내용으로 건너뛰기

업데이트로 인해 EC2 인스턴스 재부팅이 차단된 후 알려진 안정적인 커널로 되돌리려면 어떻게 해야 합니까?

6분 분량
0

업데이트로 인해 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스가 재부팅되지 않습니다. 안정적인 커널로 되돌리고 싶습니다.

간략한 설명

EC2 Linux 인스턴스에 커널 업데이트를 수행했지만 커널이 손상된 경우 인스턴스를 재부팅할 수 없습니다. 또한 SSH를 사용하여 영향을 받는 인스턴스에 연결할 수도 없습니다.

이 문제를 해결하려면 EC2 직렬 콘솔을 사용하여 루트 볼륨에 액세스합니다. 또는 임시 복구 인스턴스를 생성한 다음, 복구 인스턴스에 Amazon Elastic Block Store(Amazon EBS) 볼륨을 다시 마운트합니다. 이전 커널을 사용하도록 GNU GRUB를 구성한 다음, 인스턴스를 재부팅합니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

인스턴스의 루트 볼륨에 액세스

루트 볼륨에 액세스하려면 EC2 직렬 콘솔 또는 복구 인스턴스를 사용하십시오.

EC2 직렬 콘솔 사용

전제 조건: EC2 직렬 콘솔에 대한 액세스가 이미 구성되어 있어야 합니다. 인스턴스에 연결할 수 없고 액세스를 아직 구성하지 않은 경우, 복구 인스턴스를 사용하여 루트 볼륨에 액세스해야 합니다. 또한 직렬 콘솔 전제 조건을 준수해야 합니다.

Linux용 EC2 직렬 콘솔을 활성화한 경우 Nitro 기반 인스턴스 유형에 이를 사용하여 부팅, 네트워크 구성 및 SSH 구성 문제를 해결하십시오.

작동 중인 네트워크 연결 없이도 직렬 콘솔을 사용하여 인스턴스에 연결할 수 있습니다.

직렬 콘솔을 사용하기 전에 AWS 계정 수준에서 액세스 권한을 부여합니다. 그런 다음, IAM 사용자에게 액세스 권한을 부여하는 AWS Identity and Access Management(IAM) 정책을 생성합니다. 직렬 콘솔을 사용하는 모든 인스턴스에는 한 명 이상의 암호 기반 사용자가 포함되어야 합니다.

복구 인스턴스 사용

중요: 인스턴스 저장소 기반 인스턴스에서는 이 절차를 수행하지 마십시오. 복구 절차를 수행하려면 인스턴스를 중지하고 시작해야 하므로 인스턴스의 데이터가 손실됩니다.

복구 인스턴스를 사용하여 루트 볼륨에 액세스하려면 다음 단계를 완료하십시오.

  1. 루트 볼륨의 Amazon EBS 스냅샷을 생성합니다.

  2. 영향을 받은 인스턴스를 중지합니다.

  3. 영향을 받는 인스턴스에서 Amazon EBS 루트 볼륨을 분리합니다(/dev/xvda 또는 /dev/sda1). 루트 볼륨의 디바이스 이름을 기록해 두십시오.
    참고: 이후 단계에서 EBS 볼륨을 식별하는 데 도움이 되도록 분리하기 전에 볼륨에 태그를 지정하십시오. 루트 디바이스는 Amazon Machine Image(AMI)에 따라 다릅니다. 예를 들어 Amazon Linux 2(AL2) 및 Amazon Linux 2023(AL2023)은 /dev/xvda를 사용합니다. 그러나 Ubuntu 14, 16, 18, CentOS 7 및 Red Hat Enterprise Linux(RHEL) 7.5에서는 /dev/sda1을 사용합니다.

  4. 스냅샷과 동일한 가용 영역에서 복구 EC2 인스턴스를 시작합니다.
    참고: 인스턴스 제품 코드를 확인하십시오. 일부 제품 코드는 동일한 운영 체제(OS) 유형에서 EC2 인스턴스를 시작해야 합니다. 예를 들어 영향을 받는 인스턴스가 유료 RHEL AMI인 경우 동일한 제품 코드로 AMI를 시작해야 합니다. AL2 인스턴스가 있는 경우 오류를 방지하려면 AL2 복구 인스턴스를 만들어야 합니다.

  5. 복구 인스턴스에 보조 디바이스(/dev/sdf)로 볼륨을 연결합니다.

  6. SSH를 사용하여 복구 인스턴스에 연결합니다.

  7. 사용 가능한 디스크 디바이스를 보려면 다음 명령을 실행합니다.

    lsblk

    출력 예시:

    NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    xvda    202:0     0   15G  0 disk
    └─xvda1 202:1     0   15G  0 part /
    xvdf    202:0     0   15G  0 disk
        └─xvdf1 202:1 0   15G  0 part

    참고: Nitro 기반 인스턴스는 EBS 볼륨을 NVMe 블록 디바이스로 표시합니다(디스크 이름 nvme[0-26]n1). Nitro 기반 인스턴스의 출력 예시:

    NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    nvme0n1        259:0    0    8G  0 disk
    └─nvme0n1p1    259:1    0    8G  0 part /
    └─nvme0n1p128  259:2    0    1M  0 part
    nvme1n1        259:3    0  100G  0 disk
    └─nvme1n1p1    259:4    0  100G  0 part /
  8. 루트 사용자가 되려면 다음 명령을 실행합니다.

    sudo -i
  9. 마운트된 볼륨의 루트 파티션을 /mnt에 마운트하려면 다음 명령을 실행합니다.

    mount -o nouuid /dev/xvdf1 /mnt

    참고: /dev/xvdf1을 볼륨의 루트 파티션으로 바꾸십시오. 구성에 /mnt가 없는 경우 다음 명령을 실행하여 마운트 디렉터리를 만든 다음, 루트 파티션을 새 디렉터리에 마운트합니다.

    mkdir /mnt
    mount -o nouuid /dev/xvdf1 /mnt

    참고: 위의 mount 명령을 실행할 때 오류가 발생하면 다음 명령을 대신 실행하십시오.

    mount /dev/xvdf1 /mnt

    그 다음, 마운트 디렉터리를 사용하여 영향을 받는 인스턴스의 데이터에 액세스하십시오.

  10. 복구 인스턴스의 /dev, /run, /proc/sys를 마운트된 볼륨과 동일한 경로에 마운트하려면 다음 명령을 실행합니다.

for m in dev proc run sys; do mount -o bind {,/mnt}/$m; done
  1. 별도의 /boot 파티션이 있는 경우에는 /mnt/boot에 마운트합니다.
  2. 마운트 디렉터리로 변경하려면 다음 명령을 실행합니다.
chroot /mnt

GRUB 부트로더에서 기본 커널 업데이트

목록의 위치 0에서 손상된 커널을 찾고 위치 1에서 안정적인 마지막 커널을 찾을 수 있습니다. 손상된 커널을 안정적인 커널로 바꾸려면 배포에 따라 다음 단계를 완료하십시오.

Red Hat 6용 GRUB1(레거시 GRUB)

손상된 커널을 /boot/grub/grub.conf 파일의 안정적인 커널로 바꾸려면 다음 명령을 실행합니다.

sed -i '/^default/ s/0/1/' /boot/grub/grub.conf

Ubuntu 14 LTS, 16.04 및 18.04용 GRUB2

다음 단계를 완료하십시오.

  1. 손상된 GRUB_DEFAULT=0 기본 메뉴 항목을 /etc/default/grub 파일의 안정적인 GRUB_DEFAULT=saved 값으로 바꾸려면 다음 명령을 실행합니다.

    sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=saved/g' /etc/default/grub
  2. GRUB에서 변경 사항을 인식하도록 하려면 다음 명령을 실행합니다.

    update-grub

    참고: grub 구성 파일을 다시 빌드할 때 "device-mapper: reload ioctl on osprober-linux-xvdaX failed: Device or resource busy Command failed" 오류가 표시될 수 있습니다. 이 문제를 해결하려면 GRUB_DISABLE_OS_PROBER=true 파라미터를 /etc/default/grub 파일에 추가한 다음, 위의 명령을 다시 실행하십시오.

  3. 다음 재부팅 시 Amazon EC2가 안정적인 커널을 로드하도록 하려면 다음 명령을 실행합니다.

    grub-set-default 1

RHEL 7 및 AL2용 GRUB2

다음 단계를 완료하십시오.

  1. 손상된 GRUB_DEFAULT=0 기본 메뉴 항목을 /etc/default/grub 파일의 안정적인 GRUB_DEFAULT=saved 값으로 바꾸려면 다음 명령을 실행합니다.

    sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=saved/g' /etc/default/grub
  2. GRUB을 업데이트하여 /boot/grub2/grub.cfg 파일을 다시 생성하려면 다음 명령을 실행합니다.

    grub2-mkconfig -o /boot/grub2/grub.cfg

    참고: grub 구성 파일을 다시 빌드할 때 "device-mapper: reload ioctl on osprober-linux-xvdaX failed: Device or resource busy Command failed" 오류가 표시될 수 있습니다. 이 문제를 해결하려면 GRUB_DISABLE_OS_PROBER=true 파라미터를 /etc/default/grub 파일에 추가한 다음, 위의 명령을 다시 실행하십시오.

  3. 다음 재부팅 시 Amazon EC2가 안정적인 커널을 로드하도록 하려면 다음 명령을 실행합니다.

    grub2-set-default 1

RHEL 8, CentOS 8, AL2023용 GRUB2

GRUB2는 부트 구성에 이전 grub.cfg 형식 대신 blscfg 파일과 /boot/loader의 항목을 사용합니다. 모범 사례는 blscfg 파일을 관리하고 **/boot/loader/entries/**에서 정보를 검색하려면 grubby 도구를 사용하는 것입니다. blscfg 파일이 없거나 손상된 경우 grubby는 결과를 표시하지 않습니다. 기능을 복구하려면 파일을 다시 생성해야 합니다.

GRUB2에서 기본 커널을 업데이트하려면 다음 단계를 완료하십시오.

  1. 현재 기본 커널을 보려면 다음 명령을 실행합니다.

    grubby --default-kernel
  2. 사용 가능한 모든 커널과 해당 인덱스를 보려면 다음 명령을 실행합니다.

    grubby --info=ALL

    출력 예시:

    root@ip-172-31-29-221 /]# grubby --info=ALLindex=0
    kernel="/boot/vmlinuz-4.18.0-305.el8.x86_64"
    args="ro console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto $tuned_params"
    root="UUID=d35fe619-1d06-4ace-9fe3-169baad3e421"
    initrd="/boot/initramfs-4.18.0-305.el8.x86_64.img $tuned_initrd"
    title="Red Hat Enterprise Linux (4.18.0-305.el8.x86_64) 8.4 (Ootpa)"
    id="0c75beb2b6ca4d78b335e92f0002b619-4.18.0-305.el8.x86_64"
    index=1
    kernel="/boot/vmlinuz-0-rescue-0c75beb2b6ca4d78b335e92f0002b619"
    args="ro console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto"
    root="UUID=d35fe619-1d06-4ace-9fe3-169baad3e421"
    initrd="/boot/initramfs-0-rescue-0c75beb2b6ca4d78b335e92f0002b619.img"
    title="Red Hat Enterprise Linux (0-rescue-0c75beb2b6ca4d78b335e92f0002b619) 8.4 (Ootpa)"
    id="0c75beb2b6ca4d78b335e92f0002b619-0-rescue"
    index=2
    kernel="/boot/vmlinuz-4.18.0-305.3.1.el8_4.x86_64"
    args="ro console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto $tuned_params"
    root="UUID=d35fe619-1d06-4ace-9fe3-169baad3e421"
    initrd="/boot/initramfs-4.18.0-305.3.1.el8_4.x86_64.img $tuned_initrd"
    title="Red Hat Enterprise Linux (4.18.0-305.3.1.el8_4.x86_64) 8.4 (Ootpa)"
    id="ec2fa869f66b627b3c98f33dfa6bc44d-4.18.0-305.3.1.el8_4.x86_64"

    인스턴스의 기본값으로 설정한 커널 경로를 기록해 두십시오. 위 예제에서 인덱스 2의 커널 경로는 /boot/vmlinuz- 0-4.18.0-80.4.2.el8_1.x86_64입니다.

  3. 인스턴스의 기본 커널을 변경하려면 다음 명령을 실행합니다.

    grubby --set-default=/boot/vmlinuz-4.18.0-305.3.1.el8_4.x86_64

    참고: 4.18.0-305.3.1.el8_4.x86_64를 커널 버전 번호로 바꾸십시오.

  4. 기본 커널을 올바르게 구성했는지 확인하려면 다음 명령을 실행합니다.

    grubby --default-kernel

인스턴스 재부팅

EC2 직렬 콘솔을 사용한 경우 이제 Amazon EC2가 안정적인 커널을 로드합니다. 인스턴스를 재부팅할 수 있습니다.

복구 인스턴스를 사용하여 루트 볼륨에 액세스한 경우 다음 단계를 완료하십시오.

  1. chroot를 종료하고 /dev, /run, /proc/sys를 마운트 해제하려면 다음 명령을 실행합니다.

    exit
    umount /mnt/{dev,proc,run,sys,}
  2. 복구 인스턴스를 중지합니다.

  3. 복구 인스턴스에서 루트 볼륨을 분리합니다.

  4. /dev/xvda 또는 /dev/sda1 루트 볼륨으로 원본 인스턴스에 루트 볼륨을 연결합니다.

  5. 원본 인스턴스를 시작합니다.

  6. 이제 Amazon EC2가 안정적인 커널을 로드합니다. 인스턴스를 재부팅할 수 있습니다.

AWS 공식업데이트됨 6달 전