Previously, probe_gpt_sector_size_mismatch() would bail out early when the GPT sector size matched the device sector size. However, some devices (e.g. certain CD-ROM drives) do not support kernel partition scanning even when sector sizes match. In that case, the kernel still cannot parse the partition table, and we need to set up a loop device to expose the partitions — just as we do for the sector size mismatch case. Check blockdev_partscan_enabled() when sector sizes match, and only skip the boot partition check if partition scanning is actually supported. Also rename the function, udev property, and log messages to reflect the broader scope: - probe_gpt_sector_size_mismatch() -> probe_gpt_boot_disk_needs_loop() - ID_PART_GPT_AUTO_ROOT_DISK_SECTOR_SIZE_MISMATCH -> ID_PART_GPT_AUTO_ROOT_DISK_NEEDS_LOOP
99 lines
5.6 KiB
Plaintext
99 lines
5.6 KiB
Plaintext
# SPDX-License-Identifier: LGPL-2.1-or-later
|
|
#
|
|
# This file is part of systemd.
|
|
#
|
|
# systemd is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU Lesser General Public License as published by
|
|
# the Free Software Foundation; either version 2.1 of the License, or
|
|
# (at your option) any later version.
|
|
|
|
ACTION=="remove", GOTO="systemd_end"
|
|
|
|
SUBSYSTEM=="tty", KERNEL=="tty[a-zA-Z]*|hvc*|xvc*|hvsi*|ttysclp*|sclp_line*|3270/tty[0-9]*", TAG+="systemd"
|
|
# Exclude 8250 serial ports with a zero IO port, as they are not usable until "setserial /dev/ttySxxx port …" is invoked.
|
|
SUBSYSTEM=="tty", KERNEL=="ttyS*", DRIVERS=="serial8250", ATTR{port}=="0x0", ATTR{iomem_base}=="0x0", ENV{SYSTEMD_READY}="0"
|
|
KERNEL=="vport*", TAG+="systemd"
|
|
|
|
SUBSYSTEM=="ptp", TAG+="systemd"
|
|
|
|
SUBSYSTEM=="mtd", TAG+="systemd"
|
|
|
|
SUBSYSTEM=="ubi", TAG+="systemd"
|
|
|
|
SUBSYSTEM=="block", TAG+="systemd"
|
|
|
|
# When a dm device is first created, it's just an empty container. Ignore it.
|
|
# DM_NAME is not set in this case, but it's set on spurious "add" events that occur later.
|
|
SUBSYSTEM=="block", ACTION=="add", KERNEL=="dm-*", ENV{DM_NAME}!="?*", ENV{SYSTEMD_READY}="0"
|
|
|
|
# DM_UDEV_DISABLE_OTHER_RULES_FLAG==1 means that the device shouldn't be probed.
|
|
# Import previous SYSTEMD_READY state.
|
|
SUBSYSTEM=="block", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", ENV{SYSTEMD_READY}=="", IMPORT{db}="SYSTEMD_READY"
|
|
|
|
# Ignore encrypted devices with no identified superblock on it, since
|
|
# we are probably still calling mke2fs or mkswap on it.
|
|
SUBSYSTEM=="block", ENV{DM_UUID}=="CRYPT-*", ENV{ID_PART_TABLE_TYPE}=="", ENV{ID_FS_USAGE}=="", ENV{SYSTEMD_READY}="0"
|
|
|
|
# Ignore raid devices that are not yet assembled and started
|
|
SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", KERNEL=="md*", TEST!="md/array_state", ENV{SYSTEMD_READY}="0"
|
|
SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", KERNEL=="md*", ATTR{md/array_state}=="|clear|inactive", ENV{SYSTEMD_READY}="0"
|
|
|
|
# Ignore loop devices that don't have any file attached
|
|
SUBSYSTEM=="block", KERNEL=="loop[0-9]*", ENV{DEVTYPE}=="disk", TEST!="loop/backing_file", ENV{SYSTEMD_READY}="0"
|
|
|
|
# Ignore nbd devices until the PID file exists (which signals a connected device)
|
|
SUBSYSTEM=="block", KERNEL=="nbd*", ENV{DEVTYPE}=="disk", TEST!="pid", ENV{SYSTEMD_READY}="0"
|
|
|
|
# We need a hardware independent way to identify network devices. We
|
|
# use the /sys/subsystem/ path for this. Kernel "bus" and "class" names
|
|
# should be treated as one namespace, like udev handles it. This is mostly
|
|
# just an identification string for systemd, so whether the path actually is
|
|
# accessible or not does not matter as long as it is unique and in the
|
|
# filesystem namespace.
|
|
|
|
SUBSYSTEM=="net", KERNEL!="lo", TAG+="systemd", ENV{SYSTEMD_ALIAS}+="/sys/subsystem/net/devices/$name"
|
|
SUBSYSTEM=="bluetooth", TAG+="systemd", ENV{SYSTEMD_ALIAS}+="/sys/subsystem/bluetooth/devices/%k", \
|
|
ENV{SYSTEMD_WANTS}+="bluetooth.target", ENV{SYSTEMD_USER_WANTS}+="bluetooth.target"
|
|
|
|
ENV{ID_SMARTCARD_READER}=="?*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="smartcard.target", ENV{SYSTEMD_USER_WANTS}+="smartcard.target"
|
|
TAG=="security-device", TAG+="systemd"
|
|
SUBSYSTEM=="sound", KERNEL=="controlC*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="sound.target", ENV{SYSTEMD_USER_WANTS}+="sound.target"
|
|
|
|
SUBSYSTEM=="printer", TAG+="systemd", ENV{SYSTEMD_WANTS}+="printer.target", ENV{SYSTEMD_USER_WANTS}+="printer.target"
|
|
SUBSYSTEM=="usb", KERNEL=="lp*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="printer.target", ENV{SYSTEMD_USER_WANTS}+="printer.target"
|
|
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_USB_INTERFACES}=="*:0701??:*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="printer.target", ENV{SYSTEMD_USER_WANTS}+="printer.target"
|
|
|
|
SUBSYSTEM=="udc", TAG+="systemd", ENV{SYSTEMD_WANTS}+="usb-gadget.target"
|
|
|
|
# Apply sysctl variables to network devices (and only to those) as they appear.
|
|
ACTION=="add", SUBSYSTEM=="net", KERNEL!="lo", RUN+="{{LIBEXECDIR}}/systemd-sysctl --prefix=/net/ipv4/conf/$name --prefix=/net/ipv4/neigh/$name --prefix=/net/ipv6/conf/$name --prefix=/net/ipv6/neigh/$name"
|
|
|
|
{% if ENABLE_BACKLIGHT %}
|
|
# Pull in backlight save/restore for all backlight devices and
|
|
# keyboard backlights
|
|
SUBSYSTEM=="backlight", TAG+="systemd", IMPORT{builtin}="path_id", ENV{SYSTEMD_WANTS}+="systemd-backlight@backlight:$name.service"
|
|
SUBSYSTEM=="leds", KERNEL=="*kbd_backlight*", TAG+="systemd", IMPORT{builtin}="path_id", ENV{SYSTEMD_WANTS}+="systemd-backlight@leds:$name.service"
|
|
{% endif %}
|
|
|
|
# Pull in rfkill save/restore for all rfkill devices
|
|
SUBSYSTEM=="rfkill", ENV{SYSTEMD_RFKILL}="1"
|
|
SUBSYSTEM=="rfkill", IMPORT{builtin}="path_id"
|
|
SUBSYSTEM=="misc", KERNEL=="rfkill", TAG+="systemd", ENV{SYSTEMD_WANTS}+="systemd-rfkill.socket"
|
|
|
|
# Asynchronously mount file systems implemented by these modules as soon as they are loaded.
|
|
SUBSYSTEM=="module", KERNEL=="fuse", TAG+="systemd", ENV{SYSTEMD_WANTS}+="sys-fs-fuse-connections.mount"
|
|
SUBSYSTEM=="module", KERNEL=="configfs", TAG+="systemd", ENV{SYSTEMD_WANTS}+="sys-kernel-config.mount"
|
|
|
|
# Pull in tpm2.target whenever the full-blown /dev/tpmrm* shows up (and also
|
|
# tag the version without resource manager, so that we can sync on it).
|
|
SUBSYSTEM=="tpmrm", KERNEL=="tpmrm[0-9]*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="tpm2.target"
|
|
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", \
|
|
ENV{SYSTEMD_WANTS}+="systemd-loop@.service"
|
|
|
|
LABEL="systemd_end"
|