컴퓨터공학부

[시스템 프로그래밍 Linux] 리눅스 부팅과 종료

혜머니 2026. 4. 20. 23:11

1. 리눅스 시스템 부팅

(1) 리눅스 시스템의 부팅 단계

 - PC의 전원을 켜는 순간부터 리눅스가 완전히 동작하여 로그인 프롬프트가 출력될 때까지를 의미함

 - 전원 ON > 바이오스 단계(시스템 연결된 부품 모니터, 마우스 등등 확인하는 프로세스)

    > 부트 로더 단계(램의 운영체제를 올리는 작업) > 커널 초기화 단계 > system 서비스 단계 > 로그인 프롬프트 출력

 - 전원 ON ~ 바이오스 단계 : PC 부팅, 리눅스가 설치된 하드웨어 부팅

 - 부트 로더 단계 ~ 로그인 프롬프트 출력 : 리눅스 부팅, 리눅스 운영 체제의 부팅

(2) 바이오스 단계 : PC의 전원 스위치를 키면 제일 먼저 바이오스BIOS(Basic Input/Output System)가 동작

 - 바이오스는 보통 ROM(Read Only Memory)에 저장되어 있어 흔히 ROM-BIOS라고 부름

 - 바이오스는 PC에 장착된 기본적인 하드웨어(키보드, 디스크 등)의 상태를 확인한 후

   부팅 장치를 선택하여 부팅 디스크의 첫 섹터에서 512B를 로딩함

 - 512B : 마스터 부트 레코드(MBR)이라고 함

   > 디스트의 어떤 파티션에 2차 부팅 프로그램(부트 로더)이 있는지에 대한 정보가 저장되어있음

   > 부트 로더를 찾아 메모리에 로딩하는 작업까지 수행함

  - 바이오스 단계 : 하드웨어 검사 > 부팅 장치 선택 > MBR 로드 > 부터 로더 로드

  - 바이오스 단계에서 MBR은 부트 로더를 찾아 메모리에 로딩함

 (2) 부트 로더 단계

  - 부트 로더는 일반적으로 여러 운영체제 중에서 부팅할 운영체제를 선택할 수 있도록 메뉴를 제공함

  - 부트 로처는 리눅스 커널을 메모리에 로딩하는 역할을 수행함

  - 리눅스 커널은 /boot 디렉터리 아래에 'vmlinux-버전명'의 형태로 제공

  - rescue 버전은 응급 상황에서 시스템을 복구하는데 사용

  - GRUB(리눅스의 대표적인 부트 로더)

  - 처음 설치한 후 업데이트 시 커널이 추가로 생성됨

 (3) 커널 초기화 단계 : 부트 로더에 의해 메모리에 로딩된 커널은 가장 먼저 시스템에 연결된 장치를 검사함

  - 리눅스를 처음 시스템에 설치할 때 사용 가능한 하드웨어 정보를 미리 확인해두고, 부팅 시 장치들을 사용 가능한 상태로 유지되고 있는지 확인

  - 장치 검사 등 기본적인 초기화 과정이 후 커널은 일반적으로 프로세스를 만드는 방식인 fork를 사용하지 않고 프로세스와 스레드를 생성함

 > 이 프로세스들은 메모리 관리같은 커널의 여러가지 동작을 수행함

 - 커널 프로세스의 개수와 종류 : 리눅스의 버전과 종류별로 다름, 일반 프로세스와 구분되도록 []로 표시, 주로 PID 번호가 낮음

 - ps -ef | more 시

 - 커널 프로세스가 생성되면 커널이 수행할 작업이 끝남

 - 이제 systemd 서비스를 동작시킴

(4) systemd 서비스 단계 : 리눅스의 여러 서비스가 활성화됨

 - init 스크립트가 따로 운영되는 운영체제가 있고, systemd로 대체하는 운영체제도 있음

 - 각 서비스가 시작되는 과정은 화면에 메세지로 출력됨

 - 부트 스플래시 화면이 진행되고 있을 때 [Alt] + d를 누르면 메세지가 출력되는 화면으로 전환

 - 부팅 시 출력되는 메세지는 각종 서비스가 정상적으로 시작되는지 실패인지를 나타냄

 - 이 메세지는 부팅 후 dmesg 명령이나 more /var/log/boot.log 명령으로 확인 가능

 - dmesg 명령으로 출력되는 메세지에는 데몬의 시작과 관련된 메세지 뿐만 아니라 하드웨어 검사와 관련된 log도 포함

 - 유닉스 : 전통적인 init 프로세스가 서비스를 실행, init 프로세스는 처음 생성된 프로세스로서 PID가 1번임

 - 리눅스 : 시스템과 서비스 관리자로 init 대신 systemd 사용, systemd 프로세스가 PID 1번임

 - 데몬을 모두 실행한 뒤 그래픽 로그인 시스템인 GDMGnome Display Manager를 동작시키고, 로그인 프롬프트 출력

2. 시스템 서비스

(1) init과 systemd의 개념

 - init 프로세스는 PID가 1번인 프로세스로 모든 프로세스의 조상 역할을 함

 - init 프로세스는 부팅 과정에서 각종 서비스를 제공하는 셸 스크립트 파일을 실행함

 - init 프로세스 설정은 /etc/inittab에 있음(커널 제어 시 참조)

 - init 프로세스가 실행하는 셸 스크립트는 /etc/rc.d/init.d 디렉터리에 위치, 현재는 init 프로세스 기능이 systemd로 대체

 - 해당 디렉터리에 README 파일만 있음, init 스크립트가 systemd 기반으로 바뀌었다는 내용

 - init은 시스템의 상태를 일곱개로 정의하여 구분하고 각 상태에 따라 셸 스크립트를 실행

런레벨 target 파일(심볼릭 링크) target 원본 파일
0 시스템 종료 시스템 종료
1, S 단일 사용자 모드 단일 사용자/복구 모드
2 다중 사용자 모드 (NFS 실행 안함) 다중 사용자 모드
3 다중 사용자 모드 (NFS 실행)
4 사용하지 않음
5 GUI 상태로 부팅 GUI 상태로 부팅
6 재시작 재시작

 - systemd는 리눅스 서비스 관리와 관련된 복잡한 구조로 되어있음

 - systemd의 장점 : 소켓 기반 동작으로 inetd와 호환 가능,  셸과 독립적으로 부팅 가능, 마운트 제어 가능, fsck 제어 가능, 시스템 상태에 대한 스냅숏을 유지, SELinux와 통합 가능, 서비스에 시그널을 전달할 수 있음, 셧다운 전 사용자 세션의 안전한 종료 가능

 - systemd은 전체 시스템을 시작하고 관리하기 위해 유닛이라는 구성 요소 사용

 - systemd의 유닛들은 '서비스명.유닉 종류'의 형태로 구분 관리

 - 각 유닉은 같은 이름과 종류로 구성된 설정 파일과 동일한 이름 사용

유닛 종류 기능
service 시스템 서비스 유닛으로 데몬을 시작, 종료, 재시작, 로드함 atd.service
socket 소켓을 관리하는 유닉으로 AF_INET, AF_INET6, AF_UNIX 소켓 스티림과 데이터 그램 FIFO 지원 dbus.socket
target 유닛을 그룹핑함 basic.target
device 리눅스의 커널 장치를 관리 sys-module-fuse.device
mount 파일 시스템의 마운트 포인트 관리 tmp.mount
automount 파일 시스템에서 자동 마운트 포인트 관리 proc-sys-fs-binfmt_misc.automount
timer 타이머 기능 관리 fstrim.timer
swap 스왑 파티션이나 파일 관리 x2dswap.swap
path 파일 시스템의 개체가 변경되면 다른 서비스를 동작 시킴 cups.path
slice 시스템 프로세스를 계층적으로 관리 user.slice
scope 외부에서 생성된 프로세스 관리 init.scope

(2) systemctl 관련 명령

 - systemd 기반으로 서비스를 시작하거나 종료 시 사용하는 명령

 - systemctl 명령에서 유닉을 지정 시 유닛의 종류는 제외 가능

 - systemd 서비스를 제어

 - systemctl [옵션] [명령] [유닛명]

 * -a 상태와 관계 없이 유닛 전체 출력

 * -t 유닛 종류 지정한 종류의 유닛만 출력

 - start 유닛 시작, stop 정지, reload 다시 읽어옴, restart 재시작, status 상태 출력, enable 부팅 시 유닛이 시작되도록 설정

   disable 부팅 시 유닛이 시작하지 않도록 설정, is-active 유닛이 동작하는지 확인, is-enable 유닛이 시작되었는지 확인

   isolate 지정한 유닛 및 이와 관련된 유닛만 실행하고 나머지는 정지, kill 유닛에 시그널 전송

 - 옵션이나 명령 없이 systemctl 명령만 사용하면 현재 동작중인 유닛 출력

 - stop 명령은 root 권한이므로 root로 사용자를 전환하여 실습 필요

(3) systemd와 런레벨

 - 현재 시스템의 상태를 나타내는 한자리 숫자(문자 S 포함)

 - systemd의 target 유닛 파일들은 /usr/lib/systemd/System 디렉터리에 있음

 - 각 런레벨에 해달하는 runlevelX.target 파일이 제공됨 > 런레벨에 익숙한 사용자 편의를 위한 심볼릭 링크

런레벨 target파일(심볼릭 링크) target 원본 파일
0 runlevel0.target poweroff.target
1 runlevel1.target rescue.target
2 runlevel2.target multi-user.target
3 runlevel3.target
4 runlevel4.target
5 runlevel5.target graphical.target
6 runleve6.target reboot.target

 - 현재 target을 확인하려면 get-default 명령을 사용 (systemctl get-default)

 - 런레벨 확인을 위해선 (runlevel) 명령 사용, 'N 5' 출력 시 런레벨 5로 부팅했다는 의미

 - 예전에는 부팅 시 동작하는 기본 런레벨을 /etc/inittab 파일에 지정했으나 지금은 default.target이 가르키는 target유닛으로 바뀜

 - default.target은 /etc/systemd/ system 디렉터리 아래에 있으며 심볼릭 링크임

 - 기본 target 지정 방법 : (ststemctl set-default <name of target>.targe)

 - /etc/systemd/system 디렉터리 아래의 심볼릭 링크인 default.target이 가르키는 target 파일 변경

 - 현재 target인 grapical.target에서 multi-user.target 으로 바꾸려면 (systemctl set-defaut multi-user.target) 으로 입력

 - 런레벨이 0이나 6에 해당하는 타겟으로 지정은 안됨

 - 기본 target은 graphical(5)로 해놓는 것이 좋음

 - 현재의 target을 다른 target으로 바꿔야 할 때 systemd isolate 명령으로 간단히 해결 가능

   (systemctl isolate multi-user 혹은 runlevel3) 입력

 - init은 1번 프로세스 이름이자 init 프로세스의 런레벨을 바꿀 때 사용하는 명령이기도 함

   * 현재 init는 systemd의 심볼릭 링크 > init 명령 입력 시 required argument missing Error 발생

 - (init --help) 사용법 확인 시, 기존 init에 익숙한 사용자들을 위해 명령 유지 중 init 3 입력 시 런레벨 3으로 변경 가능

 - 런레벨을 변경하는 명령으로 telinit(systemctl에 대한 심볼릭 링크임) telinit 실행 시 init 명령과 동일하게 실행

 - 단일 사용자 모드로 전환하기 : 시스템에 문제가 생기면 시스템을 rescue.target 유닛(런레벨 1, S)로 변경 후 점검해야 함

 - 다중 사용자 모드에서 시스템 관리자만 사용할 수 있는 단일 사용자 모드로 전환하는 것

 - 이 모드로 전환하기 전에 다른 사용자들이 로그아웃해야 함

 - 단일 사용자 모드로 전환 시 그래픽 환경에서 텍스트 모드로 변경

3. 시스템 종료 및 데몬 프로세스

(1) 리눅스 시스템의 종료

 - 리눅스에서 시스템을 종료할 때 정상적인 절차를 거치는 것이 매우 중요

 - 리눅스는 비정상적으로 시슽메을 종료하여 문제가 발생하면 서비스를 제공하지 못할 수 있음

 - 전원 끄기는 다른 무엇도 할 수 없을 때에만 사용하는 최후의 수단임

 - 전원 끄기 방법 : shutdown 명령, 런레벨 0이나 6으로 전환, halt 명령, poweroff 명령, reboot 명령, 전원을 끔

 - 리눅스 시스템을 가장 정상적으로 종료하는 방법은 shutdown 명령임 (시스템 런레벨 변경 시에도 사용)

 - shutdown [옵션] [시간] [메세지] (시간 후에 메세지를 보내고 끈다는 의미)

 * -k 실제로 시스템을 종료하는 것이 아니라, 사용자에게 메세지만 전달함

 * -r 종료 후 재시작

 * -h 종료하며 halt 상태로 이동

 * -f 빠른 재시작으로 이 과정에서 fsck 생략

 * -c 이전에 내렸던 shutdown 명령을 취소

 * 시간 종료할 시간(hh:mm 혹은 +m 혹은 now)

 * 메세지 모든 사용자에게 보내질 메세지

 - shutdown 명령으로 시스템 즉시 종료 시 -h 옵션과 함께 now로 현재 시간 지정

 - 종료 시간이 now 이므로 시스템 종료 절차가 바로 시작됨

 - 메세지 사용 시 사용자가 메세지를 받고 정리할 시간이 필요하므로 시간을 지정해주는 것이 좋음

 - 시스템을 종료하는 다른 방법은 런레벨을 변경하는 것

 - telinit 명령으로 런레벨을 0으로 변경하면 시스템이 종료되고 6으로 변경하면 리부팅됨 (telinit 0)

 - systemd 기능 사용 시 target을 바꾸면 됨 (systemctl isolate poweroff.target 아니면 runlevel0.target)

 - halt, poweroff, reboot도 있음(같은 systemctl의 심볼릭 링크로 전통적인 방법으로 유지 중)

  > /var/log/wtmp에 시스템 종료 기록을 남기고 시스템을 종료하거나 재시작함

  * -n 재시작하거나 종료 전에 sync를 호출하지 않음

  * -w 실제로 재시작하거나 종료하지는 않지만 wtmp 파일에 기록을 남김

  * -d wtmp 파일에 기록을 남기지 않음(-n 옵션은 -d 포함)

  * -f 강제로 명령을 실행 shutdown을 호출하지 않음

  * -p 시스템의 전원을 끔

(2) 데몬 프로세스

 - 데몬 : 리눅스의 백그라운드에서 동작하며 특정 서비스를 제공하는 프로세스

 - 리눅스 시스템에서 동작하는 웹 서버나 데이터 베이스 서버, 원격 접속 서버 등 각종 서비스를 제공하는 프로세스

 - 독자형 : 데몬 혼자서 스스로 동작, 백그라운드에서 항상 동작, 자주 호출하지 않으면 시스템 자원 낭비 우려가 있음

 - 슈퍼데몬에 의한 동작 : 평소 슈퍼 데몬만 동작하다가 서비스 요청이 오면 슈퍼 데몬이 해당 데몬을 동작시킴

                                      독자형보다 서비스 응답에 시간이 좀 더 걸릴 수 있음, 자원 효율적 사용 가능

 - 데몬이 제대로 동작하지 않으면 시스템이 서비스를 제공할 수 없음

 - 데몬은 종류가 늘어나자 이를 관리하기 위한 슈퍼 데몬이 등장

 - 유닉스의 슈퍼 데몬 : inetd

 - 로키 리눅스의 슈퍼 데몬 : 보안 기능이 포함된 xinetc

 - 슈퍼 데몬은 사용자의 요청을 받아 해당하는 서비스 데몬을 동작시킴

 - systemd는 init를 대체한 데몬

 - systemd는 1번 프로세스로서 대다수 프로그램의 조상 프로세스로 시스템의 상태를 종합적으로 관리

 - 커널 스레드 데몬 : 커널 일부를 프로세스처럼 관리하는 데몬

 > ps 명령으로 확인 시 []에 들어있는 데몬

 > 대부분 입출력이나 메모리 관리, 디스크 동기화 등을 수행하며 대체로 낮은 PID 할당

 > 커널 스레드를 동작하는 조상데몬은 커널 스레드 데몬임

 > PPID가 2번임을 알 수 잇음 kthread 데몬

 - 리눅스에서는 다양한 서비스 제공

데몬 기능
atd 특정 시간에 실행하도록 예약한 명령 실행 (at 명령으로 예약)
crond 주기적으로 실행하도록 예약한 명령을 실행
dhcpd 동적으로 IP 주소를 부여하는 서비스 제공
httpd 웹 서비스를 제공
lpd 프린트 서비스를 제공
nfs 네트워크 파일 시스템 서비스 제공
named DNS 서비스 제공
sendemail 이메일 서비스 제공
smtpd 메일 전송 서비스 제공
popd 기본 편지함 서비스 제공
routed 자동 IP 라우터 테이블 서비스 제공
smb 삼바 서비스 제공
syslogd 로그 기록 서비스 제공
sshd 원격 보안 접속 서비스 제공
in.telnetd 원격 접속 서비스 제공
ftpd 파일 송수신 서비스 제공
ntpd 시간 동기화 서비스 제공