針對無法連線或無法存取的 Linux 執行個體,如何設定對其 EC2 序列主控台的存取權?
上次更新日期:2022 年 3 月 22 日
我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 執行個體無法連線或無法存取。我沒有在作業系統級別設定對 EC2 序列主控台的存取。如何修改 EC2 序列主控台的作業系統設定併為任何作業系統使用者設定存取執行個體的密碼?
簡短描述
要設定對序列主控台的存取,請執行以下操作:
1. 存取執行個體的根磁碟區。
2. 設定根使用者或任何其他作業系統使用者的密碼。
3. 檢查並更新序列主控台的 GRUB 設定。
注意:如果 EC2 序列主控台在受影響的執行個體上工作正常,並且您只需為作業系統使用者設定密碼,則可以跳過步驟 3。
先決條件
要使用序列主控台,請確保滿足先決條件,但設置設定作業系統使用者密碼除外。以下解決方案將討論設定密碼。
解決方案
使用救援執行個體存取執行個體的根磁碟區
建立臨時救援執行個體,然後在救援執行個體上重新安裝您的 Amazon Elastic Block Store (Amazon EBS) 磁碟區。在救援執行個體中,您可以檢查和修改序列主控台的 GRUB 設定。您還可以為根使用者或任何其他作業系統使用設定密碼。
重要提示:請勿對執行個體存放區支援的執行個體執行此程序。由於恢復程序要求您的執行個體停止並啟動,因此該執行個體上的所有資料都將丟失。如需詳細資訊,請參閱判斷執行個體的根裝置類型。
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、CentOS7 和 RHEL 7.5,會使用 /dev/sda1。
6. 選擇動作、分離磁碟區,然後選擇是,分離。請注意可用區域。
注意:您可以在分離 EBS 磁碟區之前對其進行標記,以幫助在後續步驟中識別它。
7. 在同一可用區域中啟動救援 EC2 執行個體。
注意:根據產品代碼,您可能需要啟動相同作業系統類型的 EC2 執行個體。例如,如果受損的 EC2 執行個體是付費的 RHEL AMI,則必須啟動具有相同產品代碼的 AMI。有關更多資訊,請參閲取得執行個體的產品代碼。
如果原始執行個體正在執行 SELinux (例如 RHEL、CentOS 7 或 8),請從使用 SELinux 的 AMI 啟動救援執行個體。如果您選擇執行其他作業系統 (如 Amazon Linux 2) 的 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
設定根使用者或任何其他作業系統使用者的密碼。
使用 passwd 命令為您的作業系統使用者設定密碼。在下面的範例中,使用者是根使用者:
passwd root
檢查並更新序列主控台的 GRUB 設定。
注意:如果 EC2 序列主控台在受影響的執行個體上工作正常,並且您只需為作業系統使用者設定密碼,則可以跳過此步驟。
Linux 支援的序列主控台連接埠為 ttyS0。如果在連接到 EC2 序列主控台時螢幕保持黑色,沒有提供任何輸出,則應確保在 GRUB 設定中正確設定 console 條目。下面提供的範例來自 AWS Marketplace AMI,這些 AMI 適用於序列主控台在其中工作正常的不同分發版:
適用於 Amazon Linux 2、RHL 和 CentOS 7 的 GRUB2
1. 驗證 ttyS0 的 console 條目是否已在 /etc/default/grub 檔案的 GRUB_CMDLINE_LINUX_DEFAULT 行中正確設定:
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 的主控台條目,請將其新增至 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. 驗證 ttyS0 的主控台條目是否在 /boot/grub/grub.conf 檔案的 kernel 行中正確設定:
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 的主控台條目,請根據上述範例將其新增至 /boot/grub/grub.conf 檔案中。
適用於 Ubuntu 16.04, 18.04 和 20.04 的 GRUB2
1. 驗證 ttyS0 的主控台條目是否已在 /etc/default/grub.d/50-cloudimg-settings.cfg 檔案的 GRUB_CMDLINE_LINUX_DEFAULT 行中正確設定:
GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0 nvme_core.io_timeout=4294967295"
2. 如果主控台條目 console=ttyS0 不存在,請將其新增至 GRUB_CMDLINE_LINUX_DEFAULT 行中。然後使用以下命令更新 GRUB 組態:
update-grub
適用於 RHEL 8 和 CentOS 8 的 GRUB2
1. 執行 grubby --default-kernel 命令以檢視目前的預設內核:
grubby --default-kernel
2. 執行 grubby --info=ALL 命令以檢視所有可用的內核、它們的索引及其參數:
grubby --info=ALL
3. 驗證 ttyS0 的主控台條目是否在步驟 1 中列出的預設內核的 args 行中正確設定。
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"
4. 如果未設定 ttyS0 的主控台條目,則使用以下 grubby 命令將其附加到預設內核的 args:
grubby --args 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、CentOS7 和 RHEL 7.5,會使用 /dev/sda1。
現在,您可以使用上一步中為根使用者或任何其他作業系統使用者定義的密碼,通過 EC2 序列主控台存取受損執行個體的作業系統。