]> git.ipfire.org Git - thirdparty/systemd.git/blob - docs/DISCOVERABLE_PARTITIONS.md
Merge pull request #16096 from poettering/journal-hash-fix
[thirdparty/systemd.git] / docs / DISCOVERABLE_PARTITIONS.md
1 ---
2 title: Discoverable Partitions Specification
3 category: Concepts
4 layout: default
5 ---
6 # The Discoverable Partitions Specification
7
8 _TL;DR: Let's automatically discover, mount and enable the root partition,
9 `/home/`, `/srv/`, `/var/` and `/var/tmp/` and the swap partitions based on
10 GUID Partition Tables (GPT)!_
11
12 The GUID Partition Table (GPT) is mandatory on EFI systems. It allows
13 identification of partition types with UUIDs. So far Linux has made little use
14 of this, and mostly just defined one UUID for file system/data partitions and
15 another one for swap partitions. With this specification, we introduce
16 additional partition types to enable automatic discovery of partitions and
17 their intended mountpoint. This has many benefits:
18
19 * OS installers can automatically discover and make sense of partitions of
20 existing Linux installations.
21 * The OS can discover and mount the necessary file systems with a non-existing
22 or incomplete `/etc/fstab` file and without the `root=` kernel command line
23 option.
24 * Container managers (such as nspawn and libvirt-lxc) can decode and set up
25 file systems contained in GPT disk images automatically and mount them to the
26 right places, thus allowing booting the same, identical images on bare-metal
27 and in Linux containers. This enables true, natural portability of disk
28 images between physical machines and Linux containers.
29 * As a help to administrators and users partition manager tools can show more
30 descriptive information about partitions tables.
31
32 Note that the OS side of this specification is currently implemented in
33 [systemd](http://systemd.io/) 211 and newer in the
34 [systemd-auto-gpt-generator(8)](http://www.freedesktop.org/software/systemd/man/systemd-gpt-auto-generator.html)
35 generator tool. Note that automatic discovery of the root only works if the
36 boot loader communicates this information to the OS, by implementing the [Boot
37 Loader
38 Interface](https://systemd.io/BOOT_LOADER_INTERFACE).
39
40 ## Defined Partition Type UUIDs
41
42 | Partition Type UUID | Name | Allowed File Systems | Explanation |
43 |---------------------|------|----------------------|-------------|
44 | `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 <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`. |
45 | `4f68bce3-e8cd-4db1-96e7-fbcaf984b709` | _Root Partition (x86-64)_ | ditto | ditto |
46 | `69dad710-2ce4-4e3c-b16c-21a1d49abed3` | _Root Partition (32-bit ARM)_ | ditto | ditto |
47 | `b921b045-1df0-41c3-af44-4c6f280d3fae` | _Root Partition (64-bit ARM/AArch64)_ | ditto | ditto |
48 | `993d8d3d-f80e-4225-855a-9daf8ed7ea97` | _Root Partition (Itanium/IA-64)_ | ditto | ditto |
49 | `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. |
50 | `2c7357ed-ebd2-46d9-aec1-23d437ec2bf5` | _Root Verity Partition (x86-64)_ | ditto | ditto |
51 | `7386cdf2-203c-47a9-a498-f2ecce45a2d6` | _Root Verity Partition (32-bit ARM)_ | ditto | ditto |
52 | `df3300ce-d69f-4c92-978c-9bfb0f38d820` | _Root Verity Partition (64-bit ARM/AArch64)_ | ditto | ditto |
53 | `86ed10d5-b607-45bb-8957-d350f23d0571` | _Root Verity Partition (Itanium/IA-64)_ | ditto | ditto |
54 | `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`. |
55 | `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`. |
56 | `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`](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`. |
57 | `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 <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. |
58 | `0657fd6d-a4ab-43c4-84e5-0933c84b4f4f` | _Swap_ | Swap | All swap partitions on the disk containing the root partition are automatically enabled. |
59 | `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](http://www.uefi.org/specifications). |
60 | `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 <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). |
61 | `0fc63daf-8483-4772-8e79-3d69d8477de4` | _Other 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 <tt>/etc/fstab</tt>. Optionally, these partitions may be encrypted with LUKS. |
62
63 Other GPT type IDs might be used on Linux, for example to mark software RAID or
64 LVM partitions. The definitions of those GPT types is outside of the scope of
65 this specification.
66
67 [systemd-id128(1)](http://www.freedesktop.org/software/systemd/man/systemd-i128.html)
68 may be used to list those UUIDs.
69
70 ## Partition Names
71
72 For partitions of the types listed above it is recommended to use
73 human-friendly, descriptive partition names in the GPT partition table, for
74 example "*Home*", "*Server* *Data*", "*Fedora* *Root*" and similar, possibly
75 localized.
76
77 ## Partition Flags
78
79 For the root, server data, home, variable data, temporary data and swap
80 partitions, the partition flag bit 63 ("*no-auto*") may be used to turn off
81 auto-discovery for the specific partition. If set, the partition will not be
82 automatically mounted or enabled.
83
84 For the root, server data, home, variable data and temporary data partitions,
85 the partition flag bit 60 ("*read-only*") may be used to mark a partition for
86 read-only mounts only. If set, the partition will be mounted read-only instead
87 of read-write. Note that the variable data partition and the temporary data
88 partition will generally not be able to serve their purpose if marked
89 read-only, since by their very definition they are supposed to be mutable. (The
90 home and server data partitions are generally assumed to be mutable as well,
91 but the requirement for them is not equally strong.) Because of that, while the
92 read-only flag is defined and supported, it's almost never a good idea to
93 actually use it for these partitions.
94
95 Note that these two flag definitions happen to map nicely to the ones used by
96 Microsoft Basic Data Partitions.
97
98 ## Suggested Mode of Operation
99
100 An *installer* that repartitions the hard disk _should_ use the above UUID
101 partition types for appropriate partitions it creates.
102
103 An *installer* which supports a "manual partitioning" interface _may_ choose to
104 pre-populate the interface with swap, `/home/`, `/srv/`, `/var/tmp/` partitions
105 of pre-existing Linux installations, identified with the GPT type UUIDs
106 above. The installer should not pre-populate such an interface with any
107 identified root or `/var/` partition unless the intention is to overwrite an
108 existing operating system that might be installed.
109
110 An *installer* _may_ omit creating entries in `/etc/fstab` for root, `/home/`,
111 `/srv/`, `/var/`, `/var/tmp` and for the swap partitions if they use these UUID
112 partition types, and are the first partitions on the disk of each type. If the
113 ESP shall be mounted to `/efi/` (or `/boot/`), it may additionally omit
114 creating the entry for it in `/etc/fstab`. If an extended boot partition is
115 used, or if the EFI partition shall not be mounted to `/efi/` or `/boot/`, it
116 _must_ create `/etc/fstab` entries for them. If other partitions are used (for
117 example for `/usr/` or `/var/lib/mysql/`), the installer _must_ register these
118 in `/etc/fstab`. The `root=` parameter passed to the kernel by the boot loader
119 may be omitted if the root partition is the first one on the disk of its type.
120 If the root partition is not the first one on the disk, the `root=` parameter
121 _must_ be passed to the kernel by the boot loader. An installer that mounts a
122 root, `/home/`, `/srv/`, `/var/`, or `/var/tmp/` file system with the partition
123 types defined as above which contains a LUKS header _must_ call the device
124 mapper device "root", "home", "srv", "var" or "tmp", respectively. This is
125 necessary to ensure that the automatic discovery will never result in different
126 device mapper names than any static configuration by the installer, thus
127 eliminating possible naming conflicts and ambiguities.
128
129 An *operating* *system* _should_ automatically discover and mount the first
130 root partition that does not have the no-auto flag set (as described above) by
131 scanning the disk containing the currently used EFI ESP. It _should_
132 automatically discover and mount the first `/home/`, `/srv/`, `/var/`,
133 `/var/tmp/` and swap partitions that do not have the no-auto flag set by
134 scanning the disk containing the discovered root partition. It should
135 automatically discover and mount the partition containing the currently used
136 EFI ESP to `/efi/` (or `/boot/` as fallback). It should automatically discover
137 and mount the partition containing the currently used Extended Boot Loader
138 Partition to `/boot/`. It _should not_ discover or automatically mount
139 partitions with other UUID partition types, or partitions located on other
140 disks, or partitions with the no-auto flag set. User configuration shall
141 always override automatic discovery and mounting. If a root, `/home/`,
142 `/srv/`, `/boot/`, `/var/`, `/var/tmp/`, `/efi/`, `/boot/` or swap partition is
143 listed in `/etc/fstab` or with `root=` on the kernel command line, it _must_
144 take precedence over automatically discovered partitions. If a `/home/`,
145 `/srv/`, `/boot/`, `/var/`, `/var/tmp/`, `/efi/` or `/boot/` directory is found
146 to be populated already in the root partition, the automatic discovery _must
147 not_ mount any discovered file system over it.
148
149 A *container* *manager* should automatically discover and mount the root,
150 `/home/`, `/srv/`, `/var/`, `/var/tmp/` partitions inside a container disk
151 image. It may choose to mount any discovered ESP and/or XBOOOTLDR partition to
152 `/efi/` or `/boot/`. It should ignore any swap should they be included in a
153 container disk image.
154
155 If a btrfs file system is automatically discovered and mounted by the operating
156 system/container manager it will be mounted with its *default* subvolume. The
157 installer should make sure to set the default subvolume correctly using "btrfs
158 subvolume set-default".
159
160 ## Sharing of File Systems between Installations
161
162 If two Linux-based operating systems are installed on the same disk, the scheme
163 above suggests that they may share the swap, `/home/`, `/srv/`, `/var/tmp/`,
164 ESP, XBOOTLDR. However, they should each have their own root and `/var/`
165 partition.
166
167 ## Frequently Asked Questions
168
169 ### Why are you taking my `/etc/fstab` away?
170
171 We are not. `/etc/fstab` always overrides automatic discovery and is indeed
172 mentioned in the specifications. We are simply trying to make the boot and
173 installation processes of Linux a bit more robust and self-descriptive.
174
175 ### Why did you only define the root partition for x86, x86-64, ARM, ARM64, ia64?
176
177 The automatic discovery of the root partition is defined to operate on the disk
178 containing the current EFI System Partition (ESP). Since EFI only exists on
179 x86, x86-64, ia64, and ARM so far, we only defined root partition UUIDs for
180 these architectures. Should EFI become more common on other architectures, we
181 can define additional UUIDs for them.
182
183 ### Why define distinct root partition UUIDs for the various architectures?
184
185 This allows disk images that may be booted on multiple architectures to use
186 discovery of the appropriate root partition on each architecture.
187
188 ### Doesn't this break multi-boot scenarios?
189
190 No, it doesn't. The specification says that installers may not stop creating
191 `/etc/fstab` or stop including `root=` on the kernel command line, unless the used
192 partitions are the first ones of their type on the disk. Additionally,
193 `/etc/fstab` and `root=` both override automatic discovery. Multi-boot is hence
194 well supported, since it doesn't change anything for anything but the first
195 installation.
196
197 That all said, it's not expected that generic installers generally stop setting
198 `root=` and creating `/etc/fstab` anyway. The option to drop these configuration
199 bits is primarily something for appliance-like devices. However, generic
200 installers should *still* set the right GPT partition types for the partitions
201 they create so that container managers, partition tools and administrators can
202 benefit. Phrased differently, this specification introduces A) the
203 *recommendation* to use the newly defined partition types to tag things
204 properly and B) the *option* to then drop `root=` and `/etc/fstab`. While we
205 advertise A) to *all* installers, we only propose B) for simpler,
206 appliance-like installations.
207
208 ### What partitioning tools will create a DPS-compliant partition table?
209
210 As of util-linux 2.25.2, the fdisk tool provides type codes to create the root,
211 home, and swap partitions that the DPS expects, but the gdisk tool (version
212 0.8.10) and its variants do not support creation of a root file system with a
213 matching type code. By default, fdisk will create an old-style MBR, not a GPT,
214 so typing 'l' to list partition types will not show the choices that the root
215 partition with the correct UUID. You must first create an empty GPT and then
216 type 'l' in order for the DPS-compliant type codes to be available.