diff options
author | David Teigland <teigland@redhat.com> | 2021-03-26 11:39:05 -0500 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2021-03-31 14:06:19 -0500 |
commit | 9388ca6e90c304b27c8cdf237dcab416fe8c34bd (patch) | |
tree | 0d2d4e89c5cde9327c244f511d046f97898766a4 | |
parent | e719522e29d68a3d51c4c53b9ee8be81fce8d15d (diff) | |
download | lvm2-dev-dct-pvscan-list-4.tar.gz |
new udev and systemd autoactivationdev-dct-pvscan-list-4
udev rule calls pvscan directly which indicates if the
VG can be activated. If so, the lvm-vgchange service
is run, which runs vgchange -aay.
-rw-r--r-- | scripts/lvm-vgchange.service | 12 | ||||
-rw-r--r-- | udev/69-dm-lvm.rules | 77 |
2 files changed, 89 insertions, 0 deletions
diff --git a/scripts/lvm-vgchange.service b/scripts/lvm-vgchange.service new file mode 100644 index 000000000..bf7162690 --- /dev/null +++ b/scripts/lvm-vgchange.service @@ -0,0 +1,12 @@ +[Unit] +Description=LVM event activation of VG %i +Documentation=man:vgchange(8) +DefaultDependencies=no +StartLimitIntervalSec=0 +Before=shutdown.target +Conflicts=shutdown.target + +[Service] +Type=oneshot +RemainAfterExit=no +ExecStart=@SBINDIR@/lvm vgchange -aay %i diff --git a/udev/69-dm-lvm.rules b/udev/69-dm-lvm.rules new file mode 100644 index 000000000..29a2070b3 --- /dev/null +++ b/udev/69-dm-lvm.rules @@ -0,0 +1,77 @@ +# Copyright (C) 2012,2021 Red Hat, Inc. All rights reserved. +# +# This file is part of LVM2. + +# Udev rules for 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" + +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" +ENV{LVM_MD_PV_ACTIVATED}!="1", ENV{SYSTEMD_READY}="0" +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" +ENV{LVM_LOOP_PV_ACTIVATED}!="1", ENV{SYSTEMD_READY}="0" +GOTO="lvm_end" + +LABEL="next" +ACTION!="add", GOTO="lvm_end" + +LABEL="lvm_scan" + +ENV{SYSTEMD_READY}="1" + +# 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 +# the lvm-vgchange service is started which runs +# vgchange -aay <vgname>. +# +# pvscan only reads the single device specified, +# and uses temp files under /run/lvm to check if +# other PVs in the VG are present. + +IMPORT{program}="/usr/sbin/lvm pvscan --cache --listvg --checkcomplete --vgonline --udevoutput --journal=output $env{DEVNAME}" +ENV{LVM_VG_NAME_COMPLETE}=="?*", RUN+="/usr/bin/systemctl start lvm-vgchange@$env{LVM_VG_NAME_COMPLETE}.service" +GOTO="lvm_end" + +LABEL="lvm_end" |