리눅스 시스템의 부팅
- PC 부팅
- ① 전원 ON
- ② 바이오스 단계
- 리눅스 부팅
- ③ 부트 로더 단계
- ④ 커널 초기화 단계
- ⑤ systemd 서비스 단계
- ⑥ 로그인 프롬프트 출력
바이오스 단계
- 하드웨어 검사 > 부팅 장치 선택 > MBR 로드 > 부트 로더 로드
- 부팅 시 바이오스(Basic Input/Output System) 동작
- PC에 장착된 기본적인 하드웨어의 상태 확인
- 부팅 장치 선택 후 부팅 디스크의 첫 섹터에서 512바이트를 로딩
- 마스터 부트 레코드(MBR): 2차 부팅 프로그램(부트 로더)의 위치 저장
부트 로더 단계
- MBR이 부트 로더를 찾아 메모리에 로딩
- 여러 운영체제 중에서 부팅할 운영체제를 선택할 수 있도록 메뉴 제공
- 리눅스 커널을 메모리에 로딩
- 리눅스 커널은 /boot 디렉터리 아래에 'vmlinuz-버전명'의 형태로 제공
- 리눅스의 대표적인 부트 로더: GRUB, LILO (우분투는 GRUB)
커널 초기화 단계
- 가장 먼저 시스템에 연결된 메모리, 디스크, 키보드, 마우스 등 장치 검사
- 장치 검사 등 기본적인 초기화 과정 후 fork를 사용하지 않고 생성되는 프로세스와 스레드 생성
- 프로세스들은 메모리 관리 같은 커널의 여러 가지 동작 수행
- 프로세스는 일반적인 프로세스와 구분되도록 대괄호로 표시하며, 주로 PID 번호가 낮게 배정
systemd 서비스 단계
- 기존의 init 스크립트를 대체한 것으로 다양한 서비스를 동작시킴
- 각 서비스가 시작하는 과정은 화면에 메시지로 출력됨
- 부트 스플래시 화면이 바로 종료되고 서비스가 정상적으로 시작하는지(OK) 또는 실패인지(Fail) 알려주는 메시지가 출력되는 화면으로 전환됨
부팅 후 과정
- 부팅 후 메시지 확인: dmesg 명령 또는 more /var/log/boot/log 명령으로 확인
- 1번 프로세스 실행: 유닉스에서는 init 프로세스가 처음 생성된 프로세스로서 PID가 1번이나 우분투 15.04 버전부터 systemd 사용
- 로그인 프롬프트 출력: 그래픽 로그인 시스템인 GDM(GNOME display manager)을 동자 후 로그인 프롬프트 출력
systemd 서비스
- init 프로세스
- 전통적인 유닉스 시스템에서 부팅 시 가장 먼저 생성되는 초기 프로세스
- 현재 systemd로 대체되어 사용하지 않음
- upstart와 관련된 스크립트 파일: /etc/init 디렉터리에 작업명.conf 파일로 구성
- init과 관련된 스크립트 파일: /etc/init.d 디렉터리에 있으며 아직 일부 서비스의 스크립트 파일이 남아있음
- 런레벨(Runlevel)
- 시스템 관리의 용이함을 위해 각 부팅 환경을 레벨 단위로 나누어 놓은 것
- 시스템의 단계를 0~6까지의 런레벨로 구성
- 각 단계에 따라 셸 스크립트 실행
- 0: 시스템 종료, /etc/rc0.d
- 1, S: 응급 복구 모드(단일 사용자 모드), /etc/rc1.d, /etc/rcS.d
- 2~4: 다중 사용자 모드, /etc/rc2.d ~ /etc/rc4.d
- 5: 그래피컬 다중 사용자 모드, /etc/rc5.d
- 6: 재시작, /etc/rc6.d
systemd의 장점
- 소켓 기반으로 동작하여 inetd와 호환성 유지
- 셸과 독립적으로 부팅 가능
- 마운트 제어 가능
- fsck 제어 가능
- 시스템 상태에 대한 스냅샷을 유지
- SELinux와 통합 가능
- 서비스에 시그널 전달 가능
- shutdown 전에 사용자 세션의 안전한 종료 가능
systemd 유닛
- 전체 시스템을 시작하고 관리하는 유닛이라 부르는 구성 요소 사용
- systemd는 관리 대상의 이름을 '서비스명.유닛종류'의 형태로 관리
- 각 유닛은 같은 이름과 종류로 구성된 설정 파일과 동일한 이름을 사용
- 유닛과 관련한 보다 자세한 내용 확인 방법: man systemd.유닛명
유닛 | 기능 | 예 |
service | 가장 명백한 유닛으로 데몬을 시작·종료·재시작·로딩 | atd.service |
socket | 소켓을 관리하는 유닛으로 AF_INET, AF_INET6, AF_UNIX 소켓 스트림과 데이터그램, FIFO를 지원 | abus.socket |
device | 리눅스 장치 트리에 있는 장치 관리 | sys-module-fuse.device |
mount | 디렉터리 계층 구조의 마운트 포인트 관리 | boot.mount |
automount | 디렉터리 계층 구조에서 자동 마운트 포인트 관리 | proc-sys-fs-binfmt_misc.automount |
target | 유닛을 그루핑 | basic.target |
swap | 스왑 장치 관리 | dev-mapper-fedora \ x2dswap.swap |
path | 경로 관리 | cups.path |
timer | 타이머 관련 기능 관리 | dnf-makecache.timer |
slice | 프로세스 그룹의 자원을 계층적으로 관리 | system-getly.clice |
scope | 외부에서 생성된 프로세스 관리 | init.scope |
systemctl
- systemctl [옵션] [명령] [유닛명]: systemd 기반으로 서비스를 시작하거나 종료할 때 사용하는 명령
- 옵션
- 옵션 없을 경우 현재 동작 중인 유닛 출력
- -a: 상태와 관계 없이 유닛 전체를 출력
- -t 유닛 종류: 지정한 종류의 유닛만 출력
- 명령
- start: 유닛 시작
- stop: 유닛 정지
- status: 유닛 상태 확인
- reload: 유닛 설정 파일 리로드
- restart: 유닛 재시작
- enable: 부팅 시 유닛 시작
- disable: 부팅 시 유닛 시작 해제
- is-active: 유닛 동작 여부 확인
- is-enabled: 유닛 시작 여부 확인
- isolate: 지정한 유닛 및 관련 유닛만 시작하고 나머지 정지
- kill: 유닛에 시그널 전송
systemd와 런레벨
- 런레벨은 현재 시스템의 상태를 나타내는 한 자리 숫자(+문자 S, s)
- 런레벨에 대응하는 systemd의 target 유닛 제공(/lib/systemd/system 디렉터리)
- runlevel: 현재 런레벨 확인
기본 target 지정
- 부팅할 때 동작할 기본 runlevel은 기본 target으로 바뀌었고, 아래와 같은 형식으로 지정
- systemctl set-default <name or target>.target
- /etc/systemd/system 디렉터리 아래의 심벌릭 링크인 default.target이 가리키는 target 파일 변경
- 현재 target인 graphical.target에서 multi-user.target으로 바꾸는 예
- sudo systemctl set-default multi-user.target
target 변경
- isolate 명령 사용
- multi-user.target(runlevel 3)으로 변경
- systemctl isolate multi-user
- systemctl isolate runlevel3
- graphical.target(runlevel 5)으로 변경
- systemctl isolate graphical
- systemctl isolate runlevel5
런레벨 변경
- init, telinit 명령 사용
- init은 init 프로세스의 runlevel을 바꿀 때 사용하기도 함
단일 사용자 모드로 전환
- rescue.target(runlevel 1)
- 시스템에 문제가 있을 경우 전환하여 점검
- 윈도우의 안전 모드 같은 것으로 다중 사용자 모드에서 시스템 관리자만 사용할 수 있는 단일 사용자 모드로 전환
- systemctl isolate rescue
- systemctl isolate runlevel1
- init 1
- telinit S
시스템 종료
- shutdown [옵션] [시간] [메시지]: 리눅스 종료
- -k: 실제로 시스템을 종료하는 것이 아니라 사용자들에게 메시지만 전달
- -r: 종료 후 재시작
- -h: 종료하며 halt나 power-off 상태로 이동
- -c: 이전에 했던 shutdown 명령을 취소
- 시간: hh:mm, +m, now
- 런레벨 변경을 통한 종료
- 종료: 런레벨을 0으로 변경 > sudo init 0
- 재시작: 런레벨을 6으로 변경 > sudo init 6
- systemd를 통한 종료
- 종료: systemctl isolate poweroff, systemctl isolate runlevel0
- 재시작: systemctl isolate reboot, systemctl isolate unlevel6
- 기타 시스템 종료 명령
- reboot
- halt
- poweroff
데몬 프로세스
- 데몬(daemon): 리눅스의 백그라운드에서 동작하면서 특정한 서비스를 제공하는 프로세스
- 슈퍼 데몬: inetd(유닉스), xinetd(우분투, 보안 기능 포함)
데몬의 동작 방식
- 독자형(standalone)
- 시스템의 백그라운드에서 서비스별로 항상 동작
- 자주 호출되는 데몬이 아니라면 시스템의 자원을 낭비할 우려가 있음
- 슈퍼 데몬에 의한 동작 방식
- 평소에는 슈퍼 데몬만 동작하다가 서비스 요청이 오면 슈퍼 데몬이 해당 데몬을 동작시킴
- 독자형보다는 서비스에 응답하는 데 시간이 더 걸릴 수 있지만 자원을 효율적으로 사용
데몬의 조상
- systemd 데몬
- 대부분의 프로세스의 조상 프로세스
- pstree 명령으로 프로세스의 실행 구조 확인 가능
- 커널 스레드 데몬
- 커널의 일부분을 프로세스처럼 관리하는 데몬
- ps 명령으로 확인했을 때 대괄호로 둘러싸여 있는 프로세스들
- 예전에는 대부분 k로 시작했으나 최근에는 이를 반드시 준수하지는 않음
- 커널 데몬은 대부분 입출력이나 메모리 관리, 디스크 동기화 등을 수행하며 대체로 PID가 낮은 번호로 할당
리눅스의 주요 데몬
- atd: 특정 시간에 실행하도록 예약한 명령 실행(at 명령으로 예약)
- crond: 주기적으로 실행하도록 예약한 명령 실행
- dhcpd: 동적으로 IP 주소를 부여하는 서비스 제공
- httpd: 웹 서비스 제공
- lpd: 프린트 서비스 제공
- nfs: 네트워크 파일 시스템 서비스 제공
- named: DNS 서비스 제공
- sendmail: 이메일 서비스 제공
- smtpd: 메일 전송 데몬
- popd: 기본 편지함 서비스 제공
- routed: 자동 IP 라우터 테이블 서비스 제공
- smb: 삼바 서비스 제공
- syslogd: 로그 기록 서비스 제공
- sshd: 원격 보안 접속 서비스 제공
- in.telnetd: 원격 접속 서비스 제공
- ftpd: 파일 송수신 서비스 제공
- ntpd: 시간 동기화 서비스 제공