]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: only trigger the boot-disk loop device for optical drives
authorDaan De Meyer <daan@amutable.com>
Mon, 15 Jun 2026 07:55:22 +0000 (07:55 +0000)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 15 Jun 2026 14:00:39 +0000 (16:00 +0200)
probe_gpt_boot_disk_needs_loop() sets ID_PART_GPT_AUTO_ROOT_DISK_NEEDS_LOOP
for any whole disk that holds the boot ESP/XBOOTLDR but whose partition table
the kernel cannot parse. Until now the udev rule turned that into a
systemd-loop@.service for every block device.

That is too broad: device-mapper devices also report kernel partition
scanning as disabled, but their partitions are managed in userspace by kpartx
(see 66-kpartx.rules). Setting up a loop device on top of them re-exposes the
same partition table a second time and only causes trouble.

Restrict the rule to optical drives, the one class that genuinely needs a
kernel-side loop device (El Torito GPT sector size mismatch, or drives that do
not support partition scanning) and that has no userspace partition manager of
its own.

Co-developed-by: Claude Fable 5 <noreply@anthropic.com>
rules.d/99-systemd.rules.in

index 98f483503e2119f7874e390133defac78471dffe..e7b6947e8137c4a67d390b76d43d507b7871c1ff 100644 (file)
@@ -90,9 +90,12 @@ SUBSYSTEM=="tpmrm", KERNEL=="tpmrm[0-9]*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="
 SUBSYSTEM=="tpm", KERNEL=="tpm[0-9]*", TAG+="systemd"
 
 # If the kernel cannot parse the GPT partition table on the boot disk (e.g. due to a sector size
-# mismatch on a CD-ROM booted via El Torito, or because the device does not support partition
-# scanning), trigger a loop device to expose the partitions.
-SUBSYSTEM=="block", ENV{ID_PART_GPT_AUTO_ROOT_DISK_NEEDS_LOOP}=="1", \
+# mismatch on a CD-ROM booted via El Torito, or because the optical drive does not support partition
+# scanning), trigger a loop device to expose the partitions. Restrict this to optical drives: other
+# block devices that lack kernel partition scanning (most notably device-mapper) rely on userspace
+# partition managers such as kpartx (see 66-kpartx.rules), and a competing loop device would only cause
+# trouble.
+SUBSYSTEM=="block", ENV{ID_CDROM}=="1", ENV{ID_PART_GPT_AUTO_ROOT_DISK_NEEDS_LOOP}=="1", \
   ENV{SYSTEMD_WANTS}+="systemd-loop@.service"
 
 LABEL="systemd_end"