RHEL 부팅 프로세스 문제 해결

Red Hat Enterprise LinuxBeginner
지금 연습하기

소개

이 랩에서는 Red Hat Enterprise Linux (RHEL) 부팅 프로세스 문제 해결 및 복구에 필요한 필수 기술을 배우게 됩니다. 시스템이 올바르게 시작되지 못하게 할 수 있는 일반적인 문제를 진단하고 해결하기 위해 부팅 시퀀스의 다양한 단계에서 시스템과 상호 작용하는 방법을 탐구할 것입니다. 여기에는 systemd 부팅 대상 작업과 시스템 복구를 위해 설계된 특수 부팅 모드 활용이 포함됩니다.

실습을 통해 systemctl을 사용하여 systemd 대상을 관리하고, 시스템 유지 관리를 위해 GRUB 메뉴에서 복구 모드로 부팅하며, rd.break 커널 매개변수를 사용하여 루트 암호를 재설정하는 실질적인 경험을 얻게 됩니다. 또한, 손상된 /etc/fstab과 같은 중요한 구성 파일 오류를 복구하기 위해 응급 모드를 사용하는 방법을 배우게 되어, 부팅 불가능한 시스템을 작동 상태로 복원할 수 있습니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 92%입니다.학습자들로부터 96%의 긍정적인 리뷰율을 받았습니다.

systemctl 을 사용하여 Systemd 부팅 타겟 관리

이 단계에서는 systemd 부팅 대상을 관리하는 방법을 배우게 됩니다. systemd에서 "대상 (target)"은 시스템을 특정 상태로 가져오기 위해 필요한 다양한 서비스 및 기타 유닛을 함께 그룹화하는 동기화 지점입니다. 이는 이전 SysV init 시스템의 "런레벨 (runlevel)"에 해당하는 현대적인 개념입니다. 현재 기본 대상 보기, 향후 부팅을 위한 기본 대상 변경, 다른 대상으로 임시 전환하는 방법을 살펴보겠습니다.

먼저, 시스템이 기본적으로 어떤 대상으로 부팅되는지 확인해 보겠습니다. graphical.target은 데스크톱 환경이 있는 시스템에서 사용되며, 그래픽 사용자 인터페이스 (GUI) 를 제공합니다. multi-user.target은 명령줄 인터페이스 전용입니다.

현재 기본 대상을 확인하려면 다음 명령을 실행하십시오.

systemctl get-default

기본 대상이 그래픽 대상임을 확인할 수 있습니다.

graphical.target

이제 기본 부팅 대상을 multi-user.target으로 변경해 보겠습니다. 이는 서버 환경이나 그래픽 인터페이스가 필요하지 않거나 문제를 일으키는 문제 해결 상황에 유용합니다. systemctl set-default 명령은 /etc/systemd/system/default.target 심볼릭 링크를 변경하여 이를 수행합니다.

관리자 권한으로 이 명령을 실행하려면 sudo를 사용하십시오.

sudo systemctl set-default multi-user.target

출력은 심볼릭 링크가 업데이트되었음을 확인합니다.

Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target.

get-default 명령을 다시 실행하여 기본값이 변경되었는지 확인할 수 있습니다.

systemctl get-default

이제 출력은 새로운 기본 대상을 보여줍니다.

multi-user.target

이 설정을 사용하면 시스템이 재부팅 후 텍스트 기반 콘솔로 부팅됩니다. 이 랩에서는 일관된 그래픽 환경을 유지하려고 합니다. 기본 대상을 다시 graphical.target으로 설정해 보겠습니다.

sudo systemctl set-default graphical.target

이전과 유사한 출력을 볼 수 있으며, 심볼릭 링크가 다시 변경되었음을 나타냅니다.

Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target -> /usr/lib/systemd/system/graphical.target.

기본 대상이 graphical.target으로 복원되었는지 확인하기 위해 최종 확인을 실행합니다.

systemctl get-default
graphical.target

재부팅을 위한 기본 대상을 변경하는 것 외에도, systemctl isolate를 사용하여 현재 세션에서 대상을 전환할 수도 있습니다. 이 명령은 새 대상과 관련 없는 서비스를 중지하고 관련된 서비스를 시작합니다. 예를 들어, sudo systemctl isolate multi-user.target을 실행하면 그래픽 세션이 종료되고 텍스트 전용 콘솔로 전환됩니다. 이는 강력하지만 잠재적으로 방해가 될 수 있는 명령이므로 여기서는 실행하지 않겠습니다.

이제 systemctl을 사용하여 systemd 대상을 성공적으로 관리했습니다.

GRUB 메뉴에서 Rescue 모드로 부팅

이 단계에서는 시스템 복구를 위해 설계된 특수 systemd 대상인 rescue.target에 대해 배우게 됩니다. 표준 RHEL 시스템에서 이 모드에 액세스하려면 재부팅하고, 부트 로더 (GRUB) 를 중단하고, 커널의 부팅 옵션에 매개변수를 추가해야 합니다. 이렇게 하면 루트 파일 시스템이 마운트되고 대부분의 서비스가 비활성화된 단일 사용자 셸이 제공되므로 문제 해결에 이상적입니다.

이 컨테이너화된 랩 환경에서는 실제 재부팅을 수행하거나 GRUB 메뉴에 액세스할 수 없지만, rescue 모드의 구성을 탐색하여 작동 방식을 이해할 수 있습니다.

먼저, rescue.target에 대한 systemd 유닛 파일을 찾아보겠습니다. 이러한 파일은 일반적으로 /usr/lib/systemd/system/ 디렉토리에 저장됩니다.

ls -l /usr/lib/systemd/system/rescue.target

파일이 권한 및 소유권과 함께 나열되는 것을 볼 수 있습니다.

-rw-r--r--. 1 root root 500 Nov  1  2022 /usr/lib/systemd/system/rescue.target

이제 이 파일의 내용을 검토하여 구성을 이해해 보겠습니다. cat 명령은 터미널에 파일의 내용을 표시합니다.

cat /usr/lib/systemd/system/rescue.target

출력은 대상의 정의를 보여줍니다.

##  SPDX-License-Identifier: LGPL-2.1-or-later
#
##  This file is part of systemd.
#
##  systemd is free software; you can redistribute it and/or modify it
##  under the terms of the GNU Lesser General Public License as published by
##  the Free Software Foundation; either version 2.1 of the License, or
##  (at your option) any later version.

[Unit]
Description=Rescue Mode
Documentation=man:systemd.special(7)
Requires=sysinit.target rescue.service
After=sysinit.target rescue.service
AllowIsolate=yes

이 파일의 주요 지시어는 다음과 같습니다.

  • Description=Rescue Mode: 대상에 대한 사람이 읽을 수 있는 이름입니다.
  • Requires=sysinit.target rescue.service: 이 대상이 활성화될 때 sysinit.target(기본 시스템 초기화) 과 rescue.service가 모두 시작되도록 합니다. rescue 서비스는 루트 유지 관리 셸을 제공합니다.
  • After=sysinit.target rescue.service: 활성화 순서를 지정하여 시스템 초기화 및 rescue 서비스 이후에 rescue 모드가 시작되도록 합니다.
  • AllowIsolate=yes: 이를 통해 실행 중인 시스템에서 systemctl isolate rescue.target 명령을 사용하여 다른 대상에서 이 대상으로 전환할 수 있습니다.

rescue 모드가 제공하는 최소 환경에 대한 더 나은 아이디어를 얻으려면 종속성을 볼 수 있습니다. systemctl list-dependencies 명령은 대상의 일부로 시작되는 모든 유닛을 보여줍니다.

systemctl list-dependencies rescue.target

출력은 rescue 모드에 필요한 유닛을 나열합니다. 수리 작업을 위해 설계된 간소화된 환경임을 확인하는 최소한의 서비스 집합을 볼 수 있습니다.

rescue.target
○ ├─rescue.service
○ ├─systemd-update-utmp-runlevel.service
● └─sysinit.target
●   ├─dev-hugepages.mount
●   ├─dev-mqueue.mount
●   ├─dracut-shutdown.service
○   ├─iscsi-onboot.service
○   ├─iscsi-starter.service
●   ├─kmod-static-nodes.service
●   ├─ldconfig.service
●   ├─lvm2-lvmpolld.socket
... (output may vary) ...

핵심 내용은 rescue.target이 파일 시스템을 읽기 - 쓰기로 마운트하여 루트 셸을 제공하므로 시스템 문제를 해결할 수 있다는 것입니다. 다음 단계에서는 유사한 원칙에 의존하는 복구 시나리오를 시뮬레이션합니다.

rd.break 및 chroot 를 사용하여 Root 비밀번호 재설정

이 단계에서는 RHEL 시스템에서 분실된 루트 암호를 재설정하는 절차를 배우게 됩니다. 이는 중요한 복구 기술입니다. 표준 방법은 rd.break 커널 매개변수를 사용하여 부팅 프로세스를 중단하는 것입니다. 이렇게 하면 시스템이 완전히 시작되기 전에 셸에 액세스할 수 있습니다.

물리적 또는 가상 머신에서 재부팅하고, GRUB 부트 로더를 중단하고, rd.breaklinux 커널 라인 끝에 추가합니다. 이 작업은 systemd가 제어하기 직전에 부팅 프로세스를 중지하여 initramfs 셸에 배치합니다. 거기에서 일반적인 단계는 다음과 같습니다.

  1. mount -o remount,rw /sysroot 명령을 사용하여 시스템의 루트 파일 시스템 (/sysroot에 읽기 전용으로 마운트됨) 을 읽기 - 쓰기 모드로 다시 마운트합니다.
  2. chroot /sysroot를 사용하여 /sysroot에서 chroot jail 에 들어갑니다. 이렇게 하면 시스템의 실제 루트 파일 시스템이 현재 환경이 되어 시스템에 영향을 미치는 명령을 실행할 수 있습니다.
  3. passwd 명령을 사용하여 암호를 변경합니다.
  4. 잠재적인 SELinux 컨텍스트 문제를 해결합니다.
  5. chrootinitramfs 셸을 종료하여 부팅을 계속합니다.

이 랩 환경에서는 실제 재부팅을 수행하고 rd.break를 사용할 수 없지만, chroot 환경에 들어간 후 실행할 가장 중요한 명령을 시뮬레이션합니다.

먼저, 루트 암호 변경을 시뮬레이션해 보겠습니다. chroot jail 에 성공적으로 들어갔다고 가정해 보겠습니다. 이제 모든 사용자의 암호를 변경할 수 있는 루트 액세스 권한이 있습니다. sudo passwd root 명령을 사용하여 root 사용자의 암호를 변경합니다. 메시지가 표시되면 새 암호를 redhat으로 설정합니다.

sudo passwd root

새 암호를 입력하고 다시 입력하라는 메시지가 표시됩니다 (예: labex.io).

Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

이 복구 환경에서 암호를 변경한 후, 암호 파일 (/etc/shadow) 의 SELinux 보안 컨텍스트가 잘못될 수 있습니다. 이를 수정하려면 다음 부팅 시 전체 시스템 SELinux 재레이블링을 강제로 수행해야 합니다. 이는 루트 (/) 디렉토리에 .autorelabel이라는 빈 파일을 생성하여 수행됩니다.

sudo touch /.autorelabel

파일이 생성되었는지 확인해 보겠습니다.

ls -l /.autorelabel

출력은 새로 생성된 파일을 표시해야 합니다.

-rw-r--r--. 1 root root 0 <date> <time> /.autorelabel

실제 시스템에서는 이제 exit를 두 번 입력하고 시스템을 재부팅합니다. 긴 재레이블링 프로세스를 수행한 다음 새 암호로 정상적으로 부팅됩니다. 랩에서 이를 트리거하고 싶지 않으므로 방금 생성한 파일을 제거하여 정리합니다.

sudo rm /.autorelabel

이것으로 루트 암호 재설정에 대한 시뮬레이션이 완료되었습니다. 복구 프로세스의 핵심인 주요 명령 (passwdtouch /.autorelabel) 을 연습했습니다.

Emergency Mode 를 사용하여 /etc/fstab 오류 복구

이 단계에서는 /etc/fstab 파일의 오류를 진단하고 복구하는 방법을 배우게 됩니다. 이 파일은 시스템에 어떤 파일 시스템을 어디에 마운트할지 알려주므로 부팅 프로세스에 매우 중요합니다. /etc/fstab에 잘못된 항목이 있으면 시스템이 부팅되지 않아 응급 모드로 강제 진입될 수 있습니다.

응급 모드는 시스템 복구를 위해 가능한 가장 최소한의 환경을 제공합니다. rescue 모드와 달리 대부분의 파일 시스템을 마운트하거나 많은 서비스를 시작하려고 시도하지 않습니다. 특히, 루트 파일 시스템 (/) 은 추가 손상을 방지하기 위해 읽기 전용 (ro) 모드로 마운트됩니다.

이 랩에서는 실제 부팅 실패를 트리거할 수 없지만, /etc/fstab 오류를 찾아 수정하는 프로세스를 시뮬레이션할 수 있습니다.

먼저, 의도적으로 /etc/fstab에 결함이 있는 항목을 추가해 보겠습니다. sudo와 함께 echo 명령을 사용하여 존재하지 않는 장치를 참조하는 줄을 추가합니다.

echo '/dev/nonexistent /data xfs defaults 0 0' | sudo tee -a /etc/fstab

이제 /etc/fstab의 내용을 보고 잘못된 줄이 추가되었는지 확인해 보겠습니다.

cat /etc/fstab

파일 끝에 잘못된 줄이 표시되어야 합니다.

#
## /etc/fstab
## Created by anaconda on <date>
#
## Accessible filesystems, by reference, are maintained under '/dev/disk/'.
## See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
## After editing this file, run 'systemctl daemon-reload' to update systemd
## units generated from this file.
#
/dev/vda4 / xfs defaults 0 0
/dev/vda2 /boot xfs defaults 0 0
/dev/vda1 /boot/efi vfat umask=0077,shortname=winnt 0 0
/dev/vda3 swap swap defaults 0 0
/dev/nonexistent /data xfs defaults 0 0

다음으로, 진단 단계를 시뮬레이션합니다. mount -a 명령은 이미 마운트되지 않은 /etc/fstab에 나열된 모든 파일 시스템을 마운트하려고 시도합니다. 항목이 유효하지 않으므로 이 명령은 실패합니다.

sudo mount -a

이 명령은 오류를 생성하여 마운트 지점 /data가 존재하지 않음을 명확하게 나타냅니다. 이는 부팅 실패 시 표시되는 오류와 유사합니다.

mount: /data: mount point does not exist.

이제 복구 프로세스를 시뮬레이션해 보겠습니다. 실제 응급 셸에서 첫 번째 단계는 변경을 허용하기 위해 루트 파일 시스템을 읽기 - 쓰기 모드로 다시 마운트하는 것입니다.

sudo mount -o remount,rw /

이제 파일 시스템을 쓸 수 있으므로 /etc/fstab을 편집하여 오류를 수정할 수 있습니다. nano 편집기를 사용하여 파일을 엽니다.

sudo nano /etc/fstab

nano 편집기 내에서 화살표 키를 사용하여 잘못된 줄 (/dev/nonexistent /data xfs defaults 0 0) 로 이동하여 삭제합니다. Ctrl+k를 눌러 전체 줄을 삭제할 수 있습니다. 줄을 제거한 후 Ctrl+x, y, 마지막으로 Enter를 눌러 파일을 저장합니다.

수정을 확인하려면 sudo mount -a를 다시 실행합니다.

sudo mount -a

이번에는 명령이 출력이 없이 조용히 실행되어야 합니다. 이는 /etc/fstab의 모든 유효한 항목이 올바르게 마운트되었음을 나타냅니다. 파일을 성공적으로 복구했습니다.

요약

이 랩에서는 Red Hat Enterprise Linux 부팅 프로세스 문제 해결을 위한 필수 기술을 배웠습니다. systemctl을 사용하여 현재 기본값을 보고 graphical.targetmulti-user.target 간에 변경하는 등 systemd 부팅 대상 관리를 연습했습니다. 또한 GRUB 메뉴에서 rescue mode 로 부팅하여 단일 사용자 셸에서 시스템 유지 관리 작업을 수행하는 등, 특수 복구 환경에 액세스하기 위해 부팅 시퀀스를 중단하는 방법을 배웠습니다.

또한 일반적인 시스템 오류에 대한 중요한 복구 절차를 실행했습니다. rd.break 커널 매개변수를 사용하고, 쓰기 권한으로 루트 파일 시스템을 다시 마운트하고, chroot 환경을 사용하여 새 암호를 설정하는 동시에 .autorelabel 파일을 생성하여 SELinux 컨텍스트를 처리함으로써 잊어버린 루트 암호를 성공적으로 재설정했습니다. 마지막으로, 응급 모드로 들어가 문제 항목을 식별하고 주석 처리하여 시스템이 성공적으로 부팅되도록 함으로써 /etc/fstab 오류로 인한 부팅 실패를 해결하는 방법을 배웠습니다.