将 Ubuntu 16 PV 转换为 Ubuntu 16 HVM 后无法连接到 EC2 实例

将 Ubuntu 16 PV 转换为 Ubuntu 16 HVM 后无法连接到 EC2 实例

几天过去了,我仍然无法连接到运行 Ubuntu 16 的 EC2 的新 HVM 实例。作为参考,我正在尝试将我们的服务器从运行 Ubuntu 16 的 m3 实例升级到运行 Ubuntu 16 的 C5 实例。对于我尝试过的几乎每种方法,我都能停止新的 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,但到目前为止没有任何效果。当我将 附加为 时,我的实例变得无法target访问/dev/sda1

那么,当我使用名为 的磁盘执行这些操作时,我是否遗漏了某些内容nvme*?我可以提供其他信息或调试内容来帮助理解该问题吗?

答案1

我意识到这个问题很少见,但以防万一,我希望我的结果将来能帮助到别人(也许下次我尝试这样做时也能帮助到我自己)。我要感谢亚马逊支持部门的 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 中将其恢复为(这是来自 PV 实例的根卷)/dev/sdf(在 Ubuntu 系统上,名称为nvme1n1)。
  5. 创建一个新的(空白)EBS 卷(与“源” PV 根卷大小相同)并将其附加到 HVM 实例/dev/sdg(在 Ubuntu 系统上,名称为nvme2n1

移民:

登录到您的实例后,sudo su以 root 用户身份执行所有命令。

  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. 在 上创建新分区nvme2n1nvme2n1p1将创建)

    # 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. 安装/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. 退出chrootexit),关闭实例(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

相关内容