Author: glen
Date: Mon Mar 23 01:18:31 2009
New Revision: 10231

Added:
   geninitrd/trunk/mod-md.sh
Log:
- modularize mdadm

Added: geninitrd/trunk/mod-md.sh
==============================================================================
--- (empty file)
+++ geninitrd/trunk/mod-md.sh   Mon Mar 23 01:18:31 2009
@@ -0,0 +1,169 @@
+#!/bin/sh
+#
+# geninitrd mod: mdadm
+
+# if we should init md (softraid) at boot
+have_md=no
+
+# disable if tools not installed
+if [ -x /sbin/mdadm ]; then
+       USE_MD=yes
+else
+       USE_MD=no
+fi
+
+USEMDADMSTATIC=no
+# XXX wtf is this for?
+USERAIDSTART=yes
+
+# return true if mdadm is set on $devpath
+# @param       string $devpath device node to be examined
+# @access      public
+is_md() {
+       local devpath="$1"
+
+       # mdadm disabled
+       if ! is_yes "$USE_MD"; then
+               return 1
+       fi
+
+       if [[ "$devpath" == /dev/md* ]]; then
+               return 0
+       fi
+
+       return 1
+}
+
+# find md modules for $devpath
+# @param       $devpath        device to be examined
+# @return      false if $devpath is not on md
+# @access      public
+find_modules_md() {
+       local found raidlevel
+
+       if [ -f /etc/mdadm.conf ]; then
+               debug "Finding RAID details using mdadm for rootdev=$1"
+               eval `(/sbin/mdadm -v --examine --scan 
--config=/etc/mdadm.conf;/sbin/mdadm -v --detail --scan 
--config=/etc/mdadm.conf) | 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);
+                       }
+               }
+
+               /^ARRAY/ {
+                       if (($2 == rootdev) || ($2 == rootdev_devfs)) {
+                               raidlevel=$3;
+                               gsub(/level=/,NUL,raidlevel);
+                               if (raidlevel ~ /^raid([0-6]|10)/) {
+                                       gsub(/raid/,NUL,raidlevel);
+                               };
+                               found="yes";
+                               getline x;
+                               if (x ~ /devices=/) {
+                                       dev_list = x;
+                                       gsub(".*devices=", NUL, dev_list);
+                                       gsub(",", " ", dev_list);
+                               }
+                       }
+               }
+
+               END {
+                       print "have_md=" found;
+                       print "raidlevel=" raidlevel;
+                       print "dev_list=\"" dev_list "\"";
+               }'`
+       fi
+
+       if [ "$have_md" != "yes" -a -f /etc/raidtab ]; then
+               die "raidtools are not longer supported. Please migrate to 
mdadm setup!"
+       fi
+
+       if is_yes "$have_md"; then
+               case "$raidlevel" in
+               [01]|10)
+                       find_module "raid$raidlevel"
+                       ;;
+               [456])
+                       find_module "-raid$raidlevel"
+                       find_module "-raid456"
+                       ;;
+               linear)
+                       find_module "linear"
+                       ;;
+               *)
+                       warn "raid level $number (in mdadm config) not 
recognized"
+                       ;;
+               esac
+       else
+               die "RAID devices not found for \"$1\", check your 
configuration!"
+       fi
+
+       rootdev_nr=$(( $rootdev_nr + 1 ))
+       eval "rootdev${rootdev_nr}=\"$1\""
+       eval "dev_list${rootdev_nr}=\"${dev_list}\""
+
+       for device in $dev_list; do
+               find_modules_for_devpath $device
+       done
+}
+
+
+# generate initrd fragment for md
+# @access      public
+initrd_gen_md() {
+       debug "Setting up mdadm..."
+
+       if [ ! -x /sbin/mdadm -o ! -x /sbin/initrd-mdassemble ]; then
+               die "/sbin/mdadm or /sbin/initrd-mdassemble is missing!"
+       fi
+
+       inst_exec /sbin/initrd-mdassemble /bin/mdassemble
+
+       # LVM on RAID case
+       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
+                       echo "DEVICE $ex_dev" >> "$DESTDIR/etc/mdadm.conf"
+               done
+       fi
+       do_md0=1
+       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)"
+
+               [ "$cr_rootdev" = "/dev/md0" ] && do_md0=0
+
+               echo "DEVICE $cr_dev_list" >> "$DESTDIR/etc/mdadm.conf"
+               cr_dev_list_md="$(echo "$cr_dev_list" | xargs | awk ' { gsub(/ 
+/,",",$0); print $0; }')"
+               cr_md_conf=$(/sbin/mdadm --detail --brief 
--config=/etc/mdadm.conf $cr_rootdev | awk ' { gsub(/spares=[0-9]+/, "", $0); 
print $0; }')
+               if [ -n "$cr_md_conf" ]; then
+                       echo "$cr_md_conf" >> "$DESTDIR/etc/mdadm.conf"
+               else
+                       echo "ARRAY $cr_rootdev devices=$cr_dev_list_md" >> 
"$DESTDIR/etc/mdadm.conf"
+               fi
+
+               for f in $cr_dev_list $cr_rootdev $dev_list_extra; do
+                       # mkdir in case of devfs name
+                       inst_d $(dirname $f)
+                       [ -e "$DESTDIR/$f" ] && continue
+                       # this works fine with and without devfs
+                       inst $f $f
+               done
+       done
+
+       echo "mdassemble" | add_linuxrc
+
+       # needed to determine md-version
+       if [ "$do_md0" -eq 1 ]; then
+               mknod $DESTDIR/dev/md0 b 9 0
+       fi
+}
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to