針對無法連線或無法存取的 Linux 執行個體,如何取得對 EC2 序列主控台的存取權?

3 分的閱讀內容
0

我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 執行個體無法連線或無法存取。此外,我並未在作業系統層級設定 EC2 序列主控台的存取權。

簡短描述

本文適用於下列 Linux 作業系統 (OS):

  • Red Hat 7 至 9
  • 2023 年版 Amazon Linux 2
  • CentOS 7、8
  • Rocky Linux 8、9
  • Ubuntu 16 至 24
  • Debian 9 至 12

**先決條件:**若要使用序列主控台,請確定符合所有先決條件。請注意,在存取執行個體的根磁碟區之後,您必須完成作業系統使用者密碼設定步驟。

解決方法

若要設定序列主控台的存取權,則必須完成下列步驟。

**注意:**如果您的 EC2 序列主控台正常運作,而且您只需要為作業系統使用者設定密碼,請僅完成該解決方法的步驟。若要驗證 EC2 序列主控台是否正常運作,請參閱連線至 EC2 序列主控台

存取執行個體的根磁碟區

若要存取執行個體的根磁碟區,請啟動臨時執行個體。接下來,在救援執行個體上重新掛載您的 Amazon Elastic Block Store (Amazon EBS) 磁碟區。然後,在救援執行個體中檢查和修改序列主控台的 GRUB 設定。您也可以為根使用者或作業系統使用者設定密碼,並允許 SSH 常駐程式的根目錄存取

**重要:**設定臨時執行個體時,請注意下列事項:

將根磁碟連接至救援執行個體

請完成下列步驟:

  1. 建立新的金鑰對,或使用現有的金鑰對。

  2. 取得原始執行個體根磁碟區的磁碟區 ID 和裝置名稱

  3. 停止原始執行個體

  4. 在相同可用區域中,從具有相同 Linux 作業系統版本的 Amazon Machine Image (AMI) 啟動臨時執行個體

  5. 從原始執行個體分離根磁碟區並將其作為次要磁碟區連結至臨時執行個體。請注意磁碟區裝置名稱。

  6. 使用您的 SSH 金鑰對連線至臨時執行個體。

  7. 若要變更為根使用者,請執行下列命令:

    [ec2-user ~]$ sudo su
  8. 若要識別區塊型儲存設備名稱和分割區,請在臨時執行個體執行下列命令:

    [root ~]$ lsblk
    NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    xvda    202:0    0    8G  0 disk
    └─xvda1 202:1    0    8G  0 part /
    xvdf    202:80   0  101G  0 disk
    └─xvdf1 202:81   0  101G  0 part

    前項範例使用具有區塊前驅動程式的 XEN 執行個體。磁碟區裝置名稱 /dev/xvda/dev/xvdf 都是分割磁碟區,而 /dev/xvdg 則不是分割磁碟區。如果您的磁碟區已分割,請執行以下命令來掛載分割區 (/dev/xvdf1),而非原始裝置 (/dev/xvdf):

    [root ~]$ mount -o nouuid /dev/xvdf1 /mnt

    如果您使用 Nitro 型執行個體,則磁碟區裝置名稱看起來會類似於 /dev/nvme[0-26]n1。如果您的執行個體建置在具有 NVMe 的 Nitro 上,則將分割區掛載至 /mnt 目錄中。使用您先前識別的裝置名稱來執行下列命令:

    [root ~]$ mount -o nouuid  /dev/nvme1n1p1 /mnt

    如需詳細資訊,請參閱 Amazon EC2 執行個體磁碟區的裝置名稱

  9. 若要在 /mnt 目錄中建立 chroot 環境,請執行下列命令:

    [root ~]$ for i in dev proc sys run; do mount -o bind /$i /mnt/$i; done; chroot /mnt

    在前項範例中,/dev/proc/sys/run 目錄是從原始根目錄檔案系統進行繫結掛載。此設定可讓執行於 chroot 環境內的程序存取這些系統目錄。

設定根使用者或任何其他作業系統使用者的密碼

在 chroot 中,請使用 passwd 命令來為作業系統使用者設定密碼,並允許 SSH 組態中的根存取權。

在下面的範例中,使用者為根使用者。您可以使用下列命令設定根 passwd:

[root ~]$ passwd root

若要在 Linux 變更中設定允許 SSH 常駐程式 (sshd) 的根存取權,並將 #PermitRootLogin yes 變更為 PermitRootLogin yes,請執行下列程式碼:

[root ~]$ sed -i 's/#\?PermitRootLogin .*/PermitRootLogin yes/' /etc/ssh/sshd_config

將核心參數傳遞給引導程式 GRUB

若要將所有主控台輸出傳送至序列連接埠,則必須將下列核心參數 console=tty0 console=ttyS0,115200 傳遞給引導程式 GRUB。

**注意:**tty0ttyS0 包含的是零,而非字母 O。

下列清單會顯示此範例所選的選項:

  • console= 是一項核心參數,可指定核心訊息的首選主控台裝置。
  • tty0 指的是系統上的首個虛擬主控台 (文字模式)。
  • ttyS0 指的是第一個序列連接埠。
  • 115200 是序列連接埠的傳輸速率 (每秒位元數)。這是用於序列通訊的常見傳輸速率。
  • n8 指定序列連接埠的字元大小和同位設定。n 代表無同位。8 顯示字元大小為 8 位元。
  • tty0 參數會啟動核心,將主控台訊息傳送至首個虛擬主控台 (tty0)。這通常為 Linux 系統上的主要文字模式主控台。
  • ttyS0 參數會設定核心,以便將控制台訊息傳送至首個序列連接埠 (ttyS0)。訊息會以不具同位的 115200 傳輸速率傳送,而且每個字元為 8 位元。

檢查並更新序列主控台的 GRUB2 設定

將核心參數 console=tty0 和 console=ttyS0,115200 新增至 /etc/default/grub 檔案中的 GRUB_CMDLINE_LINUX_DEFAULT 行中

請完成下列步驟:

  1. 使用 chroot 中的文字編輯器開啟 /etc/default/grub 檔案。例如,若要使用 nanovi 編輯器,請執行下列其中一個命令:

    [root ~]$ nano /etc/default/grub
    [root ~]$ vi /etc/default/grub
  2. 找出以 GRUB_CMDLINE_LINUX_DEFAULT 開頭的行。該行會類似於下列內容:

    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
  3. 將核心參數 console=tty0console=ttyS0,115200 新增至此行中。輸入空格以分隔這些核心參數與目前參數。更新的行會類似於下列內容:

    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash console=tty0 console=ttyS0,115200"
  4. 請儲存變更,並退出文字編輯器。

  5. 若要更新 GRUB 組態,請執行下列命令:

    適用於 Red Hat、CentOS、Amazon Linux 和 Rocky Linux

    在 BIOS 型電腦上:

    [root ~]$ grub2-mkconfig -o /boot/grub2/grub.cfg

    在 UEFI 型電腦上:

    [root ~]$ grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

    針對 Ubuntu 和 Debian

    下列命令會使用新的核心參數重新產生 GRUB 組態檔案。

    [root ~]$ update-grub
  6. 若要退出 chroot 並卸載 /dev/run/proc/sys,請執行下列命令:

    [root ~]$ exit; umount -fl /mnt/{dev,proc,run,sys,}
  7. Amazon EC2 主控台中選擇 Instances (執行個體),然後選擇救援執行個體。

  8. 選擇 Instance state (執行個體狀態)、Stop instance (停止執行個體),然後選取 Yes, stop (是,停止)。

  9. 從救援執行個體中分離根磁碟區 id-##### (來自受損執行個體的磁碟區)。

  10. 將根磁碟區作為根磁碟區 (/dev/sda1) 連接至受損執行個體,然後啟動此執行個體。

  11. 使用瀏覽器型用戶端連線至 EC2 執行個體的序列主控台。

  12. 使用具有根身分的使用者與先前設定的密碼登入。

AWS 官方
AWS 官方已更新 4 個月前