정상 부팅이 안 되거나 root 암호를 잊었을 때 최소한의 환경으로 부팅하는 방법이다. systemd 기반 배포판(RHEL 7 이상, Ubuntu 16.04 이상)은 SysV 의 runlevel 1 대신 rescue.target · emergency.target 을 쓰고, root 암호 초기화는 initramfs 단계에서 멈추는 rd.break 를 쓴다.
| 방법 | 커널 인자 | 상태 |
|---|---|---|
| Rescue (단일 사용자) | systemd.unit=rescue.target |
로컬 파일시스템 마운트, 서비스 없음, root 암호 필요 |
| Emergency | systemd.unit=emergency.target |
/ 읽기 전용, 최소 환경, root 암호 필요 |
| initramfs 셸 | rd.break |
/sysroot 아래에 실제 루트. 암호 없이 진입. root 암호 초기화용 |
| 커널 직접 셸 | init=/bin/bash |
systemd 를 띄우지 않음. SELinux 재레이블 필요 |
모두 콘솔(로컬 또는 하이퍼바이저 콘솔)에서 GRUB 메뉴를 편집해야 한다. ssh 로는 할 수 없다.
e 를 누른다.linux (또는 linuxefi) 로 시작하는 줄 끝에 인자를 붙인다. rhgb quiet 가 있으면 지워야 메시지가 보인다.Ctrl+x 로 부팅한다. 이 변경은 한 번만 적용된다.linux 줄 끝에 다음을 붙인다.
systemd.unit=rescue.target
root 암호를 넣으면 셸이 뜬다. 파일시스템은 마운트돼 있고 네트워크와 서비스는 없다. fstab 오류로 부팅이 멈추는 경우처럼 설정 파일을 고칠 때 쓴다. 이미 부팅된 시스템에서 전환하려면 다음을 실행한다.
sudo systemctl rescue
linux 줄 끝에 rd.break 를 붙이고 부팅한다. initramfs 의 셸이 뜨면 실제 루트가 /sysroot 에 읽기 전용으로 붙어 있다.
mount -o remount,rw /sysroot
chroot /sysroot
passwd
touch /.autorelabel
exit
exit
touch /.autorelabel 은 SELinux 가 켜진 시스템에서 필수다. 빠뜨리면 /etc/shadow 의 컨텍스트가 어긋나 로그인이 안 된다. 재부팅 때 전체 재레이블이 돌아 디스크 크기에 따라 몇 분 걸린다.exit 를 두 번 하면 부팅이 이어진다.rd.break 전에 암호 프롬프트가 먼저 뜬다.2021년 테스트 됨. rhgb quiet 자리에 init=/bin/bash 를 넣으면 systemd 없이 bash 가 PID 1 로 뜬다.
init=/bin/bash
mount -o remount,rw /
passwd
touch /.autorelabel
exec /sbin/init
rd.break 와 달리 실제 루트가 / 에 바로 붙는다. 끝낼 때 exec /sbin/init 대신 전원을 끄면 파일시스템이 더러운 상태로 남는다.
재부팅 후 새 암호로 로그인되는지, getenforce 가 Enforcing 인지 본다. 재레이블이 돌지 않았으면 sudo restorecon -v /etc/shadow 로 손본다.