SVN: geninitrd/trunk/mod-md.sh

glen glen at pld-linux.org
Mon Mar 23 01:18:31 CET 2009


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
+}


More information about the pld-cvs-commit mailing list