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
+}
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to