Journey to Security/Linux OS

리눅스 rescue mode에서 chroot /sysroot 동작 원리

Cordilog 2026. 6. 23. 18:35

리눅스 서버가 정상적으로 부팅되지 않을 때 관리자는 응급 복구 모드(Rescue Mode)에 진입해 시스템을 복구한다.

이 때 chroot /sysroot 명령어를 사용해 현재 프로세스가 인식하는 루트 파일 시스템을 교체해야 한다.

initramfs 부팅 단계의 구조와 함께 /sysroot 디렉터리와 chroot 명령어의 동작 원리를 알아보자.

 

1. /sysroot

/sysroot는 리눅스 부팅 초기 단계에서 사용되는 마운트 포인트로, initramfs 환경이 실제 디스크의 루트 파일 시스템(/)을 임시로 마운트하기 위한 위치다.

1️⃣ 정상 부팅 과정에서의 /sysroot

부팅이 시작되면 커널은 initramfs 환경을 메모리에 로드하고, 이 환경에서 실제 디스크의 루트 파일 시스템을 /sysroot에 마운트한다.

이후 switch_root 또는 pivot_root 시스템 콜을 통해 프로세스의 루트 디렉터리를 /sysroot 위치로 전환한다.

전환이 완료되면 /sysroot 자체는 비어 있는 디렉터리로 남는다.

2️⃣ 응급 복구 모드에서의 /sysroot

부팅 과정에서 오류가 발생해 switch_root 단계까지 진행하지 못하면 시스템은 dracut emergency shell(응급 복구 셸)에 진입한다.

이 상태에서는 initramfs 환경이 그대로 유지되며, 실제 디스크의 루트 파일 시스템은 /sysroot에 마운트된 상태로 남아 있다.

관리자가 작업해야 할 실제 시스템 파일은 모두 /sysroot 하위에 존재한다.

2. initramfs 환경의 구조와 위치

1️⃣ initramfs가 필요한 이유

리눅스 커널이 실제 디스크의 루트 파일 시스템을 마운트하려면 디스크 드라이버, 파일 시스템 모듈(ext4, xfs), LVM/RAID/디스크 암호화 같은 스토리지 스택 모듈이 먼저 로드되어야 한다.

이러한 모듈을 커널 이미지에 모두 정적으로 포함하면 커널이 비대해지므로, 부팅 초기에 필요한 최소 모듈과 도구만 압축한 임시 루트 파일 시스템을 메모리에 올린다. 이것이 initramfs다.

2️⃣ initramfs 환경의 도구 구성

initramfs는 디스크 마운트를 위한 최소한의 도구만 포함한다.

/bin, /etc, /lib 같은 디렉터리는 존재하지만, 이는 메모리 상의 임시 사본이며 실제 디스크의 동일 디렉터리와는 완전히 별개의 파일 시스템이다.

3️⃣ 응급 복구 셸 진입 시점의 파일 시스템 상태

복구 셸이 떴을 때 현재 셸 프로세스가 인식하는 루트는 initramfs의 루트이며, 실제 디스크의 루트는 /sysroot 하위에 마운트된 상태다. 

여기서 핵심은 메모리의 initramfs 환경과 디스크의 실제 파일 시스템이 완전히 분리된 두 개의 파일 시스템이라는 점이다. /sysroot는 이 두 파일 시스템을 잇는 유일한 접점이다.

3. initramfs 환경에서 명령어 실행의 한계

1️⃣ 명령어가 참조하는 파일 시스템

리눅스에서 모든 명령어와 파일 경로는 호출 프로세스의 루트 디렉터리(/)를 기준으로 해석된다.

initramfs 환경에서 passwd 명령어를 실행하면 다음과 같은 일이 발생한다.

  • 실행되는 바이너리는 /usr/bin/passwd가 아닌 initramfs 내부의 passwd
  • 수정되는 파일은 디스크의 /etc/shadow가 아닌 initramfs 내부의 /etc/shadow
  • 시스템 재부팅 시 initramfs는 휘발되므로 변경 사항은 모두 소실

2️⃣ /sysroot 경로를 직접 지정해 편집할 때의 한계

수동으로 절대 경로를 지정해 vi /sysroot/etc/fstab처럼 파일을 수정하는 것은 가능하다.

하지만 단순 파일 수정 이상의 작업에서는 다음과 같은 한계가 있다.

  • PAM 모듈, SELinux 컨텍스트, systemd 단위 파일이 가정하는 절대 경로 참조가 어긋남
  • passwd, useradd, dnf 같은 도구가 내부적으로 /etc/passwd, /var/lib/rpm 등 절대 경로를 직접 참조함
  • 동적 라이브러리 로딩 경로(/lib, /usr/lib)가 initramfs의 라이브러리를 가리키게 되어 디스크에 설치된 도구를 호출할 수 없음

이러한 한계를 우회하기 위해 사용하는 것이 chroot 명령어다.

4. chroot /sysroot의 동작 원리

1️⃣ chroot 시스템 콜의 정의

chroot(2) 시스템 콜은 호출 프로세스의 루트 디렉터리를 지정한 경로로 변경한다.

변경 이후 해당 프로세스와 그 자식 프로세스들은 모든 절대 경로를 새 루트 기준으로 해석한다.

chroot /sysroot 명령은 현재 셸 프로세스의 루트 디렉터리를 /sysroot로 변경한 뒤, 새 루트 환경에서 셸(/bin/sh 또는 /bin/bash)을 다시 실행하는 동작이다.

2️⃣ 루트 디렉터리 기준의 전환

chroot 실행 전후의 경로 해석 차이를 비교하면 다음과 같다.

 
 

3️⃣ chroot 이후 명령어 동작 환경의 변화

chroot 실행 직후 셸은 디스크의 루트 파일 시스템을 기준으로 동작한다.

입력하는 모든 명령어가 디스크의 바이너리(/usr/bin/passwd, /usr/bin/vi 등)를 실행하고, 디스크의 설정 파일(/etc/shadow, /etc/fstab 등)을 수정하며, 디스크의 라이브러리(/usr/lib64/*.so)를 로드한다.

결과적으로 정상 부팅된 시스템에 root로 로그인한 것과 거의 동일한 환경이 만들어진다.

4️⃣ 보조 파일 시스템의 추가 마운트

chroot 환경에서 일부 명령(dnf, grub2-install 등)은 /proc, /sys, /dev 같은 가상 파일 시스템을 필요로 한다.

dracut emergency shell은 보통 이를 자동으로 처리하지만, 일부 복구 환경에서는 수동 바인드 마운트가 필요하다.

mount --bind /proc /sysroot/proc
mount --bind /sys  /sysroot/sys
mount --bind /dev  /sysroot/dev
chroot /sysroot

5. 복구 작업의 전체 흐름

부팅 실패부터 재부팅까지의 순서를 정리하면 다음과 같다.

 

1️⃣ 자주 사용되는 복구 작업

  • root 비밀번호 초기화: passwd
  • /etc/fstab 오타 수정: vi /etc/fstab
  • 손상된 패키지 재설치: dnf reinstall <package>
  • 부트로더 재설치: grub2-install /dev/sda, grub2-mkconfig -o /boot/grub2/grub.cfg
  • SELinux 컨텍스트 재라벨링 예약: touch /.autorelabel

2️⃣ chroot 환경 종료와 재부팅

복구가 끝나면 exit 명령으로 chroot 환경을 빠져나온다.

이때 셸은 다시 initramfs 환경으로 복귀하며, 이어서 reboot 또는 systemctl reboot 명령으로 시스템을 재시작한다.

재부팅 시 정상 부팅 절차가 다시 시도되고, 복구 작업이 적절했다면 시스템은 디스크의 루트 파일 시스템으로 정상적으로 전환된다.

6. 정리

/sysroot는 initramfs 환경에서 실제 디스크의 루트 파일 시스템을 임시로 마운트해두는 디렉터리이며, chroot /sysroot는 현재 셸 프로세스의 루트 디렉터리 기준 자체를 디스크로 전환하는 명령이다.

이 두 가지가 조합되어 응급 복구 모드에서 정상 부팅 환경과 동일한 조건으로 작업할 수 있는 메커니즘이 성립한다.

이 메커니즘의 핵심은 "현재 프로세스가 어느 루트 파일 시스템을 기준으로 동작하는가"다.

같은 passwd 명령이라도 chroot 전후로 수정 대상이 달라지므로, 복구 모드에서 작업할 때는 항상 현재 루트 기준을 명확히 인지하고 명령을 실행해야 한다.