几天过去了,我仍然无法连接到运行 Ubuntu 16 的 EC2 的新 HVM 实例。作为参考,我正在尝试将我们的服务器从运行 Ubuntu 16 的 m3 实例升级到运行 Ubuntu 16 的 C5 实例。对于我尝试过的几乎每种方法,我都能停止新的 C5 实例,分离所有卷,并将新更新的源卷附加为/dev/sda1
,但是当我连接到实例时,我总是超时。亚马逊的状态检查也失败了,因为它说实例无法访问。但是,系统日志显示启动时没有问题。
我尝试过这个帖子。 我试过了这个帖子我也看过其他网站,并给了这和这尝试一下。我甚至尝试过 ec2 命令行工具方法,以及从 ec2 控制台(在线)转换 AMI,但是我无法使用转换后的 AMI 启动 C5 实例,或者实例将停止并失败(在通过命令行进行转换的情况下)。
我真正能想到的唯一可能导致此问题的是 C5 实例上分区的命名约定。我见过的每本指南都使用xvda/xvdf/xvdg
。我可能是错的,但我没有这些分区或磁盘,而是有nvme0n1
、nvme0n1p1
(新的 HVM 根)、nvme1n1
和nvme1n1p1
。当我尝试 HVM/源/目标磁盘方法时,我有nvme0n1/nvme0n1p1
、nvme1n1
(目标 - 所有内容应该最终出现的位置)和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 实例,请执行以下操作:
先决条件摘要:
开始之前,请确保在您的 PV 实例上安装以下内容:
$ sudo apt-get install grub-pc grub-pc-bin grub-legacy-ec2 grub-gfxpayload-lists $ sudo apt-get install linux-aws
- 停止 PV 实例 &创建快照它的根体积,恢复此快照作为源的同一可用区域上的新 EBS 卷(在创建快照后立即启动 PV 实例)
- 启动新的 C5 HVM 实例(目标)选择源实例同一可用区域上的 Ubuntu Server 16.04 LTS(HVM)(将此新实例 EBS 根卷大小保持为 8GB,因为此根卷将仅临时使用)
- 实例启动后,附加卷您在步骤 1 中将其恢复为(这是来自 PV 实例的根卷)
/dev/sdf
(在 Ubuntu 系统上,名称为nvme1n1
)。 - 创建一个新的(空白)EBS 卷(与“源” PV 根卷大小相同)并将其附加到 HVM 实例
/dev/sdg
(在 Ubuntu 系统上,名称为nvme2n1
)
移民:
登录到您的实例后,sudo su
以 root 用户身份执行所有命令。
显示您的卷
# 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
)在 上创建新分区
nvme2n1
(nvme2n1p1
将创建)# parted /dev/nvme2n1 --script 'mklabel msdos mkpart primary 1M -1s print quit' # partprobe /dev/nvme2n1 # udevadm settle
检查“源”卷并最小化原始文件系统的大小以加快该过程。我们不想在下一步复制可用磁盘空间。
# e2fsck -f /dev/nvme1n1 ; resize2fs -M /dev/nvme1n1
将“源”卷复制到“目标”卷
# 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 "\\ ")
将“目标”卷的大小调整为最大值:
# e2fsck -f /dev/nvme2n1p1 && resize2fs /dev/nvme2n1p1
准备目标卷:
# mount /dev/nvme2n1p1 /mnt/ && mount -o bind /dev/ /mnt/dev && mount -o bind /sys /mnt/sys && mount -o bind /proc /mnt/proc
chroot
到新卷# chroot /mnt/
重新安装 grub在 chrooted 卷上:
# grub-install --recheck /dev/nvme2n1 # update-grub
退出
chroot
# exit
关闭实例
# shutdown -h now
转换后您现在需要执行以下操作:
分离 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
。
关闭实例,分离卷,然后输入与之前相同的配置。将 8GB 卷附加为
/dev/sda1/
,将最终目标卷附加为/dev/sdf/
。启动实例并登录。安装
/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
创建或者更新文件:
/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
退出
chroot
(exit
),关闭实例(shutdown -h now
)。按照之前的第 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