如何获取包含/
文件系统的卷的 UUID?到目前为止,我发现最好的方法是blkid -o list
。但这种输出是人类可读的,很难解析。也许有更好的方法?
我需要使用系统特定的模板来参数化配置管理。
请注意,blkid
对于那些将来可能重复使用我的问题结果的人来说,陷阱是:blkid
缓存以前运行的结果/etc/blkid.tab
。这意味着blkid
第一次以非 root 用户身份运行不会返回任何数据。此外,在 root 运行后以非 root 用户身份运行blkid
将返回过时(可能不正确)的数据。
答案1
使用findmnt
:
$ findmnt /
TARGET SOURCE FSTYPE OPTIONS
/ /dev/md127p1 ext4 rw,relatime,stripe=256,data=ordered
$ findmnt / -o UUID
UUID
046a554b-d9f5-4b23-82e6-ffaeb98284aa
$ findmnt / -o UUID -n
046a554b-d9f5-4b23-82e6-ffaeb98284aa
它还有几个选项来控制如何查找信息以及如何呈现信息(包括 JSON 输出!)。它是软件包的一部分mount
,因此可以在任何 Ubuntu 安装中使用。
答案2
另一个解决方案:
lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
-n
抑制标题(不是真正需要的,但解析起来更安全)-r
制作原始输出(使其解析更安全)-o UUID,MOUNTPOINT
仅包含必要信息
答案3
您可以使用lsblk
命令输出 UUID,但您需要分区的设备名称(例如 /dev/sda2)。您可以使用命令df
并修剪输出来获取此信息。使用命令替换将设备名称提供给lsblk
。看来您需要 sudo 才能访问 UUID,尽管 lsblk 的正常输出不需要它:
sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
答案4
将值调整mountpoint
为相关文件系统的当前挂载点:
dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)" &&
sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p'