부트 매니저 - LILO, GRUB
System/OS - Linux

부트 매니저 - LILO, GRUB

728x90

부트 매니저(Boot Manager) = 부트 로더(Boot Loader)

부팅을 도와주는 역할을 하는 프로그램; 컴퓨터를 처음 시작했을 때 가장 먼저 실행되는 소프트웨어 프로그램이다.

한 컴퓨터에 다양한 운영체제가 설치되어 있을 경우에 선택하여 부팅할 수 있도록 한다.

하드 디스크의 맨 앞쪽 영역인 MBR(Master Boot Record)에 설치된다.

**MBR: 부트 섹터(Boot Sector)/파티션 섹터(Partition Secotr); 디스크의 첫 번째(0번) 섹터이고, 크기는 512byte이다. 이 영역에 부트 로더 프로그램과 파티션 정보를 기록한다. 이 정보들을 통해 운영체제가 어디에 위치해 있는지 파악하고 선택한 운영체제를 주메모리 또는 RAM에 부팅한다.

리눅스에서 사용하느 가장 대표적인 부트 매니저 프로그램은 LILO와 GRUB이다. 


LILO (LInux LOader)

리눅스 전용 부트 로더

특정 파일 시스템에 구애받지 않고 플로피 디스크와 하드 디스크를 이용한 부팅을 지원했고, 초창기에 주로 사용한 부트 매니저 프로그램이다. 현재에는 잘 쓰이고 있지 않다.

하드 디스크에 접근할 때 BIOS의 정보만을 참고하는데, 초기 BIOS는 0~1023의 1024개의 실린더까지만 인식해 8GB가 넘는 곳에 리눅스가 설치되어 있는 경우 부팅되지 않았다. 

환경 설정 파일인 "/etc/lilo.conf"를 수정하고 난 뒤 "lilo"라는 명령어를 수행해야만 부팅되는 불편함이 있다.


GRUB (GRand Unified Bootloader)

GNU 프로젝트에서 만든 부트 로더

다양한 파일 시스템을 지원하고, 부팅 할 때는 커널 인자를 조정하여 동적 부팅을 지원한다. 기본적으로 메뉴 인터페이스 방식을 제공하지만, Bash Shell과 같은 명령 프롬프트 모드를 추가로 제공하고 있다. 그래픽 메뉴와 배경 그림 삽입 등 다양한 기능을 제공한다. 따라서 현재는 LILO보다는 GRUB을 주로 사용하고 있고, CentOS 7부터는 GRUB2 버전을 제공하고 있다. (shell script 문법을 사용하기 때문에 GRUB1보다 어려운 편...이지만 조건식과 함수를 사용할 수 있게되었다!)

더보기

**동적 부티으로 동적 모듈을 로드할 수 있다. 동적 모듈들은 /boot/grub2/i386-pc/ 디렉터리에 mod ㅏㅍ일로 존재하고, GRUB2는 필요에 따라 파일들을 로드할 수 있게 되어 있다.


GRUB의 부트 화면

가장 처음으로 보이는 초기 GRUB의 메뉴 화면이다. 메뉴 목록 형식으로 운영체제의 목록을 보여준다. 일정 시간 동안 어떠한 동작을 취하지 않으면 기본 모드로 부팅되고, 상하(↑/↓) 방향키로 원하는 운영체제를 선택하고 [Enter]키를 누르면 해당 운영체제로 부팅된다. 또는 메뉴 화면에서 [e]키를 누르면 편집모드, [c]키를 누르면 명령 프롬프트 모드로 넘어가 커널 인자값 조정을 통한 부팅환경을 수정할 수 있다.


GRUB의 부팅 모드

편집 모드

초기 GRUB 부트 화면에서 [e]키를 누르면 연결된다. 설정된 항목들이 나타나면서 사용자가 방향키를 이용해 편집하려는 부분으로 이동해 직접 편집할 수 있도록 한다.

[Ctrl] + [X]를 누르면 부팅이 시작되고

[Ctrl] + [C]를 누르면 명령 프롬프트 모드를 호출한다.

[ESC]키를 누르면 초기 GRUB 메뉴로 돌아간다.

명령 프롬프트 모드

초기 GRUB 부트 화면에서 [c]키를 누르면 진입하게 된다. Bash Shell과 비슷하게 상호대화식으로 직접 입력할 수 있도록 환경이 되어있다. 커널 경로와 파일의 이름만 알면 부팅이 가능해진 것이다. 순차적으로 내용들을 입력하고 가장 마지막 라인에서 boot라고 입력하면 부팅이 된다.

[Tab]키를 누르면 명령행 자동완성 기능을 사용할 수 있다.

[ESC]키를 누르면 명령 프롬프트 모드를 취소할 수 있다.


GRUB의 설정 파일

CentOS 7에서 GRUB의 환경 설정 파일: 'boot/grub2/grub.cfg' → 심볼릭 링크 파일: '/etc/grub2.cfg'

"grub.cfg" 파일은 셸 스크립트 형태로 작성되어 있고 '/etc/grub.d'의 파일들과 '/etc/default/grub' 파일을 참고하여 동작한다. "grub.cfg"는 일반 사용자에게 읽기 전용이고, root 사용자도 직접 편집할 수 없게 되어있기 때문에 설정 내용을 변경하고 싶으면 '/etc/grub.d'과 '/etc/default/grub' 파일을 수정한 후 # grub2-mkconfig 명령을 실행해야 한다. (GRUB 운영관련 주요 설정들은 '/etc/default/grub' 파일에 있다)

 

/etc/default/grub 파일의 설정 내용

아래 실습을 먼저 해서 net.ifnames=0 설정값이 있다

GRUB_TIMEOUT=5 GRUB 부트 화면에서 대기하는 시간을 초단위로 지정한다.
GRUB_DISTRIBUTOR="$(sed 's, release.*)"GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB 부트화면에서 각 entry 앞에 보여질 리눅스 배포판의 이름을 추출할 때 사용한다. 현재 설정파일은 '/etc/system-release' 파일에서 'CentOS Linux'라는 문자열이 추출되게 한다.
GRUB_DEFAULT=saved 부트 화면에 제시된 목록 중 기본으로 부팅될 모드를 선택한다. 일반적으로 인덱스값으로 0번부터 N번까지의 정수값을 입력한다.
현재 설정된 'saved'는 기본 메뉴 목록이 'GRUB_SAFEDEFAULT' 또는 'grub-set-default'에 의해 저장되게 한다.
GRUB_DISABLE_SUBMENU=true 서브 메뉴의 사용 여부를 설정한다. 즉, grub-mkconfig에서 버전 번호가 가장 높은 커널을 최상위 메뉴 항목으로 생성하고 다른 모드의 커널 또는 복구 모드에 대한 대체 항목을 하위 메뉴로 생성한다. 'true'로 설정하면 하위 메뉴를 생성하지 않는다.
GRUB_TERMINAL_OUTPUT="console" GRUB이 출력되는 터미널 장치를 설정한다. 'console'로 설정해 모니터로 출력되도록 한다. 그 외에 'serial', 'gfxterm' 등으로 설정할 수 있다
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet" 커널 인자값을 지정하는 항목이다. 
GRUB_DISABLE_RECOVERY="true" 부트 메뉴 목록에 복구 모드의 표시 여부를 지정한다. 'true'로 설정하면 목록에 나타나지 않는다.

# grub2-mkconfig

GRUB 환경 설정 파일을 생성하는 명령어다. 환경 설정 파일을 변경한 후 반드시 실행해야한다!

# grub2-mkconfig [-o 파일명]

옵션 o: GRUB의 환경 설정 파일을 생성할 때 파일을 지정한다. (--output=파일명 과 같다)


GRUB 활용

root 패스워드를 잊어버린 경우

root 패스워드를 다시 설정하기 위해 리눅스를 응급 복구 모드로 부팅해야한다. (CentOS 6 이전 버전은 단일 사용자 모드)

응급 복구 모드로 진입하게 되면 시스템 점검 관련작업을 수행할 수 있게 되고, 별도의 아이디, 패스워드 없이 사용자 권한이 root인 상태로 로그인된다. 응급 복구 모드로 접속한 후 # passwd 명령을 이용해 패스워드를 재설정할 수 있다.(ubuntu에서는 따로 응급 복구모드로 진입할 필요가 없었다)

[실습]

① 시스템을 재부팅하고 GRUB 부트 메뉴 창이 나오면 [e]키를 눌러 커널 인자값을 수정할 수 있는 편집상태로 진입한다.

② 커널 인자값이 있는 맨 마지막 부분으로 이동한 후 커널 인자값인 'ro rhgb quiteLANG=ko_KR.UTF-8'를 지우고 'rw init=/bin/sh'를 입력한다.

변경 전 (내 CentOS7에는 crashkernel=auto 값이 중간에 들어가있었다)
변경 후

(+) USB 키보드를 사용하거나 KVM 및 VirtualBox 기반의 가상 게스트인 경우 init=/bin/sh 로 변경해도 패스워드가 변경되지 않는 경우가 있다. 이럴 때에는 rb.break로 설정하면 된다.

 

③ [Ctrl] + [X]를 눌러 부팅한다.

부팅 진행 중...
부팅 완료! 응급 복구 모드에 진입한 듯 하다!

④ 사용자 확인 후 passwd 명령을 사용해 패스워드를 변경한다.

⑤ 패스워드 변경 후, SELinux를 사용하는 겨웅에는 라벨 변경 명령을 실행해야 한다. 그 후, 재부팅한다.


GRUB 패스워드 설정

위의 경우와 같이 물리적으로 시스템에 접근할 수 있다면 누구나 쉽게 응급 복구 모드에 접근하여 root의 패스워드를 임의로 변경할 수 있게된다. 응급 복구모드에 접근할 수 없도록 GRUB에 패스워드를 설정할 수 있다.

/etc/grub.d/00_header 파일의 설정을 변경하고 grub2-mkconfig 명령을 실행해 변경한 설정 내용을 반영시킨다.

[실습]

① /etc/grub.d/00_header 파일의 가장 아래에 다음 4개의 행을 추가하고 저장한다. 여기서 설정한 superusers는 GRUB의 사용자로, 기존 리눅스 사용자와 관련이 없기 때문에 새로 지정하면 된다.

/etc/grub.d/00_header 설정 변경

② # grub2-mkconfig -o /boot/grub2/grub.cfg 명령을 실행한다.

③ 재부팅 후 GRUB 초기화면에서 [e]키를 눌러 편집모드로 진입하면 사용자명과 패스워드를 입력하도록 한다.

편집모드 진입


콘솔 모드의 터미널 해상도 변경

X윈도우 모드의 해상도 변경은 "설정" 페이지로 들어가 쉽게 바꿀 수 있다. 콘솔 모드(텍스트 모드)의 경우에는 따로 설정 아이콘이 없기 때무에 설정파일을 수정해 터미널의 해상도를 바꿀 수 있다.

콘솔 모드의 해상도 관련 설정파일은 "/etc/default/grub"이고 해상도와 관련한 부분은 GRUB_CMDLINE_LINUX="rhgb quiet"이다. 이 항목의 뒷 부분에 'vga=값'을 추가한다.

color / 해상도 640*480 800*600 1024*768 1280*1024 1600*1200
8bit(256) 769 771 773 775 796
16bit(65, 536) 785 788 791 794 798
24bit(16.8M) 786 789 792 795 799

△ 해상도 조정을 위한 VGA 코드값

[실습]

① "/etc/default/grub.conf" 파일에서 해상도 관련 설정(vga=값)을 추가한다.

vga 값 추가

② 변경한 내용을 적용하기 위해 # grub2-mkconfig 명령을 실행하고 재부팅한다.

재부팅 후 해상도가 변경되었음을 확인할 수 있다


네트워크 어댑터 이름 변경

네트워크 어댑터의 정보를 확인하기 편하게 하기위해 네트워크 어댑터의 이름을 변경한다. CentOS 6 이전 버전에서는 eth0, eth1 등의 형식으로 어댑터들의 이름이 부여되었지만 CentOS 7부터는 enp0s3 등의 형식으로 부여되기 때문에 이름으로 직관적인 정보 파악이 어렵다. 따라서 커널 매개 변수를 추가해 네트워크 어댑터의 이름을 이전 형식으로 변경한다.

"/etc/default/grub.conf" 파일에서 커널 매개 변수와 관련된 항목인 GRUB_CMDLINE_LINUX의 값에 'net.ifnames=0'을 추가한다.

[실습]

① "/etc/default/grub" 파일에서 'net.ifnames=0'을 추가한다.

변경 전 네트워크 어댑터의 이름

② 변경된 내용을 적용하기 위해 # grub2-mkconfig -o /boot/grub2/grub.cfg 명령을 실행하고 재부팅한다.

재부팅 후 변경된 네트워크 어댑터의 이름을 확인할 수 있다.

::참고::

MBR 관련(whatis.techtarget.com/definition/Master-Boot-Record-MBR#:~:text=The%20Master%20Boot%20Record%20(MBR,storage%20or%20random%20access%20memory.)

책 CentOS 7으로 리눅스마스터 1급 정복하기 (정성재/북스홀릭)

책 이것이 리눅스다 with RedHat CentOS 8 (우재남/한빛미디어)

SMALL

'System > OS - Linux' 카테고리의 다른 글

리눅스 기초 명령어-파일, 디렉터리  (0) 2021.02.06
리눅스 디렉터리(Directory)  (0) 2021.01.22
LVM  (0) 2021.01.21
RAID  (0) 2021.01.21
[CentOS 8] APM 웹 서버  (0) 2020.12.10