들어가기
리눅스를 사용하다 보면 언젠가는 부팅이 정상적으로 되지 않는 상황을 마주하게 됩니다.
서비스가 올라오지 않거나, 네트워크가 죽어 있거나, 심한 경우 로그인 자체가 불가능한 상태가 되기도 합니다.
이럴 때 필요한 것은 단순한 명령어 암기가 아니라,
리눅스가 어떤 순서로 부팅되는지, 그리고 어디에서 문제가 발생했는지 추적할 수 있는 감각입니다.
이번 글에서는 Red Hat Enterprise Linux 계열(RHEL 7~10 기준)을 중심으로,
- 리눅스 부팅 방식의 역사
- systemd 기반 부팅 구조
- Runlevel과 Target의 관계
- 싱글 유저 모드 진입과 암호 복구
- 서비스와 부팅의 관계
- GRUB2와 커널 파라미터
- initramfs의 역할
을 실무에서 문제를 해결하는 관점으로 정리해봅니다.
리눅스 시스템 부팅 방식의 변화
리눅스의 부팅 방식은 한 번에 systemd로 넘어온 것이 아닙니다.
시대에 따라 점진적으로 발전해 왔습니다.
Runlevel 기반 (System V init)
가장 오래된 방식입니다.
부팅 시 특정 Runlevel에 따라 정해진 스크립트를 순서대로 실행합니다.
- 각 Runlevel마다 시작/중지할 서비스 목록이 존재
- 순차 실행 방식
- 상용 UNIX 및 초기 리눅스 배포판에서 사용
단순하지만 느리고, 의존성 관리가 어렵다는 단점이 있었습니다.
Event 기반 (Upstart)
Ubuntu에서 시작된 방식으로,
RHEL 6에서도 잠시 사용되었습니다.
- 이벤트 발생 시 스크립트 실행
- SysV init 구조를 기반으로 개선
과도기적 성격이 강했고, 현재는 거의 사용되지 않습니다.
Dependency 기반 (systemd)
현재 표준입니다.
RHEL 7부터 본격적으로 도입되었습니다.
- 서비스 간 의존성을 기반으로 병렬 실행
- init 스크립트 대신 unit 파일 사용
- 시스템과 서비스 전체를 통합 관리
부팅 속도와 관리 측면에서 가장 큰 개선이 이루어진 구조입니다.
init과 PID 1
부팅 과정에서 커널이 가장 먼저 실행하는 사용자 공간 프로세스가 init입니다.
- PID 1
- 모든 프로세스의 부모
- 시스템 전체 수명 동안 유지
과거에는 SysV init이 PID 1이었고,
현재는 systemd가 PID 1 역할을 수행합니다.
이 차이를 이해하는 것이 매우 중요합니다.
systemd 핵심 개념: Unit과 Target
systemd를 이해하려면 두 가지 용어가 핵심입니다.
Unit
systemd가 관리하는 모든 객체를 Unit이라고 부릅니다.
대표적인 유형은 다음과 같습니다.
- service : 서비스
- target : 상태 묶음
- mount : 마운트 포인트
- socket : 소켓 기반 활성화
- timer : 스케줄링
Target
Target은 여러 Unit의 묶음입니다.
과거 SysV init의 Runlevel에 해당하는 개념입니다.
Runlevel과 Target의 관계
SysV init 시절의 Runlevel은 다음과 같았습니다.
- 0 : 종료
- 1 : 싱글 유저 모드 (Rescue)
- 3 : 텍스트 모드 (멀티 유저)
- 5 : GUI 모드
systemd에서는 이를 Target으로 대응시킵니다.
- runlevel 3 → multi-user.target
- runlevel 5 → graphical.target
내부적으로는 여전히 Runlevel 개념이 남아 있지만,
운영 관점에서는 Target만 사용하는 것이 맞습니다.
기본 Target 확인 및 변경
bashsystemctl get-default
기본 부팅 Target을 확인합니다.
bashsystemctl set-default graphical.target
다음 부팅부터 GUI 모드로 시작합니다.
bashsystemctl set-default multi-user.target
서버 환경에서 주로 사용하는 설정입니다.
일시적인 Target 변경 (isolate)
bashsystemctl isolate multi-user.target
현재 세션에서만 Target을 전환합니다.
재부팅하면 원래 설정으로 돌아옵니다.
운영 중 테스트할 때 매우 유용합니다.
현재 Runlevel 확인
bashwho -r
systemd 환경에서도 호환을 위해 제공되는 명령입니다.
싱글 유저 모드와 암호 복구
부팅 문제 해결에서 가장 많이 사용되는 기술 중 하나입니다.
RHEL 7 ~ 9 방식 (rd.break)
- 부팅 시 GRUB 메뉴에서 커널 선택
e입력- linux 라인 끝에
rd.break추가 - Ctrl + x 부팅
/sysroot로 진입
bashchroot /sysroot
mount -o rw,remount /sysroot
passwd root
touch /.autorelabel
exit
exit
SELinux 환경에서는 /.autorelabel이 매우 중요합니다.
RHEL 10 방식 (init=/bin/bash)
- GRUB에서 커널 선택 후
e - linux 라인 끝에
init=/bin/bash추가 - Ctrl + x
bashmount -o rw,remount /
passwd root
touch /.autorelabel
exec /sbin/init
init을 다시 실행해야 정상 부팅으로 이어집니다.
서비스와 부팅의 관계
SysV init 시절
- 서비스 스크립트 직접 실행
- service 명령어 사용
- ntsysv, setup 등
systemd 환경
시스템과 서비스를 통합 관리합니다.
bashsystemctl start httpd
systemctl stop httpd
systemctl restart httpd
자동 시작 설정
bashsystemctl enable httpd
systemctl disable httpd
systemctl mask httpd
systemctl unmask httpd
mask는 실무에서 매우 강력한 차단 수단입니다.
GRUB 2와 커널 파라미터
GRUB 2는 커널과 initramfs를 메모리에 로드하는 역할을 합니다.
커널 옵션 확인
bashcat /proc/cmdline
실제로 적용된 옵션을 확인할 수 있습니다.
RHEL 9 이상: grubby 사용
bashgrubby --info=ALL
grubby --default-index
grubby --set-default-index=0
커널 옵션 추가
bashgrubby --update-kernel=ALL --args="rhgb quiet ipv6.disable=1"
옵션 제거
bashgrubby --update-kernel=1 --remove-args="rhgb quiet"
부트로더 암호 설정
bashgrub2-set-password
직접 grub.cfg를 수정하지 않는 것이 원칙입니다.
initramfs (초기 램 파일시스템)
initramfs는 커널이 루트 파일시스템을 마운트하기 전까지 사용하는 임시 환경입니다.
- 스토리지 드라이버
- 파일시스템 모듈
- LVM, RAID, 암호화 지원
레스큐 커널의 initramfs가 더 큰 이유는,
더 많은 하드웨어와 파일시스템을 지원하기 위해서입니다.
bashdr
dracut --regenerate-all
systemd 부팅 순서
- local-fs.target
- sysinit.target
- basic.target
- multi-user.target
- graphical.target
bashsystemctl list-dependencies graphical.target
부팅 문제 분석에 매우 유용합니다.
rc.local의 현재 위치
bash/etc/rc.d/rc.local
호환성 목적입니다.
systemd 서비스로 대체하는 것이 권장됩니다.
마무리
부팅은 리눅스의 모든 것의 시작입니다.
부팅 과정을 이해하면,
- 시스템 장애 복구
- 서비스 문제 추적
- 보안 사고 대응
까지 훨씬 수월해집니다.