Chapter 08. 리눅스의부팅과종료
00. 개요 01. 리눅스시스템의부팅 02. systemd 서비스 03. 리눅스시스템의종료 04. 데몬프로세스 05. 부트로더
리눅스시스템의부팅과정을이해하고부트로더의역할을설명할수있다. systemd 프로세스의역할을설명할수있다. systemd의유닛을설명할수있다. systemctl 명령으로유닛을시작 종료하고상태를확인할수있다. 런레벨이무엇인지설명하고런레벨을변경할수있다. 리눅스시스템을종료할수있다. 데몬을이해하고슈퍼데몬의역할을설명할수있다. 단일사용자모드로부팅할수있다. root 계정의암호를복구할수있다.
리눅스실습스터디맵
00 개요 [ 그림 8-1] 8 장의내용구성
01 리눅스시스템의부팅 리눅스시스템의부팅과정 바이오스단계 PC 의전원스위치를켜서부팅하면제일먼저바이오스 (BIOS, basic input/output system) 가동작 바이오스는 PC 에장착된기본적인하드웨어 ( 키보드, 디스크등 ) 의상태를확인한후부팅장치를선택하여부팅디스크의첫섹터에서 512 바이트를로딩 이 512 바이트가마스터부트레코드 (master boot record, MBR): 2 차부팅프로그램 ( 부트로더 ) 의위치저장
01 리눅스시스템의부팅 부트로더단계 바이오스단계에서 MBR 는부트로더를찾아메모리에로딩 부트로더는여러운영체제중에서부팅할운영체제를선택할수있도록메뉴를제공 부트로더는리눅스커널을메모리에로딩 리눅스커널은 /boot 디렉터리아래에 vmlinuz-버전명 의형태로제공 리눅스의대표적인부트로더로는 GRUB와 LILO [user1@localhost ~]$ ls /boot/vm* /boot/vmlinuz-0-rescue-7b4398c518d54062aa164042d9bf5191 /boot/vmlinuz-3.11.2-201.fc19.x86_64 /boot/vmlinuz-3.9.5-301.fc19.x86_64 [user1@localhost ~]$
01 리눅스시스템의부팅 커널초기화단계 커널은가장먼저시스템에연결된메모리, 디스크, 키보드, 마우스등장치들을검사 장치검사등기본적인초기화과정이끝나면커널은 fork를사용하지않고생성되는프로세스와스레드생성 이프로세스들은메모리관리같은커널의여러가지동작을수행 이들프로세스는일반적인프로세스와구분되도록대괄호 ([ ]) 로표시하며, 주로 PID 번호가낮게배정 [root@localhost ~]# ps -ef more UID PID PPID C STIME TTY TIME CMD root 1 0 0 16:22? 00:00:09 /usr/lib/systemd/systemd --switc hed-root --system --deserialize 21 root 2 0 0 16:22? 00:00:00 [kthreadd] root 3 2 0 16:22? 00:00:00 [ksoftirqd/0] root 5 2 0 16:22? 00:00:00 [kworker/0:0h] root 7 2 0 16:22? 00:00:00 [kworker/u:0h] root 8 2 0 16:22? 00:00:00 [migration/0] root 9 2 0 16:22? 00:00:00 [watchdog/0] root 10 2 0 16:22? 00:00:00 [migration/1] root 12 2 0 16:22? 00:00:00 [kworker/1:0h] ( 생략 )
01 리눅스시스템의부팅 systemd 서비스단계 systemd 서비스단계에이르면리눅스가본격적으로동작하기시작 systemd 서비스는페도라에서기존의 init 스크립트를대체한것으로다양한서비스를동작시킴 각서비스가시작하는과정은화면에메시지로출력 페도라에서는기본적으로메시지가보이지않도록하고대신에부트스플래시 (boot splash) 라고하는이미지를출력 부트스플래시화면이진행중일때 ctrl+d 키를누르면 메시지가출력되는화면으로전환 [ 그림 8-5] 페도라스플래시화면 [ 그림 8-6] 부팅메시지출력화면
01 리눅스시스템의부팅 부팅후메시지확인 부팅시출력된메시지는 dmesg 명령이나 more /var/log/boot.log 명령으로확인가능 [user1@localhost ~]$ dmesg more [ 0.000000] Initializing cgroup subsys cpuset [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Initializing cgroup subsys cpuacct [ 0.000000] Linux version 3.11.2-201.fc19.x86_64 (mockbuild@bkernel01.phx2.fe doraproject.org) (gcc version 4.8.1 20130603 (Red Hat 4.8.1-1) (GCC) ) #1 SMP Fr i Sep 27 19:20:55 UTC 2013 [ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.11.2-201.fc19.x86_64 root=/de v/mapper/fedora-root ro rd.lvm.lv=fedora/swap rd.md=0 rd.dm=0 vconsole.keymap=us rd.luks=0 vconsole.font=latarcyrheb-sun16 rd.lvm.lv=fedora/root rhgb quiet LANG =ko_kr.utf-8 [ 0.000000] Disabled fast string operations [ 0.000000] e820: BIOS-provided physical RAM map: ( 생략 )
01 리눅스시스템의부팅 1 번프로세스 전통적으로유닉스에서는 init 프로세스가처음생성된프로세스로서 PID 가 1 번 리눅스는페도라 14 부터 init 대신에시스템과서비스관리자로 systemd 를사용하기시작했고, systemd 프로세스가 1 번프로세스 [user1@localhost ~]$ ps -ef more UID PID PPID C STIME TTY TIME CMD root 1 0 0 16:22? 00:00:09 /usr/lib/systemd/systemd --switc hed-root --system --deserialize 20 root 2 0 0 16:22? 00:00:00 [kthreadd] root 3 2 0 16:22? 00:00:00 [ksoftirqd/0] ( 생략 ) 로그인프롬프트출력 마지막으로그래픽로그인시스템인 GDM(GNOME display manager) 을동작시키고, 로그인프롬프트출력 [ 그림 8-7] 로그인프롬프트화면
02 systemd 서비스 기존 init 프로세스 init 프로세스는 PID 가 1 번인프로세스로모든프로세스의조상역할 init 프로세스는부팅과정에서각종서비스를제공하는셸스크립트파일을실행 init 프로세스설정파일은 /etc/inittab [user1@localhost ~]$ cd /etc [user1@localhost etc]$ cat inittab # inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # Ctrl-Alt-Delete is handled by /etc/systemd/system/ctrl-alt-del.target # # systemd uses 'targets' instead of runlevels. By default, there are two main targets: # # multi-user.target: analogous to runlevel 3 # graphical.target: analogous to runlevel 5 # # To set a default target, run: # # ln -s /lib/systemd/system/<target name>.target /etc/systemd/system/default. target # [user1@localhost etc]$
02 systemd 서비스 기존 init 프로세스 init 프로세스가실행하는스크립트파일은 /etc/rc.d/init.d 디렉터리에위치 /etc/rc*.d 디렉터리에있는파일들은 /etc/rc.d/init.d 파일에대한심벌릭링크 현재는 systemd 서비스에의해대부분대체되고일부파일만유지 [user1@localhost etc]$ cd /etc/rc.d/init.d [user1@localhost init.d]$ ls README ebtables functions netcf-transaction netconsole network [user1@localhost init.d]$ /etc/rc.d/init.d 디렉터리의 README 파일 : 전통적인 init 스크립트가 systemd 기반으로바뀌었다는것 [user1@localhost init.d]$ cat README You are looking for the traditional init scripts in /etc/rc.d/init.d, and they are gone? Here's an explanation on what's going on: You are running a systemd-based OS where traditional init scripts have been replaced by native systemd services files. Service files provide very similar functionality to init scripts. To make use of service ( 생략 )
02 systemd 서비스 init 프로세스와런레벨 init 프로세스에서사용하던런레벨 (Run Level) 의개념에대한이해필요 init 는시스템의단계를일곱개로정의하여구분하고각단계에따라셸스크립트를실행하는데, 이단계들을런레벨이라고함
02 systemd 서비스 systemd 의기본개념 systemd는페도라 14에서처음등장하여페도라 15부터본격적으로기존의 init 스크립트를대체하기시작 페도라 18부터는거의대부분의서비스가 systemd 기반변경 systemd는 init 방식에비해가진장점 소켓기반으로동작하여 inetd와호환성을유지한다. 셸과독립적으로부팅이가능하다. 마운트제어가가능하다. fsck 제어가가능하다. 시스템상태에대한스냅숏을유지한다. SELinux와통합이가능하다. 서비스에시그널을전달할수있다. 셧다운전에사용자세션의안전한종료가가능하다.
02 systemd 서비스 systemd 유닛 systemd는전체시스템을시작하고관리하는데유닛 (units) 이라부르는구성요소를사용 systemd는관리대상의이름을 서비스이름. 유닛종류 의형태로관리 각유닛은같은이름과종류로구성된설정파일과동일한이름을사용
02 systemd 서비스 systemd 관련명령 systemd 를기반으로서비스를시작하거나종료할때사용하는명령은 systemctl
02 systemd 서비스 동작중인유닛출력하기 옵션이나명령없이 systemctl 명령만사용하면현재동작중인유닛이출력 [user1@localhost init.d]$ systemctl UNIT LOAD ACTIVE SUB JOB DESCRIPTION proc-sys...misc.automount loaded active running Arbitrary Executable File sys-devi...ock-sr0.device loaded active plugged VMware_Virtual_IDE_CDROM_D sys-devi...da-sda1.device loaded active plugged VMware_Virtual_S sys-devi...da-sda2.device loaded active plugged VMware_Virtual_S sys-devi...ock-sda.device loaded active plugged VMware_Virtual_S sys-devi...db-sdb1.device loaded active plugged VMware_Virtual_S sys-devi...db-sdb2.device loaded active plugged VMware_Virtual_S sys-devi...ock-sdb.device loaded active plugged VMware_Virtual_S sys-devi...dc-sdc1.device loaded active plugged VMware_Virtual_S sys-devi...dc-sdc2.device loaded active plugged VMware_Virtual_S sys-devi...ock-sdc.device loaded active plugged VMware_Virtual_S ( 생략 )
02 systemd 서비스 전체유닛출력하기 : -a 옵션 -a 옵션을지정하면전체유닛이출력 [user1@localhost init.d]$ systemctl -a ( 생략 ) colord.service loaded active running Manage, Install and Gene crond.service loaded active running Command Scheduler cups.service loaded active running CUPS Printing Service dbus.service loaded active running D-Bus System Message Bus dm-event.service loaded inactive dead Device-mapper event daem dracut-shutdown.service loaded inactive dead Restore /run/initramfs ebtables.service loaded inactive dead SYSV: Ethernet Bridge fi emergency.service loaded inactive dead Emergency Shell ( 생략 )
02 systemd 서비스 특정유닛출력하기 : -t 옵션 [user1@localhost init.d]$ systemctl -t service UNIT LOAD ACTIVE SUB JOB DESCRIPTION abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active running ABRT kernel log watcher abrt-vmcore.service loaded active exited Harvest vmcores for ABRT abrt-xorg.service loaded active running ABRT Xorg log watcher abrtd.service loaded active running ABRT Automated Bug Reportin accounts-daemon.service loaded active running Accounts Service atd.service loaded active running Job spooling tools auditd.service loaded active running Security Auditing Service avahi-daemon.service loaded active running Avahi mdns/dns-sd Stack bluetooth.service loaded active running Bluetooth service ( 생략 ) 유닛의상태확인하기 : status [user1@localhost init.d]$ systemctl status bluetooth.service bluetooth.service - Bluetooth service Loaded: loaded (/usr/lib/systemd/system/bluetooth.service; enabled) Active: active (running) since Fri, 2013-06-07 17:24:34 KST Main PID: 555 (bluetoothd) CGroup: name=systemd:/system/bluetooth.service 555 /usr/sbin/bluetoothd -n ( 생략 ) [user1@localhost init.d]$
02 systemd 서비스 유닛서비스정지하기 : stop [root@localhost ~]# systemctl stop bluetooth.service [root@localhost ~]# systemctl status bluetooth.service bluetooth.service - Bluetooth service Loaded: loaded (/usr/lib/systemd/system/bluetooth.service; enabled) Active: inactive (dead) since Fri, 2013-06-07 16:00:00 KST; 12s ago Process: 555 ExecStart=/usr/sbin/bluetoothd -n (code=exited, status=0/ SUCCESS) CGroup: name=systemd:/system/bluetooth.service Jun 07 15:59:56 localhost.localdomain bluetoothd[555]: Endpoint unregistered:... Jun 07 15:59:56 localhost.localdomain bluetoothd[555]: bluetoothd[555]: Endpo... Jun 07 15:59:56 localhost.localdomain bluetoothd[555]: Endpoint unregistered:... Jun 07 15:59:57 localhost.localdomain bluetoothd[555]: bluetoothd[555]: Endpo... Jun 07 15:59:57 localhost.localdomain bluetoothd[555]: Endpoint unregistered:... Jun 07 15:59:59 localhost.localdomain bluetoothd[555]: bluetoothd[555]: Stopp... Jun 07 15:59:59 localhost.localdomain bluetoothd[555]: Stopping SDP server Jun 07 15:59:59 localhost.localdomain bluetoothd[555]: Exit Jun 07 15:59:59 localhost.localdomain bluetoothd[555]: bluetoothd[555]: Exit Jun 07 16:00:00 localhost.localdomain systemd[1]: Stopped Bluetooth service. [root@localhost ~]# 유닛서비스시작하기 : start [root@localhost ~]# systemctl start bluetooth.service [root@localhost ~]# systemctl is-active bluetooth.service active [root@localhost ~]#
02 systemd 서비스 systemd 와런레벨 런레벨변경하기 systemd에서런레벨을변경하는것도 isolate 명령으로간단히해결 예 : 런레벨 3로변경 [root@localhost ~]# systemctl isolate multi-user.target 또는 [root@localhost ~]# systemctl isolate runlevel3.target [ 그림 8-8] 런레벨 3 화면
02 systemd 서비스 런레벨변경하기 런레벨 5 로다시변경하기 [root@localhost ~]# systemctl isolate graphical.target [root@localhost ~]# systemctl isolate runlevel5.target init 명령으로런레벨변경하기 init 명령으로런레벨변경가능 [root@localhost ~]# cd /sbin [root@localhost ~]# ls -l /sbin/init lrwxrwxrwx. 1 root root 22 10월 3 21:45 init ->../lib/systemd/systemd [root@localhost ~]#
02 systemd 서비스 init 명령으로런레벨변경하기 init 명령만입력하면다음과같이출력 [root@localhost ~]# init init [OPTIONS...] {COMMAND} Send control commands to the init daemon. --help Show this help --no-wall Don't send wall message before halt/power-off/reboot Commands: 0 Power-off the machine 6 Reboot the machine 2, 3, 4, 5 Start runlevelx.target unit 1, s, S Enter rescue mode q, Q Reload init daemon configuration u, U Reexecute init daemon [root@localhost ~]#
02 systemd 서비스 telinit 명령으로런레벨변경하기 telinit 명령을실행하면 init 명령과같은결과가출력 [root@localhost ~]# telinit telinit [OPTIONS...] {COMMAND} Send control commands to the init daemon. --help Show this help --no-wall Don't send wall message before halt/power-off/reboot Commands: 0 Power-off the machine 6 Reboot the machine 2, 3, 4, 5 Start runlevelx.target unit 1, s, S Enter rescue mode q, Q Reload init daemon configuration u, U Reexecute init daemon [root@localhost ~]#
02 systemd 서비스 단일사용자모드로전환하기 : 런레벨 1 시스템에문제가있을경우시스템을런레벨 1( 런레벨 S) 로변경하여점검 : 안전모드개념 이모드로변환하기전에다른사용자들은로그아웃해야함 단일모드변경방법 [root@localhost ~]# systemctl isolate rescue.target [root@localhost ~]# systemctl isolate runlevel1.target [root@localhost ~]# init 1 [root@localhost ~]# telinit S
02 systemd 서비스 기본런레벨지정하기 예전 : 부팅할때동작할기본런레벨은예전에는 /etc/inittab 파일에지정 현재 : /etc/systemd/system 디렉터리아래의 default.target 으로지정 -> 다른 target 유닛에대한심벌릭링크 예 : 그래픽모드 ( 런레벨 5) 로기본런레벨을지정 [root@localhost ~]# ln -sf /lib/systemd/system/graphical.target /etc/systemd/ system/default.target 예 : 런레벨 3 을기본으로지정 [root@localhost ~]# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/ system/default.target 런레벨 0 이나런레벨 6 을기본런레벨로지정하면안됨 -> 왜? 현재런레벨확인하기 현재런레벨확인은 runlevel 명령을사용 [root@localhost ~]# runlevel S 5 [root@localhost ~]#
02 systemd 서비스 현재런레벨확인하기 systemctl 명령으로 target 을확인 [root@localhost ~]# systemctl -t target UNIT LOAD ACTIVE SUB JOB DESCRIPTION basic.target loaded active active Basic System cryptsetup.target loaded active active Encrypted Volumes getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems multi-user.target loaded active active Multi-User network.target loaded active active Network remote-fs.target loaded active active Remote File Systems sockets.target loaded active active Sockets swap.target loaded active active Swap sysinit.target loaded active active System Initialization syslog.target loaded active active Syslog LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. JOB = Pending job for the unit. 13 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'. [root@localhost ~]#
03 리눅스시스템의종료 리눅스를종료하는방법 shutdown 명령을사용한다. halt 명령을사용한다. poweroff 명령을사용한다. 런레벨을 0이나 6으로전환한다. reboot 명령을사용한다. 전원을끈다 -> 최후의수단
03 리눅스시스템의종료 shutdown 명령사용하기 리눅스시스템을가장정상적으로종료하는방법 shutdown 명령으로시스템즉시종료하기 -h 옵션과함께현재시간으로지정 [root@localhost ~]# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/ system/default.target
03 리눅스시스템의종료 shutdown 한다는메시지보내고종료하기 시스템을종료할때 shutdown 명령으로메시지를보낼수있음 사용자들이메시지를받고정리할시간이필요하므로시간을 now 로지정하면안되고특정시간을지정 예 : 2 분후에종료한다는메시지발송 [root@localhost ~]# shutdown -h +2 "System is going down in 2 min" 사용자터미널출력 [user1@localhost ~]$ Broadcast message from root@localhost.localdomain (Sat, 2013-06-08 14:25:38 KST): System is going down in 2 min The system is going down for power-off at Sat, 2013-06-08 14:27:38 KST! shutdown 명령으로시스템재시작하기 : -r 옵션사용 [root@localhost ~]# shutdown -r +3 Broadcast message from root@localhost.localdomain (Sat, 2013-06-08 14:29:35 KST): The system is going down for reboot at Sat, 2013-06-08 14:32:35 KST!
03 리눅스시스템의종료 shutdown 명령취소하기 : -c 옵션 [root@localhost ~]# shutdown -c 앞의 3 분후재시작명령취소할경우메시지출력 Broadcast message from root@localhost.localdomain (Sat, 2013-06-08 14:29:43 KST): The system shutdown has been cancelled at Sat, 2013-06-08 14:30:42 KST! shutdown 메시지만보내기 : -k 옵션 [root@localhost ~]# shutdown -k 2 Broadcast message from root@localhost.localdomain (Sat, 2013-06-08 14:37:19 KST): The system is going down for power-off at Sat, 2013-06-08 14:39:19 KST!
03 리눅스시스템의종료 런레벨변경하기 런레벨을 0 으로바꾸면시스템이종료 [root@localhost ~]# telinit 0 재시작하려면런레벨을 6 으로변경 [root@localhost ~]# telinit 6 systemd 로종료하기 [root@localhost ~]# systemctl isolate poweroff.target [root@localhost ~]# systemctl isolate runlevel0.target systemd 로재시작하기 [root@localhost ~]# systemctl isolate reboot.target [root@localhost ~]# systemctl isolate runlevel6.target
03 리눅스시스템의종료 기타시스템종료명령 시스템을종료하거나재시작하기위해사용할수있는명령 : halt, poweroff, reboot 이명령들은모두 systemctl 명령의심벌릭링크 [root@localhost ~]# cd /sbin [root@localhost sbin]# ls -l halt lrwxrwxrwx. 1 root root 16 10월 3 21:45 halt ->../bin/systemctl [root@localhost sbin]# ls -l poweroff lrwxrwxrwx. 1 root root 16 10월 3 21:45 poweroff ->../bin/systemctl [root@localhost sbin]# ls -l reboot lrwxrwxrwx. 1 root root 16 10월 3 21:45 reboot ->../bin/systemctl [root@localhost sbin]# halt, reboot, poweroff 명령은 /var/log/wtmp 파일에시스템종료기록을남기고시스템을종료하거나재시작 사용할수있는옵션 -n : 재시작이나종료전에 sync를호출하지않는다. -w : 실질적으로재시작하거나종료하지는않지만 wtmp 파일에기록을남긴다. -d : wtmp 파일에기록을남기지않는다. -n 옵션은 -d 옵션을포함한다. -f : 강제로명령을실행하며 shutdown을호출하지않는다. -p : 시스템의전원을끈다.
04 데몬프로세스 데몬 (daemon) 리눅스의백그라운드에서동작하면서특정한서비스를제공하는프로세스 리눅스시스템에서동작하는각종서비스를제공하는프로세스들이바로데몬 데몬의동작방식 독자형 (standalone) 시스템의백그라운드에서서비스별로항상동작 자주호출되는데몬이아니라면시스템의자원을낭비할우려 슈퍼데몬에의한동작방식 평소에는슈퍼데몬만동작하다가서비스요청이오면슈퍼데몬이해당데몬을동작시킴 독자형보다는서비스에응답하는데시간이약간더걸릴수있지만자원을효율적으로사용한다는장점 슈퍼데몬 유닉스에서슈퍼데몬의이름은 inetd 페도라에서는보안기능이포함된 xinetd를사용
04 데몬프로세스 데몬의조상 : systemd 와커널스레드데몬 systemd 데몬 init 을대체한데몬으로대부분의프로세스의조상프로세스 pstree 명령으로확인 [root@localhost sbin]# pstree systemd NetworkManager dhclient 3*[{NetworkManager}] 2*[abrt-watch-log] abrtd accounts-daemon {accounts-daemon} at-spi-bus-laun dbus-daemon {dbus-daemon} 3*[{at-spi-bus-laun}] at-spi2-registr {at-spi2-registr} atd auditd audispd sedispatch {audispd} {auditd} avahi-daemon avahi-daemon bluetoothd chronyd crond ( 생략 )
04 데몬프로세스 커널스레드데몬 커널의일부분을프로세스처럼관리하는데몬 ps 명령으로확인했을때대괄호 ([ ]) 로둘러싸여있는프로세스들 예전에는대부분 k로시작했으나요즘은이를반드시준수하지는않음 커널데몬은대부분입출력이나메모리관리, 디스크동기화등을수행하며대체로 PID가낮은번호로할당 커널데몬을동작시키는조상데몬은커널스레드데몬 (kthreadd): PID 2번 [root@localhost sbin]# ps -ef more UID PID PPID C STIME TTY TIME CMD root 1 0 0 20:35? 00:00:13 /usr/lib/systemd/systemd --switc hed-root --system --deserialize 21 root 2 0 0 20:35? 00:00:00 [kthreadd] root 3 2 0 20:35? 00:00:00 [ksoftirqd/0] root 5 2 0 20:35? 00:00:00 [kworker/0:0h] root 7 2 0 20:35? 00:00:00 [kworker/u:0h] root 8 2 0 20:35? 00:00:02 [migration/0] root 9 2 0 20:35? 00:00:00 [watchdog/0] root 10 2 0 20:35? 00:00:04 [migration/1] root 12 2 0 20:35? 00:00:00 [kworker/1:0h] root 13 2 0 20:35? 00:00:00 [ksoftirqd/1] ( 생략 )
04 데몬프로세스 주요데몬
05 부트로더 GRUB 의개요 GRand Unified Bootloader 의약자로, 리눅스의전통적인부트로더인 LILO 의단점을보완하여 GNU 프로젝트의일환으로개발 GRUB 는 LILO 에비해다음과같은장점을가지고있음 LILO 는리눅스에서만사용이가능하지만 GRUB 는윈도에서도사용할수있다. LILO 에비해설정과사용이편리하다. 부팅시에명령을사용하여수정이가능하다. 멀티부팅기능을지원한다. GRUB 의가장최신버전은 GRUB2 로페도라 16 부터기본부트로더로사용중
05 부트로더 GRUB2 관련디렉터리와파일 /boot/grub2/grub.cfg 파일 : 기존의 menu.lst 파일을대체하는기본설정파일 [root@localhost sbin]# more /boot/grub2/grub.cfg # # DO NOT EDIT THIS FILE # # It is automatically generated by grub2-mkconfig using templates # from /etc/grub.d and settings from /etc/default/grub # ### BEGIN /etc/grub.d/00_header ### if [ -s $prefix/grubenv ]; then load_env fi set default="${saved_entry}" if [ x"${feature_menuentry_id}" = xy ]; then menuentry_id_option="--id" else menuentry_id_option="" fi ( 생략 )
05 부트로더 GRUB2 관련디렉터리와파일 /etc/grub.d 디렉터리 : GRUB 스크립트를가지고있으며 GRUB 의명령이실행될때순서대로읽혀 grub.cfg 파일이생성 [root@localhost sbin]# ls /etc/grub.d 00_header 20_linux_xen 30_os-prober 41_custom 10_linux 20_ppc_terminfo 40_custom README [root@localhost sbin]# /etc/default/grub 파일 : GRUB 메뉴설정내용이저장 [root@localhost sbin]# cat /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release.*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora/swap rd.md=0 rd.dm=0 vconsole.keymap=us $([ -x /usr/sbin/rhcrashkernel-param ] && /usr/sbin/rhcrashkernel-param :) rd.luks=0 vconsole.font=latarcyrheb-sun16 rd.lvm.lv=fedora/root rhgb quiet" GRUB_DISABLE_RECOVERY="true" [root@localhost sbin]#
05 부트로더 단일사용자모드로부팅하기 1 시스템재시작하기 : 부팅할때 GRUB 메뉴초기화면이출력 [ 그림 8-10] GRUB 메뉴초기화면
05 부트로더 단일사용자모드로부팅하기 2 GRUB 편집모드로전환하기 : GRUB Boot Menu 가출력될때신속하게 e 키를눌러서편집모드로전환 [ 그림 8-11] GRUB 편집화면
05 부트로더 단일사용자모드로부팅하기 3 단일사용자모드로수정하기 리눅스커널정보가있는행에서 quiet 다음에 1을추가하면런레벨 1로부팅 이때는단일사용자모드로부팅한후 root 암호를물어봄 [ 그림 8-12] 단일사용자모드로부팅하기위해커널항목수정
05 부트로더 단일사용자모드로부팅하기 3 root 암호를복구하려면 quiet 다음에 init=/bin/bash 를추가 [ 그림 8-13] root 암호복구를위한커널항목수정
05 부트로더 단일사용자모드로부팅하기 4 재시작하기 F10 키를눌러재시작 -> init=/bin/bash를추가했다면바로 root계정으로동작 [ 그림 8-14] root 암호복구를위한화면
05 부트로더 단일사용자모드로부팅하기 루트파일시스템이읽기전용으로마운트되므로읽기 / 쓰기모드로다시마운트해야함 시스템의메시지가기본적으로한글로출력되는데콘솔모드에서는한글이출력되지않으므로언어를영어로바꿔야함 passwd 명령으로암호변경가능 [root@localhost /]# mount -o remount,rw / [root@localhost /]# LANG=en_US.UTF-8 [root@localhost /]# passwd root Changing password for user root. New password: Retype new password: passwd: all authentication tokens updated succesfully. [root@localhost /]# root 암호를수정하고재시작했는데로그인이안된다면 다시단일사용자모드로부팅하여 selinux 의설정파일 (/etc/selinux/config) 에서 SELINUX=disabled 로수정하고재시작해야함