当前位置: 首页>>技术教程>>正文


如何通过UUID判断分区是否挂载?

, , ,

问题描述

如果我有驱动器分区的 UUID,我该如何使用命令行来确定它是否已安装?

最佳办法

lsblk 可能有帮助。它只能打印 UUID 和挂载点,因此,给定 UUID,只需查看挂载点是否不为空:

uuid=foo
lsblk -o UUID,MOUNTPOINT | awk -v u="$uuid" '$1 == u {print $2}'

所以:

uuid=foo
mountpoint=$(lsblk -o UUID,MOUNTPOINT | awk -v u="$uuid" '$1 == u {print $2}')
if [[ -n $mountpoint ]]
then
    echo mounted
else
    echo not mounted
fi

由于lsblk可以作用于特定设备,因此您还可以执行以下操作:

mountpoint=$(lsblk -o MOUNTPOINT "/dev/disk/by-uuid/$uuid" | awk 'NR==2')

使用第一种方法,如果该 UUID 不是来自当前连接的磁盘,则不会出错。使用第二种方法,如果 /dev/disk/by-uuid/$uuid 不存在,则 lsblk 会出错。

次佳办法

lsblk -o UUID,SIZE,MOUNTPOINT

如果您只需要一行包含您的 UUID 和挂载点($UUID 代表您的 UUID):

lsblk -o UUID,MOUNTPOINT|grep "$UUID"

如果卸载,则挂载点将为空。尝试 lsblk -h 以获取更多选项。

使用awk打印结果。如果 NF(字段数)大于 1,则意味着它有一个挂载点:

lsblk -o UUID,MOUNTPOINT|grep "$UUID"|awk '{if (NF>1) print $1" is mounted"; else print $1" is unmounted";}'

第三种办法

如果您想要 mount 中的详细信息

for uuid in /dev/disk/by-uuid/*; do if [[ "$uuid" =~ .*your-UUID-here.* ]]; then echo $(mount | grep "$(readlink -e "$uuid")") ; fi; done

your-UUID-here 替换为您的 UUID

更易读:

 for uuid in /dev/disk/by-uuid/*; do 
   if [[ "$uuid" =~ .*your-UUID-here.* ]]
     then echo $(mount | grep "$(readlink -e "$uuid")")
   fi
 done

输出示例:

/dev/mmcblk1p2 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)

你可以让它检查字符串不为空并回显 “mounted”:

for uuid in /dev/disk/by-uuid/*; do if [[ "$uuid" =~ .*your-UUID-here.* ]]; then if [[ $(mount | grep "$(readlink -e "$uuid")") ]]; then echo "mounted"; fi; fi; done

但其他人给出了更好的方法来做到这一点:)

第四种办法

Ubuntu 使用 UDisks2 守护进程,它会轮询有关文件系统的大量信息,我们可以使用 udisksctl 并过滤其输出,以找到一种快速而肮脏的方法来查找我们需要的信息:

udisksctl dump | python -c 'import sys;lines = [l.strip() for l in sys.stdin if " UUID" in l or " MountPoints:" in l];print "\n".join(lines)'

上面显示的内容基本上会打印文件系统及其挂载点的 UUID。通过目视检查,您现在可以确定哪个 UUID 已挂载,哪个未挂载。

$ udisksctl dump | python -c 'import sys;lines = [l.strip() for l in sys.stdin                                           
> if " UUID" in l or " MountPoints:" in l];print "\n".join(lines)'
MountPoints:        /
UUID:               000b5321-01
MountPoints:
UUID:               bbf23a81-808e-11e4-a445-201a06d7b0e9
MountPoints:
UUID:               bbf23a87-808e-11e4-a445-201a06d7b0e9
MountPoints:
UUID:               bbf23a89-808e-11e4-a445-201a06d7b0e9
MountPoints:
UUID:               bbf23a8f-808e-11e4-a445-201a06d7b0e9
MountPoints:
UUID:               02fe8de2-a408-11e4-8eeb-f0761c8c6df7
MountPoints:        /mnt/HDD
UUID:               53827413-0b7e-4ae6-ae09-1daea529d6a1

第五种办法

我的解决方案

  • 仅使用 shell 和 procfs ,因此没有奇怪的命令输出格式问题,

  • 不(重新)扫描设备 UUID,但使用内核缓存,

  • 因此不需要 super-user 权限,

  • 不依赖于规范化路径名,而是使用(设备)文件标识。

my_uuid=...
while IFS=' ' read -r dev mnt remainder; do
  case "$dev" in
  /dev/*)
    if [ "$dev" -ef "/dev/disk/by-uuid/$my_uuid" ]; then
      echo "$my_uuid ($dev) mounted at $mnt"
      break
    fi;;
  esac
done < /proc/mounts

第六种办法

基于我收到的这个问题的出色答案,我意识到使用设备名称要容易得多。从 UUID 获取设备名称:

disk_uuid=foo
disk_devname=$(blkid -U "$disk_uuid")

这意味着我可以通过 greping df 的输出来快速推断它是否已安装:

df | grep -q "$disk_devname" && echo "Disk mounted" || echo "Disk not mounted"

或者使用 Muru’s answer 中的代码,它有一个额外的好处,可以告诉我驱动器安装在哪里:

mountpoint=$(lsblk -no MOUNTPOINT "$disk_devname")
if [[ -n  "$mountpoint" ]]; then
   echo "Disk is mounted at $mountpoint"
else
   echo "Disk not mounted"
fi

第七种办法

您可以使用 df 命令查看已挂载的文件系统及其挂载点。这是我的机器上的一个示例…分区 sdb3 (我在其上安装了另一个系统)未安装,因此未列出(分区是 re-labeled,这就是显示名称而不是 UUID 的原因):

df
Filesystem                   1K-blocks     Used Available Use% Mounted on
udev                           8100756        0   8100756   0% /dev
tmpfs                          1625296     9952   1615344   1% /run
/dev/sdb4                     41022688  7074348  31834804  19% /
tmpfs                          8126464    19456   8107008   1% /dev/shm
tmpfs                             5120        4      5116   1% /run/lock
tmpfs                          8126464        0   8126464   0% /sys/fs/cgroup
/dev/loop0                       76800    76800         0 100% /snap/ubuntu-core/423
/dev/sdb1                      4186108    12160   4173948   1% /boot/efi
zsc-lxd/containers/uc-1604-1  58620160   516736  58103424   1% /var/lib/lxd/containers/uc-1604-1.zfs
zsc-lxd/containers/uc-1610-1  58637184   533760  58103424   1% /var/lib/lxd/containers/uc-1610-1.zfs
tmpfs                          1625292      124   1625168   1% /run/user/1000
/dev/sdb5                     61796348 10766892  47867344  19% /media/cl/virtual
/dev/sda4                    206293688 13419740 182371804   7% /media/cl/system
/dev/sda3                    206293688 32116600 163674944  17% /media/cl/rescue
/dev/sda2                    206293688  1867604 193923940   1% /media/cl/media
/dev/sda1                    206293688  2539712 193251832   2% /media/cl/data  

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14419.html,未经允许,请勿转载。