Chapter 08. 리눅스의부팅과종료
00. 개요 01. 리눅스시스템의부팅 02. systemd 서비스 03. 리눅스시스템의종료 04. 데몬프로세스 05. 부트로더
리눅스시스템의부팅과정을이해하고부트로더의역할을설명할수있다. systemd 프로세스의역할을설명할수있다. systemd의유닛을설명할수있다. systemctl 명령으로유닛을시작 종료하고상태를확인할수있다. 런레벨을이해하고변경할수있다. 리눅스시스템을종료할수있다. 데몬을이해하고슈퍼데몬의역할을설명할수있다. 단일사용자모드로부팅할수있다. root 계정의암호를복구할수있다.
리눅스실습스터디맵
00 개요
01 리눅스시스템의부팅 리눅스시스템의부팅과정 바이오스단계 PC 의전원스위치를켜서부팅하면제일먼저바이오스 (BIOS, basic input/output system) 가동작 바이오스는 PC 에장착된기본적인하드웨어 ( 키보드, 디스크등 ) 의상태를확인한후부팅장치를선택하여부팅디스크의첫섹터에서 512 바이트를로딩 이 512 바이트가마스터부트레코드 (master boot record, MBR): 2 차부팅프로그램 ( 부트로더 ) 의위치저장
01 리눅스시스템의부팅 부트로더단계 바이오스단계에서 MBR 는부트로더를찾아메모리에로딩 부트로더는여러운영체제중에서부팅할운영체제를선택할수있도록메뉴를제공
01 리눅스시스템의부팅 부트로더단계 부트로더는리눅스커널을메모리에로딩 리눅스커널은 /boot 디렉터리아래에 vmlinuz-버전명 의형태로제공 리눅스의대표적인부트로더로는 GRUB와 LILO
01 리눅스시스템의부팅 커널초기화단계 커널은가장먼저시스템에연결된메모리, 디스크, 키보드, 마우스등장치들을검사 장치검사등기본적인초기화과정이끝나면커널은 fork를사용하지않고생성되는프로세스와스레드생성 이프로세스들은메모리관리같은커널의여러가지동작을수행 이들프로세스는일반적인프로세스와구분되도록대괄호 ([ ]) 로표시하며, 주로 PID 번호가낮게배정
01 리눅스시스템의부팅 systemd 서비스단계 우분투에서 systemd 서비스는기존의 init 스크립트를대체한것으로다양한서비스를동작 각서비스가시작하는과정은화면에메시지로출력 부트스플래시화면이바로종료되고 [ 그림 8-6] 과같이메시지가출력되는화면으로전환
01 리눅스시스템의부팅 부팅후메시지확인 부팅시출력된메시지는 dmesg 명령이나 more /var/log/boot.log 명령으로확인가능
01 리눅스시스템의부팅 1 번프로세스 전통적으로유닉스에서는 init 프로세스가처음생성된프로세스로서 PID 가 1 번 로그인프롬프트출력 마지막으로그래픽로그인시스템인 GDM(GNOME display manager) 을동작시키고, 로그인프롬프트출력
02 systemd 서비스 init 프로세스 init 프로세스는스크립트를순차적으로실행하여다른프로세스를동작 우분투는 14.10 버전까지자체적으로개발한 upstart 를기존의 init 대신사용해왔으나현재는 upstart 를기본적으로설치하지않음 upstart 를사용하려고하면다음과같은메시지가출력
02 systemd 서비스 init 프로세스 init 가 systemd 로대체
02 systemd 서비스 init 프로세스 upstart 와관련된스크립트파일은 /etc/init 디렉터리에 작업명.conf 파일로구성 init 와관련된스크립트파일은 /etc/init.d 디렉터리에있으며아직일부서비스의스크립트파일이남아있음
02 systemd 서비스 init 프로세스와런레벨 init 프로세스에서사용하던런레벨 (Run Level) 의개념에대한이해필요 init 는시스템의단계를일곱개로정의하여구분하고각단계에따라셸스크립트를실행하는데, 이단계들을런레벨이라고함
02 systemd 서비스 init 프로세스와런레벨 런레벨 2, 3, 4 번이동일하다는것은 /etc/rc2.d, /etc/rc3.d, /etc/rc4.d 디렉터리의내용이모두같다는것으로알수있음
02 systemd 서비스 init 프로세스와런레벨 런레벨별로실행하는스크립트파일은 /etc/init.d 디렉터리에있는파일에대한심벌릭링크
02 systemd 서비스 systemd 의기본개념 systemd는 init 방식에비해다음과같은장점을가지고있음 소켓기반으로동작하여 inetd와호환성을유지한다. 셸과독립적으로부팅이가능하다. 마운트제어가가능하다. fsck 제어가가능하다. 시스템상태에대한스냅숏을유지한다. SELinux와통합이가능하다. 서비스에시그널을전달할수있다. shutdown 전에사용자세션의안전한종료가가능하다.
02 systemd 서비스 systemd 유닛 전체시스템을시작하고관리하는데유닛 (unit) 이라부르는구성요소를사용 systemd는관리대상의이름을 서비스명. 유닛종류 의형태로관리 각유닛은같은이름과종류로구성된설정파일과동일한이름을사용 유닛과관련한보다자세한내용은 man systemd. 유닛명 으로확인
02 systemd 서비스 systemd 관련명령 systemd 기반으로서비스를시작하거나종료할때사용하는명령 : systemctl
02 systemd 서비스 동작중인유닛출력하기 옵션이나명령없이 systemctl 명령만사용하면현재동작중인유닛이출력
02 systemd 서비스 전체유닛출력하기 : -a 옵션 systemctl 명령에 -a 옵션을지정하면전체유닛이출력
02 systemd 서비스 특정유닛출력하기 : -t 옵션 특정종류의유닛만출력하려면 -t 옵션을사용 service 유닛만출력한예
02 systemd 서비스 유닛서비스시작하기 : start 명령 유닛서비스를시작하려면 start 명령을사용 cron 유닛을시작한후 is-active 명령으로동작여부를확인해보면 active 상태임을알수있음
02 systemd 서비스 유닛상태확인하기 : status 명령 유닛의상태를확인하려면 status 명령을사용 cron.service 의상태를출력한예
02 systemd 서비스 유닛서비스정지하기 : stop 명령 유닛서비스를정지하려면 stop 명령을사용 cron 유닛을정지한후다시 status 명령으로상태를확인해보면 inactive(dead)
02 systemd 서비스 systemd 와런레벨 런레벨은현재시스템의상태를나타내는한자리숫자 ( 문자 S, s 포함 ) 이에대응하는 systemd의 target 유닛은 [ 표 8-3] 과같이제공 이파일들은 /lib/systemd/system 디렉터리에있음 현재런레벨확인하기 : runlevel 명령
02 systemd 서비스 기본 target 지정하기 부팅할때동작할기본런레벨은기본 target 으로바뀌었고, 다음과같은형식으로지정 이명령은 /etc/systemd/system 디렉터리아래에심벌릭링크인 default.target 이가리키는 target 파일을변경 현재 target 인 graphical.target 에서 multi-user.target 으로바꾸는예
02 systemd 서비스 target 변경하기 systemd 에서런레벨을변경하는것도 isolate 명령으로간단히해결 multi-user.target( 런레벨 3) 으로변경하려면다음명령중하나를입력 graphical.target( 런레벨 5) 으로변경하려면다음명령중하나를사용
02 systemd 서비스 telinit, init 명령으로런레벨변경하기 init 는 init 프로세스의런레벨을바꿀때사용하기도함 현재 init 는 systemd 에대한심벌릭링크 init 명령만입력하면다음과같이출력
02 systemd 서비스 telinit, init 명령으로런레벨변경하기 init --help 로사용법을알아보면다음과같이출력
02 systemd 서비스 telinit, init 명령으로런레벨변경하기 런레벨을바꾸는명령으로 telinit telinit 명령을실행하면 init 명령과같은결과가출력
02 systemd 서비스 단일사용자모드로전환하기 : rescue.target( 런레벨 1) 시스템에문제가있을경우시스템을 rescue.target 유닛 ( 런레벨 1, 런레벨 S) 으로변경하여점검 윈도의안전모드같은것으로, 다중사용자모드에서시스템관리자만사용할수있는단일사용자모드로전환하는것
03 리눅스시스템의종료 리눅스를종료하는방법 shutdown 명령을사용한다. halt 명령을사용한다. poweroff 명령을사용한다. 런레벨을 0이나 6으로전환한다 (target을전환한다 ). reboot 명령을사용한다. 전원을끈다.
03 리눅스시스템의종료 shutdown 명령사용하기 리눅스시스템을가장정상적으로종료하는방법 shutdown 명령으로시스템즉시종료하기 -h 옵션과함께현재시간으로지정
03 리눅스시스템의종료 셧다운한다는메시지보내고종료하기 시스템을종료할때 shutdown 명령으로메시지를보낼수있음 사용자들이메시지를받고정리할시간이필요하므로시간을 now로지정하면안되고특정시간을지정 예 : 2분후에종료한다는메시지발송 사용자터미널출력 shutdown 명령으로시스템재시작하기 : -r 옵션사용 3 분후에시스템재시작
03 리눅스시스템의종료 shutdown 명령취소하기 : -c 옵션 앞의 3 분후재시작명령취소할경우메시지출력 shutdown 메시지만보내기 : -k 옵션 -k 다음에 2 를지정하면다른사용자의터미널에는다음과같은메시지가출력
03 리눅스시스템의종료 런레벨변경하여종료하기 런레벨을 0 으로바꾸면시스템이종료 재시작하려면런레벨을 6 으로변경 systemd 로종료하기 systemd 에서 target 유닛을변경하면시스템을종료하거나재시작가능 시스템재시작하기
03 리눅스시스템의종료 기타시스템종료명령 시스템을종료하거나재시작하기위해사용할수있는명령 : reboot, halt, poweroff 이러현명령은모두 systemctl 의심벌릭링크 reboot, halt, poweroff 명령은 /var/log/wtmp 파일에시스템종료기록을남기고시스템을종료하거나재시작 사용할수있는옵션 -n: 재시작이나종료전에 sync를호출하지않는다. -w: 실제로재시작하거나종료하지는않지만 wtmp 파일에기록을남긴다. -d: wtmp 파일에기록을남기지않는다. -n 옵션은 -d 옵션을포함한다. -f : 강제로명령을실행하며 shutdown을호출하지않는다. -p: 시스템의전원을끈다.
04 데몬프로세스 데몬 (daemon) 리눅스의백그라운드에서동작하면서특정한서비스를제공하는프로세스 리눅스시스템에서동작하는각종서비스를제공하는프로세스들이바로데몬 데몬의동작방식 독자형 (standalone) 시스템의백그라운드에서서비스별로항상동작 자주호출되는데몬이아니라면시스템의자원을낭비할우려 슈퍼데몬에의한동작방식 평소에는슈퍼데몬만동작하다가서비스요청이오면슈퍼데몬이해당데몬을동작시킴 독자형보다는서비스에응답하는데시간이약간더걸릴수있지만자원을효율적으로사용한다는장점 슈퍼데몬 유닉스에서슈퍼데몬의이름은 inetd 우분투에서는보안기능이포함된 xinetd를사용
04 데몬프로세스 데몬의조상 : systemd와커널스레드데몬 systemd 데몬 대부분의프로세스의조상프로세스 pstree 명령으로확인
04 데몬프로세스 커널스레드데몬 커널의일부분을프로세스처럼관리하는데몬 ps 명령으로확인했을때대괄호 ([ ]) 로둘러싸여있는프로세스들 예전에는대부분 k로시작했으나요즘은이를반드시준수하지는않음 커널데몬은대부분입출력이나메모리관리, 디스크동기화등을수행하며대체로 PID가낮은번호로할당 커널데몬을동작시키는조상데몬은커널스레드데몬 (kthreadd): PID 2번
04 데몬프로세스 주요데몬
05 부트로더 GRUB 의개요 grand unified bootloader 의약자로, 리눅스의전통적인부트로더인 LILO 의단점을보완하여 GNU 프로젝트의일환으로개발 GRUB 는 LILO 에비해다음과같은장점을가지고있음 LILO 는리눅스에서만사용이가능하지만 GRUB 는윈도에서도사용할수있다. LILO 에비해설정과사용이편리하다. 부팅시에명령을사용하여수정이가능하다. 멀티부팅기능을지원한다. GRUB 의가장최신버전은 GRUB2 로우분투에서기본부트로더로사용
05 부트로더 GRUB2 관련디렉터리와파일 /boot/grub2/grub.cfg 파일 : 기존의 menu.lst 파일을대체하는기본설정파일
05 부트로더 GRUB2 관련디렉터리와파일 /etc/grub.d 디렉터리 : GRUB 스크립트를가지고있으며 GRUB 의명령이실행될때순서대로읽혀 grub.cfg 파일이생성 /etc/default/grub 파일 : GRUB 메뉴설정내용이저장
05 부트로더 암호복구하기 1 시스템재시작하기 : 부팅할때 GRUB 메뉴초기화면이출력
05 부트로더 암호복구하기 2 GRUB 편집모드로전환하기 : GRUB Boot Menu 가출력될때재빨리 e 키를눌러서편집모드로전환
05 부트로더 암호복구하기 3 단일사용자모드로수정하기 리눅스커널정보가있는행에서 ro quiet splash $vt_handoff 를 rw init=/bin/bash 로수정
05 부트로더 암호복구하기 4 F10 키를눌러재시작하면 root 계정으로동작 5 재부팅하기 : reboot -f 명령으로시스템을재시작했을때 GRUB 화면출력. 이상태에서 Enter 키를눌러우분투부팅
05 부트로더 복구모드로부팅하기 어떤이유에서든우분투가부팅되지않는다면복구모드로부팅하는것이유용 복구모드에서는 root 계정으로로그인하여시스템의복구에필요한작업을수행할수있음 1 복구모드선택하기 : 시스템재시작 -GRUB 메뉴초기화면 - Ubuntu 용고급설정 -recovery mode
05 부트로더 복구모드로부팅하기 2 root 항목선택하기 root 항목을선택
05 부트로더 복구모드로부팅하기 3 root 로로그인하기
05 부트로더 복구모드로부팅하기 4 다시마운트하기 root 파일시스템이읽기전용으로마운트되었으므로읽기 쓰기가가능하도록다시마운트하고작업 5 재시작하기 작업이완료되면 reboot -f 명령으로리눅스를재시작