Amazon Elastic Compute Cloud
Linux 实例用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

我的实例正从错误的卷启动

在某些情况下,您可能会发现某个并非附加到 /dev/xvda/dev/sda 的卷成为了您的实例的根卷。当您将另一个实例的根卷或从某个根卷的快照中创建的卷附加到带有现有根卷的实例时,可能会发生这种情况。

这是由于 Linux 中的初始虚拟磁盘的工作方式导致的。它将选择在 /etc/fstab 中定义为 / 的卷,在某些发行版 (包括 Amazon Linux) 中,这是由附加到卷分区的标签决定的。具体来说,您将发现您的 /etc/fstab 与下面类似:

LABEL=/ / ext4 defaults,noatime 1 1 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0

并且,如果您检查两个卷的标签,您将看到它们都包含 / 标签:

[ec2-user ~]$ sudo e2label /dev/xvda1 / [ec2-user ~]$ sudo e2label /dev/xvdf1 /

在此示例中,您最终可以让 /dev/xvdf1 (而不是您打算从中启动实例的 /dev/xvda1 卷) 成为您的实例在初始虚拟磁盘运行后启动到的根设备。解决此问题相当简单;您可以使用相同的 e2label 命令更改您不想从中启动实例的附加卷的标签。

某些情况下,在 /etc/fstab 中指定 UUID 可以解决此问题。但是,如果两个卷来自同一快照,或者辅助卷是通过主卷的快照创建的,则它们将共享 UUID。

[ec2-user ~]$ sudo blkid /dev/xvda1: LABEL="/" UUID=73947a77-ddbe-4dc7-bd8f-3fe0bc840778 TYPE="ext4" PARTLABEL="Linux" PARTUUID=d55925ee-72c8-41e7-b514-7084e28f7334 /dev/xvdf1: LABEL="old/" UUID=73947a77-ddbe-4dc7-bd8f-3fe0bc840778 TYPE="ext4" PARTLABEL="Linux" PARTUUID=d55925ee-72c8-41e7-b514-7084e28f7334

更改一个附加卷的标签

  1. 使用 e2label 命令将卷的标签更改为 / 之外的其他标签。

    [ec2-user ~]$ sudo e2label /dev/xvdf1 old/
  2. 验证卷是否有新标签。

    [ec2-user ~]$ sudo e2label /dev/xvdf1 old/

在进行此更改后,您应该能够重新启动实例并在实例启动时让初始虚拟磁盘选择适当的卷。

重要

如果您要分离使用新标签的卷并将它返回到另一实例以用作根卷,则必须再次执行上述过程并将卷标签更改回其原始值。否则,其他实例将不会启动,因为内存虚拟磁盘无法找到标签为 / 的卷。