[lvm-devel] [PATCH] dracut: do not allow lvm to effect metadata changes
Mike Snitzer
snitzer at redhat.com
Mon Nov 30 22:35:05 UTC 2009
mkinitrd produced an environment that was read-only. As such lvm
commands that were executed by an initrd could not effect changes to LVM
VG metadata (because /var/lock/lvm was not writable). Within an initrd
lvm commands always needed to use --ignorelockingfailure to allow
proper activation of the root LV.
However, Dracut provides a writable /var so it must take steps to
prevent lvm commands from making metadata changes (either directly
through lvm commands or indirectly with monitoring via dmeventd or
the lvm polldaemon that can fork from vgchange).
This patch provides the following changes:
* impose read-only locking for all lvm commands via the initramfs'
lvm.conf (locking_type = 4)
- the use of sed is placeholder "hack" until lvm2 provides a proper
tool for changing lvm.conf
- lvm_scan.sh should run lvm commands with --ignorelockingfailure to
re-use lvm's existing initrd-specific logic; future lvm2 changes
will split this flag out into various new command-line switches
* do not install dmeventd or its libraries into the initramfs
- no monitoring should be started from within initramfs
- NOTE: the same should apply to 90dmraid/install
* remove (incorrect) custom block device 'types'
- the correct types would be: '[ "blkext", 1 , "cciss0", 16 ]'
- but lvm2 (>= 2.02.52) already properly supports both 'blkext' and
'cciss' (including cciss0 -> cciss7)
Signed-off-by: Mike Snitzer <snitzer at redhat.com>
---
diff --git a/modules.d/90lvm/install b/modules.d/90lvm/install
index 56e2eb0..2d622f5 100755
--- a/modules.d/90lvm/install
+++ b/modules.d/90lvm/install
@@ -1,23 +1,17 @@
#!/bin/bash
inst lvm
-inst dmeventd
-
-if ldd $(which lvm) | grep -q lib64; then
- LIBDIR="/lib64"
-else
- LIBDIR="/lib"
-fi
inst_rules "$moddir/64-lvm.rules" 64-lvm.rules
if [[ $hostonly ]] || [[ $lvmconf = "yes" ]]; then
- [ -f /etc/lvm/lvm.conf ] && inst /etc/lvm/lvm.conf
+ if [ -f /etc/lvm/lvm.conf ]; then
+ inst /etc/lvm/lvm.conf
+ # FIXME: near-term hack to establish read-only locking;
+ # use command-line lvm.conf editor once it is available
+ sed -i -e 's/\(^[[:space:]]*\)locking_type[[:space:]]*=[[:space:]]*[[:digit:]]/\1locking_type = 4/' ${initdir}/etc/lvm/lvm.conf
+ fi
fi
-for i in $(ls /$LIBDIR/libdevmapper-event*.so 2>/dev/null); do
- dracut_install $i
-done
-
inst_rules 10-dm.rules 13-dm-disk.rules 95-dm-notify.rules 11-dm-lvm.rules
inst "$moddir/lvm_scan.sh" /sbin/lvm_scan
diff --git a/modules.d/90lvm/lvm_scan.sh b/modules.d/90lvm/lvm_scan.sh
index 73ba845..3bf858a 100755
--- a/modules.d/90lvm/lvm_scan.sh
+++ b/modules.d/90lvm/lvm_scan.sh
@@ -23,14 +23,17 @@ if [ ! -e /etc/lvm/lvm.conf ]; then
printf '"a|^/dev/%s$|", ' $dev;
done;
echo '"r/.*/" ]';
- echo 'types = [ "blkext", 1024 , "cciss0", 1024 ]'
echo '}';
+ # establish read-only locking
+ echo 'global {';
+ echo ' locking_type = 4';
+ echo '}';
} > /etc/lvm/lvm.conf
lvmwritten=1
fi
info "Scanning devices $lvmdevs for LVM volume groups $VGS"
-lvm vgscan 2>&1 | vinfo
-lvm vgchange -ay --monitor n $VGS 2>&1 | vinfo
+lvm vgscan --ignorelockingfailure 2>&1 | vinfo
+lvm vgchange -ay --ignorelockingfailure --monitor n $VGS 2>&1 | vinfo
if [ "$lvmwritten" ]; then
rm -f /etc/lvm/lvm.conf
ln -s /sbin/lvm-cleanup /pre-pivot/30-lvm-cleanup.sh 2>/dev/null
More information about the lvm-devel
mailing list