如何找到文件系统的UUID


133

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


感谢您提供所有答案,我相信我会在不同情况下使用它们。
布拉德·吉尔伯特

2
请注意,标题以前是“如何查找分区的UUID”。该问题仅在使用GPT分区表时才有意义。这是该问题的答案
Alastair Irvine'3

Answers:


164

另一个可用的命令对此也很好用,它是“ 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

1
在我的Ubuntu计算机上,我不需要使用sudo。
布拉德·吉尔伯特

只需输入blkid,就可以准确地得到我想要的东西,但不能完全满足我的要求。(无论如何,我都接受它,因为我确信我会经常使用它)
布拉德·吉尔伯特

3
在较新版本的Ubuntu上,blkid -L现在的等价命令是blkid -o list; 该-L选项已更改为-L label查找使用指定标签的设备。
aculich 2012年

@aculich我已经更新了答案,其中包括的最新语法blkid。感谢您提及。
Christopher Cashell 2012年

2
太好了,我从来不知道blkid;我一直都做完ls -l /dev/disk/by-uuid。在Gentoo blkidsys-apps/util-linux
AdmiralNemo

10

仅适用于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

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

我相信root=LABEL=并且root=UUID=是由早期用户空间实现的,前几天我在系统上看到的init代码将这些参数转换为/ 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


与sgdisk 1.0.1 相比,正确的用法似乎是-i1或。-i 1-i:1
查尔斯·达菲

@CharlesDuffy感谢您发现该错误。我已经编辑了答案以进行更正。
John S Gruber

7

在任何类型的文件系统上都可以使用的脚本清洁方式是:

lsblk -no UUID <device-containing-FS>

或者,给定安装点(或其中的任何文件):

lsblk -no UUID $(df -P <file> | awk 'END{print $1}')

输出是UUID,整个UUID,仅是UUID。


1
它比blkid@ christopher-cashell的答案要好,因为您不需要成为root。对于挂载点或文件,最好执行以下操作:lsblk -no UUID $(findmnt -n -o SOURCE --target <file>)
marcz

@marcz在btrfs子卷上失败:findmnt -n -o SOURCE --target ~给出:/dev/mapper/vg_svelte-home[/@home]
Tom Hale

正确的@ tom-hale,lsblk -no UUID $(findmnt -n -o SOURCE --target <file> | cut -d[ -f1)应删除存在的子卷。
marcz

5

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

/sbin/tune2fs -l /dev/sda1

3
只要您的文件系统被格式化为ext2,ext3或ext4,它就可以工作。大多数文件系统是其中之一,但不是全部。它也不适用于交换分区。请参阅我的回答以了解通用方式。
Hamish Downer

在我的情况下,这导致Couldn't find valid filesystem superblock.
Michel

3

推荐的方法是

sudo vol_id -u /dev/sda2

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

如对此问题的注释中所述,vol_id可能不在您的路径中。在ubuntu上,它在/ sbin中,因此上面的方法可以正常工作。对于软呢帽,它似乎需要

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

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


这在我的Fedora 10笔记本电脑上不起作用。
艾迪(Eddie)

这是比我的更好的解决方案。Eddie,vol_id位于/ lib / udev中。先生,您能编辑答案以在vol_id前面加上完整路径吗?在我知道的任何发行版上,默认情况下/ lib / udev都不在root的路径中。
MihaiLimbăşan,2009年

“ / lib / udev / vol_id / dev / sda2”似乎起作用。很少有人会在其路径中使用/ lib / udev。
艾迪(Eddie)

在我的Ubuntu的电脑有一个从一个符号链接/sbin/vol_id/lib/udev/vol_id
吉尔伯特

4
从Karmic(9.10)起,vol_id已从Ubuntu删除,因此不再有用或不相关。由于vol_id是在取代blkid的某个时刻构建而成,因此它经历了很多扭曲。
阿兰·奥德


2

假设您想要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,请删除粗线和剪切点,例如:

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发行版中的工具,这些工具默认情况下在任何用户的路径。


这将在运行最新的devfs的任何计算机上运行。
艾迪(Eddie)

1

您还可以使用它来打印所有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
ls -l /dev/disk/by-uuid | grep `lsblk | grep "/" | awk '{print $1}'` | awk '{print $9}'

多年来,以上似乎适用于大多数(我发现的所有)Linux系统。我不知道它可能有缺陷。我希望获得序列号,但是...这是根文件系统的UUID。

如果有人能够获得序列号而不必是root(就像我一样)并且不安装在不同版本的Unix中不同的“异常”软件包,我将不胜感激-总是可以学到一些东西。而且我知道我正在混用东西-这是根文件系统UUID,而不是磁盘。

BTW的目的是在每台机器上生成一个无法修改的唯一编号(例如磁盘序列号和很早以前的MAC地址)。

它用于将软件编码到单个计算机上。在允许他们进行虚拟化之前,MAC地址是可以的……有些卑鄙的客户只是简单地将其MAC地址设置为一个常数(当然是在不同的网络上),而不必付钱给我。

在AIX中,只有一个调用,以获得一个标识机器的号码。它不在乎硬件是否发生更改或软件更新是否发生,因此我不知道它们的操作方式。如果主板发生更改,则数字发生了更改,因此我认为他们将其隐藏在那里。这是罕见的。


0

您可以使用以下命令获取特定驱动器的UUID,

sudo vol_id -u /dev/sda1

或者您可以使用它列出附加媒体的所有UUID,

ls /dev/disk/by-uuid

从Ubuntu 9.10开始不再适用,因为已删除了vol_id
阿兰·奥德
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.