我正在开发一个bash脚本,用于判断给定的驱动器是否连接到系统,如果是,则将某些数据(需要从异地取出的备份)复制到该驱动器。
我想要做的是通过UUID识别驱动器/分区,以便我可以拥有一个经常扫描该驱动器存在的脚本,当它插入时,将数据复制到它(通过rsync,所以我不特别在意这个部分是不是一次运行,因为后来的运行是I / O便宜的)。我希望这一点尽可能简单,这样我就可以将驱动器交给非技术人员并说“将其插入此处,然后再将其拔掉并随身携带”。
我似乎无法在mount
中找到任何可以做到这一点的选项,并且通过/etc/fstab
进行点击并不能告诉我是否实际安装了驱动器。
在给定UUID的情况下,如何安装具有该UUID的驱动器以及它的安装点是什么?如何判断?
答案 0 :(得分:2)
/ dev / disk / by-uuid /是附加卷的符号链接场。它不会告诉您卷是否已安装,但会告诉您它是否已插入 - 因此可能会解决您的特定用例。
$ ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Nov 22 10:08 b928a862-6b3c-45a8-82fe-8f1db2863be3 -> ../../dm-0
lrwxrwxrwx 1 root root 10 Dec 8 14:33 e37fab85-9b00-4d9b-b25e-0970d6eaa3fa -> ../../sdg1
$ readlink /dev/disk/by-uuid/b928a862-6b3c-45a8-82fe-8f1db2863be3
../../dm-0
这有帮助吗?
答案 1 :(得分:2)
mount | grep $(readlink -f /dev/disk/by-uuid/$UUID )
答案 2 :(得分:2)
可以通过其符号链接安装设备。如果是这种情况,mount命令将通过其符号链接引用它,但您可能通过其真实路径引用它,或者更糟糕的是另一个符号链接。
由于多个块设备文件可以指向单个块设备(!),因此更加复杂。这可以通过使用mknod命令来完成。
我能找到准确获取此信息的唯一方法是将/proc/mounts
中所有条目的主要和次要数字与您要查找的UUID的主要和次要数字进行比较。
这是一个可以执行此操作的函数/脚本。
#!/bin/bash
# $1: should be a drive uuid, such as that reported by blkid
# return: return value of 0 if mounted, 1 if not mounted
function is_mounted_by_uuid() {
input_path=$(readlink -f /dev/disk/by-uuid/"$1")
input_maj_min=$(stat -c '%T %t' "$input_path")
cat /proc/mounts | cut -f-1 -d' ' | while read block_device; do
if [ -b "$block_device" ]; then
block_device_real=$(readlink -f "$block_device")
blkdev_maj_min=$(stat -c '%T %t' "$block_device_real")
if [ "$input_maj_min" == "$blkdev_maj_min" ]; then
return 255
fi
fi
done
if [ $? -eq 255 ]; then
return 0
else
return 1
fi
}
if is_mounted_by_uuid "$1"; then
echo $(readlink -f /dev/disk/by-uuid/$1) is mounted
else
echo $(readlink -f /dev/disk/by-uuid/$1) is not mounted
fi
答案 3 :(得分:1)
我发现这样做的最好方法是使用blkid将UUID转换为unix文件系统上的块设计,例如。
:~# blkid -U '09b8f1ab-8d4b-4c5f-b395-40be09c090b0'
/dev/sdb1
然后grep mount命令的输出。
:~# mount | grep $(blkid -U '09b8f1ab-8d4b-4c5f-b395-40be09c090b0')
/dev/sdb1 on /media/WD_Disk_1 type ext3 (rw,nosuid,nodev,uhelper=udisks)
然后grep表示所需的挂载点
grep -qs '/media/WD_Disk_1 '
完整命令是
:~# mount | grep $(blkid -U '09b8f1ab-8d4b-4c5f-b395-40be09c090b0') | grep '/media/WD_Disk_1 '
/dev/sdb1 on /media/WD_Disk_1 type ext3 (rw,nosuid,nodev,uhelper=udisks)
我将它放入if语句并隐藏输出,用一条漂亮的小消息替换它: - )。
if mount | grep $(blkid -U '09b8f1ab-8d4b-4c5f-b395-40be09c090b0') | grep '/media/WD_Disk_1 ' > /dev/null 2>&1;
then
rsync -az --delete /mnt/data/ /media/WD_Disk_1/current_working_data/;
echo "sync complete"
else
echo "couldn't find WD_Disk_1 filesystem"
exit 1
fi