我有一台带有热插拔驱动器托架的服务器(运行 Ubuntu 14.04)。我通常使用热插拔托架来安装一堆松散硬盘中的一个,我在这些硬盘上传输大型科学数据集。其中一些磁盘需要不同的安装选项(不同的文件系统、SSD v HDD 等),我通常会为/etc/fstab
.
为了简化用于批处理和备份此数据的一些脚本,我想将服务器配置为始终对当前插入的这些热插拔磁盘之一使用相同的安装点。
我尝试过将这样的东西放入我的fstab
:
UUID=<disk A> /common_mount_point ext4 defaults,discard,noatime 0 0
UUID=<disk B> /common_mount_point btrfs defaults,compress=lzo 0 0
当我想挂载磁盘 A 时,这工作正常,但每当我尝试挂载磁盘 B 时,我都会收到错误:
mount: special device UUID=<disk B> does not exist
如果我交换这两行的顺序,就会发生相反的情况,因此似乎mount
只是查找引用该特定安装点的第一行fstab
,如果找不到关联的文件系统描述符,则会抛出错误。
我想我可能可以编写一个 bash 脚本来顺序尝试将多个不同的 UUID 安装到同一安装点,直到其中一个安装操作成功,但我希望有一个更优雅的解决方案。
更新1
有趣的是,如果我调用sudo mount -a
而不是mount /common_mount_point
,虽然我仍然收到无法找到磁盘 A 的 UUID 的错误消息,但它会成功安装磁盘 B。因此,似乎mount -a
会尝试使用fstab
相同安装点的多个条目,但我会而不必sudo
为了使这项工作发挥作用。
这种行为似乎与这个报告的错误在mountall
,这是显然已在 v2.50 中修复。 Trusty 存储库中的最新版本仍然是 2.49,因此我将看看是否可以找到具有更新版本的 PPA。
更新2
事实证明, in 中的错误mountall
是无关紧要的,因为仅当我调用而不是 时才mountall
调用。事实上,根据输出,我已经在运行 v2.53 (尽管告诉我它是 v2.49)。这可能解释了确实尝试引用同一安装点的多行的事实。mount -a
mount /common_mount_point
mountall
dpkg -s mountall
mountall --version
sudo mount -a
fstab
答案1
利用 udev 使用相同的设备名称
/etc/fstab
您可以列出设备名称,并将 udev 设置为对所有这些设备使用相同的设备名称,而不是在 中列出 UUID 。将这样的行放入以下文件中/etc/udev/rules.d
:
KERNEL=="sd*", ATTRS{serial}=="123456798", NAME="one_of_my_disks%n"
或者
KERNEL=="sd*", ATTRS{serial}=="123456798", SYMLINK+="one_of_my_disks%n"
运行以查看可以匹配的udevadm info -a -n sdb
磁盘属性(如上例)。ATTRS{serial}=="123456798"
请注意,您只能使用多个属性,但它们都必须来自同一部分。
然后,在 中/etc/fstab
,用作/dev/one_of_my_disks
块设备。
如果您的磁盘具有不同的布局,则情况会更加复杂。您可以用于auto
文件系统类型;这应该适用于大多数类型。但是,如果您需要不同的分区号或安装选项,则需要不同的 fstab 条目。您可以fstab
通过 udev 条目调用的脚本进行动态编辑来解决这个问题,该脚本将在系统检测到磁盘时执行。例如,使用以下 udev 规则:
KERNEL=="sd*", ATTRS{serial}=="123456798", ENV{FSTAB4}="compress=lzo", NAME="one_of_my_disks%n", RUN+="/usr/local/sbin/fstab_update_my_disk"
和以下fstab_update_my_disk
脚本(未经测试):
#!/bin/sh
/usr/bin/sed -i -e '/^\/dev\/one_of_my_disks1/ s/\([^ \t][^ \t]*[ \t][ \t]*[^ \t][^ \t]*[ \t][ \t]*[^ \t][^ \t]*[ \t][ \t]*\)[^ \t][^ \t]*/\1'"$FSTAB4"'/'
利用 udev 不关心挂载点
另一种方法是保留单独的 fstab 条目,具有不同的设备名称和不同的安装点。但使用 udevRUN
挂钩来更新指向挂载点的符号链接。
KERNEL=="sd*", ATTRS{serial}=="123456798", RUN+="/bin/ln -snf /media/disk1 /media/one_of_my_disks"