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