Dean 씨가 알려주는 재부팅에
실패한 EC2 인스턴스에서 이전 커널을
로드하도록 GRUB을 업데이트하는 방법

Dean_CPT1018

업데이트로 인해 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 재부팅하지 못하는 경우 안정적인 커널로 되돌리려면 어떻게 해야 합니까?

Linux EC2 인스턴스에 대한 커널 업데이트를 수행하지만, 현재 커널이 손상된 경우 EC2 인스턴스가 재부팅되지 않습니다. 또한 SSH를 사용하여 손상된 인스턴스에 연결할 수도 없습니다. 그러나 임시 복구 인스턴스를 생성하고 복구 인스턴스에서 EBS 볼륨을 다시 마운트한 후에 GRUB에 커널 파라미터를 변경하여 손상된 커널을 제거할 수 있습니다.

중요: 인스턴스가 인스턴스 저장소 지원 인스턴스인 경우 이 절차를 수행하지 마십시오. 이 복구 절차에서는 인스턴스를 중지하고 시작해야 하므로 데이터가 유실됩니다. 자세한 내용은 인스턴스의 루트 디바이스 유형 확인을 참조하십시오.

복구 EC2 인스턴스에 루트 볼륨 연결

1.    루트 볼륨의 EBS 스냅샷을 생성합니다. 자세한 내용은 Amazon EBS 스냅샷 생성을 참조하십시오.

2.    Amazon EC2 콘솔을 엽니다.

참고: 올바른 AWS 리전에 있어야 합니다.

3.    탐색 창에서 [Instances]를 선택하고 손상된 인스턴스를 선택합니다.

4.    [Actions]를 선택하고 [Instance State]를 선택하고 [Stop]을 선택합니다.

5.    [Description] 탭의 [Root device]에서 [/dev/sda1]을 선택하고 EBS ID를 선택합니다.

참고: 루트 디바이스는 AMI에 따라 다르지만, 루트 디바이스에 대해 항상 /dev/sda1 또는 /dev/xvda가 예약됩니다. 예를 들어, Amazon Linux 1 및 2는 /dev/xvda를 나타내지만, Ubuntu 14, 16, 18, CentOS 7, RHEL 7.5와 같은 다른 배포는 /dev/sda1로 설정됩니다.

6.    [Actions]를 선택하고 [Detach Volume]을 선택하고 [Yes, Detach]를 선택합니다. 가용 영역을 기록합니다.

7.    동일한 가용 영역에서 복구 EC2 인스턴스를 시작합니다.

참고: 제품 코드에 따라 동일한 OS 유형의 EC2 인스턴스를 시작해야 할 수도 있습니다. 예를 들어, 손상된 EC2 인스턴스가 유료 RHEL AMI인 경우 동일한 제품 코드로 AMI를 시작해야 합니다. 자세한 내용은 인스턴스에 대한 제품 코드 가져오기를 참조하십시오.

8.    복구 인스턴스를 시작한 후에 탐색 창에서 [Volumes]를 선택하고 손상된 인스턴스의 분리된 루트 볼륨을 선택합니다.

9.    [Actions]를 선택하고 [Attach Volume]을 선택합니다.

10.     복구 인스턴스 ID(id-xxxxx)를 선택하고 사용하지 않는 디바이스를 설정합니다. 이 예에서는/dev/xvdb를 사용합니다.

손상된 인스턴스의 볼륨 마운트

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

2.    lsblk 명령을 실행하여 사용 가능한 디스크 디바이스를 확인합니다.

lsblk

다음은 출력에 대한 예입니다.

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

3.    마운트 디렉터리를 생성한 후 여기에 /dev/xvdb1 파티션을 마운트합니다. 자세한 내용은 Amazon EBS 볼륨을 Linux에서 사용할 수 있도록 만들기를 참조하십시오.

sudo mkdir /mount
sudo mount /dev/xvdb1 /mount

이제 마운트 디렉터리를 통해 손상된 인스턴스의 데이터에 액세스할 수 있습니다.

4.    새로 마운트한 볼륨과 동일한 경로에 복구 인스턴스의 /dev, /dev/shm, /proc/sys를 마운트합니다.

sudo mount -o bind /dev /mount/dev
sudo mount -o bind /dev/shm /mount/dev/shm
sudo mount -o bind /proc /mount/proc 
sudo mount -o bind /sys /mount/sys

5.    chroot 함수를 호출하여 마운트 디렉터리로 변경합니다.

sudo chroot /mount

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

현재 손상된 커널은 목록에서 위치 0에 있습니다. 마지막 안정적인 커널은 위치 1에 있습니다. 손상된 커널을 안정적인 커널로 교체하려면 배포에 따라 다음 절차 중 하나를 선택합니다.

  • Red Hat 6 및 Amazon Linux에 대한 GRUB1(레거시 GRUB)
  • Ubuntu 14 LTS 및 16.04에 대한 GRUB2
  • RHEL 7.5 및 Amazon Linux 2에 대한 GRUB2

Red Hat 6 및 Amazon Linux 1에 대한 GRUB1(레거시 GRUB)

sed 명령을 사용하여 /boot/grub/grub.conf 파일에서 손상된 커널을 안정적인 커널로 교체합니다.

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

Ubuntu 14 LTS 및 16.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을 업데이트합니다.

sudo update-grub

3.    다음에 재부팅할 때 안정적인 커널을 로드하도록 grub-set-default 명령을 실행합니다. 이 예에서 grub-set-default는 위치 0에서 1로 설정됩니다.

sudo grub-set-default 1

RHEL 7.5 및 Amazon Linux 2에 대한 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.    /boot/grub2/grub.cfg 파일을 재생성하도록 grub을 업데이트합니다.

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

3.    다음에 재부팅할 때 안정적인 커널을 로드하도록 grub2-set-default 명령을 실행합니다. 이 예에서 grub2-set-default는 위치 0에서 1로 설정됩니다.

sudo grub2-set-default 1

4.    exit를 입력하여 chroot 환경을 종료합니다.

복구 인스턴스에서 루트 볼륨을 분리하고 손상된 인스턴스에 연결

1.    Amazon EC2 콘솔에서 [Instances]를 선택하고 복구 인스턴스를 선택합니다.

2.    [Actions]를 선택하고 [Instance State]를 선택하고 [Stop]을 선택한 다음, [Yes, Stop]을 선택합니다.

3.    복구 인스턴스에서 루트 볼륨 vol-xxx를 분리합니다.

4.    손상된 인스턴스에 루트 볼륨(/dev/sda1)으로 루트 볼륨을 연결하고 인스턴스를 시작합니다.

참고: 배포에 따라 루트 볼륨이 달라집니다. Amazon Linux 1 및 2의 경우 루트 볼륨은 /dev/xvda이어야 합니다. 아닌 경우 오류가 수신됩니다. 마찬가지로 배포가 RHEL, CentOS 또는 Ubuntu인 경우 루트 볼륨은 /dev/sda1이어야 합니다.

이제 안정적인 커널이 로드되고 인스턴스가 재부팅됩니다.


페이지 내용이 도움이 되었습니까? | 아니요

AWS 지원 지식 센터로 돌아가기

도움이 필요하십니까? AWS 지원 센터를 방문하십시오.

게시 날짜: 2019년 1월 15일