Linux 磁盘 UUID

本文最后更新于:2022年7月4日 上午

LInux 磁盘分区可以使用 UUID 进行表示和区分,本文记录 Linux 磁盘UUID相关内容。

UUID

UUID 意即 通用唯一识别码(Universally Unique Identifier),它可以帮助 Linux 系统识别一个磁盘分区而不是块设备文件。

  • 自内核 2.15.1 起,libuuid 就是 util-linux-ng 包中的一部分,它被默认安装在 Linux 系统中。UUID 由该库生成,可以合理地认为在一个系统中 UUID 是唯一的,并且在所有系统中也是唯一的。

  • 这是在计算机系统中用来标识信息的一个 128 位(比特)的数字。UUID 最初被用在 阿波罗网络计算机系统(Apollo Network Computing System)(NCS)中,之后 UUID 被 开放软件基金会(Open Software Foundation)(OSF)标准化,成为 分布式计算环境(Distributed Computing Environment)(DCE)的一部分。

  • UUID 以 32 个十六进制的数字表示,被连字符分割为 5 组显示,总共的 36 个字符的格式为 8-4-4-4-12(32 个字母或数字和 4 个连字符)。

    1
    例如: `d92fa769-e00f-4fd7-b6ed-ecf7224af7fa`

PARTUUID

PARTUUIDs 是GUID分区表(GPT)的组件,该表替代了与主引导记录(MBR)相关的磁盘分区,也可以像UUID一样用于磁盘挂载。

有关更多信息,请参见Linux.com-在Linux中使用新的GUID分区表

GPT GUID(全局唯一标识符)和我们熟悉的Linux UUID(通用唯一标识符)虽然具有相同的有用目的,但它们并非一回事:给块设备唯一的名称。Linux UUID是文件系统的功能,并且在创建文件系统时创建。要查看Linux UUID,只需启动blkid命令即可。请注意Partition GUID代码以及其显示为“ Microsoft基本数据”的方式。是的,Microsoft总是会崩溃,因为这是EXT4分区,因此Windows无法读取它,但是会将其视为未格式化的分区。在当前版本的gdisk中,您将看不到这一点,因为直到2011年为止,还没有Linux文件系统GUID。现在有了,所以如果您不使用像我的旧Linux(Mint 13),

您将在fstab中使用分区唯一的GUID,如下所示:

1
PARTUUID = 8C208C30-4E8F-4096-ACF9-858959BABBAA /data ext4 defaults 0 0

—— Linux.com

修改 UUID

  • 生成 UUID
1
uuidgen
  • tune2fs 命令写入

  • 示例

    1
    2
    3
    4
    $ uuidgen
    2125190c-0317-4460-8cad-4f5b9fa46633

    $ sudo tune2fs /dev/sda1 -U 2125190c-0317-4460-8cad-4f5b9fa46633

注意:这个命令不要轻易试,如果忘记修改对应的grub.cfg和fstab等文件,系统会不正常

查看磁盘 UUID

通过设备目录

  • 通过设备目录信息可以获取磁盘部分信息

    1
    2
    3
    4
    ls -l /dev/disk/by-uuid/  # 按照 UUID 查看设备
    ls -l /dev/disk/by-path/ # 按照路径查看设备
    ls -l /dev/disk/by-id/ # 按照 ID 查看设备
    ls -l /dev/disk/by-label/ # 按照卷标查看设备
  • 示例:

    1
    2
    3
    4
    5
    6
    7
     ls -l /dev/disk/by-uuid/
    总用量 0
    lrwxrwxrwx 1 root root 10 14 08:31 127386cd-a14d-4346-b914-eb11c6a40303 -> ../../sdd4
    lrwxrwxrwx 1 root root 10 14 08:31 161c25c8-348a-4c0d-931d-cfc7861ad4f6 -> ../../sdc3
    lrwxrwxrwx 1 root root 10 14 08:31 2a69fb2c-a734-46e0-a154-230429895150 -> ../../sdb1
    lrwxrwxrwx 1 root root 10 14 08:31 35a891ef-4058-42fe-85d6-2e79170c4357 -> ../../sdg4
    ......
  • 目录结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /         (这就是著名的根)
    ├── bin (你在终端运行的大多数程序,比如cp、mv...)
    ├── boot (内核放在这里,这个目录也经常被作为某个独立分区的挂载点)
    │ └── grub (grub引导程序和引导菜单就放在这里)
    ├── cdrom
    ├── dev (存放设备文件,这里相当于一个设备管理器,由系统自动生成。视硬件环境不同变化很大)
    │ ├── block
    │ ├── bsg
    │ ├── bus
    │ ├── char
    │ ├── disk (磁盘信息,要挂载硬盘分区就要注意这里的信息喽)
    │ │ ├── by-id (硬盘分区的永久性符号链接)
    │ │ ├── by-label (按卷标识别的硬盘分区,常用于挂载)
    │ │ ├── by-path (硬盘分区的节点链接)
    │ │ └── by-uuid (按UUID识别的硬盘分区,常用于挂载)

blkid命令

  • 使用命令
1
sudo blkid
  • 可以看到所有设备的 UUID 、PARTUUID 等信息
1
2
3
4
5
6
7
8
$ sudo blkid

/dev/mapper/ubuntu--vg-swap_1: UUID="9f50bf3a-35e0-43a7-9c59-5ad8a37ade7e" TYPE="swap"
/dev/mapper/ubuntu--vg-root: UUID="7f44d86a-3ca7-418e-b4af-4e23dd432d53" TYPE="xfs"
/dev/sdb1: LABEL="BACKUP_I_S" UUID="21694b2c-ab34-47e0-a1b54-230629895150" TYPE="xfs" PARTLABEL="BACKUP_I_S" PARTUUID="23ca3ca7-3da0-489c-89aa-3dafa4add9cc"
/dev/sdb2: LABEL="BACKUP_I_M" UUID="f3b49e52-ea03-4d5a-a4e1-b1bd248f0a38" TYPE="xfs" PARTLABEL="BACKUP_I_M" PARTUUID="5fa8cffe-2c3d-4466-a904-cfe20a3fa659"
/dev/sdb3: LABEL="BACKUP_I_L" UUID="68d51ac4-6d5c-44bb-9b5b-fc60bf2ce5f3" TYPE="xfs" PARTLABEL="BACKUP_I_L" PARTUUID="095a4566-75f7-4f3e-b4ac-891fa374bc06"
/dev/sdb4: LABEL="BACKUP_I_XL" UUID="c73928c2-3927-4d39-b117-54af3c2808d4" TYPE="xfs" PARTLABEL="BACKUP_I_XL" PARTUUID="e28a06bb-2b10-4a41-b5f5-72747efef306"
  • 添加 -p 选项可以获得更详细的设备信息
1
2
$ sudo blkid -p /dev/sda1
/dev/sda1: LABEL="DATA_I_S" UUID="5f4cff5e-aa7c-f0a0-bd1b-8fde325a125b" TYPE="xfs" USAGE="filesystem" PART_ENTRY_SCHEME="gpt" PART_ENTRY_NAME="DATA_I_S" PART_ENTRY_UUID="13fd5af6-d5cb-4fb1-9cf2-fa6a574d2388" PART_ENTRY_TYPE="0fc63daf-8d83-4578-4379-ad69dd477de4" PART_ENTRY_NUMBER="1" PART_ENTRY_OFFSET="2048" PART_ENTRY_SIZE="1048576000" PART_ENTRY_DISK="8:0"

lsblk 命令

lsblk 列出所有有关可用或指定块设备的信息。lsblk 命令读取 sysfs 文件系统和 udev 数据库以收集信息。

  • 如果 udev 数据库不可用或者编译的 lsblk 不支持 udev,它会试图从块设备中读取卷标、UUID 和文件系统类型。这种情况下,必须以 root 身份运行。该命令默认会以类似于树的格式打印出所有的块设备(RAM 盘除外)。
1
2
3
4
5
6
7
8
9
10
11
12
13
$ lsblk -o name,mountpoint,size,uuid
NAME MOUNTPOINT SIZE UUID
sda 30G
└─sda1 / 20G d92fa769-e00f-4fd7-b6ed-ecf7224af7fa
sdb 10G
sdc 10G
├─sdc1 1G d17e3c31-e2c9-4f11-809c-94a549bc43b7
├─sdc3 1G ca307aa4-0866-49b1-8184-004025789e63
├─sdc4 1K
└─sdc5 1G
sdd 10G
sde 10G
sr0 1024M

hwinfo 命令

hwinfo 意即硬件信息工具,是另外一种很好的实用工具。它被用来检测系统中已存在的硬件,并且以可读的格式显示各种硬件组件的细节信息。

1
2
3
4
$ hwinfo --block | grep by-uuid | awk '{print $3,$7}'
/dev/sdc1, /dev/disk/by-uuid/d17e3c31-e2c9-4f11-809c-94a549bc43b7
/dev/sdc3, /dev/disk/by-uuid/ca307aa4-0866-49b1-8184-004025789e63
/dev/sda1, /dev/disk/by-uuid/d92fa769-e00f-4fd7-b6ed-ecf7224af7fa

udevadm 命令

udevadm 需要命令和命令特定的操作。它控制 systemd-udevd 的运行时行为,请求内核事件、管理事件队列并且提供简单的调试机制。

1
2
$ udevadm info -q all -n /dev/sdc1 | grep -i by-uuid | head -1
S: disk/by-uuid/d17e3c31-e2c9-4f11-809c-94a549bc43b7

tune2fs 命令

tune2fs 允许系统管理员在 Linux 的 ext2、ext3、ext4 文件系统中调整各种可调的文件系统参数。这些选项的当前值可以使用选项 -l 显示。

1
2
$ tune2fs -l /dev/sdc1 | grep UUID
Filesystem UUID: d17e3c31-e2c9-4f11-809c-94a549bc43b7

dumpe2fs

dumpe2fs 打印出现在设备文件系统中的超级块和块组的信息。

1
2
3
$ dumpe2fs /dev/sdc1 | grep UUID
dumpe2fs 1.43.5 (04-Aug-2017)
Filesystem UUID: d17e3c31-e2c9-4f11-809c-94a549bc43b7

参考资料


Linux 磁盘 UUID
https://www.zywvvd.com/notes/system/linux/linux-disk-uuid/linux-disk-uuid/
作者
Yiwei Zhang
发布于
2022年1月4日
许可协议