연결하거나 액세스할 수 없는 Linux 인스턴스의 EC2 직렬 콘솔 액세스를 구성하려면 어떻게 해야 하나요?

7분 분량
0

Amazon Elastic Compute Cloud(Amazon EC2) Linux 인스턴스에 연결하거나 액세스할 수 없습니다. OS 수준에서 EC2 직렬 콘솔 액세스를 구성하지 않았습니다.

간략한 설명

직렬 콘솔 액세스를 구성하려면 다음 단계를 따르세요.

1.    인스턴스의 루트 볼륨에 액세스합니다.

2.    루트 사용자 또는 다른 OS 사용자의 암호를 설정합니다.

3.    직렬 콘솔의 GRUB 설정을 확인하고 업데이트합니다.

참고: 영향을 받는 인스턴스에서 EC2 직렬 콘솔이 제대로 작동하는 경우 3단계를 건너뛸 수 있으며 OS 사용자의 암호만 설정하면 됩니다.

사전 요구 사항

직렬 콘솔을 사용하려면 OS 사용자 암호 설정을 제외한 사전 요구 사항을 충족해야 합니다. 암호 설정은 다음 해결 방법에 설명되어 있습니다.

해결 방법

복구 인스턴스를 사용하여 인스턴스의 루트 볼륨 액세스

임시 복구 인스턴스를 만든 다음 Amazon Elastic Block Store(Amazon EBS) 볼륨을 복구 인스턴스에 다시 마운트합니다. 복구 인스턴스에서 직렬 콘솔의 GRUB 설정을 확인하고 수정할 수 있습니다. 루트 사용자 또는 다른 OS 사용자의 암호를 설정할 수도 있습니다.

중요: 인스턴스 스토어 지원 인스턴스에서는 이 절차를 수행하지 마세요. 복구 절차를 수행하려면 인스턴스를 중지하고 시작해야 하므로 인스턴스의 모든 데이터가 손실됩니다. 자세한 내용은 인스턴스의 루트 디바이스 유형 결정을 참조하세요.

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

2.    Amazon EC2 콘솔을 엽니다.

참고: 리전이 올바른지 확인합니다.

3.    탐색 창에서 인스턴스를 선택한 다음 손상된 인스턴스를 선택합니다.

4.    인스턴스 상태, 인스턴스 중지를 선택한 다음 중지를 선택합니다.

5.    스토리지 탭의 블록 디바이스에서 /dev/sda1 또는 /dev/xvda볼륨 ID를 선택합니다.

참고: 루트 디바이스는 AMI마다 다르지만 /dev/xvda 또는 /dev/sda1은 루트 디바이스용으로 예약되어 있습니다. 예를 들어 Amazon Linux 1과 2는 /dev/xvda를 사용합니다. Ubuntu 16, 18, CentOS 7, RHEL 7.5 등의 다른 배포판에서는 /dev/sda1을 사용합니다.

6.    작업, 볼륨 분리를 선택한 다음 예, 분리를 선택합니다. 가용 영역을 기록해 둡니다.

참고: 분리하기 전에 EBS 볼륨의 태그를 지정하면 이후 단계에서 쉽게 알아볼 수 있습니다.

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

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

원본 인스턴스에서 SELinux(예: RHEL, CentOS 7 또는 8)를 실행하는 경우 SELinux를 사용하는 AMI에서 복구 인스턴스를 시작합니다. Amazon Linux 2 등의 다른 OS를 실행하는 AMI를 선택하면 원본 인스턴스에 수정된 파일이 있을 때 SELinux 레이블이 손상됩니다.

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

9.    작업, 볼륨 연결을 선택합니다.

10.    복구 인스턴스 ID(id-xxxxx)를 선택한 다음 사용되지 않은 디바이스를 설정합니다. 이 예시에서는 /dev/sdf입니다.

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

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

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 블록 디바이스로 노출합니다. Nitro 기반 인스턴스에서 lsblk 명령으로 생성된 출력에는 디스크 이름이 nvme[0-26]n1로 표시됩니다. 자세한 내용은 Linux 인스턴스의 Amazon EBS 및 NVMe를 참조하세요. 다음은 Nitro 기반 인스턴스의 lsblk 명령 출력 예시입니다.

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 /

13.    루트가 되도록 다음 명령을 실행합니다.

sudo -i

14.    마운트된 볼륨의 루트 파티션을 /mnt에 마운트합니다. 이전 예시에서 /dev/xvdf1 또는 /dev/nvme2n1p2는 마운트된 볼륨의 루트 파티션입니다. 자세한 내용은 Amazon EBS 볼륨을 Linux에서 사용할 수 있도록 설정을 참조하세요.

참고: 다음 예시에서 볼륨의 올바른 루트 파티션으로 /dev/xvdf1을 바꿉니다.

mount -o nouuid /dev/xvdf1 /mnt

참고: 구성에 /mnt가 없는 경우 마운트 디렉터리를 만든 다음 마운트된 볼륨의 루트 파티션을 새로운 이 디렉터리에 마운트하세요.

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

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

15.    복구 인스턴스의 /dev, /run, /proc, /sys를 새로 마운트한 볼륨과 같은 경로에 마운트합니다.

for m in dev proc run sys; do mount -o bind {,/mnt}/$m; done

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

참고:****/boot/etc 파티션이 분리되어 있는 경우 다음 명령을 실행하기 전에 이를 /mnt/boot/mnt/etc에 마운트하세요.

chroot /mnt

루트 사용자 또는 다른 OS 사용자의 암호를 설정합니다.

passwd 명령을 사용하여 OS 사용자의 암호를 설정합니다. 다음 예시에서 사용자는 루트입니다.

passwd root

직렬 콘솔의 GRUB 설정을 확인하고 업데이트합니다.

참고: 영향을 받는 인스턴스에서 EC2 직렬 콘솔이 제대로 작동하는 경우 이 단계를 건너뛸 수 있으며 OS 사용자의 암호만 설정하면 됩니다.

지원되는 Linux용 직렬 콘솔 포트는 ttyS0입니다. EC2 직렬 콘솔에 연결할 때 아무것도 출력되지 않고 화면이 검은색으로 표시되는 경우 GRUB 설정에 console 항목이 제대로 구성되어 있는지 확인해야 합니다. 아래 제공된 예시는 직렬 콘솔이 제대로 작동하는 다양한 배포판의 AWS Marketplace AMI에서 가져온 것입니다.

Amazon Linux 2, RHEL, CentOS 7용 GRUB2

1.    /etc/default/grub 파일의 GRUB_CMDLINE_LINUX_DEFAULT 줄에 ttyS0에 대한 console 항목이 올바르게 설정되었는지 확인합니다.

Amazon Linux 2

GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0"

RHEL 7

GRUB_CMDLINE_LINUX="console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau crashkernel=auto"

CentOS 7

GRUB_CMDLINE_LINUX="console=tty0 crashkernel=auto net.ifnames=0 console=ttyS0"

2.    ttyS0에 대한 console 항목이 설정되지 않은 경우 GRUB_CMDLINE_LINUX_DEFAULT 줄에 추가합니다. 그런 다음 GRUB을 업데이트하여 /boot/grub2/grub.cfg 파일을 다시 생성합니다.

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

Red Hat 6 및 Amazon Linux 1용 GRUB1(레거시 GRUB)

1.    /boot/grub/grub.conf 파일의 kernel 줄에 ttyS0에 대한 console 항목이 올바르게 설정되었는지 확인합니다.

Amazon Linux 1

kernel /boot/vmlinuz-4.14.252-131.483.amzn1.x86_64 root=LABEL=/ console=tty1 console=ttyS0 selinux=0 nvme_core.io_timeout=4294967295

Red Hat 6

kernel /boot/vmlinuz-2.6.32-573.el6.x86_64 console=ttyS0 console=ttyS0,115200n8 ro root=UUID=0e6b1614-7bbe-4d6e-bc78-a5556a123ba8 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 xen_blkfront.sda_is_xvda=1 console=tty0 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_LVM rd_NO_DM

2.    ttyS0에 대한 console 항목이 설정되지 않은 경우 이전 예시를 참고하여 /boot/grub/grub.conf 파일에 추가합니다.

Ubuntu 16.04, 18.04, 20.04용 GRUB2

1.    /etc/default/grub.d/50-cloudimg-settings.cfg 파일의 GRUB_CMDLINE_LINUX_DEFAULT 줄에 ttyS0에 대한 console 항목이 올바르게 설정되었는지 확인합니다.

GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0 nvme_core.io_timeout=4294967295"

2.    console 항목 console=ttyS0이 설정되지 않은 경우**,** GRUB_CMDLINE_LINUX_DEFAULT 줄에 추가합니다. 그리고 다음 명령을 사용하여 GRUB 구성을 업데이트합니다.

update-grub

**RHEL 8, CentOS 8, Amazon Linux 2023용 GRUB2
**

1.    grubby --default-kernel 명령을 실행하여 현재 기본 커널을 확인합니다.

grubby --default-kernel

2.    grubby --info=ALL 명령을 실행하여 사용 가능한 모든 커널, 인덱스, 인수를 확인합니다.

grubby --info=ALL

3.    1단계에서 다룬 기본 커널의 args 줄에 ttyS0에 대한 console 항목이 올바르게 설정되어 있는지 확인합니다.

RHEL 8

index=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"

CentOS 8

index=2
kernel="/boot/vmlinuz-4.18.0-193.19.1.el8_2.x86_64"
args="ro console=ttyS0,115200n8 no_timer_check net.ifnames=0 nvme_core.io_timeout=4294967295 nvme_core.max_retries=10 crashkernel=auto $tuned_params"
root="UUID=b437cbaa-8fe5-49e4-8537-0895c219037a"
initrd="/boot/initramfs-4.18.0-193.19.1.el8_2.x86_64.img $tuned_initrd"
title="CentOS Linux (4.18.0-193.19.1.el8_2.x86_64) 8 (Core)"
id="dc49529e359897df0b9664481b009b1f-4.18.0-193.19.1.el8_2.x86_64"

Amazon Linux 2023

[root@ip-172-31-92-173 ~]# grubby --info DEFAULTindex=0
kernel="/boot/vmlinuz-6.1.15-28.43.amzn2023.x86_64"
Acessing serial console on Amazon Linux 2023
root="UUID=7efef47b-a4f8-4b90-9504-8196067a31b6"
initrd="/boot/initramfs-6.1.15-28.43.amzn2023.x86_64.img"
title="Amazon Linux (6.1.15-28.43.amzn2023.x86_64) 2023"
id="02c860b8daad4861b87f9b3603834c8f-6.1.15-28.43.amzn2023.x86_64"

4.    ttyS0에 대한 console 항목이 설정되지 않은 경우 다음 grubby 명령을 실행하여 기본 커널의 args에 추가합니다.

grubby --args "console=tty0 console=ttyS0,115200n8" --update-kernel DEFAULT

복구 인스턴스에서 루트 볼륨을 마운트 해제하고 분리한 다음, 손상된 인스턴스에 볼륨을 연결합니다.

1.    chroot를 종료하고 /dev, /run, /proc, /sys를 마운트 해제합니다.

exit
umount /mnt/{dev,proc,run,sys,}

2.    Amazon EC2 콘솔에서 인스턴스를 선택한 다음 복구 인스턴스를 선택합니다.

3.    인스턴스 상태, 인스턴스 중지를 선택한 다음 예, 중지를 선택합니다.

4.    루트 볼륨 id-xxxxx(손상된 인스턴스의 볼륨)를 복구 인스턴스에서 분리합니다.

5.    4단계에서 분리한 루트 볼륨을 루트 볼륨(/dev/sda1)으로 손상된 인스턴스에 연결한 다음 인스턴스를 시작합니다.

참고: 루트 디바이스는 AMI별로 다릅니다. /dev/xvda 또는 /dev/sda1 이름은 루트 디바이스용으로 예약되어 있습니다. 예를 들어 Amazon Linux 1과 2는 /dev/xvda를 사용합니다. Ubuntu 16, 18, CentOS 7, RHEL 7.5 등의 다른 배포판에서는 /dev/sda1을 사용합니다.

이제 이전 단계에서 루트 또는 다른 OS 사용자에 대해 정의한 암호를 사용하여 EC2 직렬 콘솔을 통해 손상된 인스턴스의 OS에 액세스할 수 있습니다.

관련 정보

GRUB을 사용하여 Linux 인스턴스 문제 해결

AWS 공식
AWS 공식업데이트됨 2년 전