본문 바로가기

13. OS

[Linux] 6. 리눅스 시스템의 부팅과 종료

https://www.yes24.com/Product/Goods/56681458

 

페도라 리눅스 - 예스24

시스템, 서버 및 네트워크, 보안까지 한 권으로 정복하는 페도라 리눅스리눅스에 대한 기본 지식을 쌓고자 하는 컴퓨터 관련 학과 학생을 대상으로 한다. 대부분의 윈도 사용자를 위해 리눅스를

www.yes24.com

 

리눅스의 부팅은 PC의 전원을 켜는 순간부터 리눅스가 완전히 동작하여 로그인 프롬프트가 출력될 때까지를 말한다. 이러한 리눅스의 부팅 과정을 잘 이해하고, 부팅할 때 필요한 서비스가 시작되도록 설정하고 부팅 과정에서 문제가 발생할 경우 이를 해결해야 한다.

 

 

◎ 리눅스 시스템의 부팅

 리눅스 시스템의 부팅 과정은 크게 PC 부팅(하드웨어 단계)과 리눅스 부팅으로 나뉜다. 리눅스가 설치된 하드웨어(ex. PC)의 부팅과 리눅스 운영체제의 부팅 절차로 구분할 수 있다.

 

● 바이오스 단계

 PC의 전원을 켜면 제일 먼저 바이오스(BIOS : Basic Input/Output System)가 동작한다. BIOS 는 시스템의 기본 입출력 시스템으로, 컴퓨터 전원이 켜지면 가장 먼저 실행되는 소프트웨어이다. BIOS는 하드웨어의 초기화(키보드, 디스크 등의 상태를 확인), POST(Power-On Self-Test) 수행, 디바이스 선택 등을 담당한다. 디바이스의 선택은 MBR를 읽어와서 부트 로더 단계에서 선택할 수 있게 화면에 보여준다.

 

POST(Power-On Self-Test)

컴퓨터의 전원이 켜질 때 자동으로 실행되는 자체 진단 프로세스이다. 이 프로세스는 하드웨어의 기본 기능을 확인하고 시스템이 부팅될 수 있는 상태인지를 판단하는데 사용된다.

 

ㆍMBR(Master Boot Record)

하드 디스크의 첫 번째 섹터에 위치한 작은 데이터 영역이다. 부트 로더와 파티션 테이블을 포함하고 있으며, 시스템이 부팅될 때 컴퓨터가 가장 먼저 읽는 영역 중에 하나이다.

 

 

● 부트 로더 단계

 바이오스 단계에서 MBR은 부트 로더를 찾아 메모리에 로딩한다. 부트 로더는 일반적으로 여러 운영체제 중에서 부팅할 운영체제를 선택할 수 있도록 메뉴를 제공한다.

 

부트 로더는 리눅스 커널을 메모리에 로딩하는 역할을 수행한다. 리눅스 커널은 /boot 디렉토리 아래에 'vmlinuz-버전명' 형태로 제공된다. 

 

리눅스의 대표적인 부트 로더는 GRUB와 LILO가 있다.

 

 

● 커널 초기화 단계

 부트 로더에 의해 메모리에 로딩된 커널은 가장 먼저 시스템에 연결된 장치들을 검사한다. 리눅스를 처음 시스템에 설치할 때 사용가능한 하드웨어의 정보를 미리 확인했다가, 부팅할 때 이러한 장치들이 사용 가능한 상태로 유지되고 있는지 확인하는 것이다. 이러한 기본적인 초기화 과정이 끝나면 커널은 일반적으로 프로세스를 만드는 방식인 fork를 사용하지 않고 프로세스와 스레드를 생성한다. 이러한 커널 프로세스들은 일반적인 프로세스와 구분되도록 대괄호([])로 표시하며, 주로 PID 번호가 낮게 배정되어 있다.

 

커널 프로세스가 생성되면 커널이 수행할 작업이 끝난다. 이제 systemd 서비스를 동작시킨다.

 

 

● systemd 서비스 단계

 systemd 서비스 단계에 이르면 리눅스가 본격적으로 동작하기 시작했다고 생각하면 된다. 서비스가 시작하는 과정은 화면에 메시지로 출력되는데 dmesg 명령이나 /var/log/boot.log 에서 확인할 수 있다. 

 

dmesg 명령으로 출력되는 메시지에는 데몬의 시작과 관련된 메시지뿐만 아니라 하드웨어 검서와 관련된 메시지도 모두 포함된다.

 

 

● 로그인 프롬프트 출력

systemd 서비스 단계에서는 데몬을 모두 실행한 뒤 마지막으로 로그인 프롬프트가 출력된다. 설치된 환경마다 다르겠지만 GDM(GNOME display manager)를 설치하였기 때문에 밑에 사진과 같이 화면이 나온다.

 

 

◎ systemd 서비스

 systemd는 리눅스의 시스템과 서비스 관리자로서 유닉스의 init 프로세스가 하던 작업을 대신 수행한다. 즉 systemd는 다양한 서비스 데몬을 시작하고, 프로세스들의 상태를 유지하며, 시스템의 상태를 관리한다.

PID 1 systemd

 

 

● init 프로세스

init 프로세스는 PID가 1번인 프로세스로 모든 프로세스의 조상 역할을 한다. init 프로세스는 부팅 과정에서 각종 서비스를 제공하는 셸 스크립트 파일을 실행한다. init 프로세스와 관련된 설정 파일은 /etc/inittab 이다.

대충 inittab 안쓰고 systemd 쓴다는 얘기

 

init 프로세스가 실행하는 스크립트 파일은 /etc/rc.d/init.d 디렉토리에 위치한다. 현재는 systemd 서비스에 의해 대부분 대체되고 일부 파일만 남아 있다.

/etc/rc.d/init.d

 

● init 프로세스와 런레벨

/etc/rc*.d 디렉토리는 Unix 및 Unix 계열 운영 체제에서 부팅 시에 실행되는 서비스 및 스크립트의 초기화 파일이 위치하는 디렉토리이다. 이 디렉토리들은 시스템의 런레벨에 따라 다르며, 보통은 다음과 같이 구성된다.

/etc/rc0.d : 시스템 종료(runlevel 0)에 필요한 서비스 및 스크립트의 설정을 포함한다.
/etc/rc1.d : 단일 사용자 모드(runlevel 1)에 필요한 서비스 및 스크립트의 설정을 포함한다.
/etc/rc2.d, /etc/rc3.d, /etc/rc4.d, /etc/rc5.d : 다중 사용자 모드(runlevel 2~5)에 필요한 서비스 및 스크립트의 설정을 포함한다.
/etc/rc6.d : 시스템 재부팅(runlevel 6)에 필요한 서비스 및 스크립트의 설정을 포함한다.

 

각 디렉토리에는 실행 파일들을 가리키는 심볼릭 링크들이 있다. 이 링크들은 /etc/init.d 디렉토리에 있는 실행 파일들을 가리키며, 해당 런레벨에서 실행될 때 스크립트가 실행된다.

 

 

◎ systemd의 기본 개념

systemd는 전체 시스템을 시작하고 관리하는데 유닛이라 부르는 구성 요소를 사용한다.

 

ㆍUnit

서비스, 타겟, 장치, 소켓 등과 같은 시스템 리소스 또는 구성 요소를 나타내는 개념이다. 각 유닛은 시스템의 다른 부분을 관리하고 제어하는 역할을 수행한다.

 

유닛 기능
service 백그라운드에서 실행되는 프로세스를 나타낸다.
주로 데몬 프로세스나 서비스를 실행하기 위해 사용된다.
socket 네트워크 소켓을 나타낸다. 네트워크 통신을 위해 사용되는 서비스들은 소켓 유닛을 통해 소켓을 생성하고 관리한다.
device 하드웨어 장치를 나타낸다.
mount 시스템 부팅 시에 특정 파일 시스템을 마운트 하는데 사용된다 .
automount 파일 시스템을 사용할 때만 마운트 하는데 사용된다.
즉 파일이나 디렉토리에 접근할 때마다 필요할 때만 해당 파일 시스템이 마운트되도록 할 수 있다.
target 다른 유닛들을 그룹화하고 의존성을 관리하기 위해 사용된다.
swap 스왑 파일 또는 스왑 파티션을 활성화하고 관리하는데 사용된다.
path 파일 또는 디렉토리의 생성, 삭제, 변경 등과 같은 이벤트가 발생 할 때 지정된 서비스를 실행하는데 사용된다.
timer 특정 시간 또는 주기적으로 실행해야 하는 작업이 있을 때 사용된다. 
slice 시스템 자원을 그룹화하고 제한하는데 사용된다.
CPU 및 메모리 사용량을 제한하고 프로세스 우선 순위를 설정 등의 용도로 사용된다 .
scope 서로 다른 프로세스들을 관리하는데 사용된다 . 해당 그룹에 대한 리소스 할당 및 제어를 지정하여 프로세스 간의 간섭을 최소화하고 시스템 자원을 효율적으로 관리할 수 있다.

 

silce와 scope 유닛은 모두 systemd에서 프로세스를 관리하고 그룹화하는데 사용된다. 

 

ㆍslice

주로 시스템 전반에 걸쳐 리소스를 관리하므로 전역적인 스코프를 가진다.

시스템의 모든 프로세스에 영향을 미친다.

 

ㆍscope

특정 프로세스 그룹을 격리하고 관리하므로 해당 그룹에만 적용되는 지역적인 스코프를 가진다.

 

 

systemd 기반으로 서비스를 시작하거나 종료할 때 사용하는 명령은 systemctl이다.

 

● systemctl [옵션] [명령] [유닛명]

systemd를 제어한다.

 

ㆍ옵션

-a : 상태와 관계없이 유닛 전체를 출력한다.

-t 유닛 종류 : 지정한 종류의 유닛만 출력한다.

 

ㆍ명령

start : 유닛을 시작한다.

stop : 유닛을 정지한다.

reload : 유닛의 설정 파일을 다시 읽어온다.

restart : 유닛을 재시작한다.

status : 유닛 상태를 출력한다.

enable : 부팅 시 유닛이 시작하도록 설정한다.

disable : 부팅 시 유닛이 시작하지 않도록 설정한다.

is-active : 유닛이 동작하고 있는지 확인한다.

is-enable : 유닛이 시작되었는지 확인한다.

isolate : 지정한 유닛 및 이와 관련된 유닛만 시작하고 나머지는 정지한다.

kill : 유닛에 시그널을 전송한다.

 

ex)

systemctl

systemctl -a

systemctl start atd.service

 

 

systemd의 런레벨은 target 유닛이며 /usr/lib/systemd/systemd 디렉토리에 해당 파일들이 있다.

 

런레벨 target 파일(심볼릭 링크) target 원본 파일
0 runlevel0.target poweroff.target
1 runlevel1.target rescue.target
2 runlevel2.target multi-user.target
3 runlevel3.target
4 runlevel4.target
5 runlevel5.target graphical.target
6 runlevel6.target reboot.target

 

ㆍ현재 target과 런레벨 확인하기

 

systemctl get-default : 현재 target을 확인.

runlevel : 런레벨을 확인. N 5는 런레벨 5로 부팅했다는 의미이다.

 

 

◎ 리눅스 시스템의 종료

리눅스를 종료하는 방법은 여러가지가 있다.

ㆍshutdown 명령을 사용한다.

ㆍhalt 명령을 사용한다.

ㆍpoweroff 명령을 사용한다.

ㆍ런레벨을 0이나 6으로 전환한다.

ㆍreboot 명령을 사용한다.

ㆍ전원을 끈다.

 

전원을 끄는 경우를 제외하고 종료 방법을 각각 살펴본다.

 

● shutdown 명령 사용하기

리눅스 시스템을 가장 정상적으로 종료하는 방법은 shutdown 명령을 사용하는 것이다. 시스템을 종료하는 다른 명령들과 달리 shutdown 명령은 다양한 종료 방법을 제공한다. 또한 시스템 종료 외에 런레벨을 바꿀 때도 사용할 수 있다.

 

shutdown

리눅스를 종료한다.

 

ㆍ옵션

-k : 실제로 시스템을 종료하는 것이 아니라 사용자들에게 메시지만 전달한다.

-r : 종료 후 재시작한다.

-h : 종료하며 halt 상태로 이동한다.

-f : 빠른 재시작으로 이 과정에서 fsck를 생략할 수도 있다.

-c : 이전에 내렸던 shutdown 명령을 취소한다.

시간 : 종료할 시간이다.(hh:mm, +m, now)

메시지 : 모든 사용자에게 보낼 메시지이다.

 

ex)

shutdown -h now :  시스템을 현재 시간에 즉시 종료하도록 지정.

shutdown -c : shutdown 명령을 취소한다.

shutdown -r +3 "System is going down" : 3분후 종료하도록 설정하고 사용자들에게 메시지를 보낸다.

shutdown -k 2 : 현재 시간을 알려주고 2분 후에 시스템이 종료된다는 메시지만 보낸다.

shutdown -k 2

 

 

● 런레벨 변경하기

시스템을 종료하는 다른 방법은 런레벨을 변경하는 것이다. telinit 명령으로 런레벨을 0으로 변경하면 시스템이 종료되고, 6으로 변경하면 재시작된다. systemd 기능을 사용할 때는 target을 바꾸면 된다.

 

systemctl isolate poweroff.target

systemctl isolate runlevel0.target

 

systemctl isolate reboot.target

systemctl isolate runlevel6.target

 

 

● 기타 시스템 종료 명령

shutdown 명령과 런레벨 변경 외에 시스템을 종료하거나 재시작하는데 사용할 수 있는 명령으로 halt, poweroff, reboot가 있다. 이러한 명령은 모두 systemctl 명령의 심볼릭 링크이다.

 

 

결국엔 모두 systemctl 명령으로 시스템을 종료하고 재시작한다는 의미이다. halt, poweroff, reboot 명령은 /var/log/wtmp 파일에 시스템 종료 기록을 남기고 시스템을 종료하거나 재시작한다. 이 명령들은 런레벨이 1~5일 때 내부적으로 shutdown 명령을 호출한다.

 

 

◎ 데몬 프로세스

 데몬(daemon)은 백그라운드에서 동작하면서 사용자가와 상호작용하지 않고 시스템 리소스를 관리하거나 특정한 서비를 제공하는 프로세스를 의미한다. 리눅스 시스템에서 동작하는 웹 서버나 데이터베이스 서버, 원격 접속 서버 등 각종 서비스를 제공하는 프로세스가 바로 데몬이다.

 

대부분의 데몬을 동작시키는 조상 데몬이 있다. 이미 살펴본 systemd와 커널 스레드 데몬이 바로 그것이다.

 

● systemd 데몬

systemd는 init를 대체한 데몬이다. systemd는 1번 프로세스로서 프로세스 대부분의 조상 프로세스이며, 시스템의 상태를 종합적으로 관리하는 역할을 수행한다. pstree 명령으로 프로세스의 실행 구조를 확인해보면 systemd가 다른 데몬들의 조상임을 더 명확하게 알 수 있다.

 

pstree 명령어

 

● 커널 스레드 데몬

커널의 일부분을 프로세스처럼 관리하는 데몬을 커널 데몬이라고 한다. 이는 ps 명령으로 확인했을 때 대괄호([])에 들어 있는 프로세스들이다. 커널 데몬은 대부분 입출력이나 메모리 관리, 디스크 동기화 등을 수행하며 대체로 낮은 PID가 할당되어 있다.

일반 프로세스의 조상 데몬이 systemd라면 커널 데몬을 동작시키는 조상 데몬은 커널 스레드 데몬이다. ps 명령으로 확인해보면 모든 커널 데몬의 PPID가 2번임을 알 수 있다. 

 

 

 

◎ 부트 로더

부트 로더는 커널을 메모리에 로딩하는 역할을 수행한다. 리눅스에는 LILO와 GRUB라는 두 가지 부트 로더가 있는데 간단하게 GRUB의 개요와 관리를 위한 핵심적인 내용만 작성하였다.

 

GRUB는 grand unified bootloader의 약자로 리눅스의 전통적인 부트 로더의 LILO의 단점을 보완하여 GNU 프로젝트의 일환으로 개발되었다. 

/boot/grub2/grub.cfg : GRUB2의 기본 설정 파일이다.

/boot/grub.d 디렉토리 : GRUB 스크립트들이 위치하고 있다.

/boot/default/grub 파일 : GRUB 메뉴 설정 내용이 저장되어 있다.

 

GRUB 부트 로더와 관련된 사용법 중에서 꼭 알아두어야 할 것은 root 암호를 복구하기 위해 단일 사용자 모드로 부팅하는 것이다. 

 

일단 시스템을 재시작하여 GRUB 메뉴 초기 화면으로 간다.

 

e 키를 눌러서 편집 모드로 전환한다.

 

 

편집모드에서 quiet 다음에 init=/bin/bash 를 추가하고 Ctrl-x를 눌러 시작한다.

 

 

그럼 위 화면 처럼 root 계정으로 동작한다. 이렇게 부팅된 경우 루트 파일 시스템이 읽기 전용으로 마운트되므로 읽기/쓰기 모드로 다시 마운트해야 한다. 또한 시스템의 메시지가 기본적으로 한글로 출력되는데 콘솔 모드에서는 한글이 출력되지 않기 때문에 언어를 영어로 바꿔야 한다.

 

부팅 후 LANG 설정 없이 할 경우

 

'13. OS' 카테고리의 다른 글

[Linux] 5. 파일 시스템과 디스크 관리  (1) 2024.03.28
[Linux] 4. 프로세스 관리하기  (0) 2024.03.21
[Linux] 3. 파일의 접근 권한  (0) 2024.03.18
[Linux] 2. shell  (1) 2024.03.18
[Linux] 1. 디렉토리와 파일  (0) 2024.03.14