X-Git-Url: https://git.pld-linux.org/?a=blobdiff_plain;f=mod-md.sh;h=a3585170fb7bb56e1db25ed4f72f75ffe64d717a;hb=04b32086569a126d5d6f9bd0ad1b0db9f142f50e;hp=1949ab6991f358a4d3acd1a00a2941542eb2097d;hpb=fb5f781cd0fd3073503016ab368dab6321981278;p=projects%2Fgeninitrd.git diff --git a/mod-md.sh b/mod-md.sh index 1949ab6..a358517 100644 --- a/mod-md.sh +++ b/mod-md.sh @@ -1,5 +1,4 @@ #!/bin/sh -# # geninitrd mod: mdadm USE_MD=${USE_MD:-yes} @@ -9,10 +8,6 @@ have_md=no # setup geninitrd module # @access public setup_mod_md() { - mdassemble=$(find_tool $initrd_dir/mdassemble /sbin/initrd-mdassemble) - if [ ! -x "$mdassemble" ]; then - USE_MD=no - fi mdadm=$(find_tool /sbin/mdadm $initrd_dir/mdadm /sbin/initrd-mdadm) if [ ! -x "$mdadm" ]; then USE_MD=no @@ -45,21 +40,33 @@ find_modules_md() { local found raidlevel if [ -f /etc/mdadm.conf ]; then - debug "Finding RAID details using mdadm for rootdev=$1" + verbose "Finding RAID details using mdadm for rootdev=$1" eval `($mdadm -v --examine --scan --config=/etc/mdadm.conf 2> /dev/null;$mdadm -v --detail --scan --config=/etc/mdadm.conf 2> /dev/null) | awk -v rootdev="$1" ' BEGIN { found = "no"; dev_list = ""; raidlevel = "" - rootdev_devfs = rootdev; - if (rootdev ~ /\/dev\/md\/[0-9]/) { - gsub(/\/dev\/md\//,"/dev/md",rootdev_devfs); + rootdev_new = rootdev + rootdev_alias = rootdev; + # alternative name: normalize from /dev/md/X to /dev/mdX + if (rootdev_alias ~ /\/dev\/md\/[0-9]+/) { + gsub(/\/dev\/md\//,"/dev/md",rootdev_alias); + } + # alternative name: normalize from /dev/mdXpY to /dev/mdX + if (rootdev_alias ~/\/dev\/md[0-9]+p[0-9]+/) { + gsub(/p[0-9]+/,"",rootdev_alias); } } /^ARRAY/ { - if (($2 == rootdev) || ($2 == rootdev_devfs)) { + arr_device = $2 + # normalize to /dev/mdX form + if (arr_device ~ /\/dev\/md\/[0-9]+/) { + gsub(/\/dev\/md\//,"/dev/md",arr_device); + } + if ((arr_device == rootdev) || (arr_device == rootdev_alias)) { raidlevel=$3; + rootdev_new=arr_device gsub(/level=/,NUL,raidlevel); if (raidlevel ~ /^raid([0-6]|10)/) { gsub(/raid/,NUL,raidlevel); @@ -75,6 +82,7 @@ find_modules_md() { } END { + print "rootdev_new=" rootdev_new; print "have_md=" found; print "raidlevel=" raidlevel; print "dev_list=\"" dev_list "\""; @@ -105,10 +113,10 @@ find_modules_md() { die "RAID devices not found for \"$1\", check your configuration!" fi - debug "md: found rootdev=$1 with devices list ${dev_list}" + verbose "md: found rootdev=$1 on device $rootdev_new with devices list ${dev_list}" rootdev_nr=$(( $rootdev_nr + 1 )) - eval "rootdev${rootdev_nr}=\"$1\"" + eval "rootdev${rootdev_nr}=\"$rootdev_new\"" eval "dev_list${rootdev_nr}=\"${dev_list}\"" for device in $dev_list; do @@ -120,28 +128,36 @@ find_modules_md() { # generate initrd fragment for md # @access public initrd_gen_md() { - debug "Setting up mdadm..." + if ! is_yes "$have_md"; then + return + fi + verbose "Setting up mdadm..." + + inst_exec $mdadm /sbin/mdadm - inst_exec $mdassemble /bin/mdassemble + echo "DEVICE partitions containers" >> "$DESTDIR/etc/mdadm.conf" # LVM on RAID case local dev_list_extra ex_dev dev_list_extra=$(awk '/^DEVICE / { for (i=2; i<=NF; i++) { printf "%s ", $i; }; } ' /etc/mdadm.conf | xargs) - if [ "$dev_list_extra" = "partitions" ]; then - # FIXME: handle this case (see man mdadm.conf) - echo "DEVICE partitions" >> "$DESTDIR/etc/mdadm.conf" - dev_list_extra="" - else - for ex_dev in $dev_list_extra; do + new_dev_list_extra="" + for ex_dev in $dev_list_extra; do + if [ "$ex_dev" = "partitions" -o "$ex_dev" = "containers" ]; then echo "DEVICE $ex_dev" >> "$DESTDIR/etc/mdadm.conf" - done - fi + # FIXME: find and copy partition devices from /proc/partitions + # - best if done at runtime, now initrd gen time + continue + fi + echo "DEVICE $ex_dev" >> "$DESTDIR/etc/mdadm.conf" + new_dev_list_extra="$new_dev_list_extra $ex_dev" + done + dev_list_extra=$new_dev_list_extra local cr_rootdev cr_dev_list do_md0=1 nr cr_dev_list_md f cr_md_conf for nr in `seq 1 $rootdev_nr`; do eval cr_rootdev="\$rootdev${nr}" eval cr_dev_list="\$dev_list${nr}" - debug echo "Setting up array ($cr_rootdev = $cr_dev_list)" + verbose "Setting up array ($cr_rootdev = $cr_dev_list)" [ "$cr_rootdev" = "/dev/md0" ] && do_md0=0 @@ -163,10 +179,17 @@ initrd_gen_md() { done done - echo "mdassemble" | add_linuxrc + echo "wait_for_files $cr_dev_list" | add_linuxrc + add_linuxrc <<-'EOF' + /sbin/mdadm --assemble --scan + + if [ "$DEBUGINITRD" ]; then + [ -e /proc/mdstat ] && echo "/proc/mdstat contents:" && cat /proc/mdstat + fi + EOF # needed to determine md-version if [ "$do_md0" -eq 1 ]; then - mknod $DESTDIR/dev/md0 b 9 0 + mknod -m 660 $DESTDIR/dev/md0 b 9 0 fi }