]> git.proxmox.com Git - systemd.git/blame - docs/DISCOVERABLE_PARTITIONS.md
New upstream version 250.4
[systemd.git] / docs / DISCOVERABLE_PARTITIONS.md
CommitLineData
46cdbd49
BR
1---
2title: Discoverable Partitions Specification
3category: Concepts
4layout: default
ea0999c9 5SPDX-License-Identifier: LGPL-2.1-or-later
46cdbd49 6---
ea0999c9 7# The Discoverable Partitions Specification (DPS)
46cdbd49
BR
8
9_TL;DR: Let's automatically discover, mount and enable the root partition,
10`/home/`, `/srv/`, `/var/` and `/var/tmp/` and the swap partitions based on
11GUID Partition Tables (GPT)!_
12
a032b68d
MB
13This specification describes the use of GUID Partition Table (GPT) UUIDs to
14enable automatic discovery of partitions and their intended mountpoints.
15Traditionally Linux has made little use of partition types, mostly just
16defining one UUID for file system/data partitions and another one for swap
17partitions. With this specification, we introduce additional partition types
18for specific uses. This has many benefits:
46cdbd49
BR
19
20* OS installers can automatically discover and make sense of partitions of
21 existing Linux installations.
a032b68d 22* The OS can discover and mount the necessary file systems with a non-existent
46cdbd49
BR
23 or incomplete `/etc/fstab` file and without the `root=` kernel command line
24 option.
a032b68d 25* Container managers (such as nspawn and libvirt-lxc) can introspect and set up
46cdbd49 26 file systems contained in GPT disk images automatically and mount them to the
a032b68d 27 right places, thus allowing booting the same, identical images on bare metal
46cdbd49
BR
28 and in Linux containers. This enables true, natural portability of disk
29 images between physical machines and Linux containers.
30* As a help to administrators and users partition manager tools can show more
31 descriptive information about partitions tables.
32
33Note that the OS side of this specification is currently implemented in
a80b52fd
MB
34[systemd](https://systemd.io/) 211 and newer in the
35[systemd-gpt-auto-generator(8)](https://www.freedesktop.org/software/systemd/man/systemd-gpt-auto-generator.html)
46cdbd49
BR
36generator tool. Note that automatic discovery of the root only works if the
37boot loader communicates this information to the OS, by implementing the [Boot
38Loader
39Interface](https://systemd.io/BOOT_LOADER_INTERFACE).
40
41## Defined Partition Type UUIDs
42
9cde670f
LB
43| Name | Partition Type UUID | Allowed File Systems | Explanation |
44|------|---------------------|----------------------|-------------|
ea0999c9
MB
45| _Root Partition (Alpha)_ | `6523f8ae-3eb1-4e2a-a05a-18b695ae656f` | 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 <tt>/</tt>. 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`. |
46| _Root Partition (ARC)_ | `d27f46ed-2919-4cb8-bd25-9531f3c16534` | ditto | ditto |
47| _Root Partition (32-bit ARM)_ | `69dad710-2ce4-4e3c-b16c-21a1d49abed3` | ditto | ditto |
48| _Root Partition (64-bit ARM/AArch64)_ | `b921b045-1df0-41c3-af44-4c6f280d3fae` | ditto | ditto |
49| _Root Partition (Itanium/IA-64)_ | `993d8d3d-f80e-4225-855a-9daf8ed7ea97` | ditto | ditto |
50| _Root Partition (LoongArch 64-bit)_ | `77055800-792c-4f94-b39a-98c91b762bb6` | ditto | ditto |
51| _Root Partition (32-bit MIPS LittleEndian (mipsel))_ | `37c58c8a-d913-4156-a25f-48b1b64e07f0` | ditto | ditto |
52| _Root Partition (64-bit MIPS LittleEndian (mips64el))_ | `700bda43-7a34-4507-b179-eeb93d7a7ca3` | ditto | ditto |
53| _Root Partition (32-bit PowerPC)_ | `1de3f1ef-fa98-47b5-8dcd-4a860a654d78` | ditto | ditto |
54| _Root Partition (64-bit PowerPC BigEndian)_ | `912ade1d-a839-4913-8964-a10eee08fbd2` | ditto | ditto |
55| _Root Partition (64-bit PowerPC LittleEndian)_ | `c31c45e6-3f39-412e-80fb-4809c4980599` | ditto | ditto |
56| _Root Partition (RISC-V 32-bit)_ | `60d5a7fe-8e7d-435c-b714-3dd8162144e1` | ditto | ditto |
57| _Root Partition (RISC-V 64-bit)_ | `72ec70a6-cf74-40e6-bd49-4bda08e8f224` | ditto | ditto |
58| _Root Partition (s390)_ | `08a7acea-624c-4a20-91e8-6e0fa67d23f9` | ditto | ditto |
59| _Root Partition (s390x)_ | `5eead9a9-fe09-4a1e-a1d7-520d00531306` | ditto | ditto |
60| _Root Partition (TILE-Gx)_ | `c50cdd70-3862-4cc3-90e1-809a8c93ee2c` | ditto | ditto |
61| _Root Partition (x86)_ | `44479540-f297-41b2-9af7-d131d5f0458a` | ditto | ditto |
62| _Root Partition (amd64/x86_64)_ | `4f68bce3-e8cd-4db1-96e7-fbcaf984b709` | ditto | ditto |
63| _`/usr/` Partition (Alpha)_ | `e18cf08c-33ec-4c0d-8246-c6c6fb3da024` | Any native, optionally in LUKS | Similar semantics to root partition, but just the `/usr/` partition. |
64| _`/usr/` Partition (ARC)_ | `7978a683-6316-4922-bbee-38bff5a2fecc` | ditto | ditto |
65| _`/usr/` Partition (32-bit ARM)_ | `7d0359a3-02b3-4f0a-865c-654403e70625` | ditto | ditto |
66| _`/usr/` Partition (64-bit ARM/AArch64)_ | `b0e01050-ee5f-4390-949a-9101b17104e9` | ditto | ditto |
67| _`/usr/` Partition (Itanium/IA-64)_ | `4301d2a6-4e3b-4b2a-bb94-9e0b2c4225ea` | ditto | ditto |
68| _`/usr/` Partition (LoongArch 64-bit)_ | `e611c702-575c-4cbe-9a46-434fa0bf7e3f` | ditto | ditto |
69| _`/usr/` Partition (32-bit MIPS LittleEndian (mipsel))_ | `0f4868e9-9952-4706-979f-3ed3a473e947` | ditto | ditto |
70| _`/usr/` Partition (64-bit MIPS LittleEndian (mips64el))_ | `c97c1f32-ba06-40b4-9f22-236061b08aa8` | ditto | ditto |
71| _`/usr/` Partition (32-bit PowerPC)_ | `7d14fec5-cc71-415d-9d6c-06bf0b3c3eaf` | ditto | ditto |
72| _`/usr/` Partition (64-bit PowerPC BigEndian)_ | `2c9739e2-f068-46b3-9fd0-01c5a9afbcca` | ditto | ditto |
73| _`/usr/` Partition (64-bit PowerPC LittleEndian)_ | `15bb03af-77e7-4d4a-b12b-c0d084f7491c` | ditto | ditto |
74| _`/usr/` Partition (RISC-V 32-bit)_ | `b933fb22-5c3f-4f91-af90-e2bb0fa50702` | ditto | ditto |
75| _`/usr/` Partition (RISC-V 64-bit)_ | `beaec34b-8442-439b-a40b-984381ed097d` | ditto | ditto |
76| _`/usr/` Partition (s390)_ | `cd0f869b-d0fb-4ca0-b141-9ea87cc78d66` | ditto | ditto |
77| _`/usr/` Partition (s390x)_ | `8a4f5770-50aa-4ed3-874a-99b710db6fea` | ditto | ditto |
78| _`/usr/` Partition (TILE-Gx)_ | `55497029-c7c1-44cc-aa39-815ed1558630` | ditto | ditto |
79| _`/usr/` Partition (x86)_ | `75250d76-8cc6-458e-bd66-bd47cc81a812` | ditto | ditto |
80| _`/usr/` Partition (amd64/x86_64)_ | `8484680c-9521-48c6-9c11-b0720656f69e` | ditto | ditto |
81| _Root Verity Partition (Alpha)_ | `fc56d9e9-e6e5-4c06-be32-e74407ce09a5` | A dm-verity superblock followed by hash data | 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 128 bits of the root hash of the dm-verity hash data, and the partition UUID of this dm-verity partition should be the final 128 bits of it, so that the root partition and its Verity partition can be discovered easily, simply by specifying the root hash. |
82| _Root Verity Partition (ARC)_ | `24b2d975-0f97-4521-afa1-cd531e421b8d` | ditto | ditto |
83| _Root Verity Partition (32-bit ARM)_ | `7386cdf2-203c-47a9-a498-f2ecce45a2d6` | ditto | ditto |
84| _Root Verity Partition (64-bit ARM/AArch64)_ | `df3300ce-d69f-4c92-978c-9bfb0f38d820` | ditto | ditto |
85| _Root Verity Partition (Itanium/IA-64)_ | `86ed10d5-b607-45bb-8957-d350f23d0571` | ditto | ditto |
86| _Root Verity Partition (LoongArch 64-bit)_ | `f3393b22-e9af-4613-a948-9d3bfbd0c535` | ditto | ditto |
87| _Root Verity Partition (32-bit MIPS LittleEndian (mipsel))_ | `d7d150d2-2a04-4a33-8f12-16651205ff7b` | ditto | ditto |
88| _Root Verity Partition (64-bit MIPS LittleEndian (mips64el))_ | `16b417f8-3e06-4f57-8dd2-9b5232f41aa6` | ditto | ditto |
89| _Root Verity Partition (64-bit PowerPC LittleEndian)_ | `906bd944-4589-4aae-a4e4-dd983917446a` | ditto | ditto |
90| _Root Verity Partition (64-bit PowerPC BigEndian)_ | `9225a9a3-3c19-4d89-b4f6-eeff88f17631` | ditto | ditto |
91| _Root Verity Partition (32-bit PowerPC)_ | `98cfe649-1588-46dc-b2f0-add147424925` | ditto | ditto |
92| _Root Verity Partition (RISC-V 32-bit)_ | `ae0253be-1167-4007-ac68-43926c14c5de` | ditto | ditto |
93| _Root Verity Partition (RISC-V 64-bit)_ | `b6ed5582-440b-4209-b8da-5ff7c419ea3d` | ditto | ditto |
94| _Root Verity Partition (s390x)_ | `b325bfbe-c7be-4ab8-8357-139e652d2f6b` | ditto | ditto |
95| _Root Verity Partition (s390)_ | `7ac63b47-b25c-463b-8df8-b4a94e6c90e1` | ditto | ditto |
96| _Root Verity Partition (TILE-Gx)_ | `966061ec-28e4-4b2e-b4a5-1f0a825a1d84` | ditto | ditto |
97| _Root Verity Partition (amd64/x86_64)_ | `2c7357ed-ebd2-46d9-aec1-23d437ec2bf5` | ditto | ditto |
98| _Root Verity Partition (x86)_ | `d13c5d3b-b5d1-422a-b29f-9454fdc89d76` | ditto | ditto |
99| _`/usr/` Verity Partition (Alpha)_ | `8cce0d25-c0d0-4a44-bd87-46331bf1df67` | A dm-verity superblock followed by hash data | Similar semantics to root Verity partition, but just for the `/usr/` partition. |
100| _`/usr/` Verity Partition (ARC)_ | `fca0598c-d880-4591-8c16-4eda05c7347c` | ditto | ditto |
101| _`/usr/` Verity Partition (32-bit ARM)_ | `c215d751-7bcd-4649-be90-6627490a4c05` | ditto | ditto |
102| _`/usr/` Verity Partition (64-bit ARM/AArch64)_ | `6e11a4e7-fbca-4ded-b9e9-e1a512bb664e` | ditto | ditto |
103| _`/usr/` Verity Partition (Itanium/IA-64)_ | `6a491e03-3be7-4545-8e38-83320e0ea880` | ditto | ditto |
104| _`/usr/` Verity Partition (LoongArch 64-bit)_ | `f46b2c26-59ae-48f0-9106-c50ed47f673d` | ditto | ditto |
105| _`/usr/` Verity Partition (32-bit MIPS LittleEndian (mipsel))_ | `46b98d8d-b55c-4e8f-aab3-37fca7f80752` | ditto | ditto |
106| _`/usr/` Verity Partition (64-bit MIPS LittleEndian (mips64el))_ | `3c3d61fe-b5f3-414d-bb71-8739a694a4ef` | ditto | ditto |
107| _`/usr/` Verity Partition (64-bit PowerPC LittleEndian)_ | `ee2b9983-21e8-4153-86d9-b6901a54d1ce` | ditto | ditto |
108| _`/usr/` Verity Partition (64-bit PowerPC BigEndian)_ | `bdb528a5-a259-475f-a87d-da53fa736a07` | ditto | ditto |
109| _`/usr/` Verity Partition (32-bit PowerPC)_ | `df765d00-270e-49e5-bc75-f47bb2118b09` | ditto | ditto |
110| _`/usr/` Verity Partition (RISC-V 32-bit)_ | `cb1ee4e3-8cd0-4136-a0a4-aa61a32e8730` | ditto | ditto |
111| _`/usr/` Verity Partition (RISC-V 64-bit)_ | `8f1056be-9b05-47c4-81d6-be53128e5b54` | ditto | ditto |
112| _`/usr/` Verity Partition (s390x)_ | `31741cc4-1a2a-4111-a581-e00b447d2d06` | ditto | ditto |
113| _`/usr/` Verity Partition (s390)_ | `b663c618-e7bc-4d6d-90aa-11b756bb1797` | ditto | ditto |
114| _`/usr/` Verity Partition (TILE-Gx)_ | `2fb4bf56-07fa-42da-8132-6b139f2026ae` | ditto | ditto |
115| _`/usr/` Verity Partition (amd64/x86_64)_ | `77ff5f63-e7b6-4633-acf4-1565b864c0e6` | ditto | ditto |
116| _`/usr/` Verity Partition (x86)_ | `8f461b0d-14ee-4e81-9aa9-049b6fb97abd` | ditto | ditto |
117| _Root Verity Signature Partition (Alpha)_ | `d46495b7-a053-414f-80f7-700c99921ef8` | A serialized JSON object, see below | Contains a root hash and a PKCS#7 signature for it, permitting signed dm-verity GPT images. |
118| _Root Verity Signature Partition (ARC)_ | `143a70ba-cbd3-4f06-919f-6c05683a78bc` | ditto | ditto |
119| _Root Verity Signature Partition (32-bit ARM)_ | `42b0455f-eb11-491d-98d3-56145ba9d037` | ditto | ditto |
120| _Root Verity Signature Partition (64-bit ARM/AArch64)_ | `6db69de6-29f4-4758-a7a5-962190f00ce3` | ditto | ditto |
121| _Root Verity Signature Partition (Itanium/IA-64)_ | `e98b36ee-32ba-4882-9b12-0ce14655f46a` | ditto | ditto |
122| _Root Verity Signature Partition (LoongArch 64-bit)_ | `5afb67eb-ecc8-4f85-ae8e-ac1e7c50e7d0` | ditto | ditto |
123| _Root Verity Signature Partition (32-bit MIPS LittleEndian (mipsel))_ | `c919cc1f-4456-4eff-918c-f75e94525ca5` | ditto | ditto |
124| _Root Verity Signature Partition (64-bit MIPS LittleEndian (mips64el))_ | `904e58ef-5c65-4a31-9c57-6af5fc7c5de7` | ditto | ditto |
125| _Root Verity Signature Partition (64-bit PowerPC LittleEndian)_ | `d4a236e7-e873-4c07-bf1d-bf6cf7f1c3c6` | ditto | ditto |
126| _Root Verity Signature Partition (64-bit PowerPC BigEndian)_ | `f5e2c20c-45b2-4ffa-bce9-2a60737e1aaf` | ditto | ditto |
127| _Root Verity Signature Partition (32-bit PowerPC)_ | `1b31b5aa-add9-463a-b2ed-bd467fc857e7` | ditto | ditto |
128| _Root Verity Signature Partition (RISC-V 32-bit)_ | `3a112a75-8729-4380-b4cf-764d79934448` | ditto | ditto |
129| _Root Verity Signature Partition (RISC-V 64-bit)_ | `efe0f087-ea8d-4469-821a-4c2a96a8386a` | ditto | ditto |
130| _Root Verity Signature Partition (s390x)_ | `c80187a5-73a3-491a-901a-017c3fa953e9` | ditto | ditto |
131| _Root Verity Signature Partition (s390)_ | `3482388e-4254-435a-a241-766a065f9960` | ditto | ditto |
132| _Root Verity Signature Partition (TILE-Gx)_ | `b3671439-97b0-4a53-90f7-2d5a8f3ad47b` | ditto | ditto |
133| _Root Verity Signature Partition (amd64/x86_64)_ | `41092b05-9fc8-4523-994f-2def0408b176` | ditto | ditto |
134| _Root Verity Signature Partition (x86)_ | `5996fc05-109c-48de-808b-23fa0830b676` | ditto | ditto |
135| _`/usr/` Verity Signature Partition (Alpha)_ | `5c6e1c76-076a-457a-a0fe-f3b4cd21ce6e` | A serialized JSON object, see below | Similar semantics to root Verity signature partition, but just for the `/usr/` partition. |
136| _`/usr/` Verity Signature Partition (ARC)_ | `94f9a9a1-9971-427a-a400-50cb297f0f35` | ditto | ditto |
137| _`/usr/` Verity Signature Partition (32-bit ARM)_ | `d7ff812f-37d1-4902-a810-d76ba57b975a` | ditto | ditto |
138| _`/usr/` Verity Signature Partition (64-bit ARM/AArch64)_ | `c23ce4ff-44bd-4b00-b2d4-b41b3419e02a` | ditto | ditto |
139| _`/usr/` Verity Signature Partition (Itanium/IA-64)_ | `8de58bc2-2a43-460d-b14e-a76e4a17b47f` | ditto | ditto |
140| _`/usr/` Verity Signature Partition (LoongArch 64-bit)_ | `b024f315-d330-444c-8461-44bbde524e99` | ditto | ditto |
141| _`/usr/` Verity Signature Partition (32-bit MIPS LittleEndian (mipsel))_ | `3e23ca0b-a4bc-4b4e-8087-5ab6a26aa8a9` | ditto | ditto |
142| _`/usr/` Verity Signature Partition (64-bit MIPS LittleEndian (mips64el))_ | `f2c2c7ee-adcc-4351-b5c6-ee9816b66e16` | ditto | ditto |
143| _`/usr/` Verity Signature Partition (64-bit PowerPC LittleEndian)_ | `c8bfbd1e-268e-4521-8bba-bf314c399557` | ditto | ditto |
144| _`/usr/` Verity Signature Partition (64-bit PowerPC BigEndian)_ | `0b888863-d7f8-4d9e-9766-239fce4d58af` | ditto | ditto |
145| _`/usr/` Verity Signature Partition (32-bit PowerPC)_ | `7007891d-d371-4a80-86a4-5cb875b9302e` | ditto | ditto |
146| _`/usr/` Verity Signature Partition (RISC-V 32-bit)_ | `c3836a13-3137-45ba-b583-b16c50fe5eb4` | ditto | ditto |
147| _`/usr/` Verity Signature Partition (RISC-V 64-bit)_ | `d2f9000a-7a18-453f-b5cd-4d32f77a7b32` | ditto | ditto |
148| _`/usr/` Verity Signature Partition (s390x)_ | `3f324816-667b-46ae-86ee-9b0c0c6c11b4` | ditto | ditto |
149| _`/usr/` Verity Signature Partition (s390)_ | `17440e4f-a8d0-467f-a46e-3912ae6ef2c5` | ditto | ditto |
150| _`/usr/` Verity Signature Partition (TILE-Gx)_ | `4ede75e2-6ccc-4cc8-b9c7-70334b087510` | ditto | ditto |
151| _`/usr/` Verity Signature Partition (amd64/x86_64)_ | `e7bb33fb-06cf-4e81-8273-e543b413e2e2` | ditto | ditto |
152| _`/usr/` Verity Signature Partition (x86)_ | `974a71c0-de41-43c3-be5d-5c5ccd1ad2c0` | ditto | ditto |
153| _EFI System Partition_ | `c12a7328-f81f-11d2-ba4b-00a0c93ec93b` | 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](http://www.uefi.org/specifications). |
154| _Extended Boot Loader Partition_ | `bc13c2ff-59e6-4262-a352-b275fd6f7172` | Typically VFAT | The Extended Boot Loader Partition (XBOOTLDR) used for the current boot is automatically mounted to <tt>/boot/</tt>, unless a different partition is mounted there (possibly via <tt>/etc/fstab</tt>) or the directory is non-empty on the root disk. This partition type is defined by the [Boot Loader Specification](https://systemd.io/BOOT_LOADER_SPECIFICATION). |
155| _Swap_ | `0657fd6d-a4ab-43c4-84e5-0933c84b4f4f` | Swap, optionally in LUKS | All swap partitions on the disk containing the root partition are automatically enabled. If the partition is encrypted with LUKS, the device mapper file will be named `/dev/mapper/swap`. This partition type predates the Discoverable Partitions Specification. |
156| _Home Partition_ | `933ac7e1-2eb4-4f13-b844-0e14e2aef915` | 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`. |
157| _Server Data Partition_ | `3b8f8425-20e0-4f3b-907f-1a25a76f98e8` | 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`. |
158| _Variable Data Partition_ | `4d21b016-b534-45c2-a9fb-5c16e091fd2d` | 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 bits 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`](https://www.freedesktop.org/software/systemd/man/machine-id.html). 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`. |
159| _Temporary Data Partition_ | `7ec6f557-3bc5-4aca-b293-16ef5df639d1` | 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 <tt>tmpfs</tt> 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. |
160| _Per-user Home Partition_ | `773f91ef-66d4-49b5-bd83-d683bf40ad16` | Any native, optionally in LUKS | A home partition of a user, managed by [`systemd-homed`](https://www.freedesktop.org/software/systemd/man/systemd-homed.html). |
161| _Generic Linux Data Partition_ | `0fc63daf-8483-4772-8e79-3d69d8477de4` | 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 <tt>/etc/fstab</tt>. Optionally, these partitions may be encrypted with LUKS. This partition type predates the Discoverable Partitions Specification. |
46cdbd49
BR
162
163Other GPT type IDs might be used on Linux, for example to mark software RAID or
164LVM partitions. The definitions of those GPT types is outside of the scope of
165this specification.
166
a80b52fd 167[systemd-id128(1)](https://www.freedesktop.org/software/systemd/man/systemd-id128.html)'s
ea0999c9 168`show` command may be used to list those GPT partition type UUIDs.
46cdbd49
BR
169
170## Partition Names
171
172For partitions of the types listed above it is recommended to use
173human-friendly, descriptive partition names in the GPT partition table, for
174example "*Home*", "*Server* *Data*", "*Fedora* *Root*" and similar, possibly
175localized.
176
ea0999c9
MB
177For the Root/Verity/Verity signature partitions it might make sense to use a
178versioned naming scheme reflecting the OS name and its version,
179e.g. "fooOS_2021.4" or similar.
180
46cdbd49
BR
181## Partition Flags
182
8b3d4ff0
MB
183This specification defines three GPT partition flags that may be set for the
184partition types defined above:
185
ea0999c9
MB
1861. For the root, `/usr/`, Verity, Verity signature, home, server data, variable
187 data, temporary data, swap and extended boot loader partitions, the
188 partition flag bit 63 ("*no-auto*") may be used to turn off auto-discovery
189 for the specific partition. If set, the partition will not be automatically
190 mounted or enabled.
191
1922. For the root, `/usr/`, Verity, Verity signature home, server data, variable
193 data, temporary data and extended boot loader partitions, the partition flag
194 bit 60 ("*read-only*") may be used to mark a partition for read-only mounts
195 only. If set, the partition will be mounted read-only instead of
196 read-write. Note that the variable data partition and the temporary data
197 partition will generally not be able to serve their purpose if marked
198 read-only, since by their very definition they are supposed to be
199 mutable. (The home and server data partitions are generally assumed to be
200 mutable as well, but the requirement for them is not equally strong.)
201 Because of that, while the read-only flag is defined and supported, it's
202 almost never a good idea to actually use it for these partitions. Also note
203 that Verity and signature partitions are by their semantics always
204 read-only. The flag is hence of little effect for them, and it is
205 recommended to set it unconditionally for the Verity and signature partition
206 types.
8b3d4ff0
MB
207
2083. For the root, `/usr/`, home, server data, variable data, temporary data and
209 extended boot loader partitions, the partition flag bit 59
210 ("*grow-file-system*") may be used to mark a partition for automatic growing
211 of the contained file system to the size of the partition when
212 mounted. Tools that automatically mount disk image with a GPT partition
213 table are suggested to implicitly grow the contained file system to the
ea0999c9
MB
214 partition size they are contained in, if they are found to be smaller. This
215 flag is without effect on partitions marked read-only.
8b3d4ff0 216
ea0999c9
MB
217Note that the first two flag definitions happen to correspond nicely to the
218same ones used by Microsoft Basic Data Partitions.
8b3d4ff0
MB
219
220All three of these flags generally affect only auto-discovery and automatic
221mounting of disk images. If partitions marked with these flags are mounted
222using low-level commands like
223[mount(8)](https://man7.org/linux/man-pages/man2/mount.8.html) or directly with
224[mount(2)](https://man7.org/linux/man-pages/man2/mount.2.html), they typically
225have no effect.
46cdbd49 226
ea0999c9
MB
227## Verity
228
229The Root/`/usr/` partition types and their matching Verity and Verity signature
230partitions enable relatively automatic handling of `dm-verity` protected
231setups. These types are defined with two modes of operation in mind:
232
2331. A trusted Verity root hash is passed in externally, for example is specified
234 on the kernel command line that is signed along with the kernel image using
235 SecureBoot PE signing (which in turn is tested against a set of
236 firmware-provided set of signing keys). If so, discovery and setup of a
237 Verity volume may be fully automatic: if the root partition's UUID is chosen
238 to match the first 128 bit of the root hash, and the matching Verity
239 partition UUIDs is chosen to match the last 128bit of the root hash, then
240 automatic discovery and match-up of the two partitions is possible, as the
241 root hash is enough to both find the partitions and then combine them in a
242 Verity volume. In this mode a Verity signature partition is not used and
243 unnecessary.
244
2452. A Verity signature partition is included on the disk, with a signature to be
246 tested against a system-provided set of signing keys. The signature
247 partition primarily contains two fields: the root hash to use, and a PKCS#7
248 signature of it, using a signature key trusted by the OS. If so, discovery
249 and setup of a Verity volume may be fully automatic. First, the specified
250 root hash is validated with the signature and the OS-provided trusted
251 keys. If the signature checks out the root hash is then used in the same way
252 as in the first mode of operation described above.
253
254Both modes of operation may be combined in a single image. This is particularly
255useful for images that shall be usable in two different contexts: for example
256an image that shall be able to boot directly on UEFI systems (in which
257case it makes sense to include the root hash on the kernel command line that is
258included in the signed kernel image to boot, as per mode of operation #1
259above), but also be able to used as image for a container engine (such as
260`systemd-nspawn`), which can use the signature partition to validate the image,
261without making use of the signed kernel image (and thus following mode of
262operation #2).
263
264The Verity signature partition's contents should be a serialized JSON object in
265text form, padded with NUL bytes to the next multiple of 4096 bytes in
266size. Currently three fields are defined for the JSON object:
267
2681. The (mandatory) `rootHash` field should be a string containing the Verity root hash,
269 formatted as series of (lowercase) hex characters.
270
2712. The (mandatory) `signature` field should be a string containing the PKCS#7
272 signature of the root hash, in Base64-encoded DER format. This should be the
273 same format used by the Linux kernel's dm-verity signature logic, i.e. the
274 signed data should be the exact string representation of the hash, as stored
275 in `rootHash` above.
276
2773. The (optional) `certificateFingerprint` field should be a string containing
278 a SHA256 fingerprint of the X.509 certificate for the key that signed the
279 root hash, formatted as series of (lowercase) hex characters (no `:`
280 separators or such).
281
282More fields might be added in later revisions of this specification.
283
46cdbd49
BR
284## Suggested Mode of Operation
285
286An *installer* that repartitions the hard disk _should_ use the above UUID
287partition types for appropriate partitions it creates.
288
289An *installer* which supports a "manual partitioning" interface _may_ choose to
290pre-populate the interface with swap, `/home/`, `/srv/`, `/var/tmp/` partitions
291of pre-existing Linux installations, identified with the GPT type UUIDs
292above. The installer should not pre-populate such an interface with any
a032b68d
MB
293identified root, `/usr` or `/var/` partition unless the intention is to
294overwrite an existing operating system that might be installed.
46cdbd49
BR
295
296An *installer* _may_ omit creating entries in `/etc/fstab` for root, `/home/`,
297`/srv/`, `/var/`, `/var/tmp` and for the swap partitions if they use these UUID
298partition types, and are the first partitions on the disk of each type. If the
299ESP shall be mounted to `/efi/` (or `/boot/`), it may additionally omit
ea0999c9
MB
300creating the entry for it in `/etc/fstab`. If the EFI partition shall not be
301mounted to `/efi/` or `/boot/`, it _must_ create `/etc/fstab` entries for them.
302If other partitions are used (for example for `/usr/local/` or
303`/var/lib/mysql/`), the installer _must_ register these in `/etc/fstab`. The
304`root=` parameter passed to the kernel by the boot loader may be omitted if the
305root partition is the first one on the disk of its type. If the root partition
306is not the first one on the disk, the `root=` parameter _must_ be passed to the
307kernel by the boot loader. An installer that mounts a root, `/usr/`, `/home/`,
308`/srv/`, `/var/`, or `/var/tmp/` file system with the partition types defined
309as above which contains a LUKS header _must_ call the device mapper device
310"root", "usr", "home", "srv", "var" or "tmp", respectively. This is necessary
311to ensure that the automatic discovery will never result in different device
312mapper names than any static configuration by the installer, thus eliminating
313possible naming conflicts and ambiguities.
46cdbd49
BR
314
315An *operating* *system* _should_ automatically discover and mount the first
316root partition that does not have the no-auto flag set (as described above) by
317scanning the disk containing the currently used EFI ESP. It _should_
a032b68d 318automatically discover and mount the first `/usr/`, `/home/`, `/srv/`, `/var/`,
46cdbd49
BR
319`/var/tmp/` and swap partitions that do not have the no-auto flag set by
320scanning the disk containing the discovered root partition. It should
321automatically discover and mount the partition containing the currently used
322EFI ESP to `/efi/` (or `/boot/` as fallback). It should automatically discover
323and mount the partition containing the currently used Extended Boot Loader
324Partition to `/boot/`. It _should not_ discover or automatically mount
325partitions with other UUID partition types, or partitions located on other
326disks, or partitions with the no-auto flag set. User configuration shall
a032b68d
MB
327always override automatic discovery and mounting. If a root, `/usr/`,
328`/home/`, `/srv/`, `/boot/`, `/var/`, `/var/tmp/`, `/efi/`, `/boot/` or swap
329partition is listed in `/etc/fstab` or with `root=` on the kernel command line,
330it _must_ take precedence over automatically discovered partitions. If a
331`/home/`, `/usr/`, `/srv/`, `/boot/`, `/var/`, `/var/tmp/`, `/efi/` or `/boot/`
332directory is found to be populated already in the root partition, the automatic
8b3d4ff0
MB
333discovery _must not_ mount any discovered file system over it. Optionally, in
334case of the root, `/usr/` and their Verity partitions instead of strictly
335mounting the first suitable partition an OS might choose to mount the partition
336whose label compares the highest according to `strverscmp()` or a similar
337logic, in order to implement a simple partition-based A/B versioning
338scheme. The precise rules are left for the implementation to decide, but when
339in doubt earlier partitions (by their index) should always win over later
340partitions if the label comparison is inconclusive.
46cdbd49
BR
341
342A *container* *manager* should automatically discover and mount the root,
a032b68d
MB
343`/usr/`, `/home/`, `/srv/`, `/var/`, `/var/tmp/` partitions inside a container
344disk image. It may choose to mount any discovered ESP and/or XBOOOTLDR
345partition to `/efi/` or `/boot/`. It should ignore any swap should they be
346included in a container disk image.
46cdbd49
BR
347
348If a btrfs file system is automatically discovered and mounted by the operating
349system/container manager it will be mounted with its *default* subvolume. The
350installer should make sure to set the default subvolume correctly using "btrfs
351subvolume set-default".
352
353## Sharing of File Systems between Installations
354
355If two Linux-based operating systems are installed on the same disk, the scheme
356above suggests that they may share the swap, `/home/`, `/srv/`, `/var/tmp/`,
a032b68d
MB
357ESP, XBOOTLDR. However, they should each have their own root, `/usr/` and
358`/var/` partition.
46cdbd49
BR
359
360## Frequently Asked Questions
361
362### Why are you taking my `/etc/fstab` away?
363
364We are not. `/etc/fstab` always overrides automatic discovery and is indeed
365mentioned in the specifications. We are simply trying to make the boot and
366installation processes of Linux a bit more robust and self-descriptive.
367
ea0999c9 368### Why did you only define the root partition for these listed architectures?
46cdbd49 369
ea0999c9
MB
370Please submit a patch that adds appropriate partition type UUIDs for the
371architecture of your choice should they be missing so far. The only reason they
372aren't defined yet is that nobody submitted them yet.
46cdbd49
BR
373
374### Why define distinct root partition UUIDs for the various architectures?
375
376This allows disk images that may be booted on multiple architectures to use
377discovery of the appropriate root partition on each architecture.
378
379### Doesn't this break multi-boot scenarios?
380
381No, it doesn't. The specification says that installers may not stop creating
382`/etc/fstab` or stop including `root=` on the kernel command line, unless the used
383partitions are the first ones of their type on the disk. Additionally,
384`/etc/fstab` and `root=` both override automatic discovery. Multi-boot is hence
385well supported, since it doesn't change anything for anything but the first
386installation.
387
388That all said, it's not expected that generic installers generally stop setting
389`root=` and creating `/etc/fstab` anyway. The option to drop these configuration
390bits is primarily something for appliance-like devices. However, generic
391installers should *still* set the right GPT partition types for the partitions
392they create so that container managers, partition tools and administrators can
393benefit. Phrased differently, this specification introduces A) the
394*recommendation* to use the newly defined partition types to tag things
395properly and B) the *option* to then drop `root=` and `/etc/fstab`. While we
396advertise A) to *all* installers, we only propose B) for simpler,
397appliance-like installations.
398
399### What partitioning tools will create a DPS-compliant partition table?
400
3a6ce677
BR
401As of util-linux 2.25.2, the `fdisk` tool provides type codes to create the
402root, home, and swap partitions that the DPS expects. By default, `fdisk` will
403create an old-style MBR, not a GPT, so typing `l` to list partition types will
404not show the choices to let you set the correct UUID. Make sure to first create
405an empty GPT, then type `l` in order for the DPS-compliant type codes to be
406available.
407
408The `gdisk` tool (from version 1.0.5 onward) and its variants (`sgdisk`,
409`cgdisk`) also support creation of partitions with a matching type code.