mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
e7c8a82506
Since 67722b3123
, we have a new mechanism
to run the autoactivation from udev. With this change, we also replaced
the way the LVM autoactivation service is instantiatiated - instead of
setting the SYSTEM_WANTS udev variable (which systemd read and then
instantiated the service), we're now directly instantiating the
transient 'lvm-activate-<vgname>' service by calling systemd-run.
As such, we don't need to bother with setting the SYSTEMD_READY variable
for foreign devices anymore (in this case, MD and loop devices on top of
which there's a PV).
Before, we set the SYSTEMD_READY variable to make sure that the SYSTEMD_WANTS
is applied correctly - the service instantiation was edge-triggered by
flipping the SYSTEMD_READY from 0 to 1 and at the same time having the
SYSTEMD_WANTS variable set to the service name to instantiate. We're
using systemd-run now so this condition does not apply anymore.
Also, it was not completely correct to set SYSTEMD_READY for foreign
devices because there might be cases where this could cause issues,
see also https://github.com/lvmteam/lvm2/issues/94.
84 lines
3.2 KiB
Plaintext
84 lines
3.2 KiB
Plaintext
# Copyright (C) 2012,2021 Red Hat, Inc. All rights reserved.
|
|
#
|
|
# This file is part of LVM.
|
|
#
|
|
# This rule requires blkid to be called on block devices before so only devices
|
|
# used as LVM PVs are processed (ID_FS_TYPE="LVM2_member").
|
|
|
|
SUBSYSTEM!="block", GOTO="lvm_end"
|
|
(LVM_EXEC_RULE)
|
|
|
|
ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", GOTO="lvm_end"
|
|
|
|
# Only process devices already marked as a PV - this requires blkid to be called before.
|
|
ENV{ID_FS_TYPE}!="LVM2_member", GOTO="lvm_end"
|
|
ENV{DM_MULTIPATH_DEVICE_PATH}=="1", GOTO="lvm_end"
|
|
ACTION=="remove", GOTO="lvm_end"
|
|
|
|
# Create /dev/disk/by-id/lvm-pv-uuid-<PV_UUID> symlink for each PV
|
|
ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-id/lvm-pv-uuid-$env{ID_FS_UUID_ENC}"
|
|
|
|
# If the PV is a special device listed below, scan only if the device is
|
|
# properly activated. These devices are not usable after an ADD event,
|
|
# but they require an extra setup and they are ready after a CHANGE event.
|
|
# Also support coldplugging with ADD event but only if the device is already
|
|
# properly activated.
|
|
# This logic should be eventually moved to rules where those particular
|
|
# devices are processed primarily (MD and loop).
|
|
|
|
# DM device:
|
|
KERNEL!="dm-[0-9]*", GOTO="next"
|
|
ENV{DM_UDEV_PRIMARY_SOURCE_FLAG}=="1", ENV{DM_ACTIVATION}=="1", GOTO="lvm_scan"
|
|
GOTO="lvm_end"
|
|
|
|
# MD device:
|
|
LABEL="next"
|
|
KERNEL!="md[0-9]*", GOTO="next"
|
|
IMPORT{db}="LVM_MD_PV_ACTIVATED"
|
|
ACTION=="add", ENV{LVM_MD_PV_ACTIVATED}=="1", GOTO="lvm_scan"
|
|
ACTION=="change", ENV{LVM_MD_PV_ACTIVATED}!="1", TEST=="md/array_state", ENV{LVM_MD_PV_ACTIVATED}="1", GOTO="lvm_scan"
|
|
ACTION=="add", KERNEL=="md[0-9]*p[0-9]*", GOTO="lvm_scan"
|
|
GOTO="lvm_end"
|
|
|
|
# Loop device:
|
|
LABEL="next"
|
|
KERNEL!="loop[0-9]*", GOTO="next"
|
|
ACTION=="add", ENV{LVM_LOOP_PV_ACTIVATED}=="1", GOTO="lvm_scan"
|
|
ACTION=="change", ENV{LVM_LOOP_PV_ACTIVATED}!="1", TEST=="loop/backing_file", ENV{LVM_LOOP_PV_ACTIVATED}="1", GOTO="lvm_scan"
|
|
GOTO="lvm_end"
|
|
|
|
LABEL="next"
|
|
ACTION!="add", GOTO="lvm_end"
|
|
|
|
LABEL="lvm_scan"
|
|
|
|
# pvscan will check if this device completes a VG,
|
|
# i.e. all PVs in the VG are now present with the
|
|
# arrival of this PV. If so, it prints to stdout:
|
|
# LVM_VG_NAME_COMPLETE='foo'
|
|
#
|
|
# When the VG is complete it can be activated, so
|
|
# vgchange -aay <vgname> is run. It is run via
|
|
# systemd since it can take longer to run than
|
|
# udev wants to block when processing rules.
|
|
# (if there are hundreds of LVs to activate,
|
|
# the vgchange can take many seconds.)
|
|
#
|
|
# pvscan only reads the single device specified,
|
|
# and uses temp files under /run/lvm to check if
|
|
# other PVs in the VG are present.
|
|
#
|
|
# If event_activation=0 in lvm.conf, this pvscan
|
|
# (using checkcomplete) will do nothing, so that
|
|
# no event-based autoactivation will be happen.
|
|
#
|
|
# TODO: adjust the output of vgchange -aay so that
|
|
# it's better suited to appearing in the journal.
|
|
|
|
IMPORT{program}="(LVM_EXEC)/lvm pvscan --cache --listvg --checkcomplete --vgonline --autoactivation event --udevoutput --journal=output $env{DEVNAME}"
|
|
ENV{LVM_VG_NAME_COMPLETE}=="?*", RUN+="/usr/bin/systemd-run --no-block --property DefaultDependencies=no --unit lvm-activate-$env{LVM_VG_NAME_COMPLETE} (LVM_EXEC)/lvm vgchange -aay --autoactivation event $env{LVM_VG_NAME_COMPLETE}"
|
|
GOTO="lvm_end"
|
|
|
|
LABEL="lvm_end"
|
|
|