2021年9月12日 星期日

aws ec2 損毀救援記

我有租一部 aws 的 ec2 虛擬主機。 如果不小心下錯指令把少數幾個重要檔案搞爛掉了, 以致無法登入甚或是無法開機, 該怎麼辦? 比方說前幾天我就發生了一個悲劇... 我的伺服器當然有照著 密不透水的 ssh 這篇做, 在 /etc/ssh/sshd_config 裡面設定 PasswordAuthentication no, 並且搭配 ~/.ssh/authorized_keys 指定允許登入的 ssh 公鑰。 那天我手殘不小心把這個檔案刪掉了, 馬上掉入恐慌, 就像幾個月前某天出門後才發現忘記帶鑰匙一樣! 比忘記帶鑰匙更慘的是, 這次沒辦法找老婆幫忙~ 更糟糕的是: 伺服器上面還有老婆要用的檔案... 我雙重死定了~

以下重點摘要解鎖步驟:

  1. 從網頁登入 aws ec2 console。
  2. 停用 (stop) 出問題的虛擬機 (叫它 「主角」 好了)。
  3. 找到主角的 storage 清單, detach 它的 root volume (叫它 「問題硬碟」 好了), 也就是存放 ~/.ssh/authorized_keys 的地方。
  4. 建立一部臨時虛擬機, 登入後用 cat /proc/partitions 查看預設有哪些 volume 可用。
  5. 把問題硬碟給 attach 到臨時虛擬機上。
  6. 在臨時虛擬機裡面再下一次 cat /proc/partitions, 看看問題硬碟被指定的裝置名稱, 並且把它掛載起來。
  7. 修復問題硬碟裡面的 ~/.ssh/authorized_keys 然後卸載。
  8. 回到網頁 aws console 頁面, 把問題硬碟從臨時虛擬機上 detach 下來, 再把它 attach 回主角去, 然後就可以啟動主角了!
  9. 記得要把臨時虛擬機刪掉, 免得浪費錢。

倒數第二步要把問題硬碟 attach 回主角時, aws 的頁面會告訴你只能指定 sdf ~ sdp 的某個名稱。 試著指定 sda 果然失敗。 不能指定成 sda, 那我要怎麼開機啊?! 還好查到 這個問答, 可以從自己的工作電腦這樣查詢: aws ec2 describe-instances --region 某區域 --instance-id 主角的代號 | grep RootDeviceName 查出原來在主角的設定裡, 採用 /dev/sda1 作為 root 分割區。 所以回到網頁 aws console 頁面, 再試著指定把問題硬碟以 sda1 的代號 attach 回去, 果然就成功了! 呼~ 終於有臉面對老婆了~

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。