使用bash来判断是否安装了具有给定UUID的驱动器

时间:2012-01-10 18:23:37

标签: linux bash

我正在开发一个bash脚本,用于判断给定的驱动器是否连接到系统,如果是,则将某些数据(需要从异地取出的备份)复制到该驱动器。

我想要做的是通过UUID识别驱动器/分区,以便我可以拥有一个经常扫描该驱动器存在的脚本,当它插入时,将数据复制到它(通过rsync,所以我不特别在意这个部分是不是一次运行,因为后来的运行是I / O便宜的)。我希望这一点尽可能简单,这样我就可以将驱动器交给非技术人员并说“将其插入此处,然后再将其拔掉并随身携带”。

我似乎无法在mount中找到任何可以做到这一点的选项,并且通过/etc/fstab进行点击并不能告诉我是否实际安装了驱动器。

在给定UUID的情况下,如何安装具有该UUID的驱动器以及它的安装点是什么?如何判断?

4 个答案:

答案 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