块设备持久化命名 - Arch Linux 中文维基

跳转到内容

# 块设备持久化命名

来自 Arch Linux 中文维基
翻译状态：

- 本文（或部分内容）译自 Persistent block device naming，最近一次同步于 2025-08-01，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

相关文章

- fstab
- udev
- LVM

本文讲述如何为你的块设备提供持久化命名。udev 的导入使之成为可能，也使之优于基于总线的命名法。如果你的设备上有多个硬盘使用同一套命名方案，那么添加对应设备节点的顺序是完全随机的。这可能会使每次启动时块设备的名称（例如 `/dev/sda` 和 `/dev/sdb`，`/dev/nvme0n1` 和 `/dev/nvme1n1`，`/dev/mmcblk0` 和 `/dev/mmcblk1`）都被随机调换，并导致系统无法启动，内核错误或是块设备消失等问题出现。持久化命名法可以解决这些问题。

注意：

- 持久化命名存在一些超出本文范围的限制，比如虽然 mkinitcpio 支持某个方法，但 systemd 会对启动时支持的设备名添加额外的限制（例如 FS#42884）。
- 本文与 LVM 逻辑卷无关，因为 `/dev/VolumeGroupName/LogicalVolumeName` 设备路径是持久化的。

## 持久化命名的方法

有多种方案可以提供由 udev 管理的持久化命名：

- `60-persistent-storage.rules` 提供了四种默认方案：通过标签、通过 uuid、通过 id 和 通过路径。对于使用 GUID 分区表（GPT）的硬盘还有额外两种方案：通过分区标签和通过分区 uuid。
- `99-systemd.rules` 还为支持 GPT 分区自动挂载的环境提供了 gpt-auto 方案

`/dev/disk/` 中的文件夹是动态创建和销毁的，这取决于其中是否有设备。

注意：请注意硬盘克隆会创建两个有着相同名字的不同磁盘。

下面讲解各种命名方案及其用法。

lsblk 命令用于以图示方式查看第一种方案：

    $ lsblk -f

    NAME        FSTYPE LABEL      UUID                                 MOUNTPOINT
    sda
    ├─sda1      vfat              CBB6-24F2                            /boot
    ├─sda2      ext4   Arch Linux 0a3407de-014b-458b-b5c1-848e92a327a3 /
    ├─sda3      ext4   Data       b411dc99-f0a0-4c87-9e05-184977be8539 /home
    └─sda4      swap              f9fe0b69-a280-415d-a03a-a32752370dee [SWAP]
    mmcblk0
    └─mmcblk0p1 vfat              F4CA-5D75

使用 GPT 时应改用 `blkid` 命令，这个命令更方便脚本使用但可读性低：

    # blkid

    /dev/sda1: UUID="CBB6-24F2" TYPE="vfat" PARTLABEL="EFI system partition" PARTUUID="d0d0d110-0a71-4ed6-936a-304969ea36af"
    /dev/sda2: LABEL="Arch Linux" UUID="0a3407de-014b-458b-b5c1-848e92a327a3" TYPE="ext4" PARTLABEL="GNU/Linux" PARTUUID="98a81274-10f7-40db-872a-03df048df366"
    /dev/sda3: LABEL="Data" UUID="b411dc99-f0a0-4c87-9e05-184977be8539" TYPE="ext4" PARTLABEL="Home" PARTUUID="7280201c-fc5d-40f2-a9b2-466611d3d49e"
    /dev/sda4: UUID="f9fe0b69-a280-415d-a03a-a32752370dee" TYPE="swap" PARTLABEL="Swap" PARTUUID="039b6c1c-7553-4455-9537-1befbc9fbc5b"
    /dev/mmcblk0: PTUUID="0003e1e5" PTTYPE="dos"
    /dev/mmcblk0p1: UUID="F4CA-5D75" TYPE="vfat" PARTUUID="0003e1e5-01"

### 通过标签

几乎每一种文件系统都可以有一个标签。所有有标签的卷都在 `/dev/disk/by-label` 目录中列出。

    $ ls -l /dev/disk/by-label/

    total 0
    lrwxrwxrwx 1 root root 10 May 27 23:31 Data -> ../../sda3
    lrwxrwxrwx 1 root root 10 May 27 23:31 Arch\x20Linux -> ../../sda2

大多数文件系统都支持在创建文件系统时设置标签，详见相关的 `mkfs.*` 工具的 man 手册。有些文件系统还能修改标签。下面列出了一些常见文件系统修改标签的方式:

btrfs
  `btrfs filesystem label /dev/XXX "new label"`（如已挂载，需使用挂载点）- 需要 btrfs-progs包
crypto_LUKS（仅 LUKS2）
  `cryptsetup config --label="new label" /dev/XXX` - 需要 cryptsetup包
exfat
  `tune.exfat -L "new label" /dev/XXX` - 需要 exfatprogs包
  `exfatlabel /dev/XXX "new label"` - 需要 exfatprogs包 或 exfat-utils包
ext2/3/4
  `e2label /dev/XXX "new label"` - 需要 e2fsprogs包
fat/vfat
  `fatlabel /dev/XXX "new label"` - 需要 dosfstools包
  `mlabel -i /dev/XXX ::"new label"` - 需要 mtools包
jfs
  `jfs_tune -L "new label" /dev/XXX` - 需要 jfsutils包
ntfs
  `ntfslabel /dev/XXX "new label"` - 需要 ntfs-3g包
reiserfs
  `reiserfstune -l "new label" /dev/XXX` - 需要 reiserfsprogsAUR
swap
  `swaplabel -L "new label" /dev/XXX` - 需要 util-linux包
udf
  `udflabel /dev/XXX "new label"` - 需要 udftools包
xfs
  `xfs_admin -L "new label" /dev/XXX`（如已挂载，需使用挂载点）- 需要 xfsprogs包

可以通过 lsblk 获得设备的标签：

    $ lsblk -dno LABEL /dev/sda2

    Arch Linux

也可以使用 blkid：

    # blkid -s LABEL -o value /dev/sda2

    Arch Linux

注意：

- 标签必须是唯一的，以防止可能的冲突。
- 标签最多可以有 16 个字符。
- 标签是文件系统的一个属性，所以无法持久地表示单个硬盘阵列（RAID）设备。
- 在使用 dm-crypt 的加密容器时，容器内的文件系统的标签在容器被锁定/加密时是不可用的。

### 通过 uuid

UUID 是一种为每个文件系统提供唯一标识符的机制。这些标识符是在设备被格式化时，通过文件系统工具生成的（例如 `mkfs.*`），并且在设计上不太可能发生冲突。所有 GNU/Linux 文件系统 (包括 swap 和全加密设备的 LUKS 头字段）都支持 UUID。FAT，exFAT 和 NTFS 文件系统不支持 UUID，但是依旧会有一个较短的 UID（唯一标识符）在 `/dev/disk/by-uuid/` 中列出：

    $ ls -l /dev/disk/by-uuid/

    total 0
    lrwxrwxrwx 1 root root 10 May 27 23:31 0a3407de-014b-458b-b5c1-848e92a327a3 -> ../../sda2
    lrwxrwxrwx 1 root root 10 May 27 23:31 b411dc99-f0a0-4c87-9e05-184977be8539 -> ../../sda3
    lrwxrwxrwx 1 root root 10 May 27 23:31 CBB6-24F2 -> ../../sda1
    lrwxrwxrwx 1 root root 10 May 27 23:31 f9fe0b69-a280-415d-a03a-a32752370dee -> ../../sda4
    lrwxrwxrwx 1 root root 10 May 27 23:31 F4CA-5D75 -> ../../mmcblk0p1

可以通过 lsblk 获取设备的 UUID：

    $ lsblk -dno UUID /dev/sda1

    CBB6-24F2

或使用 blkid：

    # blkid -s UUID -o value /dev/sda1

    CBB6-24F2

使用 UUID 方法的优势在于，与使用标签相比，发生名称冲突的可能性要小得多。此外，它是在创建文件系统时自动生成的。举个例子，即使设备插入另一个系统（那个系统上可能有一个具有相同标签的设备），它也会保持唯一。

这个方法的坏处是 UUID 使长代码行难以阅读，并会打乱许多配置文件中的格式（例如 fstab 或 crypttab）。此外,每次重新格式化卷时都会生成一个新的 UUID，使得必须手动调整配置文件。

提示：如果您的交换卷没有分配 UUID，你将需要使用 mkswap 工具来重置它。

### 通过 id 和 通过路径

`by-id` 会依据硬件序列号创建一个唯一的名字，`by-path` 则取决于最短的物理路径（根据 sysfs）。两者都包含字符串以指示它们属于哪个子系统（例如 `by-path` 中的 `-ide-` 和 `by-id` 中的 `-ata-`），使得它们与控制设备的硬件相关联。这意味着不同级别的持久性：`by-path` 会在设备插入控制器的不同端口时改变，`by-id` 会在设备插入受另一个子系统约束的硬件控制器的端口时改变。[1]因此,两者都不适合实现针对硬件更改的持久化命名。

然而,两者都提供了在大型硬件基础设施中查找特定设备的重要信息。举个例子,如果你没有手动分配持久性的标签（`by-label` 或 `by-partlabel`），但保留有一个包含硬件端口使用情况的目录，那可以通过 `by-id` 和 `by-path` 来找到特定的设备。[2] [3]

注意：

- `by-id` 和 `by-path` 链接只能被视为硬盘持久化,而不是分区。分区将通过其在分区表中的编号进行引用,并且如果对分区重新排序,该编号可能会发生变化。
- 如果添加或移除了 PCIe 设备，或是系统固件无法对它们进行枚举，那么 NVMe 设备的 `/dev/disk/by-path/pci-*` 路径可能会产生变化。
- 不带命名空间标识符（NSID）的 NVMe 设备 `by-id` 链接已过时。请使用在设备序列号后带有命名空间的链接（例如为首个命名空间使用 `_1`，或是对首个命名空间的首个分区使用 `_1-part1`。）

    $ ls -l /dev/disk/by-id/

    total 0
    lrwxrwxrwx 1 root root 10 May 27 23:31 ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470 -> ../../sda
    lrwxrwxrwx 1 root root 10 May 27 23:31 ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470-part1 -> ../../sda1
    lrwxrwxrwx 1 root root 10 May 27 23:31 ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470-part2 -> ../../sda2
    lrwxrwxrwx 1 root root 10 May 27 23:31 ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470-part3 -> ../../sda3
    lrwxrwxrwx 1 root root 10 May 27 23:31 ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470-part4 -> ../../sda4
    lrwxrwxrwx 1 root root 10 May 27 23:31 mmc-SD32G_0x0040006d -> ../../mmcblk0
    lrwxrwxrwx 1 root root 10 May 27 23:31 mmc-SD32G_0x0040006d-part1 -> ../../mmcblk0p1
    lrwxrwxrwx 1 root root 13 May 27 23:31 nvme-Samsung_SSD_970_EVO_Plus_2TB_S4J4NJ0N704064T -> ../../nvme1n1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-Samsung_SSD_970_EVO_Plus_2TB_S4J4NJ0N704064T-part1 -> ../../nvme1n1p1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-Samsung_SSD_970_EVO_Plus_2TB_S4J4NJ0N704064T-part2 -> ../../nvme1n1p2
    lrwxrwxrwx 1 root root 13 May 27 23:31 nvme-Samsung_SSD_970_EVO_Plus_2TB_S4J4NJ0N704064T_1 -> ../../nvme1n1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-Samsung_SSD_970_EVO_Plus_2TB_S4J4NJ0N704064T_1-part1 -> ../../nvme1n1p1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-Samsung_SSD_970_EVO_Plus_2TB_S4J4NJ0N704064T_1-part2 -> ../../nvme1n1p2
    lrwxrwxrwx 1 root root 13 May 27 23:31 nvme-WDS100T1X0E-00AFY0_21455A801268 -> ../../nvme0n1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-WDS100T1X0E-00AFY0_21455A801268-part1 -> ../../nvme0n1p1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-WDS100T1X0E-00AFY0_21455A801268-part2 -> ../../nvme0n1p2
    lrwxrwxrwx 1 root root 13 May 27 23:31 nvme-WDS100T1X0E-00AFY0_21455A801268_1 -> ../../nvme0n1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-WDS100T1X0E-00AFY0_21455A801268_1-part1 -> ../../nvme0n1p1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-WDS100T1X0E-00AFY0_21455A801268_2-part2 -> ../../nvme0n1p2
    lrwxrwxrwx 1 root root 13 May 27 23:31 nvme-eui.002538570142d716 -> ../../nvme1n1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-eui.002538570142d716-part1 -> ../../nvme1n1p1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-eui.002538570142d716-part2 -> ../../nvme1n1p2
    lrwxrwxrwx 1 root root 13 May 27 23:31 nvme-eui.e8238fa6bf530001001b448b4566aa1a -> ../../nvme0n1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-eui.e8238fa6bf530001001b448b4566aa1a-part1 -> ../../nvme0n1p1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-eui.e8238fa6bf530001001b448b4566aa1a-part2 -> ../../nvme0n1p2
    lrwxrwxrwx 1 root root 10 May 27 23:31 wwn-0x60015ee0000b237f -> ../../sda
    lrwxrwxrwx 1 root root 10 May 27 23:31 wwn-0x60015ee0000b237f-part1 -> ../../sda1
    lrwxrwxrwx 1 root root 10 May 27 23:31 wwn-0x60015ee0000b237f-part2 -> ../../sda2
    lrwxrwxrwx 1 root root 10 May 27 23:31 wwn-0x60015ee0000b237f-part3 -> ../../sda3
    lrwxrwxrwx 1 root root 10 May 27 23:31 wwn-0x60015ee0000b237f-part4 -> ../../sda4

    $ ls -l /dev/disk/by-path/

    total 0
    lrwxrwxrwx 1 root root 10 May 27 23:31 pci-0000:00:1f.2-ata-1 -> ../../sda
    lrwxrwxrwx 1 root root 10 May 27 23:31 pci-0000:00:1f.2-ata-1-part1 -> ../../sda1
    lrwxrwxrwx 1 root root 10 May 27 23:31 pci-0000:00:1f.2-ata-1-part2 -> ../../sda2
    lrwxrwxrwx 1 root root 10 May 27 23:31 pci-0000:00:1f.2-ata-1-part3 -> ../../sda3
    lrwxrwxrwx 1 root root 10 May 27 23:31 pci-0000:00:1f.2-ata-1-part4 -> ../../sda4
    lrwxrwxrwx 1 root root 13 May 27 23:31 pci-0000:01:00.0-nvme-1 -> ../../nvme0n1
    lrwxrwxrwx 1 root root 15 May 27 23:31 pci-0000:01:00.0-nvme-1-part1 -> ../../nvme0n1p1
    lrwxrwxrwx 1 root root 15 May 27 23:31 pci-0000:01:00.0-nvme-1-part2 -> ../../nvme0n1p2
    lrwxrwxrwx 1 root root 13 May 27 23:31 pci-0000:04:00.0-nvme-1 -> ../../nvme1n1
    lrwxrwxrwx 1 root root 15 May 27 23:31 pci-0000:04:00.0-nvme-1-part1 -> ../../nvme1n1p1
    lrwxrwxrwx 1 root root 15 May 27 23:31 pci-0000:04:00.0-nvme-1-part2 -> ../../nvme1n1p2
    lrwxrwxrwx 1 root root 10 May 27 23:31 pci-0000:07:00.0-platform-rtsx_pci_sdmmc.0 -> ../../mmcblk0
    lrwxrwxrwx 1 root root 10 May 27 23:31 pci-0000:07:00.0-platform-rtsx_pci_sdmmc.0-part1 -> ../../mmcblk0p1

#### 全局名称（World Wide Name）

`by-id` 还会为支持的存储设备创建全局名称（World Wide Name，WWN）链接。与其它 `by-id` 链接不同，WWN 是完全持久化的，不会随使用的子系统而变化。

SATA 和 SAS 设备带有 `wwn-` 前缀，而 NVMe 设备会使用不同的 WWN 格式，其前缀为 `nvme-eui.`。[4]

提示：存储设备的 WWN 通常会写在其标签（硬盘上面的贴纸）上。

    $ ls -l /dev/disk/by-id/{wwn-,nvme-eui.}*

    lrwxrwxrwx 1 root root 13 May 27 23:31 nvme-eui.002538570142d716 -> ../../nvme1n1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-eui.002538570142d716-part1 -> ../../nvme1n1p1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-eui.002538570142d716-part2 -> ../../nvme1n1p2
    lrwxrwxrwx 1 root root 13 May 27 23:31 nvme-eui.e8238fa6bf530001001b448b4566aa1a -> ../../nvme0n1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-eui.e8238fa6bf530001001b448b4566aa1a-part1 -> ../../nvme0n1p1
    lrwxrwxrwx 1 root root 15 May 27 23:31 nvme-eui.e8238fa6bf530001001b448b4566aa1a-part2 -> ../../nvme0n1p2
    lrwxrwxrwx 1 root root 10 May 27 23:31 wwn-0x60015ee0000b237f -> ../../sda
    lrwxrwxrwx 1 root root 10 May 27 23:31 wwn-0x60015ee0000b237f-part1 -> ../../sda1
    lrwxrwxrwx 1 root root 10 May 27 23:31 wwn-0x60015ee0000b237f-part2 -> ../../sda2
    lrwxrwxrwx 1 root root 10 May 27 23:31 wwn-0x60015ee0000b237f-part3 -> ../../sda3
    lrwxrwxrwx 1 root root 10 May 27 23:31 wwn-0x60015ee0000b237f-part4 -> ../../sda4

### 通过分区标签

注意：此方法仅涉及具有 GUID 分区表（GPT）的硬盘。

在 GPT 硬盘上，GPT 分区标签可以在分区条目的头字段中定义。

这个方法与文件系统标签很相似，但是分区标签不随分区文件系统的修改而变动。

所有分区的分区标签都于 `/dev/disk/by-partlabel` 目录中列出。

    $ ls -l /dev/disk/by-partlabel/

    total 0
    lrwxrwxrwx 1 root root 10 May 27 23:31 EFI\x20system\x20partition -> ../../sda1
    lrwxrwxrwx 1 root root 10 May 27 23:31 GNU\x2fLinux -> ../../sda2
    lrwxrwxrwx 1 root root 10 May 27 23:31 Home -> ../../sda3
    lrwxrwxrwx 1 root root 10 May 27 23:31 Swap -> ../../sda4

设备的分区标签可以用 lsblk 获取：

    $ lsblk -dno PARTLABEL /dev/sda1

    EFI system partition

或使用 blkid：

    # blkid -s PARTLABEL -o value /dev/sda1

    EFI system partition

注意：

- GPT 分区标签也需要各不相同来避免冲突。要想改变分区标签，你可以使用 gdisk 或基于 ncurse 的 cgdisk。它们都可通过 gptfdisk包 软件包获取。具体信息请参考分区#分区工具。
- 根据规范,GPT 分区标签最多可以有 72 字符长。

### 通过分区 uuid

与 GPT 分区标签类似，GPT 分区 UUID 也在 GPT 硬盘的分区条目中定义。

MBR 不支持分区 UUID，但是使用 libblkid[5] 的 Linux[6] 和软件（例如 udev[7]）能够为 MBR 分区生成伪分区 UUID。其格式为 `SSSSSSSS-PP`，其中 `SSSSSSSS` 是一个零填充的 32 位 MBR 硬盘签名，而 `PP` 则是一个十六进制形式的零填充分区号。和一般的 GPT 分区的分区 UUID 不同，MBR 的伪分区 UUID 会在分区改变时改变。

动态目录与其它方法相似，就像文件系统 UUID，比起标签更推荐使用 UUID。

    $ ls -l /dev/disk/by-partuuid/

    total 0
    lrwxrwxrwx 1 root root 10 May 27 23:31 0003e1e5-01 -> ../../mmcblk0p1
    lrwxrwxrwx 1 root root 10 May 27 23:31 039b6c1c-7553-4455-9537-1befbc9fbc5b -> ../../sda4
    lrwxrwxrwx 1 root root 10 May 27 23:31 7280201c-fc5d-40f2-a9b2-466611d3d49e -> ../../sda3
    lrwxrwxrwx 1 root root 10 May 27 23:31 98a81274-10f7-40db-872a-03df048df366 -> ../../sda2
    lrwxrwxrwx 1 root root 10 May 27 23:31 d0d0d110-0a71-4ed6-936a-304969ea36af -> ../../sda1

设备的分区 UUID 可以用 lsblk 获得：

    $ lsblk -dno PARTUUID /dev/sda1

    d0d0d110-0a71-4ed6-936a-304969ea36af

或使用 blkid：

    # blkid -s PARTUUID -o value /dev/sda1

    d0d0d110-0a71-4ed6-936a-304969ea36af

### gpt-auto

如果满足了 systemd-gpt-auto-generator 的所有需求，那么 udev 会自动创建指向根卷设备的 `/dev/gpt-auto-root` 符号链接。如果根分区使用了 LUKS 加密，那么 `/dev/gpt-auto-root` 会指向已解锁/映射的卷，而 `/dev/gpt-auto-root-luks` 会指向加密了的分区。

    $ ls -l /dev/gpt-auto-*

    lrwxrwxrwx 1 root root 10 May 27 23:31 /dev/gpt-auto-root -> dm-0
    lrwxrwxrwx 1 root root 10 May 27 23:31 /dev/gpt-auto-root-luks -> nvme1n1p2

## 使用持久名称

有多种应用可以配置为使用持久名称。下面列出了一些配置的例子：

### fstab

请见主文章：fstab#文件系统标识。

### 内核参数

要在内核参数中使用持久化名称，需要满足下列先决条件。在遵循安装指南的标准安装中，需满足两个条件：

- 你在使用一个包含 udev 的 initramfs 镜像。
- 对于 mkinitcpio，需在 `/etc/mkinitcpio.conf` 中启用 `udev` 或 `systemd` 钩子。

根文件系统的位置在内核命令行中是通过 `root` 参数传递的。内核命令行是通过引导加载程序配置的，详见内核参数#启动管理器配置。要想修改为持久化设备名，只需修改用于指定块设备的参数，例如 `root` 和 `resume`，而其它参数则保持不变。支持多种命名方案：

在这个以 `Arch Linux` 为根文件系统标签的例子中，展示了使用标签的持久化设备名和 `LABEL=` 格式：

    root="LABEL=Arch Linux"

在这个以 `0a3407de-014b-458b-b5c1-848e92a327a3` 为根文件系统 UUID 的例子中，展示了使用 uuid 的持久化设备名和 `UUID=` 格式：

    root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3

在这个以 `wwn-0x60015ee0000b237f-part2` 为根分区 id 的例子中，展示了使用磁盘 id 的持久化设备名和 `/dev` 路径格式。

    root=/dev/disk/by-id/wwn-0x60015ee0000b237f-part2

在这个以 `98a81274-10f7-40db-872a-03df048df366` 为根分区的分区 UUID 的例子中，展示了使用 GPT 分区 UUID 的持久化设备名和 `PARTUUID=` 格式：

    root=PARTUUID=98a81274-10f7-40db-872a-03df048df366

在这个以 `GNU/Linux` 为根分区的分区标签的例子中，展示了使用 GPT 分区标签的持久化设备名和 `PARTLABEL=` 格式。

    root="PARTLABEL=GNU/Linux"

在使用 GPT 分区自动挂载时，可以直接省略 `root=` 参数。如果希望显式进行指定，可以使用：

    root=gpt-auto

分类：​

- 启动过程
- 文件系统
- 硬件检测和故障排除

块设备持久化命名
添加话题