Brad Gilbert Asked: 2009-05-03 07:47:13 +0800 CST2009-05-03 07:47:13 +0800 CST 2009-05-03 07:47:13 +0800 CST 如何找到文件系统的 UUID 772 我正在运行 Ubuntu,并且想找出UUID特定文件系统(不是分区)的。我知道我可以e2label /dev/sda1用来查找文件系统标签,但似乎没有类似的方法来查找UUID. linux partition command-line-interface 12 个回答 Voted Best Answer Christopher Cashell 2009-05-05T11:11:48+08:002009-05-05T11:11:48+08:00 '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 John S Gruber 2014-06-24T13:55:35+08:002014-06-24T13:55:35+08:00 仅适用于 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/sda1or更多的实用程序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 Tom Hale 2017-12-31T05:29:15+08:002017-12-31T05:29:15+08:00 适用于任何类型的文件系统的脚本清洁方法是: lsblk -no UUID <device-containing-FS> 或者,给定挂载点(或其中的任何文件): lsblk -no UUID $(df -P <file> | awk 'END{print $1}') 输出是 UUID、整个 UUID,除了 UUID 什么都没有。 Eddie 2009-05-03T07:57:07+08:002009-05-03T07:57:07+08:00 对 ext2/ext3/ext4 执行此操作的最简单方法是: /sbin/tune2fs -l /dev/sda1 Hamish Downer 2009-05-03T08:53:09+08:002009-05-03T08:53:09+08:00 推荐的方法是这样做 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 则发表评论,我会将其添加到此答案中。 Marcus Junius Brutus 2014-09-19T13:08:02+08:002014-09-19T13:08:02+08:00 这似乎对我有用: sudo dumpe2fs /dev/sda1 | grep UUID Mihai Limbăşan 2009-05-03T08:22:27+08:002009-05-03T08:22:27+08:00 假设您想要 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,例如: 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 发行版中默认存在的工具任何用户的路径。 kiri 2013-12-01T15:09:08+08:002013-12-01T15:09:08+08:00 您还可以使用它来打印所有 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' \; Eric Eberhard 2017-03-24T17:11:50+08:002017-03-24T17:11:50+08:00 ls -l /dev/disk/by-uuid | grep `lsblk | grep "/" | awk '{print $1}'` | awk '{print $9}' 多年来,上述内容似乎适用于大多数(我发现的所有)Linux 系统。它可能有缺陷,我不知道。我更愿意获取序列号,但是……这是根文件系统的 UUID。 如果有人有办法获得序列号而无需成为 root(就像我的那样)并且不安装在不同版本的 Unix 中不同的“不寻常”软件包,我将不胜感激 - 总是可以学到一些东西。而且我知道我正在混合一些东西 - 是根文件系统 UUID,而不是磁盘。 顺便说一句,目的是为每台机器生成一个无法修改的唯一编号(就像磁盘序列号和很久以前的 MAC 地址一样)。 它用于将软件编码到单台机器上。MAC地址很好,直到他们允许他们成为虚拟......一些低俗的客户只是将他们的MAC地址设置为一个常数(当然在不同的网络上)并避免付钱给我。 在 AIX 中,只需一次调用即可获得一个标识机器的号码。它不关心是否发生硬件更改或软件更新,所以我不知道他们是如何做到的......如果主板改变,那么数字就会改变,所以我认为他们把它藏在那里。这是非常罕见的。 asmath 2021-01-04T03:17:06+08:002021-01-04T03:17:06+08:00 查找文件系统的 UUID 的最简单和最好的方法 [root@server ~]# blkid /dev/sda1
'blkid' 是另一个可能可用且效果很好的命令。它是 e2fsprogs 软件包的一部分。它的用法示例:
在 /dev/sda1 上查找数据:
显示所有分区的 UUID 数据:
以更易于阅读的格式显示所有分区的 UUID 数据:(注意:在较新的版本中,
blkid -L
具有不同的含义,blkid -o list
应改为使用)仅显示 /dev/sda1 的 UUID,不显示其他内容:
仅适用于 GPT 分区磁盘
在 GPT 格式化磁盘上,每个分区都分配有一个 GUID,它是 UUID 的一种形式,尽管可能不是原始发布者所指的。因此,这个答案可能对原始提问者的帮助较小。尽管如此,我相信有一个重要的区别需要注意。
要获取 GPT 格式化磁盘 /dev/sda 上分区 1 的 GUID,以及它的分区标签等:
或全部:
要使用位于某个分区上的文件系统的根目录进行引导,您可以使用以下 linux 内核参数语法:
在这种情况下,您可以仅指定 UUID 的开头——足以唯一。这个参数比较原始,内核在启动过程的早期就可以理解。
这些之间的语义有所不同:
磁盘保存分区,分区保存文件系统,文件系统保存目录和文件。对于某些设置和操作系统,有更多层。
GUID UUID 和关联的标签指的是一个分区,而不是分区的内容。同一磁盘上的新分区或新磁盘上的分区将具有新的 GUID UUID。同一分区可以在某一天保存一个文件系统,而在另一天保存另一个文件系统。它仅适用于 GPT 格式的磁盘,而不适用于旧式分区磁盘。这里通常没有比指定
root=/dev/sda1
or更多的实用程序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
适用于任何类型的文件系统的脚本清洁方法是:
或者,给定挂载点(或其中的任何文件):
输出是 UUID、整个 UUID,除了 UUID 什么都没有。
对 ext2/ext3/ext4 执行此操作的最简单方法是:
推荐的方法是这样做
有关使用 UUID 的更多信息,请参阅这篇文章(来自 ubuntu 帮助,但应该适用于任何使用 UUID 的 linux 发行版)。
如对此问题的评论中所述,vol_id 可能不在您的路径中。在 ubuntu 上,它位于 /sbin 中,因此上述内容将起作用。对于 Fedora,它似乎需要
如果其他发行版在其他地方有 vol_id 则发表评论,我会将其添加到此答案中。
这似乎对我有用:
假设您想要 sda1 的 UUID,您可以尝试以下操作:
相应地调整 sda1。要获取所有分区的 UUID,请删除 greps 和 cut,例如:
我桌面上 sda1 的示例输出:
编辑:请注意,这个解决方案虽然比 udev->vol_id 更做作,但不需要root 权限,可以在任何 2005 年左右的内核上工作,并且依赖于任何 Linux 发行版中默认存在的工具任何用户的路径。
您还可以使用它来打印所有 UUID:
或者这个可以说更简单的命令,替换
sda1
为您要搜索的设备:打印所有 UUID 的第二种方法的改编:
多年来,上述内容似乎适用于大多数(我发现的所有)Linux 系统。它可能有缺陷,我不知道。我更愿意获取序列号,但是……这是根文件系统的 UUID。
如果有人有办法获得序列号而无需成为 root(就像我的那样)并且不安装在不同版本的 Unix 中不同的“不寻常”软件包,我将不胜感激 - 总是可以学到一些东西。而且我知道我正在混合一些东西 - 是根文件系统 UUID,而不是磁盘。
顺便说一句,目的是为每台机器生成一个无法修改的唯一编号(就像磁盘序列号和很久以前的 MAC 地址一样)。
它用于将软件编码到单台机器上。MAC地址很好,直到他们允许他们成为虚拟......一些低俗的客户只是将他们的MAC地址设置为一个常数(当然在不同的网络上)并避免付钱给我。
在 AIX 中,只需一次调用即可获得一个标识机器的号码。它不关心是否发生硬件更改或软件更新,所以我不知道他们是如何做到的......如果主板改变,那么数字就会改变,所以我认为他们把它藏在那里。这是非常罕见的。
查找文件系统的 UUID 的最简单和最好的方法