Search
🏫

[Unix 시스템] 4. 리눅스 시작과 종료

Tags
CS
Linux
Last edited time
2024/12/07 06:48
2 more properties
Search
[Unix 시스템] 8. 프로세스 관리
CS
Linux
2024/12/03 12:59
[Unix 시스템] 8. 프로세스 관리
CS
Linux
2024/12/03 12:59

1. 운영체제의 부팅

전원을 켜고 로그인 프롬프트가 나올때까지 과정
1.
ROM BIOS의 펌웨어 실행
2.
MBR에 있는 부트로더가 실행
3.
커널 이미지와 initramfs를 로드
4.
커널이 실행됨
5.
하드웨어를 점검하고 초기화함
6.
루트(/) 파일 시스템을 마운트하고 검사함
7.
커널은 /lib/systemd/systemd 프로그램을 실행시키고 제어를 넘김

1.1. ROM BIOS의 펌웨어 실행

BIOS 기반 x86 컴퓨터라고 가정
시스템이 켜지면, BIOS(Basic Input/Output System)라는 펌웨어가 가장 먼저 실행됨
BIOS는 하드웨어를 초기화하고, POST(Power-On Self Test)라고 불리는 일련의 하드웨어 검사를 수행
CPU, 메모리, 저장 장치, 그래픽 카드 등 주요 하드웨어가 제대로 작동하는지 확인
하드웨어 검사가 완료되면, 부트 로더를 메모리에 적재하기 위해 시스템의 저장 장치에서 MBR(Master Boot Record)을 찾음

1.2. MBR에 있는 부트로더 실행

MBR은 디스크의 첫 번째 섹터에 위치하며, 부트 로더의 첫 번째 부분을 포함
MBR에는 파티션 테이블도 포함되어 있어 부팅 가능한 파티션을 찾는 역할을 함
부팅 가능한 파티션을 찾으면, 그곳에 있는 부트로더(예: 리눅스에서는 GRUB)를 실행
부트로더는 결국 운영체제의 커널을 메모리에 적재하는 역할을 함
cf) GRUB(Grand Unified Bootloader)
리눅스의 부트 로더
사용자가 멀티부팅 환경을 설정할 수 있도록 돕고, 간단한 그래픽 인터페이스를 제공

1.3. 커널 이미지와 initramfs 로드

커널 이미지
리눅스 시스템의 핵심으로, 시스템의 하드웨어와 소프트웨어 자원을 관리하고 조정하는 역할
일반적으로 /boot/vmlinuz-<kernel-version> 파일에 저장됨
initramfs(initial RAM filesystem)
부팅 과정에서 필요한 임시 파일 시스템
시스템이 루트 파일 시스템을 마운트하기 전에 사용할 수 있는 기본 파일과 드라이버들을 포함함
부트로더는 커널 이미지와 initramfs를 메모리에 로드한 후, 커널 실행을 시작

1.4. 커널 실행

커널이 메모리에 적재되면, 부팅 작업이 본격적으로 시작됨
초기화 데몬을 통해 부팅 과정을 마무리하고 사용자 환경을 준비
커널은 시스템의 모든 하드웨어 자원(CPU, 메모리, 디스크, 네트워크 인터페이스 등)을 관리하고, 다양한 시스템 자원을 초기화함
이후, 커널은 init 프로세스(리눅스의 경우, systemd 프로세스)를 실행해 부팅 과정을 마무리하고 사용자 환경을 준비

1.5. 하드웨어 점검 및 초기화

커널은 하드웨어를 검사하고 초기화함
메모리, CPU, 저장 장치, 네트워크 장치 등 다양한 하드웨어가 제대로 작동할 수 있도록 설정
시스템에 연결된 디바이스들을 찾고, 해당 장치와 통신하기 위한 디바이스 드라이버를 로드
이 단계에서 USB 장치, 네트워크 어댑터, 그래픽 카드 등 다양한 하드웨어가 인식되고 활성화

1.6. 루트(/) 파일 시스템 마운트 및 검사

커널은 시스템의 루트 파일 시스템(/) 을 마운트
루트 파일 시스템은 시스템 운영에 필요한 핵심 파일들이 위치한 공간
파일 시스템 무결성 검사
루트 파일 시스템이 손상되거나 오류가 있을 경우 부팅 과정에 문제가 발생할 수 있음

1.7. 커널이 systemd 프로그램 실행 및 제어 넘김

커널은 부팅 과정이 끝나면 /lib/systemd/systemd라는 프로그램을 실행하고 제어를 넘김
이 프로그램은 systemd라고 하며, 현대 리눅스 배포판에서 주로 사용되는 init 시스템
systemd는 서비스 관리, 프로세스 시작/정지, 시스템 로깅 등을 포함한 다양한 초기화 작업을 처리
부팅 이후에도 계속해서 시스템의 상태를 관리하는 역할을 함

1.8. 부팅 과정과 초기화

과정과 초기화

2. 초기화 데몬

2.1. 초기화 데몬

전통적 init 데몬
Sytem V init 데몬이라고도 함
런레벨(부팅 레벨)에 기초하여 순차적으로 서비스를 실행시키는 방식
런레벨에 따라 실행되어야 또는 중단되어야 하는 서비스가 정해짐
시간이 오래 걸리며, 복잡한 초기화 스크립트로 인해 새로운 하드웨어나 서비스의 등장에 효율적 대체가 어려움
Upsert init 데몬
이벤트 기반으로 서비스를 실행하는 방식
복잡한 스크립트가 간단한 설정 파일들로 대체됨
Upsert는 Ubuntu에서 개발되어 2006년에 포함되었고 RHEL 6에서 채택됨
systemd 데몬은 2011년 Fedora에서 처음 채택되었음
RHEL 7과 SUSE 및 ubuntu 16.04에서 systemd가 Upstart를 대체함

2.2. systemd 프로세스

커널이 실행시키는 첫번째 사용자 프로세스
모든 사용자 프로세스의 최상위 조상 프로세스 (PID가 1)
ps -e 또는 ps ax 명령으로 확인
프로세스의 상태를 보는 명령어
나머지 부팅 과정 즉, 시스템 초기화 작업을 실행함
초기화 데몬이라고 함
사용자 환경을 준비함. 파일 시스템의 마운트, 시스템 운영을 위한 서비스 프로그램의 실행 등
서비스들의 병렬 시작, 온디맨드 활성화, 서비스 간 의존성 해결
이후 계속 수행되며 시스템 운영을 관리하고 셧다운까지 처리함
시스템 상태 모니터링, 데몬 관리
사용자 프로세스의 정리, 로그아웃 처리와 로그인 서비스의 제공 등

2.3. 유닛

systemd가 관리하는 시스템 자원이나 서비스와 같은 시스템 구성요소
유닛의 동작, 의존성 옵션 등은 유닛 설정 파일에서 설정 항목으로 제어됨
종류
유닛 유형
유닛 설정 파일의 확장자
설명
service
.service
시스템 서비스로 보통 데몬에 해당
target
.target
유닛의 그룹 (예: 부팅 레벨을 표현할 때 사용)
device
.device
커널이 인식한 디바이스 파일
mount
.mount
파일 시스템 마운트 지점
path
.path
파일 시스템의 파일 또는 디렉터리
socket
.socket
프로세스 간 통신에 사용되는 소켓
snapshot
.snapshot
저장된 시스템의 상태
유닛 파일이 존재하는 디렉터리
디렉터리
설명
/usr/lib/systemd/system/
소프트웨어 패키지를 설치할 때 함께 설치된 유닛 파일
/run/systemd/system/
런타임 시 만들어진 유닛 파일
/etc/systemd/system/
systemctl enable을 이용해 만들어진 유닛 파일. 우선 순위가 가장 높은 디렉터리.
systemd 데몬의 동작에 적용되는 기본 설정은 /etc/system/system.conf 파일에 있음

2.4. 기본 타킷과 런레벨

기본 타깃 (부팅 모드 또는 런레벨)을 확인 또는 변경하는 명령
systemctl get-default 또는 systemctl set-default <name.target>
초기 런레벨은 0 또는 6이 되어서는 안됨
타깃과 런레벨의 비교
런레벨
타깃 유닛
설명
0
runlevel0.target, poweroff.target
시스템을 종료하고 전원을 끔
1
runlevel1.target, rescue.target
단일 사용자 모드로 복구 셸을 설정
2~4
runlevel2.target, runlevel3.target, runlevel4.target, multi-user.target
그래픽이 없는 다중 사용자 시스템을 설정
5
runlevel5.target, graphical.target
그래픽 다중 사용자 시스템을 설정
6
runlevel6.target, reboot.target
시스템을 종료하고 재부팅함
현재 타깃을 다른 타깃유닛으로 바꾸는 관리자 명령
systemctl isolate <name.target>
telinit 명령
런레벨을 바꾸는 관리자 명령
telinit runlevel
telinit 3은 런레벨을 변경하여 텍스트 모드만 변경
telinit 0은 종료, telinit 6은 재부팅을 의미
runlevel 명령
이전 런레벨과 현재 런레벨을 확인하는 명령

2.5. 시스템 서비스의 관리

과거 서비스 수행을 위한 초기화 스크립트는 서비스 유닛으로 대체됨
관리자는 systemctl 명령을 사용하여 시스템 서비스의 상태 보기, 시작, 멈춤, 재시작, 활/비활성화 작업 수행 가능
systemctl [options] command [units]
서비스 실행과 상태 확인을 위한 systemctl 명령
명령
설명
systemctl start name.service
서비스를 시작함. service name start와 같음
systemctl stop name.service
서비스를 중지함. service name stop과 같음
systemctl restart name.service
서비스를 재시작함. service name restart와 같음
systemctl try-restart name.service
실행 중인 경우에만 서비스를 재시작함. service name condrestart와 같음
systemctl reload name.service
설정을 다시 로드함. service name reload와 같음
systemctl status name.service
서비스가 실행 중인지 확인함. service name status와 유사함
systemctl is-active name.service
서비스의 활성화 상태를 확인함
systemctl list-units --type service --all
모든 서비스의 상태를 출력함. service --status-all과 유사함
서비스 활성화와 서비스 종속성 확인을 위한 systemctl 명령
명령
설명
systemctl enable name.service
서비스를 활성화하는 것으로 부팅 시 자동으로 시작되게 함. chkconfig name on과 같음
systemctl disable name.service
서비스를 비활성화함. chkconfig name off와 같음
systemctl status name.service
서비스가 활성화되어 있는지 확인함. chkconfig --list name과 유사함
systemctl is-enabled name.service
서비스의 활성화 상태를 확인함
systemctl list-unit-files --type service
모든 서비스를 나열하고 활성화 여부를 확인함. chkconfig --list와 유사함
systemctl list-dependencies --after name.service
지정된 유닛 전에 시작하도록 된 서비스를 나열함
systemctl list-dependencies --before name.service
지정된 유닛 후에 시작하도록 된 서비스를 나열함

3. 시스템 종료

3.1. 전원 관리 명령

호환상의 이유로 shutdown 명령을 계속 사용할 수는 있음
가급적 systemctl 명령을 사용하는 것이 좋음
명령
과거 명령
설명
systemctl halt
halt
시스템을 종료함
systemctl poweroff
poweroff
시스템을 종료하고 전원을 끔
systemctl reboot
reboot
시스템을 재부팅함
systemctl suspend
pm-suspend
시스템을 일시 중단함
systemctl hibernate
pm-hibernate
시스템을 최대 절전 모드로 전환함
shutdown 명령
시간을 정해 시스템을 안전하게 종료하는 명령
shutdown [options] time [message]
옵션
-r은 재부팅, -c는 예약된 셧다운의 취소
-k는 실제 셧다움 하는것처럼 경고 메세지만 보냄
예) shutdown -r + 10
time 인수
종료 시간으로 23:15는 절대시간 형식, +10은 10분 후 종료를 의미
예) shutdown -H 23:15 / shutdown -P +10
인수로 now는 즉시 종료를 의미
shutdown -h now

3.2. 시스템의 종료 절차

실제 systemd 프로세스를 통해 셧다운이 처리됨
systemd 프로세스는 모든 프로세스에게 종료를 알림
각 프로세스가 스스로 종료하도록 TERM 시그널을 보냄
종료하지 않은 프로세스에게 강제 종료를 위한 KILL 시그널을 보냄
파일 시스템을 잠그고 루트 파일 시스템을 제외한 모든 파일 시스템을 언마운트 함
시스템 호출을 통한 커널에 재부팅 또는 종료를 요청함
종료를 위해 halt 명령 사용 가능
재부팅을 위해 reboot 명령 사용 가능
시스템의 일시 중단
systemctl suspend
일시 중단: 시스템 상태를 RAM에 저장하고 저전력 상태로 함
systemctl hibernate
최대 절전모드: 시스템 상태를 하드디스크에 저장하고 전원을 끔
systemctl hybrid-sleep
하이브리드 슬립: 메모리 외에 디스크에도 시스템 상태를 저장함