题 我如何找到文件系统的UUID


我正在运行Ubuntu,想找出答案 UUID 特定文件系统(不是分区)。我知道我可以用 e2label /dev/sda1 找出文件系统标签,但似乎没有类似的方法来找到 UUID


114
2018-05-02 15:47




感谢所有的答案,我相信我会在不同的情况下使用它们。 - Brad Gilbert
请注意,标题曾经是“我如何找到分区的UUID”。这个问题在使用GPT分区表时才有意义。 这是对这个问题的回答。 - Alastair Irvine


答案:


可能可用的另一个命令也可以很好地用于此'blkid'。它是e2fsprogs包的一部分。它的用法示例:

在/ dev / sda1上查找数据:

topher@crucible:~$ sudo blkid /dev/sda1
/dev/sda1: UUID="727cac18-044b-4504-87f1-a5aefa774bda" TYPE="ext3"

显示所有分区的UUID数据:

topher@crucible:~$ sudo blkid
/dev/sda1: UUID="727cac18-044b-4504-87f1-a5aefa774bda" TYPE="ext3"
/dev/sdb: UUID="467c4aa9-963d-4467-8cd0-d58caaacaff4" TYPE="ext3"

以更易于阅读的格式显示所有分区的UUID数据: (注意:在较新的版本中, blkid -L 有不同的含义,和 blkid -o list 应该用来代替)

topher@crucible:~$ sudo blkid -L
device     fs_type label    mount point    UUID
-------------------------------------------------------------------------------
/dev/sda1 ext3             /              727cac18-044b-4504-87f1-a5aefa774bda
/dev/sdc  ext3             /home          467c4aa9-963d-4467-8cd0-d58caaacaff4

只显示/ dev / sda1的UUID而不是其他内容:

topher@crucible:~$ sudo blkid -s UUID -o value /dev/sda1
727cac18-044b-4504-87f1-a5aefa774bda

144
2018-05-04 19:11



在我的Ubuntu计算机上,我不需要使用sudo。 - Brad Gilbert
只是打字 blkid,让我得到我想要的,但不是我要求的。 (无论如何我都接受了,因为我相信我会经常使用它) - Brad Gilbert
在较新版本的Ubuntu上,等效命令为 blkid -L 就是现在 blkid -o list;该 -L 选项已更改为 -L label 查找使用指定标签的设备。 - aculich
@aculich我已经更新了答案,包括最近的语法 blkid。谢谢你提到它。 - Christopher Cashell
很好,我从来不知道 blkid;我一直都这么做 ls -l /dev/disk/by-uuid。在Gentoo上, blkid 在... sys-apps/util-linux - AdmiralNemo


仅适用于GPT分区磁盘

在GPT格式的磁盘上,每个分区都分配了一个GUID,这是UUID的一种形式,尽管可能不是原始海报所指的。因此,这个答案可能对原始提问者没有帮助。不过我相信有一个重要的区别值得注意。

要获取GPT格式化磁盘/ dev / sda上的分区1的GUID,以及其分区标签等,请执行以下操作:

sudo sgdisk -i 1 /dev/sda

或全部用:

ls -l /dev/disk/by-partuuid

要使用某个分区上的文件系统的根目录启动,您将使用以下的linux内核参数语法:

root=PARTUUID=87654321-4321-4321-abcd-123456789012

在这种情况下,您只能指定UUID的开头 - 足够唯一。此参数更原始,内核可以在其引导过程中更早地理解。


这些语义之间存在差异:

磁盘保存分区,分区保存文件系统,文件系统保存目录和文件。对于某些设置和操作系统,有更多层。

GUID UUID和关联标签引用分区,但不引用分区的内容。同一磁盘上的新分区或新磁盘上的分区将具有新的GUID UUID。同一个分区可以在一天内保存一个文件系统,在另一天保存另一个文件系统。它仅适用于GPT格式的磁盘,但不适用于旧的分区磁盘。这里通常没有比指定更多的实用工具了 root=/dev/sda1 要么 root=8:1

其他当前答案指的是a的UUID 文件系统 在一些包含分区。如果将文件系统作为一个整体复制到另一个分区或硬盘上,则该值保持不变。此UUID在查找已移动的文件系统时非常有用。因此,这可能与大多数人更相关。 Linux内核参数 root=UUID=87654321-4321-4321-a567-123456789012 指的是这个。

我相信 root=LABEL= 和 root=UUID= 由早期用户空间实现,前几天我在系统上看到的初始化代码将这些参数转换为/ dev / disk / by-uuid和/ dev / disk / by-label(我相信链接是由udev在我的用户空间中创建的)系统)。

[1] http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/init/do_mounts.c#n183


9
2018-06-23 21:55



正确的用法似乎是 -i1 要么 -i 1,而不是 -i:1,使用sgdisk 1.0.1。 - Charles Duffy
@CharlesDuffy感谢您找到该错误。我已经编辑了答案来纠正它。 - John S Gruber


对ext2 / ext3 / ext4执行此操作的最简单方法是:

/sbin/tune2fs -l /dev/sda1

5
2018-05-02 15:57



如果您的文件系统格式为ext2,ext3或ext4,这将起作用。大多数文件系统都是其中之一,但并非全部。它也不适用于交换分区。请参阅我的答案以获得通用方法。 - Hamish Downer
这导致了我的情况 Couldn't find valid filesystem superblock. - Michel


建议的方法是这样做

sudo vol_id -u /dev/sda2

有关使用UUID的更多信息,请参阅 本文 (来自ubuntu的帮助,但应该适用于任何使用UUID的Linux发行版)。

正如对此问题的评论中所述,vol_id可能不在您的路径中。在ubuntu上,它在/ sbin中,所以上面的内容将起作用。对于fedora,它似乎需要

sudo /lib/udev/vol_id -u /dev/sda2

如果其他发行版在其他地方有vol_id,则发表评论,我会将其添加到此答案中。


3
2018-05-02 16:53



这在我的Fedora 10笔记本电脑上不起作用。 - Eddie
这比我的解决方案要好得多。 Eddie,vol_id位于/ lib / udev。你可以编辑你的答案,以便在vol_id前面的完整路径前缀吗?默认情况下,/ lib / udev不在root的路径中我知道的任何发行版。 - Mihai Limbăşan
“/ lib / udev / vol_id / dev / sda2”似乎有效。很少有人会在他们的道路上拥有/ lib / udev。 - Eddie
在我的Ubuntu计算机上有一个符号链接 /sbin/vol_id 至 /lib/udev/vol_id - Brad Gilbert
vol_id自Karmic(9.10)以来已从Ubuntu中删除,因此不再有用或相关。它经历了很多扭曲,以实现目标 vol_id 有一点是为了取而代之的 BLKID。 - Alain O'Dea


假设您想要sda1的UUID,您可以尝试这样的事情:

for v in /dev/disk/by-uuid/* ; do echo "`readlink $v`: $v" | grep ../sda1 | cut -d\: -f2 | cut -d/ -f5 ; done

相应地调整sda1。要获取所有分区的UUID,请删除greps和cut,a la:

for v in /dev/disk/by-uuid/* ; do echo "`readlink $v`: $v" ; done

我桌面上sda1的示例输出:

[mihailim@home ~]$ for v in /dev/disk/by-uuid/* ; do echo "`readlink $v`: $v" | grep ../sdb3 | cut -d\: -f2 | cut -d/ -f5 ; done
dc8c49f1-e2dc-46bc-ba02-013f26c85f70

编辑:请注意,这个解决方案,虽然比udev-> vol_id更加做作,但确实如此  需要root权限,可以在任何2005年以后的内核上运行,并且依赖于任何Linux发行版中的工具,这些工具默认位于任何用户的路径中。


2
2018-05-02 16:22



这适用于运行最近足够的devfs的任何计算机。 - Eddie


这似乎对我有用:

sudo dumpe2fs /dev/sda1 | grep UUID

2
2017-09-18 21:08





您也可以使用它来打印所有UUID:

for disk in /dev/disk/by-uuid/*; do 
    basename "$(readlink "$disk")"
    basename "$disk"
    echo
done

或者这个可以说更简单的命令,取而代之 sda1 使用您要搜索的设备:

disk=sda1
find /dev/disk/by-uuid -type l -exec sh -c "readlink {} | grep -o $disk && basename {}" \;

改编第二种方法来打印所有UUID:

find /dev/disk/by-uuid -type l -exec sh -c 'basename $(readlink {}); basename {}; echo' \;

1
2017-11-30 23:09