从脚本获取/文件系统的UUID


11

如何获取包含/文件系统的卷的UUID ?迄今为止,我发现最好的是blkid -o list。但是此输出是人类可读的并且难以解析。也许有更好的方法?

我需要使用系统特定模板来参数化配置管理。

有关blkid将来可能会重复使用我的问题结果的人的注意事项:blkid将先前运行的结果缓存在/etc/blkid.tab。这意味着blkid首次以非root用户身份运行不会返回任何数据。同样,blkid以root用户身份运行后以非root用户身份运行将返回陈旧(可能不正确)的数据。


在我自己的系统上,我为所有分区分配了人类可读的唯一标签。然后,通过使用它们的标签,我几乎可以找到关于它们的所有信息/dev/disk/by-label。...这也适用于未安装的分区。它的优点是能够编写脚本来执行从root到root-bak的rsync之类的事情,这比使用2个不表示任何意思的UUIDS容易出错。

Answers:


25

用途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安装中使用。


这在16.04上效果很好。它无法在14.04上正常运行。我不得不使用这种方法来获得可信赖的预期结果。
年长者怪胎

11

另一个解决方案:

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
  • -n 抑制标题(不是真正需要的,但是更安全地进行解析)
  • -r 使原始输出(使其更安全地解析)
  • -o UUID,MOUNTPOINT 仅包含必要的信息

5

您可以使用lsblk命令输出UUID,但需要分区的设备名称(例如/ dev / sda2)。您可以通过使用df命令并调整输出来获得此效果。使用命令替换将设备名称指定为lsblk。似乎您需要sudo来访问UUID,尽管lsblk的常规输出不需要它:

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"

2
这对我来说没有sudo16.04。
伊莱亚·卡根

仅当您(或某些脚本)曾经以root用户身份运行过此命令时。同样,在这种情况下,输出可能会过时(来自缓存)
Dmitriusan

@Dmitriusan我在从未拥有过root lsblk或没有blkidroot运行的14.04系统上运行过它,并且运行良好。您知道为什么此命令而不是Rovo发布的版本会出现缓存问题吗?原始输出是否以某种方式规避了缓存?
Arronical '17

我认为任何访问设备UUID的命令都需要root访问权限(包括Rovo发布的版本)。关于lsblk,这里是一个相关的问题unix.stackexchange.com/questions/210889/...(见第一个答案)
Dmitriusan

我同意sudo是必需的,但是找不到任何暗示lsblk依赖缓存的信息。即使我blkid以root身份运行,在上创建缓存文件/dev/.blkid.tab,非sudo的使用lsblk也不会显示UUID列中的任何内容。我认为没有过时的输出风险。
Arronical '17

4

我设法提出的最好的解决方案是

blkid -o list | awk '/\/[[:space:]]+/{ print $0 }' | tr -s ' ' | cut -d ' ' -f 4

感觉像不是最优的,但是有效。

注意: [[:space:]]表示Space


这对我有效,但与sudo
pa4080

4

将的值调整mountpoint为相关文件系统的当前安装点:

dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)" &&
sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p'

1

这是我使用的:

sudo tune2fs -l $(df  / | tail -1 |awk '{print $1}') |grep UUID|awk '{ print $3 }'

tune2fs在e2fsprogs软件包中,我不记得它是否默认安装。

sudo apt install e2fsprogs

如果未安装。


我得到awk: not an option: -e我编辑的答案,以使其起作用。如果我超速了,请随时回滚。干杯! :-)
怪杰长老

奇怪,对我来说,无论是否使用-e,它都可以工作。-e在awk的手册页中记录。我一直在脚本中使用它,但令我惊讶的是,如果没有它,它可以正常工作:)我认为-e是一种古老的UNIX习惯。但是,我应该一直保持一致,并在两个地方或两个地方都使用-e,以免使人感到困惑。
约翰·约翰·

啊,我在14.04下使用的结果与您相同gawk。我收到在16.04下指定的错误,它似乎可以mawk代替使用。
年长者怪胎

这是/ etc / alternatives之一。在我的16.04上为我/ etc / alternatives / awk-> / usr / bin / gawk。Mawk已安装,但在/ etc / alternatives中未激活。在我的17.04 gnome上,它指向awk。在我的最新安装17.10中,它是mawk。安装gawk之后,链接指向gawk,卸载gawk会将其返回到mawk。
约翰·

:-)这些可能类似的程序之间的微小差异可能导致诸如“少即是多”的声明
Elder Geek

1

经测试可在14.04和16.04上使用

一个应该始终生成根的UUID的简单的单线/

出口DRIVE = $(在'{print $ 1}'上装入| grep'/'| awk -F“); blkid $ DRIVE | 切-d'“'-f2`

我们在这里所做的工作是挂载mount的输出,以使根符号与两侧的空格/匹配,以避免在/用作路径扩展符号时匹配,并通过awk使用“ on”作为字段分隔符进行管道传递,以便仅输出设备名称,并将THAT分配给环境变量$ DRIVE,然后使用blkid $DRIVE管道传输的cut 的输出(使用)"作为字段分隔符,并仅选择第二个删除所有内容的字段,仅保留UUID。

请注意,上述命令中的grep后面的内容实际上是' space/ space',而不是出现的'/'。

这样做的好处是不需要sudo,无论驱动器如何安装,都将返回适当的结果。

在尝试这种方法之前,请确保您没有将$ DRIVE环境变量用于其他任何东西,echo $DRIVE如果您不使用该变量,它将返回空白行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.