当通过 UUID 挂载硬盘并通过设备文件挂载另一个硬盘时,我如何确保第一个始终是 /dev/sdaX ,第二个是 /dev/sdbX ,而不是相反?
对我想要做的事情的一些解释:我正在将树莓派零、USB 集线器、外部硬盘驱动器和 SD 卡(全部由移动电源供电)连接在一起。然后,当我打开树莓派电源时,它应该会自动在外部硬盘驱动器上备份 SD 卡。
简化的 fstab 如下所示:
...
uuid=123123 /mnt/exthd ntfs rw,... 0 0
/dev/sdb1 /mnt/sdcard vfat ro,... 0 0
我无法通过UUID安装SD卡,因为当我格式化卡或者当然使用另一张卡时它会改变。
问题是,我能否确定外部驱动器始终使用 /dev/sda1 挂载?
或者我是否必须解析例如 的输出lsblk
,查看哪个设备尺寸较小,然后使用此设备文件?
请注意,我不会收到来自覆盆子或其他任何东西的任何反馈。我必须确保这总是有效。如果有必要的话,我想我可以自己进行解析。问题只是,我是否必须处理它,或者是否有更简单的方法。
答案1
我注意到devpath
我的 USB 端口的属性是不变的。您可以添加新udev
规则并根据设备插入的端口创建特定的符号链接。只需将一个新文件添加到您的/etc/udev/rules.d
目录中,如下所示:
#new symlink for my front USB port:
KERNELS=="2-1.8", SUBSYSTEMS=="usb", ATTRS{devpath}=="1.8", SYMLINK+="usb_port1"
并确保其名称以.rules
, 例如结尾port1.rules
。从现在开始,您可以fstab
使用该条目/dev/usb_port1
,因为插入该特定端口的任何设备都将列在 中的所述符号链接下/dev/
。 SD 卡也是如此,您应该已经解决了。
发生的情况是,我们检查特定端口(部件==
)的独特属性,一旦这些属性匹配,就会添加(+=
)一个新的符号链接到/dev/
.
您想要匹配的属性信息可以通过udevadm info -a /dev/sdb1
(for a device sdb1
) 检索。确保您仅从一个父设备块获取属性,并且该父设备块应该具有唯一的devpath
和KERNELS
条目 - 尝试使用几个 USB 端口(如果可用)来查看哪些端口发生了变化。
PS:udev
还允许在插入设备时运行脚本 - 可能会派上用场以满足您的备份需求。但是我不知道启动系统是否算作插入,因此您必须检查行为。
答案2
我很可能会使用 Fiximan 的答案,但为了完整起见,这里有一个我编写的示例脚本,用于安装尺寸较小且尚未安装的设备。
#!/bin/bash
output=$(lsblk -b -I 8 -i | grep "^[\`|]-sd.1" | awk '{print substr($1,3), $4, $7}')
cursize=999999999999999
while read dev size mountpath; do
echo $dev :: $size :: $mountpath
if [[ $size -lt $cursize && -z $mountpath ]]
then
cursize=$size;
dev2mount=$dev;
fi
done <<< "$output"
echo to mount: $dev2mount of $cursize size