UUID
。我知道我可以使用e2label /dev/sda1
找出文件系统标签,但是似乎没有类似的方法来找到UUID
。#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/sda1
或root=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
– 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
评论
感谢您提供所有答案,我确定我会在不同情况下使用它们。请注意,标题以前是“如何查找分区的UUID”。该问题仅在使用GPT分区表时才有意义。这是该问题的答案。