cmod.ify

[LINUX] 부팅 시스템 본문

BASIC/LINUX

[LINUX] 부팅 시스템

modifyC 2026. 1. 9. 19:38
728x90
반응형

1. 리눅스 부팅 시스템 개요

  • 정의: PC 전원을 켜는 순간부터 시스템이 완전히 동작하여 로그인 프롬프트가 출력될 때까지의 전 과정을 의미함.
  • 중요성: 부팅 시 필요한 서비스의 시작 순서를 결정하고, 장애 발생 시 원인을 파악하여 해결하기 위해 과정에 대한 이해가 필수적임.
  • 전체 흐름: 전원 ON → BIOS 단계 → 부트 로더(Boot Loader) → 커널 초기화(Kernel Initialize) → systemd 서비스 → 로그인 프롬프트 출력.
    • 1, 2단계(하드웨어 제어)는 리눅스 운영체제 자체와는 무관한 단계임.

2. 부팅 단계별 상세 과정

2.1 BIOS (Basic Input Output System) 단계

  • 역할: ROM에 저장되어 있어 ROM BIOS라고도 불리며, 키보드, 디스크 등 하드웨어 상태를 점검함.
  • 부팅 매체 선택: 부팅 장치를 선택한 후 디스크의 첫 번째 섹터인 MBR(Master Boot Record, 512B)을 로딩함.
  • 작동 원리: MBR에 저장된 파티션 정보 및 부트 로더 위치를 확인하여 부트 로더를 메모리에 로딩함.

2.2 부트 로더 (Boot Loader) 단계

  • 역할: 운영체제 선택 메뉴를 제공하고 리눅스 커널을 메모리에 로딩함.
  • GRUB (Grand Unified Bootloader): 우분투의 기본 부트 로더로 사용됨.
    • /boot 디렉토리 내 vmlinuz-버전명 형태의 커널 파일을 찾아 메모리에 올림.
  • 부팅 메뉴 설정: 기본적으로 단일 OS 환경에서는 메뉴를 숨김 처리함.
    • 설정 변경 경로: /etc/default/grub
    • GRUB_TIMEOUT_STYLE=hidden: 주석 처리 시 부팅 메뉴 출력 가능함.
    • GRUB_TIMEOUT=0: 메뉴가 표시되는 대기 시간을 설정함.
    • 설정 적용: 수정 후 반드시 sudo update-grub 명령을 수행해야 함.

2.3 커널 초기화 (Kernel Initialize) 단계

  • 역할: 시스템에 연결된 하드웨어 장치들을 사용할 수 있도록 준비(초기화)함.

2.4 systemd 서비스 시작 단계

  • 역할: 하드웨어 준비 완료 후, 소프트웨어 및 각종 시스템 서비스를 실행하여 사용 환경을 조성함.

3. 부팅 메시지 및 로그 확인

  • 부트 스플래시: GUI 환경에서는 부팅 메시지 대신 이미지가 출력됨.
  • 부팅 메시지 출력 설정: 부팅 실패 원인을 파악해야 할 때 사용함.
    • /etc/default/grub 파일 내 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"에서 quiet 제거 후 업데이트(sudo update-grub) 수행함.
  • 로그 확인 경로: 부팅 후 메시지를 다시 확인하고자 할 때 참조함.
    • /var/log/boot.log 또는 /var/log/bootstrap.log 파일 확인.
  • 프로세스 확인: ps -ef | more 명령을 통해 현재 실행 중인 모든 서비스 프로세스를 확인 가능함.

4. systemd service 

개요

systemd는 리눅스 시스템의 서비스 관리자로, 과거 유닉스의 init 프로세스가 하던 역할을 계승함. 다양한 서비스 데몬을 시작하고 프로세스 상태를 유지하며, 시스템 전체의 상태를 통합 관리함.

  • 관련 명령어: man init을 통해 상세 정보를 확인할 수 있음.

init vs systemd

현재 리눅스 시스템은 과거의 방식과 새로운 방식이 공존하는 과기기적 형태를 띠고 있음.

  • init 방식: 관련 스크립트 파일이 /etc/init.d 디렉토리에 존재하며, 현재까지도 호환성을 위해 남아있음.
  • RunLevel: 응급 복구 모드(1, S, s)를 포함하여 시스템의 동작 상태를 정의함.
  • 공존: 구형 init 스크립트 방식과 최신 systemd 서비스가 시스템 내에서 함께 동작함.
  • 경로 확인: ls -l /etc/systemd 명령어로 설정 확인 가능.

systemd의 주요 장점

systemd는 기존 init 방식보다 빠르고 효율적인 관리 기능을 제공함.

  1. 소켓 기반 동작: inetd와 호환성을 유지하며 서비스 요청 시 즉각 대응.
  2. 병렬 부팅: 쉘과 독립적으로 부팅이 가능하여 부팅 속도가 비약적으로 빠름.
  3. 정교한 마운트 제어: 파일 시스템을 프로세스 root 아래에 올리는 마운트 과정을 직접 제어함.
  4. fsck 제거 가능: 부팅 시 파일 시스템 체크(File System Check) 과정을 최적화하거나 생략 가능.
  5. 스냅샷 지원: 시스템 상태의 복사본(백업)인 스냅샷을 유지하여 복구 용이.
  6. 시그널 전송: 개별 서비스에 직접 시그널을 보내 제어 가능.
  7. 안전한 종료: 시스템 셧다운 전 사용자 세션을 안전하게 정리함.

systemd unit

systemd는 유닛(Unit)이라는 구성 요소를 사용하며, 서비스이름.유닛종류 형태로 관리함.

유닛 종류 설명
service 데몬 시작, 종료, 재시작 및 로드 등 시스템 서비스 관리
target 여러 유닛을 논리적으로 그룹화 (RunLevel과 유사)
automount 특정 디렉토리 접근 시 자동 마운트 포인트 관리
device 리눅스 장치 트리 내의 하드웨어 장치 관리
mount 파일 시스템 마운트 포인트 관리
path 파일/디렉토리 경로의 변화 감시 및 관리
scope 외부에서 생성된 프로세스 그룹 관리
slice 프로세스를 계층적으로 관리하여 자원 할당 제어
socket 통신을 위한 소켓 관리
swap 스왑 메모리 장치 및 파일 관리
timer 특정 시간 또는 간격에 따라 실행되는 기능 관리

systemctl 명령어 활용

systemctl [옵션] [명령] [유닛이름] 형식을 사용하여 시스템을 제어함.

1) 주요 옵션

  • -a: 상태와 관계없이 전체 유닛 리스트 출력.
  • -t [유닛종류]: 특정 종류의 유닛만 필터링하여 출력.

2) 필수 실행 명령

  • start / stop: 유닛 시작 및 중지 (예: systemctl start mariadb)
  • restart / reload: 재시작 또는 설정 파일만 다시 읽기
  • status: 유닛의 현재 동작 상태 확인
  • enable / disable: 부팅 시 자동 시작 등록 또는 해제
  • is-active / is-enabled: 현재 동작 여부 및 자동 시작 등록 여부 확인
  • isolate: 지정한 유닛만 실행하고 나머지는 모두 정지
  • kill: 해당 유닛에 프로세스 종료 시그널 전송

3) Target 확인

  • 현재 시스템의 기본 타겟(런레벨) 확인: systemctl get-default

5. 서비스 등록 및 관리

Ubuntu를 포함한 최신 리눅스에서는 systemd를 이용해 서비스를 등록하는 것이 표준임. /etc/systemd/system 디렉토리에 .service 파일을 생성하여 관리함.

서비스 파일 구성 예시

[Unit]
Description=My custom service
After=network.target

[Service]
ExecStart=/path/to/your/script/myservice.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

파일 구성 상세 설명

  • [Unit]: 서비스의 설명과 실행 순서(의존성)를 정의함.
    • After=network.target: 네트워크 서비스가 완전히 실행된 후 이 서비스가 시작되도록 설정함.
  • [Service]: 서비스의 핵심 동작을 정의함.
    • ExecStart: 실행할 스크립트나 바이너리의 절대 경로를 지정함.
    • Restart=on-failure: 프로세스가 비정상적으로 종료되었을 때 자동으로 재시작하는 정책임.
  • [Install]: 서비스 활성화(enable) 시 참조하는 정보임.
    • WantedBy=multi-user.target: 해당 서비스가 일반적인 다중 사용자 모드(런레벨 3 환경)에서 자동으로 시작되도록 설정함.

서비스 등록 및 활성화 절차

  1. 데몬 재로드: 새로운 서비스 파일을 생성하거나 수정했다면 systemd가 이를 인식하도록 명령 수행.
    • systemctl daemon-reload
  2. 서비스 활성화: 부팅 시 자동 시작되도록 등록.
    • systemctl enable [서비스명]
  3. 서비스 시작: 즉시 서비스 실행.
    • systemctl start [서비스명]

6. 시스템 종료 및 재시작

리눅스는 주로 서버용으로 사용되므로, 비정상적인 종료는 서비스 중단 및 데이터 손상으로 이어질 수 있음. 반드시 올바른 종료 명령어를 사용해야 함.

주요 종료 방법

  • 명령어 이용: shutdown, halt, poweroff, reboot
  • 런레벨 이용: Runlevel 0 (종료), Runlevel 6 (재시작)
  • 주의: 물리적인 전원 차단은 최후의 수단으로만 사용해야 함.

shutdown 명령어 활용

shutdown [옵션] [시간] [메시지] 형식을 사용함.

  • 주요 옵션
    • -k: 실제로 종료하지 않고, 접속 중인 사용자들에게 종료 안내 메시지만 전송함.
    • -r: 시스템 종료 후 재시작함.
    • -h: 시스템을 종료하고 halt(정지) 상태로 전환함.
    • -f: 재시작 시 fsck(파일 시스템 체크)를 건너뛰고 빠르게 부팅함.
    • -c: 예약된 shutdown 명령을 취소함.
  • 시간 설정
    • now: 즉시 실행.
    • +10: 10분 후 실행.
    • 18:30: 오후 6시 30분에 실행.

7. systemd 기반 종료 및 기타 명령

현대적인 리눅스 방식에서는 systemctl을 사용하여 시스템 상태를 제어함.

Run Level 제어 (init)

  • sudo init 0: 즉시 종료
  • sudo init 6: 즉시 재시작

systemctl isolate 사용

특정 타겟으로 시스템 상태를 강제 전환(Isolate)함.

  • 종료: sudo systemctl isolate poweroff.target 또는 runlevel0.target
  • 재시작: sudo systemctl isolate reboot.target

심볼릭 링크 명령어

사용자 편의를 위해 아래 명령어들은 사실상 systemctl 명령의 심볼릭 링크로 연결되어 있음.

  • halt: /sbin/halt
  • poweroff: /sbin/poweroff
  • reboot: /sbin/reboot

8. Daemon Process (데몬 프로세스)

개요

리눅스 시스템의 백그라운드에서 동작하며 특정 서비스를 제공하는 프로세스임. 주로 서버 역할을 하는 프로세스들이 이에 해당하며, 동작 방식에 따라 두 가지로 분류됨.

  • 독자형 (Standalone): 시스템 백그라운드에서 항상 상주하며 대기함. 응답 속도는 빠르지만, 자주 사용하지 않는 서비스일 경우 시스템 자원(CPU, 메모리)을 낭비할 수 있음.
  • 슈퍼 데몬 (Super Daemon) 방식: 평소에는 슈퍼 데몬만 떠 있다가 서비스 요청이 올 때만 해당 데몬을 깨워 실행함. 자원을 효율적으로 쓰지만, 독자형에 비해 초기 응답 시간이 약간 더 걸림.

슈퍼 데몬 (xinetd)

  • 데몬의 수가 늘어나면서 효율적인 관리를 위해 등장함.
  • 유닉스의 inetd에서 보안 기능이 강화된 xinetd를 우분투에서 사용함.
  • 주로 네트워크 서비스 관련 데몬들을 관리하며, 요청이 오면 중개인 역할을 수행함.

systemd 데몬

  • 과거의 init을 대체하여 대다수 프로세스의 조상이 된 프로세스임.
  • pstree 명령어를 통해 프로세스 간의 계층 구조와 조상 프로세스를 확인할 수 있음.

Kernel Thread 데몬

  • 커널의 일부분을 프로세스처럼 관리하는 데몬들임.
  • ps 명령 실행 시 [ ] 대괄호에 묶여 표시되는 프로세스들임.
  • 입출력, 메모리 관리, 디스크 동기화 등 핵심 업무를 수행하며, 보통 낮은 번호의 PID를 부여받음.

9. 주요 데몬 종류

데몬 이름 기능 설명
atd 지정된 특정 시간에 명령을 1회 실행함
cron 주기적으로 예약된 명령을 반복 실행함 (스케줄링)
dhcpd 클라이언트에 동적 IP 주소를 할당함
httpd 웹 서버 서비스 제공 (Apache 등)
nfs 네트워크 파일 시스템 서비스 제공
named DNS(도메인 네임 서비스) 관리
sshd 원격 보안 접속 서비스 제공
syslogd 시스템 로그 기록 및 관리
ftpd 파일 송수신(FTP) 서비스 제공
ntpd 표준 서버와 시스템 시간 동기화

10. Boot Loader (부트 로더)

개요

시스템 전원이 켜지면 커널을 메모리에 로딩하여 운영체제를 시작시키는 역할을 수행함. 리눅스에서는 과거 LILO와 현재의 GRUB가 사용됨. 우분투는 GRUB2를 표준으로 사용함.

GRUB (Grand Unified Bootloader)의 장점

  1. 범용성: 리눅스 전용인 LILO와 달리 윈도우 등 타 OS와도 호환됨.
  2. 편의성: 설정이 간편하고 부팅 시점에 명령어를 직접 입력해 수정 가능함.
  3. 멀티 부팅: 여러 운영체제를 선택해서 부팅할 수 있는 기능을 제공함.

관련 디렉토리 및 파일

  • /boot/grub/grub.cfg: 실제 부팅 설정 파일이나 직접 수정해서는 안 됨.
  • /etc/default/grub: 사용자 설정 파일. 메뉴 대기 시간 등을 수정할 때 사용함.
  • /etc/grub.d/: GRUB 설정을 생성하는 스크립트 파일들이 모여 있는 디렉토리임.
  • 설정을 변경했다면 반드시 sudo update-grub 명령을 실행해야 grub.cfg에 반영됨.

11. [Tip] 루트(root) 암호 분실 시 조치 방법

루트 계정의 암호를 잊어버린 경우 GRUB 편집 모드를 통해 재설정 가능함.

  1. 편집 모드 진입: 부팅 시 GRUB 메뉴 화면에서 'E' 키를 누름.
  2. 커널 옵션 수정: ro splash $vt_handoff 부분을 찾아 **rw init=/bin/bash**로 변경함.
  3. 부팅: 변경 후 Ctrl + X 또는 F10을 눌러 부팅하면 비밀번호 입력 없이 root 쉘로 접속됨.
  4. 암호 변경: 접속 후 passwd root 명령으로 새 비밀번호 설정 가능함.

12. Namespace & Cgroup (컨테이너 핵심 기술)

Container 기술 개요 애플리케이션을 효율적이고 독립적으로 실행할 수 있는 경량화된 환경을 제공함. 가상 머신(VM)보다 가볍고 빠르며, 그 근간에는 리눅스 커널의 세 가지 핵심 기술이 있음.

  1. Cgroup (Control Group): 자원 제한 및 관리
  2. Namespace: 프로세스 격리
  3. Union Mount Filesystem: 효율적인 파일 시스템 계층 관리

13. Control Group (Cgroup)

프로세스 그룹이 사용하는 시스템 자원(CPU, 메모리 등)의 사용량을 수집하고 제한하는 커널 기능임.

주요 서브 시스템

  • CPU: 프로세스의 CPU 사용률 제한.
  • Memory: 프로세스의 메모리 사용량 제한.
  • Freezer: cgroup 내의 작업을 일시 중지(Suspend)하거나 다시 시작(Resume)함.
  • blkio: 하드디스크와 같은 블록 장치에 대한 I/O 속도를 제한함.
  • net_cls: 네트워크 패킷에 태그를 지정하여 트래픽 컨트롤러가 특정 작업을 식별하게 함.
  • cpuset: 개별 CPU 코어나 메모리 노드를 특정 cgroup에 할당함.
  • cpuacct: cgroup에서 사용한 CPU 자원에 대한 보고서를 생성함.
  • devices: cgroup 단위로 장치(Device)에 대한 액세스 권한을 관리함.
  • ns: 네임스페이스(Namespace) 서브시스템.

Tip: 설정 값을 변경할 때 echo 명령어를 사용하여 설정 파일에 내용을 출력하거나 추가함 (>, >>, | tee 등 활용).


14. Namespace

하나의 운영체제 안에서 프로세스들을 독립된 공간으로 격리하기 위해 사용하는 커널 기능임. Docker와 같은 컨테이너 기술이 마치 독립된 OS처럼 동작할 수 있게 만드는 핵심 기반임.

격리되는 주요 자원

  • PID Namespace: 프로세스 ID 공간 격리 (컨테이너 안에서는 자신이 1번 프로세스로 보임).
  • Network Namespace: 네트워크 인터페이스, IP, 라우팅 테이블 격리.
  • Mount Namespace: 파일 시스템 마운트 포인트 격리.
  • UTS Namespace: 호스트명, 도메인명 격리.
  • IPC Namespace: 프로세스 간 통신 자원 격리.
  • User Namespace: 사용자 및 그룹 ID 격리.
728x90
반응형

'BASIC > LINUX' 카테고리의 다른 글

[LINUX] 사용자 관리 및 관련 파일 정리  (0) 2026.01.13
[LINUX] 디스크 관리  (1) 2026.01.12
[LINUX] 소프트웨어  (0) 2026.01.09
[LINUX] 프로세스  (1) 2026.01.08
[LINUX] FILE SYSTEM  (0) 2026.01.08