2019/04/08

system 리눅스 부팅 시작 프로세스 정리

리눅스 부팅 시작 프로세스 정리

시스템이 응용 프로그램을 실행할 준비가 되려면 무엇이 필요한지 궁금한가?

리눅스 부팅 및 시작 프로세스를 이해하는 것은 리눅스를 구성하고 시작 문제를 해결할 수 있다는 점에서 중요하다.
이 문서는 grub2 부트로더를 사용하는 부트업 시퀀스와 systemd 초기화 시스템이 동작하는 순서에 대해 간략하게 설명한다.

grub2: https://en.wikipedia.org/wiki/GNU_GRUB
system: https://en.wikipedia.org/wiki/Systemd

실제로 리눅스 컴퓨터를 부팅중 일때 필요한 두 가지 이벤트가 있다.

- 부팅 및 시작
컴퓨터 전원 ON
커널 초기화
systemd 시작

시작 프로세스는 동작/점거 상태 정보를 리눅스 컴퓨터로 가져 오는 작업을 완료한다.

전반적인 리눅스 부팅 및 시작 프로세스는 이해하기 쉽다.

- BIOS POST
- 부트로더 (GRUB2)
- 커널 초기화
- 모든 프로세스의 부모인 system를 시작

GRUB2와 system는 최근에 발표된 리눅스에서 초기화 소프트웨어로 사용되고 있다.

1 부팅 프로세스
컴퓨터 전원 ON
부팅 프로세스 시작
루트 사용자 및 일반사용자 로그인

부팅 순서 변경
재 부팅

2. BIOS POST
컴퓨터 전원 ON
BIOS(기본 입출력 시스템)의 일부인 POST(Power On Self Test) 실행.

1981년 IBM 최초의 PC 설계.
BIOS 하드웨어 구성 요소로 하드웨어 초기화 설계.
POST는 컴퓨터 하드웨어가 올바르게 동작하는지 확인하기 위함이며, BIOS의 일 부분이다.
POST가 실패하면 컴퓨터를 사용할 수 없음(즉 부팅 프로세스를 진행 불 가능)

BIOS POST는 하드웨어의 기본 동작 가능성을 검사 한 다음 연결된 모든 부팅 장치에서 부팅 섹터를 찾는다.
부팅 섹터는 BIOS 인터럽트 INT 13H를 실행한다.
유효한 부트 레코드를 포함 하는 첫 번째 부트 섹터는 RAM에 로드 된 후 제어 명령을 부트 섹터에 로드 된 코드(grub)로 전송 된다.

부트 섹터가 실제 부트 로더의 첫 단계이다.
리눅스 사용되는 부트로더 grub, grub2, lilo가 있음.

3. GRUB
GRUB2는 "GRand Unified Bootloader, version 2"의 약자이다.
현재 대부분의 최신 리눅스 배포판에서 기본 부트로더를 사용한다.
GRUB2는 컴퓨터 운영체제 커널을 찾아 메모리에 로드 할 정도로 잘 만들어진 프로그램이다.

GRUB은 멀티 부트 사양과 호환되도록 설계되었다.
https://en.wikipedia.org/wiki/Multiboot_Specification
단일 운영 체제의 부트 레코드를 변경해 로드 할 수 있다.

GRUB은 설치된 리눅스 배포본에 대해 여러 다른 커널 중 하나를 선택해 부팅 할 수 있다.
업데이트 된 커널이 부팅이 안 될 경우 또는 특정 프로그램에서 동작 안할 경우 다른 이전 버전의 커널로 부팅 할 수 있다.
이러한 구성 파일은 /boot/grub/gurb.cnf 파일을 사용해 설정 할 수 있다.

grub1은 현재 레거시로 간주되며 대부분의 리눅스 배포판에서는 grub2로 변경 되었다.
grub2는 grub1을 다시 작성한 소프트웨어 프로그램이다.
grub2는 grub1과 동일한 부트 기능을 제공한다.
grub2는 메인 프레임과 유사한 명령 기반의 미리 정해진 OS 환경이기 때문에 부팅 전 단계에서 더 많은 유연성을 제공한다.
grub2는 /boot/grub2/gurb.cfg 파일로 설정 가능하다.

두 grub의 주요 기능은 리눅스 커널을 메모리에 로드해 실행하는 것이다.
두 버전의 grub은 본질적으로 동일한 방식으로 동작하며 동일한 세 단계를 거치지 만 grub 역할을 수행하는 방법에 대한 설명을 위해 grub2를 사용한다.

4. 단계별 절차.
1 시작
- BIOS POST 섹션 동작
- POST 끝날 때 연결된 디스크 MBR(마스터 부트 레코드)에 있는 부트 레코드 검색 찾기
- 부트 레코드 메모리 로드
- 부트 스트랩 코드, 즉 GRUB2 1 단계은 파티션 테이블 함께 하드 드라이브의 첫 번째 섹터 512 바이트 맞춤.
- 마스트 부트 레코드(https://en.wikipedia.org/wiki/Master_boot_record)에서 실제 부트 스트랩 코드에 할당 된 총 공간은 446 바이트 이다
- 1 단계 446 바이트 파일의 이름은 boot.img이며 별도로 부트 레코드에 추가되는 파티션 테이블은 포함하지 않는다.

부트 레코드는 작아야 하기 때문에 파일 시스템 구조를 이해하지 못한다.
따라서 1 단계의 유일한 목적은 1.5 단계 RAM에 로드 한 후 1 단계를 1.5 단계에서 제어 전환한다.

1.5 단계
위에서 언급했듯이 grub의 1.5 단계는 부트 레코드 자체와 디스크 드라이브의 첫 번째 파티션 사이의 공간에 있어야 한다.
이 공간은 기술적 이유(역사적)로 사용되지 않고 남겨놓았다.
하드 드라이브의 첫 번째 파티션은 섹터 63에서 시작 하고 섹터 0의 MBR과 함께 62 512-바이트 섹터-31744 바이트- 남겨둔다.
GRUB은 1.5단계인 core.img 파일을 저장 한다.
core.img 파일은 25389 바이트 이므로 MBR과 이를 저장할 첫 번째 디스크 파티션 사이에 충분 한 공간이다.

이 단계에서 수용 할 수 있는 많은 양의 코드로 인해 표준 ext linux 파일 시스템, fat, NTFS와 같은 공통 파일 시스템 드라이버를 포함 할 수 있다.
grub2의 2단계에서 표준 ext 파일 시스템을 사용할 수 있지만, 논리 볼륨에는 사용할 수 없다.
따라서 2단계 파일의 표준 위치는 /boot/ 파일시스템, /boot/grub2 에 있다.

/boot 디렉토리는 grub에서 지원하는 파일 시스템에 있어야 한다.
전체 파일 시스템은 아니다.
1.5 단계의 기능은 /boot 파일 시스템에서 2 단계에서 필요한 파일을 찾고 필요한 드라이버를 로드하는 데 필요한 파일 시스템 드라이버를 실행해 시작하는 것이다.

2 단계
이 단계의 grub 관련 모든 파일은 /boot/grub2 디렉토리 하위 디렉토리에 있다.
grub2에는 1단계와 2단계와 같은 이미지 파일은 없다.
대신, 대부분은 /boot/grub2/i386-pc 디렉토리에서 필요에 따라 로드되는 런타임 커널 모듈로 구성된다.

grub2 2단계의 기능은 리눅스 커널을 찾아서 RAM에 로드하고 컴퓨터를 제어하는 것이다.
커널 및 관련 파일은 /boot/ 디렉토리에 있다.
보통 커널 파일은 vmlinuz로 시작하는 이름으로 식별 할 수 있다.
/boot/ 디렉토리의 내용을 나열하여 현재 시스템에 설치된 커널을 볼 수 있다.

grub2는 여러 리눅스 커널 중 하나를 선택해 부팅을 지원한다.

grub2의 2단계는 선택한 커널을 메모리에 로드하고 컴퓨터 제어를 커널에게 넘기는 것이다.

3 핵심
모든 커널은 공간을 절약하기 위해 압축 해제 된 자체 압축 형식으로 되어있다.
커널은 RAM 디스크 이미지 및 하드 드라이브의 장치 맵과 함께 /boot 디렉토리에 있다.

선택한 커널을 메모리에 로드하고 실행 한 후에는 RAM 디스크 압축을 풀기 전 커널 버전과 맞는 RAM 디스크 파일을 풀어야 한다.
커널이 압축을 풀면 systemd를 로드한다.
systemd는 이전 방식 sysv(BSD) init(유닉스) 프로그램을 대체하는 방식이다.

https://en.wikipedia.org/wiki/Systemd
https://en.wikipedia.org/wiki/Init#SysV-style

여기 까지가 부팅 과정이 끝이다.
이 시점에서, 리눅스 커널 및 systemd 실행 하지만, 최종 사용자는 아직 아무런 작업을 수행할 수 없다.

4. 시작 프로세스
시작 프로세스는 부팅 프로세스를 따르고, Linux 컴퓨터는 생산적인 작업에 사용할 수 있는 작동 상태를 제공 합니다.

5. systemd
systemd는 모든 프로세스의 모체이며 리눅스 호스트를 생산적인 작업을 수행 할 수 있는 상태로 만든다.
이전 init 프로그램보다 훨씬 광범위한 기능 중 일부는 파일 시스템 마운트, 시스템 서비스 시작 및 관린, 실행중인 리눅스 호스트 관리가 여러 측면에 보강 되었다.
시동 순서와 관련이 없는 systemd의 작업은 여기서는 언급하지 않느다.

먼저, systemd는 스왑 파일이나 파티션을 포함하여 /etc/fstab에 정의 된대로 파일 시스템을 마운트 한다.
이 시점에서 /etc/ 에 있는 구성 파일에 접근 할 수 있다.
구성 파일 /etc/systemd/system/default.target 을 사용하여 호스트를 부트하기 위해 상태 또는 대상을 결정 한다.
default.target 파일은 실제 대상 파일 만 심볼릭 링크한다.
데스크탑 워크스테이션의 경우 일반적으로 이전의 systemV init에서 runlevel 5와 동일한 graphical.target이 된다.
서버의 경우 기본값은 SystemV에서 실행 레벨 3과 같은 다중 사용자 모드일 가능성이 크다.
emergency.target은 단일 사용자 모드와 유사하다.

systemd 시작과 이전 버전의 systemV 시작 런레벨을 비교 한다.
halt.target: 시스템 전원을 끄지 않고 시스템 정지
0|poweroff.target|runlevel0.target: 시스템을 정지하고 전원을 끈다
S|emergency.target|:단일 사용자 모드. 실행중인 서비스가 없다. 파일 시스템이 마운트되지 않는다. 사용자가 시스템과 상호 작용할 수 있도록 복구 쉘만 주 콘솔에서 실행
1|rescue.target|runlevel1.target: 기본 시스템이며 가장 기본적인 서비스만 실행하고 기본 콘솔 구조 쉘을 마운트한다.
2||runrevel2.target: 다중 사용자, NFS, GUI 지원 하지 않는 모드
3|multi-user.target|runlevel3.target: 모든 서비스가 실행 중이자만 명령해 인터페이스 CLI 모드
4||runlevel4.target: 미사용
5|graphicla.target|runlevel5.target:GUI 다중 사용자 모드
6|reboot.target|runlevel6.target: 재부팅

default.target : 이 대상은 multi-user.target 또는 graphical.target에 대한 심볼릭 링크로 앨리어싱된다.
systemd는 항상 default.target을 사용하여 시스템을 시작한다.
default.target은 절대로 halt.target, poweroff.target, reboot.target 으로 지정하면 된다.

현 런레벨 확인.
sudo systemctl get-default
graphical.target ---> 그래픽 모드

런레벨 종류
0: poweroff.target
1: rescue.target
2,3,4: multi-user.target
5: graphical.target
6: reboot.target

런레벨 변경.
sudo systemctl set-default multi-user.target
Alt+F1 = 로그인 화면 이동.

각 런레벨 구성 파일에는 일련의 종속성이 있다.
systemd가 필요한 종속성을 시작한다.
이러한 종속성은 특정 기능 수준에서 리눅스 호스트를 실행하는 데 필요한 서비스이다.

system는 또한 레거시 SystemV init 디렉토리를 보고 거기에 시작 파일이 있는지 확인한다.
SystemV init 구성 파일이 있으면 서비스를 시작한다.

부트업 맨 페이지 확인.
http://man7.org/linux/man-pages/man7/bootup.7.html

sysinit.target 및 basic.target 은 시작 프로세스의 체크 위치로 간주 된다.
systemd가 서비스를 시작 할 때 병렬로 서비스를 동작 시키기 위한 방법으로 설계 되었다.
하지만, 더욱 유연성을 고려해 systemd 가 시작 하기전 동작 해야할 특정 서비스 실행 할 수 있다.
이러한 검사 방법으로 모든 서비스에 대해 동작 시킬 수 가 있게된다.

sysinit.target 은 종속되는 모든 유닛이 완료 처리.
모든 유닛. 마운트 파일 시스템, 스왑 파일 설정, udev 시작, 임의 생성 시드 설정, 하위 레벨 서비스 시작, 하나 이상의 파일 시스템이 암호화 되어있는 경우 암호화 서비스 설정은 sysinit 내용에 완료된다.
targeting 이러한 작업을 병렬로 처리한다.

sysinit.target는 간략한 시스템 기능 측면이 고 basic.target으로 이동 하는 데 필요한 모든 하위 수준 서비스와 장치를 시작 한다.

           local-fs-pre.target
                    |
                    v
           (various mounts and   (various swap   (various cryptsetup
            fsck services...)     devices...)        devices...)       (various low-level   (various low-level
                    |                  |                  |             services: udevd,     API VFS mounts:
                    v                  v                  v             tmpfiles, random     mqueue, configfs,
             local-fs.target      swap.target     cryptsetup.target    seed, sysctl, ...)      debugfs, ...)
                    |                  |                  |                    |                    |
                    \__________________|_________________ | ___________________|____________________/
                                                         \|/
                                                          v
                                                   sysinit.target
                                                          |
                     ____________________________________/|\________________________________________
                    /                  |                  |                    |                    \
                    |                  |                  |                    |                    |
                    v                  v                  |                    v                    v
                (various           (various               |                (various          rescue.service
               timers...)          paths...)              |               sockets...)               |
                    |                  |                  |                    |                    v
                    v                  v                  |                    v              rescue.target
              timers.target      paths.target             |             sockets.target
                    |                  |                  |                    |
                    v                  \_________________ | ___________________/
                                                         \|/
                                                          v
                                                    basic.target
                                                          |
                     ____________________________________/|                                 emergency.service
                    /                  |                  |                                         |
                    |                  |                  |                                         v
                    v                  v                  v                                 emergency.target
                display-        (various system    (various system
            manager.service         services           services)
                    |             required for            |
                    |            graphical UIs)           v
                    |                  |           multi-user.target
                    |                  |                  |
                    \_________________ | _________________/
                                      \|/
                                       v
                             graphical.target


system.target이 완료된 후 systemd는 basic.target을 시작하여 이를 수행하는 데 필요한 모든 유닛을 시작한다.
기본 목표는 다음 target(대상)에 필요한 유닛을 시작하여 몇 가지 추가 기능을 제공한다.
여기에는 다양한 실행 가능한 디렉토리 위치에, 통신 소켓 및 타이머에 대한 경로 설정과 같은 것들이 포함된다.

마지막으로, 사용자 레벨 목표 인 multi-user.target 또는 graphical.target 을 초기화 할 수 있다.

multi-user.target은 콘솔 텍스트 모드로 로그인 할 수 있다.
graphical.target이 기본이면 그래픽 로그인을 볼 수 있다.
GUI 로그인 화면은 사용 하는 기본 디스플레이 관리자에 따라 다르다.

DM: Displayer Manager
|Desktop|Display manager|설명|
|GNOME  |GDM|그놈 디스플레이 메니저|
|KDE    |KDM|KDE 기반 디스플레이 메니저|
||LightDM|조그만한 디스플레이 메니저|
|LXDE|LXDM|LXDE 디스플레이 메니저|
|KDE|SDDM|단순한 데스크탑 디스플레이 메니저|
||XDM|기본 X 윈도우 시스템 디스플레이 메니저|

WM: Windows Manager: X window System:https://en.wikipedia.org/wiki/X_Window_System
|Desktop|Window manager|설명|
|Unity|Compiz
||FluxBox||
||FVWM||
||IceWM||
|KDE|Kwin|2008년 KDE Plasma 4 시작|
|GNOME|Metacity|그놈 2의 기본값
|GNOME|Mutter|그놈 3의 기본값
||twm|아주 오래되고 간단한 창 관리자|
|Xfce|Xfwm||

요즘 새롭게 나온 WM: Windows Manager인 Wayland: https://en.wikipedia.org/wiki/Wayland_(display_server_protocol)


6. 문제점
/etc/default/grub 수정시 원하는 커널로 부팅 되지 않을 경우가 발생.
GRUB_DEFAULT = GRUB_DEFAULT = 2

수정 후 저장.
grub2-mkconfig > /boot/grub2/grub.cfg
또는
grub-mkconfig > /boot/grub/grub.cfg

7. 결론
grub2 및 systemd init 시스템은 대부분 최신 리눅스 배포판에서 사용된다.
부팅 및 시작 단계의 핵심 구성 요소이다.
특히 systemd를 둘러싼 논쟁이 있었음에도 불구하고 이 두 구성 요소는 커널을 처음 로드하고 리눅스 시스템의 기능을 생성하는 데 필요한 모든 서비스를 시작 할 수 있다.

이전 버전보다 grub2와 systemd가 더 복잡하지만, 기능을 습듭하면 관리하기가 쉽다.
systemd 메뉴얼 페이지: https://www.freedesktop.org/software/systemd/man/index.html