Red Hat Certified System Administrator (RHCSA) #4 부팅과 시스템: systemd, target, GRUB2, password recovery

9 분 소요

#3 셸 스크립트에서 조건문과 반복으로 작업을 자동화하는 도구를 다졌다면, 이번에는 시스템 그 자체를 다루는 영역으로 들어갑니다. RHEL 시스템이 켜져서 서비스가 올라오기까지의 흐름, 즉 부팅과 systemd입니다. RHCSA에서 이 영역은 출제 빈도가 매우 높고, 특히 root 비밀번호 복구는 거의 매 시험에 등장하는 단골 작업입니다.

이번 글에서는 systemd가 무엇이고 systemctl로 서비스를 어떻게 제어하는지, 부팅 target을 어떻게 바꾸는지, GRUB2에서 커널 파라미터를 어떻게 편집하는지, 그리고 root 비밀번호를 잊었을 때 어떻게 복구하는지를 명령 단위로 정리하겠습니다. RHEL 실무 트랙의 systemd 편에서 개념을 잡았다면, 이번 글은 그 작업들을 시험 형식으로 다시 손에 익히겠습니다.

systemd란 무엇인가 #

systemd는 RHEL 7부터 표준이 된 init 시스템이자 서비스 관리자입니다. 커널이 부팅을 마치면 PID 1로 systemd가 가장 먼저 뜨고, 그 뒤의 모든 서비스를 systemd가 시작하고 멈추고 감시합니다. 과거 SysVinit의 스크립트 방식과 달리, systemd는 서비스를 unit이라는 단위로 선언적으로 관리하며 의존 관계에 따라 병렬로 올립니다.

systemd의 핵심 개념은 다음 두 가지입니다.

  • unit. systemd가 관리하는 대상의 단위입니다. 서비스, 마운트, 소켓, target 등이 모두 unit입니다.
  • target. 여러 unit을 묶은 그룹입니다. 시스템이 도달해야 할 상태(예: 멀티유저 콘솔, 그래픽 데스크톱)를 나타냅니다.

unit의 종류 #

unit은 확장자로 종류를 구분합니다. RHCSA에서 자주 보게 되는 종류는 다음과 같습니다.

확장자종류설명
.service서비스데몬(sshd, httpd 등)을 정의
.targettargetunit의 그룹. 부팅 상태를 나타냄
.mount마운트파일 시스템 마운트를 정의
.socket소켓소켓 기반 활성화를 정의
.timer타이머cron을 대체하는 예약 실행

unit 파일은 두 곳에 위치합니다. 패키지가 설치한 기본 unit은 /usr/lib/systemd/system/에, 관리자가 수정하거나 추가한 unit은 /etc/systemd/system/에 있습니다. 같은 이름이면 /etc/ 쪽이 우선합니다.

systemctl로 서비스 제어하기 #

systemctl은 systemd를 다루는 단일 명령입니다. RHCSA에서 가장 손에 익혀야 할 명령이므로, 동작별로 정리하겠습니다.

시작, 정지, 재시작 #

# 서비스 시작
sudo systemctl start sshd

# 서비스 정지
sudo systemctl stop sshd

# 서비스 재시작
sudo systemctl restart sshd

# 설정만 다시 읽기(가능한 서비스에 한함)
sudo systemctl reload sshd

서비스 이름 뒤의 .service는 생략할 수 있습니다. systemctl start sshdsystemctl start sshd.service는 동일하게 동작합니다.

부팅 시 자동 시작 여부 #

start와 enable의 차이는 RHCSA의 핵심 함정입니다. start는 지금 시작하는 것이고, enable은 부팅 때마다 자동으로 시작되도록 등록하는 것입니다. 둘은 별개라서, start만 하고 enable을 잊으면 재부팅 후 서비스가 사라져 실점합니다.

# 부팅 시 자동 시작 등록
sudo systemctl enable sshd

# 자동 시작 해제
sudo systemctl disable sshd

# 지금 시작 + 자동 시작 등록을 한 번에
sudo systemctl enable --now httpd

enable --now는 enable과 start를 동시에 수행합니다. 시험에서 “서비스를 시작하고 부팅 시에도 동작하게 하라"는 문제가 나오면 이 한 줄이 가장 안전합니다.

상태 확인 #

# 서비스 상태 자세히 보기
systemctl status sshd

# 실행 중인지만 확인(active/inactive)
systemctl is-active sshd

# 자동 시작 등록 여부 확인(enabled/disabled)
systemctl is-enabled sshd

systemctl status의 출력에서 두 줄을 눈여겨봅니다. Loaded: 줄의 enabled/disabled는 부팅 자동 시작 여부이고, Active: 줄의 active (running)/inactive (dead)는 현재 실행 상태입니다.

mask로 서비스 완전 차단 #

disable은 자동 시작만 막을 뿐, 다른 서비스가 의존성으로 깨우거나 수동 start는 여전히 가능합니다. 아예 시작 자체를 막으려면 mask를 씁니다. mask는 unit을 /dev/null로 심볼릭 링크해 어떤 방법으로도 시작되지 않게 합니다.

# 서비스를 완전히 차단
sudo systemctl mask firewalld

# 차단 해제
sudo systemctl unmask firewalld

masked 상태에서는 start를 시도해도 거부됩니다. 차단을 풀려면 반드시 unmask를 먼저 해야 합니다.

부팅 target #

target은 시스템이 도달할 상태를 묶은 unit입니다. 과거 SysVinit의 runlevel을 대체하며, RHCSA에서 자주 다루는 target은 두 가지입니다.

target과거 runlevel설명
multi-user.target3텍스트 콘솔, 네트워크 포함. 서버 표준
graphical.target5multi-user에 그래픽 데스크톱 추가

이 외에 rescue.target(단일 사용자 복구)과 emergency.target(최소 환경)도 복구 상황에서 쓰입니다.

기본 target 확인과 변경 #

# 현재 기본 target 확인
systemctl get-default

# 기본 target을 멀티유저(텍스트)로 변경
sudo systemctl set-default multi-user.target

# 기본 target을 그래픽으로 변경
sudo systemctl set-default graphical.target

set-default는 다음 부팅부터 적용되는 영구 설정입니다. 시험에서 “부팅 시 그래픽 없이 텍스트 모드로 뜨게 하라"는 문제는 set-default multi-user.target으로 해결합니다.

지금 즉시 target 전환 #

재부팅 없이 현재 실행 중인 시스템의 상태만 바꾸려면 isolate를 씁니다.

# 지금 즉시 멀티유저 모드로 전환
sudo systemctl isolate multi-user.target

# 지금 즉시 그래픽 모드로 전환
sudo systemctl isolate graphical.target

set-default는 다음 부팅에, isolate는 지금 당장 적용된다는 차이를 구분합니다. 영구 변경을 원한다면 set-default를, 일시적 확인을 원한다면 isolate를 씁니다.

systemctl로 서비스 분석 #

운영과 트러블슈팅에서는 어떤 unit이 떠 있고 무엇에 의존하는지를 읽어야 합니다.

# 로드된 unit 목록
systemctl list-units

# 서비스 타입만, 실패한 것 포함
systemctl list-units --type=service --all

# 실패한 unit만 추리기
systemctl --failed

# 설치된 모든 unit 파일과 자동 시작 상태
systemctl list-unit-files

systemctl --failed는 부팅 후 무엇이 올라오지 못했는지를 한눈에 보여 줘, 문제 서비스를 빠르게 찾는 출발점입니다.

의존 관계 추적 #

# 특정 target이 끌어오는 unit 트리
systemctl list-dependencies graphical.target

# 특정 서비스가 의존하는 대상
systemctl list-dependencies sshd

list-dependencies는 target이 어떤 서비스를 묶고 있는지, 서비스가 무엇을 필요로 하는지를 트리로 보여 줍니다. graphical.target이 multi-user.target을 포함하는 구조도 이 명령으로 확인할 수 있습니다.

GRUB2 부트로더 #

GRUB2는 RHEL의 부트로더입니다. 커널을 메모리에 올리고 커널 파라미터를 전달하는 역할을 하며, RHCSA에서는 부팅 시 커널 파라미터를 일시적으로 편집하는 작업이 비밀번호 복구와 직결되어 중요합니다.

부팅 시 일시 편집 #

시스템이 켜질 때 GRUB2 메뉴가 뜨면, 부팅할 항목에 커서를 올리고 e를 누릅니다. 그러면 해당 항목의 부팅 설정을 편집할 수 있습니다. linux로 시작하는 줄을 찾아 커널 파라미터를 추가하거나 수정한 뒤 Ctrl+x로 부팅하면, 그 한 번의 부팅에만 적용됩니다. 재부팅하면 원래대로 돌아오므로 안전하게 시도할 수 있습니다.

이 일시 편집이 root 비밀번호 복구의 핵심입니다. linux 줄 끝에 rd.break를 추가해 부팅하면 root 셸로 떨어집니다.

영구 변경 #

커널 파라미터를 영구히 바꾸려면 /etc/default/grub을 수정한 뒤 설정을 다시 생성합니다.

# /etc/default/grub 편집 후 설정 생성
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

RHEL 9에서는 grubby 명령으로 개별 파라미터만 손쉽게 추가하는 방법도 있습니다.

# 모든 커널에 파라미터 추가
sudo grubby --update-kernel=ALL --args="quiet"

# 파라미터 제거
sudo grubby --update-kernel=ALL --remove-args="quiet"

root 비밀번호 복구 (최빈출) #

RHCSA에서 거의 매번 나오는 작업입니다. root 비밀번호를 모를 때 rd.break로 초기 램디스크 단계에서 멈춘 뒤, 루트 파일 시스템을 다시 쓰기 가능하게 마운트하고 비밀번호를 바꾸는 절차입니다. 순서를 통째로 외워 두는 것이 가장 빠릅니다.

1단계: rd.break로 부팅 #

  1. 시스템을 재부팅하고 GRUB2 메뉴에서 부팅 항목에 커서를 올린 뒤 e를 누릅니다.
  2. linux로 시작하는 줄을 찾아 끝에 rd.break를 추가합니다.
  3. Ctrl+x로 부팅하면 switch_root 프롬프트가 뜨는 root 셸로 떨어집니다.

2단계: 루트 파일 시스템 재마운트 #

이 단계에서 실제 루트는 /sysroot에 읽기 전용으로 마운트되어 있습니다. 비밀번호를 바꾸려면 쓰기 가능하게 다시 마운트해야 합니다.

# /sysroot를 읽기/쓰기로 재마운트
mount -o remount,rw /sysroot

# 실제 루트로 chroot
chroot /sysroot

3단계: 비밀번호 변경 #

# root 비밀번호 변경
passwd root

4단계: SELinux relabel 예약 #

여기가 가장 많이 빠뜨리는 단계입니다. /etc/shadow가 비밀번호 변경으로 수정되었으므로, SELinux 컨텍스트가 어긋날 수 있습니다. 다음 부팅에서 전체 relabel을 수행하도록 예약 파일을 만듭니다.

# 다음 부팅 시 전체 relabel 예약
touch /.autorelabel

이 파일을 만들지 않으면 SELinux 컨텍스트가 어긋나 로그인이 안 되거나 부팅이 막힐 수 있습니다. 반드시 수행합니다.

5단계: 빠져나와 재부팅 #

# chroot 종료
exit

# switch_root 셸 종료(부팅 재개)
exit

두 번째 exit로 부팅이 재개되면 /.autorelabel이 전체 relabel을 수행합니다. relabel은 시스템 크기에 따라 수 분 걸리며, 끝나면 자동으로 다시 재부팅됩니다. 그 뒤 새 비밀번호로 root 로그인이 됩니다.

relabel을 기다리지 않으려면, chroot 안에서 /.autorelabel 대신 restorecon -v /etc/shadow로 해당 파일만 컨텍스트를 복구하는 방법도 있습니다. 다만 안전하게 가려면 /.autorelabel을 권장합니다.

시험 포인트 #

  • start와 enable은 별개입니다. 지금 시작은 start, 부팅 자동 시작은 enable이며, 둘 다 필요하면 enable --now를 씁니다.
  • mask는 disable보다 강력합니다. disable은 자동 시작만 막고, mask는 수동 start와 의존성 시작까지 모두 차단합니다.
  • set-default와 isolate를 구분합니다. 부팅 기본값 변경은 set-default(영구), 지금 즉시 전환은 isolate(일시)입니다.
  • 부팅 시 e 편집은 일시 적용입니다. 한 번의 부팅에만 반영되고 재부팅하면 사라지므로 복구 작업에 안전합니다.
  • root 비밀번호 복구 순서를 통째로 외웁니다. rd.break 추가 → mount -o remount,rw /sysrootchroot /sysrootpasswd roottouch /.autorelabelexit 두 번입니다.
  • /.autorelabel을 절대 빠뜨리지 않습니다. 이 단계를 잊으면 SELinux 때문에 로그인이 막히는 것이 RHCSA의 단골 실점입니다.

정리 #

이번 글에서 잡은 것:

  • systemd는 PID 1의 init이자 서비스 관리자입니다. 모든 대상을 unit으로 다루고 target으로 그룹화합니다.
  • systemctl 핵심 동작. start/stop/restart, enable/disable, status, mask를 동작별로 구분해 익혔습니다.
  • 부팅 target. multi-user와 graphical을 get-default,set-default로 영구 변경하고, isolate로 즉시 전환합니다.
  • 서비스 분석. list-units, –failed, list-dependencies로 무엇이 떠 있고 무엇에 의존하는지 읽습니다.
  • GRUB2. 부팅 시 e로 커널 파라미터를 일시 편집하고, grub2-mkconfig,grubby로 영구 반영합니다.
  • root 비밀번호 복구. rd.break부터 /.autorelabel까지 순서를 통째로 외워 두는 것이 최선입니다.

다음: 로컬 storage 1 #

부팅과 systemd로 시스템 운영의 토대를 잡았습니다. 이제 RHCSA에서 작업 수가 가장 많아 합격을 가르는 영역, 스토리지로 들어갑니다.

#5 로컬 storage 1: 파티션, swap, LVM 기초에서는 디스크에 파티션을 만들고, swap 공간을 추가하며, LVM의 physical volume,volume group,logical volume 개념을 직접 만들어 보며 정리하겠습니다.

X