]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
mdraid: add rd_NO_MDADMCONF --mdadmconf --nomdadmconf
authorHarald Hoyer <harald@redhat.com>
Tue, 15 Sep 2009 07:00:13 +0000 (09:00 +0200)
committerHarald Hoyer <harald@redhat.com>
Tue, 15 Sep 2009 13:00:18 +0000 (15:00 +0200)
Copy /etc/mdadm.conf to initramfs (even for non-hostonly) if
mdadmconf="yes" is set in dracut.conf or --mdadmconf is specified on the
dracut command line.

This was done, because there seems _no_ sane way to autoassemble md raid
arrays.

also moved rd_NO_MD to an udev ENV

dracut
dracut.8
dracut.conf
modules.d/90mdraid/65-md-incremental-imsm.rules
modules.d/90mdraid/install
modules.d/90mdraid/mdadm_auto.sh [new file with mode: 0755]
modules.d/90mdraid/parse-md.sh
test/TEST-10-RAID/test.sh
test/TEST-12-RAID-DEG/create-root.sh
test/TEST-12-RAID-DEG/test.sh
test/TEST-14-IMSM/test.sh

diff --git a/dracut b/dracut
index d9fd8411c5a506d24f51dee06eba7e3d8f8739b0..a6705e3301daf319298f81810c82d92bd749c8f6 100755 (executable)
--- a/dracut
+++ b/dracut
@@ -45,6 +45,8 @@ Creates initial ramdisk images for preloading modules
   --no-kernel           Do not install kernel drivers and firmware files
   --strip               Strip binaries in the initramfs (default)
   --nostrip             Do not strip binaries in the initramfs
+  --mdadmconf           Include local /etc/mdadm.conf
+  --nomdadmconf         Do not include local /etc/mdadm.conf
   -h, --help            This message
   --debug               Output debug information of the build process
   -v, --verbose         Verbose output during the build process
@@ -78,6 +80,8 @@ while (($# > 0)); do
        --no-kernel) kernel_only="no"; no_kernel="yes";;
        --strip) do_strip_l="yes";;
        --nostrip) do_strip_l="no";;
+        --mdadmconf) mdadmconf_l="yes";;
+        --nomdadmconf) mdadmconf_l="no";;
        -h|--help) usage; exit 1 ;;
        --debug) debug="yes";;
        -v|--verbose) beverbose="yes";;
@@ -115,6 +119,7 @@ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH
 [[ $fw_dir_l ]] && fw_dir=$fw_dir_l
 [[ $do_strip_l ]] && do_strip=$do_strip_l
 [[ $hostonly_l ]] && hostonly=$hostonly_l
+[[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l
 [[ $dracutbasedir ]] || dracutbasedir=/usr/share/dracut
 [[ $fw_dir ]] || fw_dir=/lib/firmware
 [[ $do_strip ]] || do_strip=yes
@@ -163,7 +168,7 @@ chmod 755 "$initdir"
 
 export initdir hookdirs dsrc dracutmodules drivers \
     fw_dir drivers_dir debug beverbose no_kernel kernel_only \
-    add_drivers
+    add_drivers mdadmconf
 
 if [[ $kernel_only != yes ]]; then
     # Create some directory structure first
index c3c2f845ef4e7443c11e7a508eee078a92634b68..4370eff415f2c07a800290758e5b63e2ba42fc65 100644 (file)
--- a/dracut.8
+++ b/dracut.8
@@ -44,6 +44,12 @@ only install kernel drivers and firmware files
 .BR \-\-no-kernel
 do not install kernel drivers and firmware files
 .TP
+.BR \-\-mdadmconf
+include local /etc/mdadm.conf
+.TP
+.BR \-\-nomdadmconf
+do not include local /etc/mdadm.conf
+.TP
 .BR \-\-strip
 strip binaries in the initramfs (default)
 .TP
@@ -146,6 +152,9 @@ disable MD RAID detection
 .B rd_NO_MDIMSM
 no MD RAID for imsm/isw raids, use dmraid instead
 .TP
+.B rd_NO_MDADMCONF
+ignore mdadm.conf included in initramfs
+.TP
 .B rd_MD_UUID=<md uuid>
 only activate the raid sets with the given UUID
 
index 73d064fedec66081d8a3242b6ecf04476ded646d..ded37767719f1d5f4b382b80168d6e78b9004d67 100644 (file)
@@ -11,3 +11,7 @@
 
 # build initrd only to boot current hardware
 #hostonly="-h"
+#
+
+# install local /etc/mdadm.conf
+mdadmconf="yes"
index 883f80c85d988e88f3f46aa87a14a6c707766ce9..ca0ac70d229a6362fc25a3c828ebd572b7874fbc 100644 (file)
@@ -11,11 +11,14 @@ ENV{DEVTYPE}!="partition", \
 
 ENV{ID_FS_TYPE}=="isw_raid_member", ENV{rd_NO_MDIMSM}=="?*", GOTO="md_inc_end"
 
+ENV{rd_NO_MD}=="?*", GOTO="md_inc_end"
+
 TEST=="/tmp/.mdraid_start-%k", GOTO="md_inc_end"
 TEST=="/tmp/.mdraid_container-%k", GOTO="md_inc_end"
 
 KERNEL!="md*", IMPORT{program}="/sbin/mdadm --examine --export $tempnode"
 
+
 # UUID CHECK
 
 LABEL="do_md_inc"
@@ -41,6 +44,8 @@ ACTION=="add|change", \
        KERNEL=="md[0-9]*|md/*", \
        ENV{MD_LEVEL}!="container", \
        ENV{MD_CONTAINER}!="?*", \
+        ENV{rd_MDADMCONF}!="?*", \
+        ENV{rd_NO_MD}!="?*", \
        GOTO="do_raidstart"
 
 GOTO="end_raidstart"
@@ -63,6 +68,8 @@ ACTION=="add|change", \
        KERNEL=="md[0-9]*|md/*", \
        ENV{DEVTYPE}!="partition", \
        ENV{MD_LEVEL}=="container", \
+        ENV{rd_MDADMCONF}!="?*", \
+        ENV{rd_NO_MD}!="?*", \
        GOTO="do_container"
 
 GOTO="end_container"
index c2de3bbae68694f07828dee3c43e26f95280b0d2..84ab240e2c2a48e26dde5beaed63008ab05a26e2 100755 (executable)
@@ -21,7 +21,7 @@ if ! mdadm -Q -e imsm /dev/null &> /dev/null; then
     inst_hook pre-trigger 30 "$moddir/md-noimsm.sh"
 fi
 
-if [[ $hostonly ]]; then 
+if [[ $hostonly ]] || [[ $mdadmconf = "yes" ]]; then 
     [ -f /etc/mdadm/mdadm.conf ] && inst /etc/mdadm/mdadm.conf /etc/mdadm.conf
     [ -f /etc/mdadm.conf ] && inst /etc/mdadm.conf
 fi
@@ -33,6 +33,7 @@ fi
 
 inst "$moddir/mdraid_start.sh" /sbin/mdraid_start
 inst "$moddir/mdcontainer_start.sh" /sbin/mdcontainer_start
+inst "$moddir/mdadm_auto.sh" /sbin/mdadm_auto
 inst_hook pre-trigger 30 "$moddir/parse-md.sh"
 inst_hook pre-pivot 30 "$moddir/mdraid-cleanup.sh"
 inst_hook pre-pivot 31 "$moddir/mdraid-cleanup.sh"
diff --git a/modules.d/90mdraid/mdadm_auto.sh b/modules.d/90mdraid/mdadm_auto.sh
new file mode 100755 (executable)
index 0000000..9e96b00
--- /dev/null
@@ -0,0 +1,7 @@
+#!/bin/sh
+. /lib/dracut-lib.sh
+
+info "Autoassembling MD Raid"    
+udevadm control --stop-exec-queue
+/sbin/mdadm -As --auto=yes --run 2>&1 | vinfo
+udevadm control --start-exec-queue
index 1032963b7bb07de89204e2cf3fe700b52ca43e32..a2cf599e05330519a576fd695e15936e8889ba67 100644 (file)
@@ -1,6 +1,6 @@
 if getarg rd_NO_MD; then
     info "rd_NO_MD: removing MD RAID activation"
-    rm /etc/udev/rules.d/65-md-incremental*.rules
+    udevadm control --property=rd_NO_MD=1
 else
     MD_UUID=$(getargs rd_MD_UUID=)
 
@@ -24,6 +24,12 @@ else
     fi
 fi
 
+
+if [ -e /etc/mdadm.conf ] && ! getarg rd_NO_MDADMCONF; then
+    udevadm control --property=rd_MDADMCONF=1
+    rm -f /pre-pivot/*mdraid-cleanup.sh
+fi
+
 if getarg rd_NO_MDIMSM; then
     info "rd_NO_MDIMSM: no MD RAID for imsm/isw raids"
     udevadm control --property=rd_NO_MDIMSM=1
index 1b9e931d79e2a4425ea763126e9ffa21504efa79..7d793d3c82c8a16fe2160ab04a2ca52399b3e0fd 100755 (executable)
@@ -47,6 +47,7 @@ test_setup() {
     $basedir/dracut -l -i overlay / \
        -m "dash crypt lvm mdraid udev-rules base rootfs-block kernel-modules" \
        -d "ata_piix ext2 sd_mod" \
+        --nomdadmconf \
        -f initramfs.makeroot $KVERSION || return 1
     rm -rf overlay
     # Invoke KVM and/or QEMU to actually create the target filesystem.
index bf944187e9009ad229a0804499b69a03c824ff27..b21a060271ee3dcc8ddead9f76c90cc50c867276 100755 (executable)
@@ -30,7 +30,9 @@ cp -a -t /sysroot /source/* && \
 umount /sysroot && \
 lvm lvchange -a n /dev/dracut/root && \
 cryptsetup luksClose /dev/mapper/dracut_crypt_test && \
+{ mdadm -W /dev/md0 || : ;} && \
 mdadm /dev/md0 --fail /dev/sda2 --remove /dev/sda2 && \
+{ mdadm -W /dev/md0 || : ;} && \
 {
 /sbin/mdadm --detail --export /dev/md0 > /tmp/mduuid ;
 . /tmp/mduuid;
index 94ef50b5b5e88c6b3859237c711b4d082b851fbd..25c9634140c43d4161a9dfa50e0bc90894077c78 100755 (executable)
@@ -27,6 +27,8 @@ test_run() {
     echo "MD_UUID=$MD_UUID"
 
     client_run || return 1
+    
+    client_run rd_NO_MDADMCONF || return 1
 
     client_run rd_NO_LVM && return 1
 
@@ -36,13 +38,13 @@ test_run() {
 
     client_run rd_LVM_VG=dummy1 rd_LVM_VG=dracut rd_LVM_VG=dummy2 || return 1
 
-    client_run rd_MD_UUID=failme && return 1
+    client_run rd_MD_UUID=failme rd_NO_MDADMCONF && return 1
 
     client_run rd_NO_MD && return 1
 
-    client_run rd_MD_UUID=$MD_UUID || return 1
+    client_run rd_MD_UUID=$MD_UUID rd_NO_MDADMCONF || return 1
 
-    client_run rd_MD_UUID=dummy1 rd_MD_UUID=$MD_UUID rd_MD_UUID=dummy2 || return 1
+    client_run rd_MD_UUID=dummy1 rd_MD_UUID=$MD_UUID rd_MD_UUID=dummy2 rd_NO_MDADMCONF|| return 1
 
     return 0
 }
@@ -50,7 +52,7 @@ test_run() {
 test_setup() {
     # Create the blank file to use as a root filesystem
     dd if=/dev/zero of=root.ext2 bs=1M count=20
-
     kernel=$KVERSION
     # Create what will eventually be our root filesystem onto an overlay
     (
@@ -88,12 +90,15 @@ test_setup() {
        -append "root=/dev/dracut/root rw rootfstype=ext2 quiet console=ttyS0,115200n81" \
        -initrd initramfs.makeroot  || return 1
     grep -m 1 -q dracut-root-block-created root.ext2 || return 1
+    eval $(grep --binary-files=text -m 1 MD_UUID root.ext2)
     (
        initdir=overlay
        . $basedir/dracut-functions
        dracut_install poweroff shutdown
        inst_simple ./hard-off.sh /emergency/01hard-off.sh
        inst ./cryptroot-ask /sbin/cryptroot-ask
+        mkdir -p overlay/etc
+        echo "ARRAY /dev/md0 level=raid5 num-devices=3 UUID=$MD_UUID" > overlay/etc/mdadm.conf
     )
     sudo $basedir/dracut -l -i overlay / \
        -o "plymouth" \
index 73aaca34c38d879690ecc2e18e671c288a04cbd5..00593c91bd5298beb8c6bca3910a99353ecbe721 100755 (executable)
@@ -26,11 +26,10 @@ test_run() {
     client_run || return 1
     client_run rd_NO_MDIMSM || return 1
     client_run rd_NO_DM || return 1
-    client_run rd_NO_MD rd_NO_MDIMSM && return 1
-# FIXME:
-#    client_run rd_NO_DM rd_NO_MDIMSM && return 1
-#    client_run rd_NO_MD && return 1
-    return 0
+    client_run rd_NO_DM rd_NO_MDIMSM rd_NO_MDADMCONF || return 1
+    client_run rd_NO_MD rd_NO_MDIMSM  && return 1
+    client_run rd_NO_MD && return 1
+   return 0
 }
 
 test_setup() {