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

评论

感谢您提供所有答案,我确定我会在不同情况下使用它们。

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

#1 楼

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


评论


在我的Ubuntu计算机上,我不需要使用sudo。

–布拉德·吉尔伯特(Brad Gilbert)
09年5月5日,3:28

只需输入blkid,就可以准确地得到我想要的东西,但并不能完全满足我的要求。 (我仍然接受它,因为我确定我会经常使用它)

–布拉德·吉尔伯特(Brad Gilbert)
09年5月5日,下午3:38

在较新版本的Ubuntu上,blkid -L的等效命令现在为blkid -o list; -L选项已更改为-L标签,以查找使用指定标签的设备。

– aculich
2012年1月29日下午3:09

@aculich我已经更新了答案,以包括blkid的最新语法。感谢您提及。

– Christopher Cashell
2012年3月27日19:41

太好了,我从来不知道blkid。我一直只是做ls -l / dev / disk / by-uuid。在Gentoo上,blkid位于sys-apps / util-linux中

–海军上将尼莫
2012年3月27日23:48

#2 楼

仅适用于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/sda1root=8:1有用的工具。

其他当前答案指的是某些包含分区的文件系统的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

评论


正确的用法似乎是-i1或-i 1,与sgdisk 1.0.1的-i:1相反。

–查尔斯·达菲(Charles Duffy)
15年12月29日在22:41

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

– John S Gruber
2015年12月31日,下午3:20

#3 楼

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

lsblk -no UUID <device-containing-FS>


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

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


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

评论


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

– marcz
18/12/18在13:12



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

–汤姆·黑尔
18/12/19在1:57



正确@ tom-hale,lsblk -no UUID $(findmnt -n -o SOURCE --target | cut -d [-f1)应该除去子卷(如果存在)。

– marcz
18/12/20在12:22



#4 楼

对于ext2 / ext3 / ext4而言,最简单的方法是:

/sbin/tune2fs -l /dev/sda1


评论


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

–汉米·唐纳(Hamish Downer)
09年5月2日在16:54

在我的情况下,这导致找不到有效的文件系统超级块。

–米歇尔
16年11月7日在15:34

#5 楼

推荐的方法是执行

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,请发表评论,并将其添加到此答案中。

评论


这在我的Fedora 10笔记本电脑上不起作用。

–艾迪
09年5月2日在17:10

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

– MihaiLimbăşan
09年5月2日在17:13

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

–艾迪
09年5月2日在17:20

在我的Ubuntu计算机上,有一个从/ sbin / vol_id到/ lib / udev / vol_id的符号链接

–布拉德·吉尔伯特(Brad Gilbert)
09年5月3日在16:59

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

–阿兰·奥迪(Alain O'Dea)
2015年12月31日,下午3:51

#6 楼

这似乎对我有用:

sudo dumpe2fs /dev/sda1 | grep UUID


#7 楼

假设您想要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,请丢下并割下一个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发行版中,默认情况下,该目录位于任何用户的路径中。

评论


这将在运行最新的devfs的任何计算机上运行。

–艾迪
09年5月2日在17:13

#8 楼

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



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

< br或这个可能更简单的命令,将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' \;
 


#9 楼

ls -l /dev/disk/by-uuid | grep `lsblk | grep "/" | awk '{print }'` | awk '{print }'


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

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

目的是BTW,是为每台不能修改的机器生成一个唯一的编号(例如磁盘)序列号和类似的MAC地址是很久以前的)。

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

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

#10 楼

查找文件系统的UUID的最简单,最佳方法
[root@server ~]# blkid /dev/sda1


#11 楼

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

sudo vol_id -u /dev/sda1


,也可以使用它列出附加介质的所有UUID,

ls /dev/disk/by-uuid


评论


从Ubuntu 9.10开始不再适用,因为已删除了vol_id。

–阿兰·奥迪(Alain O'Dea)
2015年12月31日,下午3:52