Total
Search
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
▪
하이브리드 슬립: 메모리 외에 디스크에도 시스템 상태를 저장함