將 Ubuntu 16 PV 轉換為 Ubuntu 16 HVM 後無法連線到 EC2 執行個體

將 Ubuntu 16 PV 轉換為 Ubuntu 16 HVM 後無法連線到 EC2 執行個體

幾天過去了,我仍然無法使用運行 Ubuntu 16 的 EC2 連接到我的新 HVM 執行個體。嘗試過的每一種方法,我都能達到停止我的新C5 實例、分離所有捲並將新更新的源卷附加為的程度/dev/sda1,但是當我連接到該實例時,我總是最終超時。亞馬遜的狀態檢查也失敗,因為它表示該實例無法存取。但是啟動時系統日誌沒有顯示任何問題。

我已經嘗試過做所有事情這個帖子。我試過了這個帖子以及。我看過其他網站,並給了嘗試一下。我甚至嘗試了 ec2 命令列工具方法,並從 ec2 控制台轉換 AMI(在線),但是我要么無法使用轉換後的 AMI 啟動 C5 實例,要么該實例將停止並失敗(在以下情況下)通過命令行轉換)。

我真正能想到的唯一可能導致此問題的原因是 C5 實例上分區的命名約定。我見過的每一個指南都使用xvda/xvdf/xvdg.我可能是錯的,但我沒有這些分割區或磁碟,而是有nvme0n1nvme0n1p1、(新的 HVM 根)、nvme1n1nvme1n1p1。當我嘗試 HVM/來源/目標磁碟方法時,我有nvme0n1/nvme0n1p1nvme1n1(目標 - 一切都應該結束的地方)和nvme2n1/nvme2n1p1(來源 - 一切都來自 m3 上的地方)。我發現這篇關於 NVME 的亞馬遜帖子所以我認為這不應該是一個問題,因為我只是在使用時使用正確的磁碟/分割區/mnt/,即。我打電話mkdir -p /mnt/target && mount /dev/nvme1n1 /mnt/target而不是mkdir -p /mnt/target && mount /dev/xvdf /mnt/target,但到目前為止沒有任何效果。當我附加targetas時,我的實例就變得無法存取/dev/sda1

那麼,在使用名為 的磁碟執行這些操作時,我是否遺漏了一些東西nvme*?我可以提供任何其他資訊或調試內容來幫助理解該問題嗎?

答案1

我意識到這個問題不太常見,但為了以防萬一,我希望我的結果可以幫助將來的某人(也許下次我嘗試這樣做時甚至可以幫助我)。我要感謝 Amazon 支援部門的 Steve E. 幫助我遷移執行個體 <3

無論如何,將我的 Ubuntu 16.04 M3 (PV) 實例遷移到 Ubuntu 16.04 C5 (HVM) 實例時出現了 2 個問題。第一個問題是新的 C5 執行個體確實使用新的命名約定,因此其他將 PV 遷移到 HVM 的教學課程的工作方式並不完全相同。另一個問題是我的 M3 (PV) 實例已升級到 Ubuntu。實際上,在過去一年左右的時間裡,我已經從 Ubuntu 12 -> Ubuntu 14 -> Ubuntu 16 過渡了。這導致了無法產生雲端網路檔案的問題,因此無法存取我的實例。

無論如何,若要使用新的 nvme 命名約定將 Ubuntu 16.04 PV 實例移轉到 HVM 實例,請執行下列操作:

先決條件摘要:

  1. 在開始之前,請確保在您的 PV 實例上安裝以下內容:

    $ sudo apt-get install grub-pc grub-pc-bin grub-legacy-ec2 grub-gfxpayload-lists
    $ sudo apt-get install linux-aws
    
  2. 停止 PV 實例 &建立快照其根體積,恢復此快照作為來源相同可用區上的新 EBS 磁碟區(建立快照後立即啟動 PV 執行個體)
  3. 啟動新的 C5 HVM 實例(目標)在來源執行個體的相同可用區上選擇 Ubuntu Server 16.04 LTS (HVM)(將此新執行個體 EBS 根磁碟區大小保持為 8GB,因為此根磁碟區僅暫時使用)
  4. 實例啟動後,附加卷您在步驟 1 中還原為/dev/sdf(在 Ubuntu 系統上,名稱為)(這是 PV 實例的根磁碟區nvme1n1)。
  5. 建立新的(空白)EBS 卷(與「來源」PV 根磁碟區大小相同)並附加到 HVM 執行個體/dev/sdg(在 Ubuntu 系統上,名稱為nvme2n1

移民:

登入執行個體後,使用sudo suroot 使用者身分執行所有指令。

  1. 顯示您的交易量

    # lsblk 
    NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    nvme0n1     259:0    0    8G  0 disk 
    └─nvme0n1p1 259:1    0    8G  0 part /
    nvme1n1     259:2    0  100G  0 disk 
    nvme2n1     259:3    0  100G  0 disk 
    

    nvme0n1是您剛剛建立的 HVM 根(只是為了這次啟動) nvme1n1是恢復的 PV 根(將轉換為 HVM) nvme2n1是空白磁碟區(將從 PV 根接收轉換為nvme1n1

  2. nvme2n1在(nvme2n1p1將要建立)上建立一個新分區

    # parted /dev/nvme2n1 --script 'mklabel msdos mkpart primary 1M -1s print quit'
    # partprobe /dev/nvme2n1
    # udevadm settle
    
  3. 檢查“來源”磁碟區並最小化原始檔案系統的大小以加快該過程。我們不想在下一步複製可用磁碟空間。

    # e2fsck -f /dev/nvme1n1 ; resize2fs -M /dev/nvme1n1
    
  4. 將「來源」磁碟區複製到「目標」卷

    # dd if=/dev/nvme1n1 of=/dev/nvme2n1p1 bs=$(blockdev --getbsz /dev/nvme1n1) conv=sparse count=$(dumpe2fs /dev/nvme1n1 | grep "Block count:" | cut -d : -f2 | tr -d "\\ ")
    
  5. 將“目標”音量調整為最大:

    # e2fsck -f /dev/nvme2n1p1 && resize2fs /dev/nvme2n1p1
    
  6. 準備目標卷:

    # mount /dev/nvme2n1p1 /mnt/ && mount -o bind /dev/ /mnt/dev && mount -o bind /sys /mnt/sys && mount -o bind /proc /mnt/proc
    
  7. chroot到新卷

    # chroot /mnt/
    
  8. 重新安裝grub在 chrooted 卷上:

    # grub-install --recheck /dev/nvme2n1
    # update-grub
    

    退出chroot

    # exit
    

    關閉實例

    # shutdown -h now
    
  9. 轉換後,您現在需要執行以下操作:

    分離您先前在 HVM 實例上擁有的 3 個磁碟區。將您在控制台上建立的最後一個磁碟區(空白)附加到 HVM 執行個體上/dev/sda1(先前已附加為)。/dev/nvme2n1啟動 HVM 實例。

新的 HVM 執行個體現在應該會成功啟動,並且將是舊來源 PV 執行個體的精確副本(如果您使用了正確的來源磁碟區)。一旦確認一切正常,就可以終止來源實例。


更新網路配置(可選)

現在,上述步驟適用於這裡的大多數人。但是,我的實例狀態仍未達到。原因是因為我在我的實例上升級了 Ubuntu,而不是從新映像開始。這使得eth0配置處於啟動狀態,沒有50-cloud-init.cfg設定檔。

如果您已經擁有該文件/etc/network/interfaces.d/50-cloud-init.cfg,那麼您可以繼續更新該文件,而不是建立新文件。也假設所有命令都通過 運行sudo su

  1. 關閉實例,分離卷,然後輸入與先前相同的配置。將 8GB 磁碟區附加為/dev/sda1/,並將最終目標磁碟區附加為/dev/sdf/。啟動實例並登入。

  2. Mount /dev/sdf,現在應該nvme1n1p1透過執行以下操作:

    # mount /dev/nvme1n1p1 /mnt/ && mount -o bind /dev/ /mnt/dev && mount -o bind /sys /mnt/sys && mount -o bind /proc /mnt/proc
    
  3. 建立或更新文件:

    /etc/network/interfaces.d/50-cloud-init.cfg
    

    具有以下內容:

    # This file is generated from information provided by
    # the datasource.  Changes to it will not persist across an instance.
    # To disable cloud-init's network configuration capabilities, write a file
    # /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
    # network: {config: disabled}
    auto lo
    iface lo inet loopback
    
    auto ens5
    iface ens5 inet dhcp
    
  4. 退出chroot( exit),關閉實例 ( shutdown -h now)。

  5. 請依照之前的步驟 9 進行操作!

你應該完成了!


答案2

謝謝,網路配置的提示在升級情況下有效(Ubuntu 14.04 PV 到 Ubuntu 18.04 PV)。將升級後的 Ubuntu 18.04 PV 轉換為 Ubuntu 18.04 HVM,並對網路配置進行了輕微調整。使用以下配置建立了新的 /etc/netplan/50-cloud-init.config

network:
    version: 2
    ethernets:
        all-en:
            match:
                name: "en*"
            dhcp4: true
        all-eth:
            match:
                name: "eth*"
            dhcp4: true

相關內容