Skip to content

Commit 4317d29

Browse files
committed
Partition: Mask DM/LVM rules, don't stop udev
While partitions are being created and wiped, mask udev rules related to Device Mapper and LVM to prevent partitions from being activated automatically. This replaces the previous solution of completely stopping udev during these operations, which prevented the use of device names created by the persistent storage rules. Also dereference device names in the check in del_pre_ks Fixes #105.
1 parent 5641f94 commit 4317d29

File tree

2 files changed

+30
-17
lines changed

2 files changed

+30
-17
lines changed

src/main/perl/Partition.pm

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -596,10 +596,12 @@ sub del_pre_ks
596596
# This will make the partitioning phase much faster.
597597
# Partitions are also wiped before they are removed.
598598
print <<EOF;
599-
if grep -q $self->{devname} /proc/partitions
600-
then
601-
wipe_metadata $path
602-
parted $devpath -s rm $n
599+
DISKDEV="\$(readlink -f $devpath)"
600+
if [[ "\$DISKDEV" =~ "/dev/" ]]; then
601+
if grep -q \${DISKDEV#/dev/} /proc/partitions; then
602+
wipe_metadata $path
603+
parted $devpath -s rm $n
604+
fi
603605
fi
604606
EOF
605607
}
@@ -625,10 +627,20 @@ sub create_pre_ks
625627
# make sure this never matches on anything else
626628
$extended_txt .= "_no_msdos_label" if ($self->{holding_dev}->{label} ne MSDOS);
627629

628-
# Avoid LVM/mdadm/etc. autodiscovery kicking in after the partition has
629-
# been created
630-
my $pause_udev = $self->{anaconda_version} >= ANACONDA_VERSION_EL_7_0 ? "udevadm control --stop-exec-queue" : "";
631-
my $unpause_udev = $self->{anaconda_version} >= ANACONDA_VERSION_EL_7_0 ? "udevadm control --start-exec-queue" : "";
630+
# Avoid LVM/mdadm/etc. autodiscovery kicking in after the partition has been created
631+
my $mask_udev_rules = $self->{anaconda_version} >= ANACONDA_VERSION_EL_7_0 ? <<EOF
632+
echo "Masking DM/LVM udev rules"
633+
find /usr/lib/udev/rules.d/ -type f -name \*.rules | grep -E '(dm|lvm)' | xargs basename -a | xargs -I@ touch /etc/udev/rules.d/@
634+
udevadm control --reload-rules && udevadm trigger
635+
EOF
636+
: "";
637+
my $unmask_udev_rules = $self->{anaconda_version} >= ANACONDA_VERSION_EL_7_0 ? <<EOF
638+
echo "Unmasking DM/LVM udev rules and waiting for devices to settle"
639+
rm -f /etc/udev/rules.d/*.rules
640+
udevadm control --reload-rules && udevadm trigger
641+
udevadm settle
642+
EOF
643+
: "";
632644

633645
print <<EOF;
634646
if ! grep -q '$self->{devname}\$' /proc/partitions
@@ -674,9 +686,11 @@ EOF
674686
} else {
675687
$end_txt = "end=\$((begin + $size * (1024 * 1024 / sectsize) - 1))";
676688
}
689+
677690
print <<EOF;
678691
$end_txt
679-
$pause_udev
692+
\n$mask_udev_rules
693+
680694
parted $disk -s -- u s mkpart $self->{type} \$begin \$end
681695
while true; do
682696
sleep 1
@@ -691,10 +705,7 @@ EOF
691705
EOF
692706
}
693707

694-
print <<EOF;
695-
$unpause_udev
696-
udevadm settle
697-
EOF
708+
print "\n$unmask_udev_rules\n";
698709

699710
my @flags = keys(%{$self->{flags}});
700711
if ( @flags > 0 ) {

src/test/resources/regexps/fs_vol1_del

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ fs_vol1_del
88
^lvm vgreduce --removemissing vg0 &&$
99
^lvm vgremove vg0 && \($
1010
^lvm pvremove /dev/sdb1$
11-
^if grep -q sdb1 /proc/partitions$
12-
^then$
13-
^\s{4}wipe_metadata /dev/sdb1$
14-
^\s{4}parted /dev/sdb -s rm 1$
11+
^DISKDEV=\"\$\(readlink -f /dev/sdb\)\"$
12+
^if \[\[ \"\$DISKDEV\" =~ \"/dev/\" \]\]; then$
13+
^\s{4}if grep -q \$\{DISKDEV#/dev/\} /proc/partitions; then$
14+
^\s{8}wipe_metadata /dev/sdb1$
15+
^\s{8}parted /dev/sdb -s rm 1$
16+
^\s{4}fi$
1517
^fi$
1618
^\)$

0 commit comments

Comments
 (0)