From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1792933442; b=dGES3ZmtCiARAy6ay50gM9/1J2OpRZxK7lAwTisrqyDaaNzruWfk6OxoMvZcwGfeF+bN hCdHg5U94h12t2TMEZ3qs5HX9n+3n6L1SPbRSvQWyCtocJN00LNPgJngVZ2MQfm77hRN9 rmYaJKI5E22hSkQqbz49dmY++GNgxcBPdVivTk8dc+My7xjuxDLpSIT8eWGleVePACA17 FvSQ782RM4oXUodNTreugCsL3A6f4KcZ+5FvJ+V6eQ5yRApFWH0LFsh/ZHn4XxXM4rRbZ iwJaMmwtZVKFVHsW/InLbrjFexv0KR2ep83Hi73appTLS3oZTIOUa0Sv8PlDGLiVClg== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1792933442; h=Received:DKIM-Signature:From:Subject:Date:Message-Id:MIME-Version: Content-Type:Content-Transfer-Encoding:X-B4-Tracking:X-Change-ID:To: Cc:X-Mailer:X-Developer-Signature:X-Developer-Key; bh=nAkrtA6faTl+77otH7gJTheo2PlzrcNoGoMjrDipjzo=; b=Cnj5gjEhKlO5d8WHB/0oORF38aGoHwEm836ck2e8BxdUYgwVLmLU+Muns1wbp/4a7xev L4q+Tt35kdmtXLMWwonC95wPz1DyaHtifihepthJAUYLlNaC84Y+4WPZXd3zhzqnkQZ/9 U9jFdTc58Ez/I4BSNNNmDyb8L+jwNqsHnGSglNxUoHbcLy/cbd2dp1SF4QvukRHxzpDXP Y5Ad2xKfTTLtns558FZ/UwY+xDyzV2F+ObXyVonl+DDjLuIrEILgme20tvOa5peUtCXEX olwOcZ9G7J/HU4tUCDE1aTqIM51vfzvCfZ0xliNpAeiz8W507D+r183nbXWYS3EvESw== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=InYdQ6OT; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3C70B606A31A; Sun, 25 Oct 2026 13:04:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=InYdQ6OT Received: by smtp.kernel.org (Postfix) with ESMTPSA id 13FC91F01825; Sun, 25 Oct 2026 13:03:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1792933441; bh=nAkrtA6faTl+77otH7gJTheo2PlzrcNoGoMjrDipjzo=; h=From:Subject:Date:To:Cc; b=InYdQ6OTrY1ycFnT2z3WRHWS2U+8oQmAXcC9ZCIPG8zrVR+iXVVM/shM6qhqdxuUi 2DPzZvXN8e6tqHA1g5hrr0KFTaHMt8lXJYh/BeovHYt/amxAtpNIanqN5A7MeTdwXY zt79d2JFUsuLB92e6e3evbr+VXlXrV1BChS1IQaRd8d7cc7EOFTnQsLnMAPpW1iHC5 6sKdZMWi3t4nHm7d/ULKXz7YGtszFOZJfAY4/LXd0YY8YUGxFEpte32PF/oxPBKqtA ZFZjHppZq+VC4vqCcrH3teG/NpIt6KnONoXTQVlVPfL9abJF3LS5PBGs77Znu5voyr VfZmhfHAmRZWA== From: Vincent Mailhol Subject: [PATCH v2 0/7] init: discoverable root partitions Date: Sun, 25 Oct 2026 14:03:10 +0100 Message-Id: <20261025-discoverable-root_partitions-v2-0-fb77d0821fab@kernel.org> X-Mailing-List: linux-efi@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-B4-Tracking: v=1; b=H4sIAAAAAAAC/32PQQ6CMBBFr0K6tgpVUFl5D0PM0A4wEShOK9EQ7 m6FuHX5JvnvZSbhkAmdyKNJMI7kyPYB1CYSuoG+RkkmsFCxyuIsSaQhp+2IDGWLkq31twHYkw8 7J0sDugQD6TE2IigGxopei/5aBG7IecvvpTYm3+tPnP4Xj4mM5f6sj6cK9EGhutyRe2y3lmtRz GuK8fEMD/i1J0pwKLXtOvJ5ZJlq6ncdOI8cFvMHbpwu9voAAAA= X-Change-ID: 20260611-discoverable-root_partitions-bdacbada570d To: Jens Axboe , Davidlohr Bueso , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, linux-efi@vger.kernel.org, linux-fsdevel@vger.kernel.org, Dave Hansen , James Bottomley , Helge Deller , Matthew Wilcox , Vincent Mailhol , Jonathan Corbet , Shuah Khan , Randy Dunlap , linux-doc@vger.kernel.org X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=6866; i=mailhol@kernel.org; h=from:subject:message-id; bh=dGMb8OmA1Qh/i9fSPAL4WkcqHv77KtSDbe4mIbxDBCs=; b=owGbwMvMwCV2McXO4Xp97WbG02pJDFl3/1nohjflPi67dm3iuXnzvppc1NAtyjzceJfXJrVTR X7uhwdiHRNZGMS4GCzFFFmWlXNyK3QUeocd+msJM4eVCWSItEgDAxCwMPDlJuaVGukY6ZlqG+oZ Ahk6RgxcnAIw1ZMsGf5KqTtwvplpfyt7wew8i7j41IvrL96ZoXnlx6PZrbGGOhfbGX6zLCti+HI pPfP45193jet/211TntwZ8PvHdyuRsnQd4xOcAA== X-Developer-Key: i=mailhol@kernel.org; a=openpgp; fpr=ED8F700574E67F20E574E8E2AB5FEB886DBB99C2 DPS [1] defines GPT partition type UUIDs for OS partitions and attributes that control whether such partitions should be automatically discovered. The specification states that: 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. DPS is already implemented in systemd-gpt-auto-generator [2], which, when embedded in an initrd, indeed allows automatic detection of the root filesystem through its partition type UUID. This series adds root discovery directly into the kernel so that people who are not using an initrd can still benefit from it. The scope is deliberately limited to block devices that the kernel can already mount through the root= parameter. Other DPS features, such as setting up LUKS-encrypted partitions, mounting partitions other than root or container setup, remain userspace responsibilities, with no future plan to implement them in the kernel. The intended usage is thus a hybrid approach in which the kernel DPS only mounts the root partition and leaves the remaining setup to userspace (either with DPS or with a classic fstab), just as it does today when root= specifies the root device. The benefit is being able to boot a kernel with no accompanying bootloader configuration: no root= parameter and no initramfs. The root partition is identified from the existing on-disk metadata instead. This is useful for booting a kernel manually, for example from the edk2 file browser, or recovering from a lost or corrupted bootloader configuration without having to supply the correct root= argument or load an initrd from the grub shell. Finally, it allows systems that otherwise need no initrd to discover their root partition through DPS without introducing an early userspace environment solely for that lookup. The implementation follows these rules: - GPT partition type UUIDs are used for automatic discovery policy only. No root=PARTTYPEUUID=xxx cmdline option or similar syntax is added. - An initramfs providing an early userspace init, a root= command-line option, or a root device supplied by the boot loader takes precedence. Existing working boot configurations therefore retain their current behaviour. Automatic discovery triggers only when booting without any of these, where the kernel would otherwise panic because no root device was specified. - As required by DPS, discovery is restricted to the disk containing the active EFI System Partition, identified through the LoaderDevicePartUUID EFI variable. This avoids selecting a root partition on another disk, such as a potentially malicious USB thumb drive. - If several eligible partitions have the selected type, the first match in block-device enumeration order is used. - The native architecture's root partition type takes precedence. Where the kernel supports compatible 32-bit userspace, its root partition type is accepted as a fallback. - Partitions carrying the DPS no-auto attribute are excluded. - The DPS read-only attribute is intentionally not enforced. The kernel already mounts the root filesystem read-only by default and if the command line requests rw, it takes precedence over the DPS attribute. User space remains responsible for deciding whether a discovered root should later be remounted read-write based on DPS metadata and local policy. Patch 1 retains GPT partition type UUIDs in partition metadata for early block lookup. Patch 2 defines the architecture-specific DPS root partition type UUIDs and the derived DPS_ROOT_AUTO_DISCOVERY symbol in Kconfig. Patch 3 factors out lookup_root_device() so initial root lookup and rootwait retries share the same lookup policy. Patch 4 implements DPS root discovery through early_lookup_dps_root() and integrates it into the root mount path. Patch 5 excludes partitions marked no-auto. Patch 6 adds the compatible 32-bit root partition type UUID as a fallback when no partition with the native type UUID can be found. Finally, patch 7 documents automatic root discovery. Tested with the Linux EFI stub [3] and with GRUB [4], which both expose the LoaderDevicePartUUID EFI variable. [1] The Discoverable Partitions Specification (DPS) Link: https://uapi-group.org/specifications/specs/discoverable_partitions_specification/ [2] systemd-gpt-auto-generator Link: https://www.freedesktop.org/software/systemd/man/latest/systemd-gpt-auto-generator.html [3] commit 0f7d63d9a725 ("efi/libstub: add initial Boot Loader Interface support") Link: https://git.kernel.org/torvalds/c/0f7d63d9a725 [4] GRUB -- ยง16.20 bli Link: https://www.gnu.org/software/grub/manual/grub/html_node/bli_005fmodule.html Signed-off-by: Vincent Mailhol --- Changes in v2: - Remove all architectures which do not have CONFIG_EFI. - Replace the per-architecture UUID headers with Kconfig definitions. - Move most of the DPS lookup logic to block/early-lookup.c. - Bail out if ROOT_DEV already exists. - Hold the disk's open_mutex during lookup so partition scanning finishes before reporting -ENODEV. This is a prerequisite for the next two changes. - Do an early abort when early_lookup_dps_root() returns -ENODEV. - Add the secondary partition type UUID as a fallback. - Small tweaks in log messages. - Documentation is updated accordingly. Link to v1: https://lore.kernel.org/r/20260615-discoverable-root_partitions-v1-0-39c78fac42e2@kernel.org --- Vincent Mailhol (7): block: store GPT partition type UUID init: add DPS root partition type UUID definitions init: factor out root device lookup into lookup_root_device() init: discover root by DPS partition type UUID block: skip partitions with DPS no-auto GPT attribute init: add secondary DPS root partition type UUID docs: document discoverable root partitions Documentation/admin-guide/discoverable-root.rst | 40 ++++++++ Documentation/admin-guide/index.rst | 1 + Documentation/admin-guide/kernel-parameters.txt | 5 + block/early-lookup.c | 119 +++++++++++++++++++++++- block/partitions/efi.c | 2 + include/linux/blkdev.h | 15 +++ init/Kconfig | 21 +++++ init/do_mounts.c | 44 +++++++-- 8 files changed, 234 insertions(+), 13 deletions(-) --- base-commit: 21a7f44fd0765fcc5194130b28767786eba1d1e7 change-id: 20260611-discoverable-root_partitions-bdacbada570d Best regards, -- Vincent Mailhol