SVN: geninitrd/trunk: geninitrd mod-lvm.sh

glen glen at pld-linux.org
Fri Feb 27 18:14:45 CET 2009


Author: glen
Date: Fri Feb 27 18:14:45 2009
New Revision: 10153

Added:
   geninitrd/trunk/mod-lvm.sh
Modified:
   geninitrd/trunk/geninitrd
Log:
- modularize lvm

Modified: geninitrd/trunk/geninitrd
==============================================================================
--- geninitrd/trunk/geninitrd	(original)
+++ geninitrd/trunk/geninitrd	Fri Feb 27 18:14:45 2009
@@ -59,25 +59,14 @@
 # are /dev nodes already created from /proc/devices info?
 proc_partitions=no
 
-# LVM devices that should not be included in vgscan on initrd
-lvm_ignore_devices=''
-
 # whether v86d should be installed
 need_v86d=0
 
-# LVM volumes that are needed to activate
-# VG for root dev
-ROOTVG=""
-# VG for suspend resume dev
-SUSPENDVG=""
-
 # resume device
 resume_dev=""
 
 # if we should init NFS at boot
 have_nfs=no
-# if we should init LVM at boot
-have_lvm=no
 # if we should init md (softraid) at boot
 have_md=no
 
@@ -546,53 +535,6 @@
 	findmodule "-scsi_wait_scan"
 }
 
-# return true if node is lvm node
-is_lvm_node() {
-	local node="$1"
-	if [ ! -e "$node" ]; then
-		die "check_lvm(): node $node doesn't exist!"
-		return 1
-	fi
-
-	# block-major-58 is lvm1
-	ls -lL "$node" 2> /dev/null | awk '{if (/^b/) { if ($5 == "58,") { exit 0; } else { exit 1; } } else { exit 1; }}'
-	rc=$?
-
-	if [ $rc = 0 ]; then
-		# is lvm1
-		return 0
-	fi
-
-	if [ ! -x /sbin/lvm ]; then
-		return 0
-	fi
-
-	/sbin/lvm lvdisplay "$node" > /dev/null 2>&1
-	rc=$?
-	if [ $rc -gt 127 ]; then
-		# lvdisplay terminated by signal! most likely it segfaulted.
-		die "Unexpected exit from 'lvdisplay $node': $rc - are your lvm tools broken?"
-	fi
-
-	return $rc
-}
-
-# find PV names from given VG name
-find_lvm_pv() {
-	local vg="$1"
-
-	local pv=$(/sbin/vgdisplay -C --noheadings -o pv_name "$vg")
-	echo $pv
-}
-
-# find VG name from given devnode
-find_lvm_vg() {
-	local devnode="$1"
-
-	local vg=$(/sbin/lvdisplay -C --noheadings -o vg_name "$devnode")
-	echo $vg
-}
-
 # return dependencies MAJOR:MINOR [MAJOR:MINOR] for DM_NAME
 # TODO: patch `dmsetup export`
 dm_deps() {
@@ -640,7 +582,7 @@
 		devpath=$(dm_longname "$devpath")
 	fi
 
-	if [ -L "$devpath" ] && ! is_lvm_node "$devpath"; then
+	if [ -L "$devpath" ] && ! is_lvm "$devpath"; then
 		# sanitize things like:
 		# /dev/block/104:2 -> /dev/cciss/c0d0p2
 		devpath=$(readlink -f "$devpath")
@@ -761,48 +703,8 @@
 		return
 	fi
 
-	if is_lvm_node "$devpath"; then
-		debug "LVM: $devpath is LVM node"
-
-		node="$devpath"
-
-		if [ ! -f /sbin/initrd-lvm -o ! -x /sbin/lvdisplay -o ! -x /sbin/pvdisplay ]; then
-			die "root on LVM but /sbin/initrd-lvm, /sbin/lvdisplay and /sbin/pvdisplay not found. Please install lvm(2) and lvm(2)-initrd package and rerun $PROGRAM."
-		fi
-		if [ -z "$LVMTOOLSVERSION" ]; then
-			LVMTOOLSVERSION=$(/sbin/initrd-lvm vgchange --version 2>/dev/null|head -n 1|awk '{gsub("vgchange: Logical Volume Manager ",NIL); gsub("LVM version:     ",NIL); gsub(/\..*/,NIL); print $1}')
-			if [ -z "$LVMTOOLSVERSION" ]; then
-				die "Can't determine LVM tools version. Please set LVMTOOLSVERSION and rerun $PROGRAM."
-			fi
-		fi
-
-		local vg=$(find_lvm_vg "$node")
-		debug "LVM VG for $node: $vg"
-		VGVOLUMES=$(echo $VGVOLUMES $vg | tr ' ' '\n' | sort -u)
-
-		local pv=$(find_lvm_pv "$vg")
-		debug "LVM PV for $vg: $pv"
-		PVDEVICES=$(echo $PVDEVICES $pv | tr ' ' '\n' | sort -u)
-
-		if [ -n "$PVDEVICES" ]; then
-			for device in $PVDEVICES; do
-				find_modules_for_devpath $device
-			done
-		else
-			die "I wasn't able to find PV (via lvdisplay and pvdisplay). You can try to set PVDEVICES in /etc/sysconfig/geninitrd."
-		fi
-
-		if [ "$LVMTOOLSVERSION" = "2" ]; then
-			findmodule "-dm-mod"
-		elif [ "$LVMTOOLSVERSION" = "1" ]; then
-			findmodule "-lvm"
-			findmodule "-lvm-mod"
-		else
-			die "LVM version $LVMTOOLSVERSION is not supported yet."
-		fi
-
-		debug "LVM v$LVMTOOLSVERSION enabled"
-		have_lvm=yes
+	if is_lvm "$devpath"; then
+		find_modules_lvm "$devpath"
 		return
 	fi
 }
@@ -1235,132 +1137,6 @@
 	chmod 755 "$DESTDIR/bin/setdhcp"
 }
 
-initrd_gen_lvm() {
-	debug "Adding LVM support to initrd"
-	inst_d /tmp /newroot
-	inst_exec /sbin/initrd-lvm /bin/lvm.static
-
-	# always make /dev on tmpfs for LVM2
-	if [ "$LVMTOOLSVERSION" = "2" ]; then
-		mount_dev
-	fi
-
-	if ! is_yes "$dev_mounted"; then
-		inst_d /dev/mapper
-		mknod $DESTDIR/dev/mapper/control c 10 63
-		for device in $PVDEVICES; do
-			# if LVM on RAID then device might be copied already in gen_md
-			[ -e "$DESTDIR/dev/$(basename $device)" ] && continue
-			inst $device /dev
-		done
-	fi
-
-	mount_tmp
-	if [ "$LVMTOOLSVERSION" = "1" ]; then
-		add_linuxrc <<-EOF
-			lvm vgscan -T
-			for vg in $VGVOLUMES; do
-				lvm vgchange -T -a y $vg
-			done
-		EOF
-	else
-		echo "cat /etc/lvm.conf > /tmp/lvm.conf" | add_linuxrc
-		echo "global {" > "$DESTDIR/etc/lvm.conf"
-		echo "	locking_type = 0" >> "$DESTDIR/etc/lvm.conf"
-		echo "	locking_dir = \"/tmp\"" >> "$DESTDIR/etc/lvm.conf"
-		echo "}" >> "$DESTDIR/etc/lvm.conf"
-		echo "devices {" >> "$DESTDIR/etc/lvm.conf"
-		echo "	sysfs_scan=0" >> "$DESTDIR/etc/lvm.conf"
-		if is_yes "$have_md"; then
-			echo "	md_component_detection = 1" >> "$DESTDIR/etc/lvm.conf"
-		fi
-		if is_yes "$have_dmraid" || is_yes "$have_multipath"; then
-			echo '	types = [ "device-mapper", 254 ]' >> "$DESTDIR/etc/lvm.conf"
-		fi
-		if [ "$lvm_ignore_devices" ]; then
-			# TODO: think of merging with lvm dumpconfig output
-			echo '	filter = [' >> "$DESTDIR/etc/lvm.conf"
-			local dev
-			for dev in $lvm_ignore_devices; do
-				debug "LVM v2: ignore device $dev"
-				printf '  "r|^%s.*|",\n' $dev
-			done >> "$DESTDIR/etc/lvm.conf"
-			echo ']' >> "$DESTDIR/etc/lvm.conf"
-		fi
-		# XXX filter= must be on one line!
-		lvm dumpconfig | awk '/filter=/' >> "$DESTDIR/etc/lvm.conf"
-		echo "}" >> "$DESTDIR/etc/lvm.conf"
-
-		initrd_gen_devices
-
-		add_linuxrc <<-EOF
-			export ROOTDEV=$rootdev
-			export ROOTVG="$VGVOLUMES"
-			export SUSPENDVG=$SUSPENDVG
-		EOF
-		add_linuxrc <<-'EOF'
-			# parse rootdev from kernel commandline if it begins with /
-			case "$ROOT" in
-				/*)
-				if [ "$ROOT" != "$ROOTDEV" ]; then
-					ROOTDEV=$ROOT
-					echo "LVM: Using 'root=$ROOTDEV' from kernel commandline"
-					local tmp=${ROOTDEV#/dev/}
-					if [ "$tmp" != "$ROOTDEV" ]; then
-						ROOTVG=${tmp%/*}
-						echo "LVM: Using Volume Group '$ROOTVG' for rootfs"
-					fi
-				fi
-				;;
-			esac
-
-			# skip duplicate VG
-			if [ "$SUSPENDVG" = "$ROOTVG" ]; then
-				export VGVOLUMES="$ROOTVG"
-			else
-				export VGVOLUMES="$SUSPENDVG $ROOTVG"
-			fi
-
-			# disable noise from LVM accessing devices that aren't ready.
-			read printk < /proc/sys/kernel/printk
-			if [ ! "$DEBUGINITRD" ]; then
-				echo 0 > /proc/sys/kernel/printk
-			fi
-
-			export LVM_SYSTEM_DIR=/tmp
-			: 'Scanning for Volume Groups'
-			lvm.static vgscan --mknodes --ignorelockingfailure 2>/dev/null
-
-			: 'Activating Volume Groups'
-			for vol in $VGVOLUMES; do
-				lvm.static vgchange --ignorelockingfailure -a y $vol 2>/dev/null
-			done
-
-			echo "$printk" > /proc/sys/kernel/printk
-
-			# Find out major/minor
-			attrs="$(lvm.static lvdisplay --ignorelockingfailure -c $ROOTDEV 2>/dev/null)"
-			if [ "$attrs" ]; then
-				majmin="${attrs#*$ROOTDEV*:*:*:*:*:*:*:*:*:*:*:*}"
-				if [ "$majmin" != "$attrs" ]; then
-					major="${majmin%:*}"
-					minor="${majmin#*:}"
-				fi
-			fi
-
-			if [ "$major" -a "$minor" ]; then
-				# Pass it to kernel
-				echo $((256 * $major + $minor)) > /proc/sys/kernel/real-root-dev
-			else
-				echo 2>&1 "Error figuring out real root device for $ROOTDEV!"
-				echo 2>&1 "System will not most likely boot up! So dropping you to a shell!"
-				echo 2>&1 ""
-				sh
-			fi
-		EOF
-	fi
-}
-
 initrd_gen_blkid()
 {
 	debug "Adding BLKID support to initrd"
@@ -1485,6 +1261,8 @@
 . /etc/geninitrd/mod-multipath.sh
 # dmraid addon
 . /etc/geninitrd/mod-dmraid.sh
+# LVM addon
+. /etc/geninitrd/mod-lvm.sh
 
 if [ -x /sbin/initrd-blkid ]; then
 	USE_BLKID=yes
@@ -1777,7 +1555,7 @@
 else
 	_lib=lib
 fi
-debug "# geninitrd $RCSID"
+debug "# $RCSID"
 debug "Using libdir: $_lib"
 
 cache_modprobe_conf

Added: geninitrd/trunk/mod-lvm.sh
==============================================================================
--- (empty file)
+++ geninitrd/trunk/mod-lvm.sh	Fri Feb 27 18:14:45 2009
@@ -0,0 +1,261 @@
+#!/bin/sh
+#
+# geninitrd mod: LVM
+
+# if we should init LVM at boot
+have_lvm=no
+
+# LVM volumes that are needed to activate
+# VG for root dev
+# @internal
+ROOTVG=""
+
+# VG for suspend resume dev
+SUSPENDVG=""
+
+VGVOLUMES=""
+
+if [ -x /sbin/lvm ]; then
+	USE_LVM=yes
+else
+	USE_LVM=no
+fi
+
+# LVM devices that should not be included in vgscan on initrd.
+# @internal
+lvm_ignore_devices=''
+
+# return true if node is lvm node
+# @param	string $node device node to be examined
+# @access	public
+is_lvm() {
+	local node="$1"
+
+	# LVM not wanted
+	if is_no "$USE_LVM"; then
+		return 1
+	fi
+
+	if [ ! -e "$node" ]; then
+		die "check_lvm(): node $node doesn't exist!"
+		return 1
+	fi
+
+	# block-major-58 is lvm1
+	ls -lL "$node" 2> /dev/null | awk '{if (/^b/) { if ($5 == "58,") { exit 0; } else { exit 1; } } else { exit 1; }}'
+	rc=$?
+
+	if [ $rc = 0 ]; then
+		# is lvm1
+		return 0
+	fi
+
+	/sbin/lvm lvdisplay "$node" > /dev/null 2>&1
+	rc=$?
+	if [ $rc -gt 127 ]; then
+		# lvdisplay terminated by signal! most likely it segfaulted.
+		die "Unexpected exit from 'lvdisplay $node': $rc - are your lvm tools broken?"
+	fi
+
+	return $rc
+}
+
+# find modules for $devpath
+# @param	$devpath	device to be examined
+# @access	public
+find_modules_lvm() {
+	local devpath="$1"
+
+	debug "LVM: $devpath is LVM node"
+
+	if [ ! -f /sbin/initrd-lvm -o ! -x /sbin/lvdisplay -o ! -x /sbin/pvdisplay ]; then
+		die "root on LVM but /sbin/initrd-lvm, /sbin/lvdisplay and /sbin/pvdisplay not found. Please install lvm(2) and lvm(2)-initrd package and rerun $PROGRAM."
+	fi
+
+	if [ -z "$LVMTOOLSVERSION" ]; then
+		LVMTOOLSVERSION=$(/sbin/initrd-lvm vgchange --version 2>/dev/null|head -n 1|awk '{gsub("vgchange: Logical Volume Manager ",NIL); gsub("LVM version:     ",NIL); gsub(/\..*/,NIL); print $1}')
+		if [ -z "$LVMTOOLSVERSION" ]; then
+			die "Can't determine LVM tools version. Please set LVMTOOLSVERSION and rerun $PROGRAM."
+		fi
+	fi
+
+	local vg=$(find_lvm_vg "$devpath")
+	debug "LVM VG for $devpath: $vg"
+	VGVOLUMES=$(echo $VGVOLUMES $vg | tr ' ' '\n' | sort -u)
+
+	local pv=$(find_lvm_pv "$vg")
+	debug "LVM PV for $vg: $pv"
+	PVDEVICES=$(echo $PVDEVICES $pv | tr ' ' '\n' | sort -u)
+
+	if [ -n "$PVDEVICES" ]; then
+		for device in $PVDEVICES; do
+			find_modules_for_devpath $device
+		done
+	else
+		die "I wasn't able to find PV (via lvdisplay and pvdisplay). You can try to set PVDEVICES in /etc/sysconfig/geninitrd."
+	fi
+
+	if [ "$LVMTOOLSVERSION" = "2" ]; then
+		findmodule "-dm-mod"
+	elif [ "$LVMTOOLSVERSION" = "1" ]; then
+		findmodule "-lvm"
+		findmodule "-lvm-mod"
+	else
+		die "LVM version $LVMTOOLSVERSION is not supported yet."
+	fi
+
+	debug "LVM v$LVMTOOLSVERSION enabled"
+	have_lvm=yes
+}
+
+
+# generate initrd fragment for lvm
+# @access	public
+initrd_gen_lvm() {
+	debug "Adding LVM support to initrd"
+	inst_d /tmp /newroot
+	inst_exec /sbin/initrd-lvm /bin/lvm.static
+
+	# always make /dev on tmpfs for LVM2
+	if [ "$LVMTOOLSVERSION" = "2" ]; then
+		mount_dev
+	fi
+
+	if ! is_yes "$dev_mounted"; then
+		inst_d /dev/mapper
+		mknod $DESTDIR/dev/mapper/control c 10 63
+		for device in $PVDEVICES; do
+			# if LVM on RAID then device might be copied already in gen_md
+			[ -e "$DESTDIR/dev/$(basename $device)" ] && continue
+			inst $device /dev
+		done
+	fi
+
+	mount_tmp
+	if [ "$LVMTOOLSVERSION" = "1" ]; then
+		add_linuxrc <<-EOF
+			lvm vgscan -T
+			for vg in $VGVOLUMES; do
+				lvm vgchange -T -a y $vg
+			done
+		EOF
+	else
+		echo "cat /etc/lvm.conf > /tmp/lvm.conf" | add_linuxrc
+		echo "global {" > "$DESTDIR/etc/lvm.conf"
+		echo "	locking_type = 0" >> "$DESTDIR/etc/lvm.conf"
+		echo "	locking_dir = \"/tmp\"" >> "$DESTDIR/etc/lvm.conf"
+		echo "}" >> "$DESTDIR/etc/lvm.conf"
+		echo "devices {" >> "$DESTDIR/etc/lvm.conf"
+		echo "	sysfs_scan=0" >> "$DESTDIR/etc/lvm.conf"
+		if is_yes "$have_md"; then
+			echo "	md_component_detection = 1" >> "$DESTDIR/etc/lvm.conf"
+		fi
+		if is_yes "$have_dmraid" || is_yes "$have_multipath"; then
+			echo '	types = [ "device-mapper", 254 ]' >> "$DESTDIR/etc/lvm.conf"
+		fi
+		if [ "$lvm_ignore_devices" ]; then
+			# TODO: think of merging with lvm dumpconfig output
+			echo '	filter = [' >> "$DESTDIR/etc/lvm.conf"
+			local dev
+			for dev in $lvm_ignore_devices; do
+				debug "LVM v2: ignore device $dev"
+				printf '  "r|^%s.*|",\n' $dev
+			done >> "$DESTDIR/etc/lvm.conf"
+			echo ']' >> "$DESTDIR/etc/lvm.conf"
+		fi
+		# XXX filter= must be on one line!
+		lvm dumpconfig | awk '/filter=/' >> "$DESTDIR/etc/lvm.conf"
+		echo "}" >> "$DESTDIR/etc/lvm.conf"
+
+		initrd_gen_devices
+
+		add_linuxrc <<-EOF
+			export ROOTDEV=$rootdev
+			export ROOTVG="$VGVOLUMES"
+			export SUSPENDVG=$SUSPENDVG
+		EOF
+		add_linuxrc <<-'EOF'
+			# parse rootdev from kernel commandline if it begins with /
+			case "$ROOT" in
+				/*)
+				if [ "$ROOT" != "$ROOTDEV" ]; then
+					ROOTDEV=$ROOT
+					echo "LVM: Using 'root=$ROOTDEV' from kernel commandline"
+					local tmp=${ROOTDEV#/dev/}
+					if [ "$tmp" != "$ROOTDEV" ]; then
+						ROOTVG=${tmp%/*}
+						echo "LVM: Using Volume Group '$ROOTVG' for rootfs"
+					fi
+				fi
+				;;
+			esac
+
+			# skip duplicate VG
+			if [ "$SUSPENDVG" = "$ROOTVG" ]; then
+				export VGVOLUMES="$ROOTVG"
+			else
+				export VGVOLUMES="$SUSPENDVG $ROOTVG"
+			fi
+
+			# disable noise from LVM accessing devices that aren't ready.
+			read printk < /proc/sys/kernel/printk
+			if [ ! "$DEBUGINITRD" ]; then
+				echo 0 > /proc/sys/kernel/printk
+			fi
+
+			export LVM_SYSTEM_DIR=/tmp
+			: 'Scanning for Volume Groups'
+			lvm.static vgscan --mknodes --ignorelockingfailure 2>/dev/null
+
+			: 'Activating Volume Groups'
+			for vol in $VGVOLUMES; do
+				lvm.static vgchange --ignorelockingfailure -a y $vol 2>/dev/null
+			done
+
+			echo "$printk" > /proc/sys/kernel/printk
+
+			# Find out major/minor
+			attrs="$(lvm.static lvdisplay --ignorelockingfailure -c $ROOTDEV 2>/dev/null)"
+			if [ "$attrs" ]; then
+				majmin="${attrs#*$ROOTDEV*:*:*:*:*:*:*:*:*:*:*:*}"
+				if [ "$majmin" != "$attrs" ]; then
+					major="${majmin%:*}"
+					minor="${majmin#*:}"
+				fi
+			fi
+
+			if [ "$major" -a "$minor" ]; then
+				# Pass it to kernel
+				echo $((256 * $major + $minor)) > /proc/sys/kernel/real-root-dev
+			else
+				echo 2>&1 "Error figuring out real root device for $ROOTDEV!"
+				echo 2>&1 "System will not most likely boot up! So dropping you to a shell!"
+				echo 2>&1 ""
+				sh
+			fi
+		EOF
+	fi
+}
+
+
+# PRIVATE METHODS
+
+# find PV names from given VG name
+# @param	string $vg Volume Group name
+# @access	private
+find_lvm_pv() {
+	local vg="$1"
+
+	local pv=$(/sbin/vgdisplay -C --noheadings -o pv_name "$vg")
+	echo $pv
+}
+
+# find VG name from given devnode
+# @param	string $devnode device node to be examined
+# @access	private
+find_lvm_vg() {
+	local devnode="$1"
+
+	local vg=$(/sbin/lvdisplay -C --noheadings -o vg_name "$devnode")
+	echo $vg
+}


More information about the pld-cvs-commit mailing list