我如何find文件系统的UUID

我正在运行的Ubuntu,并希望找出一个特定的文件系统(不是分区)的UUID 。 我知道我可以使用e2label /dev/sda1来查找文件系统标签,但似乎没有类似的方式来查找UUID

另一个可能的命令,也是相当好的,这是'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 

ext2 / ext3 / ext4最简单的方法是:

 /sbin/tune2fs -l /dev/sda1 

仅适用于GPT分区磁盘

在GPT格式化磁盘上,每个分区都分配了一个GUID,这是一种UUIDforms,尽pipe可能不是原来的海报所指的。 因此,这个答案可能不会对原提问者有帮助。 不过,我相信有一个重要的区别需要注意。

要获取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在find一个移动的文件系统中很有用。 所以这可能更适合大多数人。 Linux内核参数root=UUID=87654321-4321-4321-a567-123456789012就是指这个。

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

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

推荐的方法是做

 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,请发表评论,我将它添加到这个答案。

假设你想要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和剪切,a:

 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 

编辑:请注意,这个解决scheme虽然比udev-> vol_id更有人气,但不需要root权限,可以在任何2005后左右的内核上工作,并依赖任何Linux发行版中默认使用的工具任何用户的path。

这似乎为我工作:

 sudo dumpe2fs /dev/sda1 | grep UUID 

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

 sudo vol_id -u /dev/sda1 

或者您可以使用此列出所连接媒体的所有UUID,

 ls /dev/disk/by-uuid 

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

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

或者这个更简单的命令,用您想要search的设备replacesda1

 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' \; 
 ls -l /dev/disk/by-uuid | grep `lsblk | grep "/" | awk '{print $1}'` | awk '{print $9}' 

以上似乎在多数(所有我发现)Linux系统多年的工作。 它可能有缺陷,我不知道。 我宁愿得到序列号,但是…这是根文件系统的UUID。

如果任何人有办法得到序列号而不需要根(如我的),而不是安装在不同版本的Unix中不同的“不同寻常”的包,我将不胜感激 – 总是可以学到一些东西。 我知道我正在混合的东西 – 这是根文件系统的UUID,而不是磁盘。

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

它用于将软件编码到单个机器。 MAC地址是罚款,直到他们允许他们是虚拟的…一些低俗的客户只是简单地设置他们的MAC地址(当然不同的networking),并避免支付我。

在AIX中,只有一个调用来获得一个标识机器的号码。 它不在乎是否硬件改变或软件更新发生,所以我不知道他们是怎么做的…如果主板改变,那么数字改变,所以我认为他们把它藏在那里。 这是罕见的。