我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 驱动器,但名称不同。所有数据、安装等都运行正常。