如何在重启之间保留 AWS EC2 实例的驱动器设备路径

如何在重启之间保留 AWS EC2 实例的驱动器设备路径

m5d.xlarge使用 重新启动了运行 Ubuntu 16.04.5 LTS(xenial)的 EC2 实例shutdown -r

重新启动后,定义的各种驱动器安装/etc/fstab与最初分配给它们的设备不一致。

这导致各种服务失败,这些服务依赖于具有指定名称的驱动器安装,其中包含与该名称相关的特定数据。

在这种情况下,/data需要包含通常预期在中的内容/data,而不是其他某些驱动器安装,如/foo/bar/whatever-else

运行lsblk有助于手动重新定义文件/etc/fstab以反映新的设备分配并使服务重新上线。

问题:我担心的是,重新启动会随机地重新分配设备标签以安装驱动器,并且当服务器需要重新启动时,这个问题可能会或将再次出现。

问题:如何确保驱动器安装及其各自的设备路径在重新启动之间得以保留,而无需手动(重新)干预?


编辑c5_m5_checks_script.sh下面提供的答案中引用的脚本返回以下信息:

# ./c5_m5_checks_script.sh 
------------------------------------------------

OK     NVMe Module is installed and available on your instance


ERROR  NVMe Module is not loaded in the initramfs image.
        - Please run the following command on your instance to recreate initramfs:
        # sudo update-initramfs -c -k all


OK     ENA Module with version 2.0.3K is installed and available on your instance


OK     fstab file looks fine and does not contain any device names.

------------------------------------------------

我不明白最后OK一句话,因为该fstab文件包含设备名称。或者亚马逊使用的术语“设备名称”fstab可能与文件中的设备名称不同?

为了给出问题本质的一个具体例子,我有一个/etc/fstab如下所示的例子:

...
/dev/nvme2n1    /staging        ext4    defaults,nofail 0       0
/dev/nvme3n1    /data   ext4    defaults,nofail 0       0
...

但是,lsblk显示这两个卷已挂载到彼此的设备 ID:

# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
...
nvme2n1     259:0    0     1T  0 disk /staging
nvme3n1     259:3    0   512G  0 disk /data

现实中,nvme2n1是1T卷/data,并且nvme3n1是512G卷/staging

重新启动期间会发生一些未知的事情,将底层驱动器重新分配给可用设备 ID 的排列。

我知道的修复此问题的唯一方法是手动umount编辑这两个卷,/etc/fstab然后mount再次编辑它们。

悬赏问题:是否存在永久的修复方法,可以让我在 中使用不同的永久标识符/etc/fstab,并且在重启后能够持续存在?

答案1

AWS 有一个工具可以将 /etc/fstab 中的 EBS 卷设备名称转换为其 UUID 值:c5_m5_检查_脚本.sh

该脚本还会检查 NVMe 模块是否已加载到您的操作系统映像中,但如果不存在该模块,您的新实例类型将无法启动。

答案2

为什么不使用LABEL=UUID=/etc/fstab

您可以使用blkid来查找相应的标签和 UUID。man fstab当然,更多信息如下:

也可以使用 PARTUUID= 和 PARTLABEL=。例如,GUID 分区表 (GPT) 支持这些分区标识符。

有关设备标识符的更多详细信息,请参阅 mount(8)、blkid(8) 或 lsblk(8)。

请注意,mount(8) 使用 UUID 作为字符串。UUID 的字符串表示应基于小写字符。

答案3

我的情况的解决方案是使用符号链接(感谢我的一位同事):

将卷附加到实例时,您可以将驱动器的名称指定为 /dev/sd*(例如在 AWS 控制台或 Terraform 中)。如果您登录到实例,您将看到这些是指向 nvmeXn1、nvmeYn1 等的符号链接...即使驱动器的名称已更改,实例重启后符号链接仍指向正确的驱动器。

我的情况:

重启之前

  :~$ lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
...
nvme1n1      259:4    0  500G  0 disk
nvme2n1      259:5    0    4T  0 disk

  :~$ ls -la /dev/sd*
lrwxrwxrwx 1 root root 7 Jun 20 21:29 /dev/sdh -> nvme1n1
lrwxrwxrwx 1 root root 7 Jun 20 21:29 /dev/sds -> nvme2n1

重启后

  :~$ lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
...
nvme2n1      259:1    0  500G  0 disk
├─nvme2n1p1  259:6    0  500G  0 part
└─nvme2n1p9  259:7    0    8M  0 part
nvme1n1      259:5    0    4T  0 disk
├─nvme1n1p1  259:8    0    4T  0 part
└─nvme1n1p9  259:9    0    8M  0 part

  :~$ ls -la /dev/sd[h-s]
lrwxrwxrwx 1 root root 7 Jun 20 21:35 /dev/sdh -> nvme2n1
lrwxrwxrwx 1 root root 7 Jun 20 21:35 /dev/sds -> nvme1n1

查看/dev/nvme1n1大小为 500GB,/dev/sdh重启之前请注意这一点。

重启后,/dev/sdh指着/dev/nvme2n1它仍然是同一个 500GB 驱动器,但名称不同。所有数据、安装等都运行正常。

相关内容