systemd/docs/DISCOVERABLE_PARTITIONS.md
2021-04-23 17:57:19 +02:00

20 KiB

title category layout
Discoverable Partitions Specification Concepts default

The Discoverable Partitions Specification

TL;DR: Let's automatically discover, mount and enable the root partition, /home/, /srv/, /var/ and /var/tmp/ and the swap partitions based on GUID Partition Tables (GPT)!

This specification describes the use of GUID Partition Table (GPT) UUIDs to enable automatic discovery of partitions and their intended mountpoints. Traditionally Linux has made little use of partition types, mostly just defining one UUID for file system/data partitions and another one for swap partitions. With this specification, we introduce additional partition types for specific uses. This has many benefits:

  • OS installers can automatically discover and make sense of partitions of existing Linux installations.
  • The OS can discover and mount the necessary file systems with a non-existent or incomplete /etc/fstab file and without the root= kernel command line option.
  • Container managers (such as nspawn and libvirt-lxc) can introspect and set up file systems contained in GPT disk images automatically and mount them to the right places, thus allowing booting the same, identical images on bare metal and in Linux containers. This enables true, natural portability of disk images between physical machines and Linux containers.
  • As a help to administrators and users partition manager tools can show more descriptive information about partitions tables.

Note that the OS side of this specification is currently implemented in systemd 211 and newer in the systemd-gpt-auto-generator(8) generator tool. Note that automatic discovery of the root only works if the boot loader communicates this information to the OS, by implementing the Boot Loader Interface.

Defined Partition Type UUIDs

Partition Type UUID Name Allowed File Systems Explanation
44479540-f297-41b2-9af7-d131d5f0458a Root Partition (x86) Any native, optionally in LUKS On systems with matching architecture, the first partition with this type UUID on the disk containing the active EFI ESP is automatically mounted to the root directory /. If the partition is encrypted with LUKS or has dm-verity integrity data (see below), the device mapper file will be named /dev/mapper/root.
4f68bce3-e8cd-4db1-96e7-fbcaf984b709 Root Partition (x86-64) ditto ditto
69dad710-2ce4-4e3c-b16c-21a1d49abed3 Root Partition (32-bit ARM) ditto ditto
b921b045-1df0-41c3-af44-4c6f280d3fae Root Partition (64-bit ARM/AArch64) ditto ditto
993d8d3d-f80e-4225-855a-9daf8ed7ea97 Root Partition (Itanium/IA-64) ditto ditto
60d5a7fe-8e7d-435c-b714-3dd8162144e1 Root Partition (RISC-V 32-bit) ditto ditto
72ec70a6-cf74-40e6-bd49-4bda08e8f224 Root Partition (RISC-V 64-bit) ditto ditto
d13c5d3b-b5d1-422a-b29f-9454fdc89d76 Root Verity Partition (x86) A dm-verity superblock followed by hash data On systems with matching architecture, contains dm-verity integrity hash data for the matching root partition. If this feature is used the partition UUID of the root partition should be the first 128bit of the root hash of the dm-verity hash data, and the partition UUID of this dm-verity partition should be the final 128bit of it, so that the root partition and its verity partition can be discovered easily, simply by specifying the root hash.
2c7357ed-ebd2-46d9-aec1-23d437ec2bf5 Root Verity Partition (x86-64) ditto ditto
7386cdf2-203c-47a9-a498-f2ecce45a2d6 Root Verity Partition (32-bit ARM) ditto ditto
df3300ce-d69f-4c92-978c-9bfb0f38d820 Root Verity Partition (64-bit ARM/AArch64) ditto ditto
86ed10d5-b607-45bb-8957-d350f23d0571 Root Verity Partition (Itanium/IA-64) ditto ditto
ae0253be-1167-4007-ac68-43926c14c5de Root Verity Partition (RISC-V 32-bit) ditto ditto
b6ed5582-440b-4209-b8da-5ff7c419ea3d Root Verity Partition (RISC-V 64-bit) ditto ditto
75250d76-8cc6-458e-bd66-bd47cc81a812 /usr/ Partition (x86) Any native, optionally in LUKS Similar semantics to root partition, but just the /usr/ partition.
8484680c-9521-48c6-9c11-b0720656f69e /usr/ Partition (x86-64) ditto ditto
7d0359a3-02b3-4f0a-865c-654403e70625 /usr/ Partition (32-bit ARM) ditto ditto
b0e01050-ee5f-4390-949a-9101b17104e9 /usr/ Partition (64-bit ARM/AArch64) ditto ditto
4301d2a6-4e3b-4b2a-bb94-9e0b2c4225ea /usr/ Partition (Itanium/IA-64) ditto ditto
b933fb22-5c3f-4f91-af90-e2bb0fa50702 /usr/ Partition (RISC-V 32-bit) ditto ditto
beaec34b-8442-439b-a40b-984381ed097d /usr/ Partition (RISC-V 64-bit) ditto ditto
8f461b0d-14ee-4e81-9aa9-049b6fb97abd /usr/ Verity Partition (x86) A dm-verity superblock followed by hash data Similar semantics to root Verity partition, but just for the /usr/ partition.
77ff5f63-e7b6-4633-acf4-1565b864c0e6 /usr/ Verity Partition (x86-64) ditto ditto
c215d751-7bcd-4649-be90-6627490a4c05 /usr/ Verity Partition (32-bit ARM) ditto ditto
6e11a4e7-fbca-4ded-b9e9-e1a512bb664e /usr/ Verity Partition (64-bit ARM/AArch64) ditto ditto
6a491e03-3be7-4545-8e38-83320e0ea880 /usr/ Verity Partition (Itanium/IA-64) ditto ditto
cb1ee4e3-8cd0-4136-a0a4-aa61a32e8730 /usr/ Verity Partition (RISC-V 32-bit) ditto ditto
8f1056be-9b05-47c4-81d6-be53128e5b54 /usr/ Verity Partition (RISC-V 64-bit) ditto ditto
933ac7e1-2eb4-4f13-b844-0e14e2aef915 Home Partition Any native, optionally in LUKS The first partition with this type UUID on the disk containing the root partition is automatically mounted to /home/. If the partition is encrypted with LUKS, the device mapper file will be named /dev/mapper/home.
3b8f8425-20e0-4f3b-907f-1a25a76f98e8 Server Data Partition Any native, optionally in LUKS The first partition with this type UUID on the disk containing the root partition is automatically mounted to /srv/. If the partition is encrypted with LUKS, the device mapper file will be named /dev/mapper/srv.
4d21b016-b534-45c2-a9fb-5c16e091fd2d Variable Data Partition Any native, optionally in LUKS The first partition with this type UUID on the disk containing the root partition is automatically mounted to /var/ — under the condition that its partition UUID matches the first 128 bit of HMAC-SHA256(machine-id, 0x4d21b016b53445c2a9fb5c16e091fd2d) (i.e. the SHA256 HMAC hash of the binary type UUID keyed by the machine ID as read from /etc/machine-id. This special requirement is made because /var/ (unlike the other partition types listed here) is inherently private to a specific installation and cannot possibly be shared between multiple OS installations on the same disk, and thus should be bound to a specific instance of the OS, identified by its machine ID. If the partition is encrypted with LUKS, the device mapper file will be named /dev/mapper/var.
7ec6f557-3bc5-4aca-b293-16ef5df639d1 Temporary Data Partition Any native, optionally in LUKS The first partition with this type UUID on the disk containing the root partition is automatically mounted to /var/tmp/. If the partition is encrypted with LUKS, the device mapper file will be named /dev/mapper/tmp. Note that the intended mount point is indeed /var/tmp/, not /tmp/. The latter is typically maintained in memory via tmpfs and does not require a partition on disk. In some cases it might be desirable to make /tmp/ persistent too, in which case it is recommended to make it a symlink or bind mount to /var/tmp/, thus not requiring its own partition type UUID.
0657fd6d-a4ab-43c4-84e5-0933c84b4f4f Swap Swap All swap partitions on the disk containing the root partition are automatically enabled. This partition type predates the Discoverable Partitions Specification.
0fc63daf-8483-4772-8e79-3d69d8477de4 Generic Linux Data Partitions Any native, optionally in LUKS No automatic mounting takes place for other Linux data partitions. This partition type should be used for all partitions that carry Linux file systems. The installer needs to mount them explicitly via entries in /etc/fstab. Optionally, these partitions may be encrypted with LUKS. This partition type predates the Discoverable Partitions Specification.
c12a7328-f81f-11d2-ba4b-00a0c93ec93b EFI System Partition VFAT The ESP used for the current boot is automatically mounted to /efi/ (or /boot/ as fallback), unless a different partition is mounted there (possibly via /etc/fstab, or because the Extended Boot Loader Partition — see below — exists) or the directory is non-empty on the root disk. This partition type is defined by the UEFI Specification.
bc13c2ff-59e6-4262-a352-b275fd6f7172 Extended Boot Loader Partition Typically VFAT The Extended Boot Loader Partition (XBOOTLDR) used for the current boot is automatically mounted to /boot/, unless a different partition is mounted there (possibly via /etc/fstab) or the directory is non-empty on the root disk. This partition type is defined by the Boot Loader Specification.

Other GPT type IDs might be used on Linux, for example to mark software RAID or LVM partitions. The definitions of those GPT types is outside of the scope of this specification.

systemd-id128(1) may be used to list those UUIDs.

Partition Names

For partitions of the types listed above it is recommended to use human-friendly, descriptive partition names in the GPT partition table, for example "Home", "Server Data", "Fedora Root" and similar, possibly localized.

Partition Flags

This specification defines three GPT partition flags that may be set for the partition types defined above:

  1. For the root, /usr/, Verity, home, server data, variable data, temporary data, swap and extended boot loader partitions, the partition flag bit 63 ("no-auto") may be used to turn off auto-discovery for the specific partition. If set, the partition will not be automatically mounted or enabled.

  2. For the root, /usr/, Verity, home, server data, variable data, temporary data and extended boot loader partitions, the partition flag bit 60 ("read-only") may be used to mark a partition for read-only mounts only. If set, the partition will be mounted read-only instead of read-write. Note that the variable data partition and the temporary data partition will generally not be able to serve their purpose if marked read-only, since by their very definition they are supposed to be mutable. (The home and server data partitions are generally assumed to be mutable as well, but the requirement for them is not equally strong.) Because of that, while the read-only flag is defined and supported, it's almost never a good idea to actually use it for these partitions. Also note that Verity partitions are by their semantics always read-only. The flag is hence of little effect for them, and it is recommended to set it unconditionally for the Verity partition types.

  3. For the root, /usr/, home, server data, variable data, temporary data and extended boot loader partitions, the partition flag bit 59 ("grow-file-system") may be used to mark a partition for automatic growing of the contained file system to the size of the partition when mounted. Tools that automatically mount disk image with a GPT partition table are suggested to implicitly grow the contained file system to the partition size they are contained in. This flag is without effect on partitions marked read-only.

Note that the first two flag definitions happen to map nicely to the ones used by Microsoft Basic Data Partitions.

All three of these flags generally affect only auto-discovery and automatic mounting of disk images. If partitions marked with these flags are mounted using low-level commands like mount(8) or directly with mount(2), they typically have no effect.

Suggested Mode of Operation

An installer that repartitions the hard disk should use the above UUID partition types for appropriate partitions it creates.

An installer which supports a "manual partitioning" interface may choose to pre-populate the interface with swap, /home/, /srv/, /var/tmp/ partitions of pre-existing Linux installations, identified with the GPT type UUIDs above. The installer should not pre-populate such an interface with any identified root, /usr or /var/ partition unless the intention is to overwrite an existing operating system that might be installed.

An installer may omit creating entries in /etc/fstab for root, /home/, /srv/, /var/, /var/tmp and for the swap partitions if they use these UUID partition types, and are the first partitions on the disk of each type. If the ESP shall be mounted to /efi/ (or /boot/), it may additionally omit creating the entry for it in /etc/fstab. If an extended boot partition is used, or if the EFI partition shall not be mounted to /efi/ or /boot/, it must create /etc/fstab entries for them. If other partitions are used (for example for /usr/ or /var/lib/mysql/), the installer must register these in /etc/fstab. The root= parameter passed to the kernel by the boot loader may be omitted if the root partition is the first one on the disk of its type. If the root partition is not the first one on the disk, the root= parameter must be passed to the kernel by the boot loader. An installer that mounts a root, /usr/, /home/, /srv/, /var/, or /var/tmp/ file system with the partition types defined as above which contains a LUKS header must call the device mapper device "root", "usr", "home", "srv", "var" or "tmp", respectively. This is necessary to ensure that the automatic discovery will never result in different device mapper names than any static configuration by the installer, thus eliminating possible naming conflicts and ambiguities.

An operating system should automatically discover and mount the first root partition that does not have the no-auto flag set (as described above) by scanning the disk containing the currently used EFI ESP. It should automatically discover and mount the first /usr/, /home/, /srv/, /var/, /var/tmp/ and swap partitions that do not have the no-auto flag set by scanning the disk containing the discovered root partition. It should automatically discover and mount the partition containing the currently used EFI ESP to /efi/ (or /boot/ as fallback). It should automatically discover and mount the partition containing the currently used Extended Boot Loader Partition to /boot/. It should not discover or automatically mount partitions with other UUID partition types, or partitions located on other disks, or partitions with the no-auto flag set. User configuration shall always override automatic discovery and mounting. If a root, /usr/, /home/, /srv/, /boot/, /var/, /var/tmp/, /efi/, /boot/ or swap partition is listed in /etc/fstab or with root= on the kernel command line, it must take precedence over automatically discovered partitions. If a /home/, /usr/, /srv/, /boot/, /var/, /var/tmp/, /efi/ or /boot/ directory is found to be populated already in the root partition, the automatic discovery must not mount any discovered file system over it. Optionally, in case of the root, /usr/ and their Verity partitions instead of strictly mounting the first suitable partition an OS might choose to mount the partition whose label compares the highest according to strverscmp() or a similar logic, in order to implement a simple partition-based A/B versioning scheme. The precise rules are left for the implementation to decide, but when in doubt earlier partitions (by their index) should always win over later partitions if the label comparison is inconclusive.

A container manager should automatically discover and mount the root, /usr/, /home/, /srv/, /var/, /var/tmp/ partitions inside a container disk image. It may choose to mount any discovered ESP and/or XBOOOTLDR partition to /efi/ or /boot/. It should ignore any swap should they be included in a container disk image.

If a btrfs file system is automatically discovered and mounted by the operating system/container manager it will be mounted with its default subvolume. The installer should make sure to set the default subvolume correctly using "btrfs subvolume set-default".

Sharing of File Systems between Installations

If two Linux-based operating systems are installed on the same disk, the scheme above suggests that they may share the swap, /home/, /srv/, /var/tmp/, ESP, XBOOTLDR. However, they should each have their own root, /usr/ and /var/ partition.

Frequently Asked Questions

Why are you taking my /etc/fstab away?

We are not. /etc/fstab always overrides automatic discovery and is indeed mentioned in the specifications. We are simply trying to make the boot and installation processes of Linux a bit more robust and self-descriptive.

Why did you only define the root partition for x86, x86-64, ARM, ARM64, ia64?

The automatic discovery of the root partition is defined to operate on the disk containing the current EFI System Partition (ESP). Since EFI only exists on x86, x86-64, ia64, and ARM so far, we only defined root partition UUIDs for these architectures. Should EFI become more common on other architectures, we can define additional UUIDs for them.

Why define distinct root partition UUIDs for the various architectures?

This allows disk images that may be booted on multiple architectures to use discovery of the appropriate root partition on each architecture.

Doesn't this break multi-boot scenarios?

No, it doesn't. The specification says that installers may not stop creating /etc/fstab or stop including root= on the kernel command line, unless the used partitions are the first ones of their type on the disk. Additionally, /etc/fstab and root= both override automatic discovery. Multi-boot is hence well supported, since it doesn't change anything for anything but the first installation.

That all said, it's not expected that generic installers generally stop setting root= and creating /etc/fstab anyway. The option to drop these configuration bits is primarily something for appliance-like devices. However, generic installers should still set the right GPT partition types for the partitions they create so that container managers, partition tools and administrators can benefit. Phrased differently, this specification introduces A) the recommendation to use the newly defined partition types to tag things properly and B) the option to then drop root= and /etc/fstab. While we advertise A) to all installers, we only propose B) for simpler, appliance-like installations.

What partitioning tools will create a DPS-compliant partition table?

As of util-linux 2.25.2, the fdisk tool provides type codes to create the root, home, and swap partitions that the DPS expects. By default, fdisk will create an old-style MBR, not a GPT, so typing l to list partition types will not show the choices to let you set the correct UUID. Make sure to first create an empty GPT, then type l in order for the DPS-compliant type codes to be available.

The gdisk tool (from version 1.0.5 onward) and its variants (sgdisk, cgdisk) also support creation of partitions with a matching type code.