SVN: geninitrd/trunk/geninitrd

glen glen at pld-linux.org
Tue Oct 30 16:08:43 CET 2007


Author: glen
Date: Tue Oct 30 16:08:43 2007
New Revision: 8899

Modified:
   geninitrd/trunk/geninitrd
Log:
- add function add_linuxrc() and generate all output via that function
- add debuginitrd=sh possibility to invoke shell at some points in initrd

Modified: geninitrd/trunk/geninitrd
==============================================================================
--- geninitrd/trunk/geninitrd	(original)
+++ geninitrd/trunk/geninitrd	Tue Oct 30 16:08:43 2007
@@ -116,6 +116,12 @@
 	exit $rc
 }
 
+# append text to /linuxrc
+# takes STDIN as input
+add_linuxrc() {
+	cat >> "$s"
+}
+
 # Checks if busybox has support for APPLET(s)
 # Exits from geninitrd if the support is not present.
 #
@@ -800,8 +806,7 @@
 
 firmware_install_module_pre() {
 	local module="$1"
-	local linuxrc="$2"
-	local firmware_files="$3"
+	local firmware_files="$2"
 
 	debug "Adding Firmwares ($firmware_files) to initrd for module $module"
 	inst_d /proc
@@ -823,17 +828,19 @@
 		inst /lib/firmware/$firmware /lib/firmware/$firmware
 	done
 
-	echo "mount -t proc none /proc" >> "$linuxrc"
-	echo "mount -t sysfs none /sys" >> "$linuxrc"
-	echo "echo -n "/lib/firmware/firmware.sh" > /proc/sys/kernel/hotplug" >> "$linuxrc"
+	echo "mount -t proc none /proc" | add_linuxrc
+	echo "mount -t sysfs none /sys" | add_linuxrc
+	echo "echo -n "/lib/firmware/firmware.sh" > /proc/sys/kernel/hotplug" | add_linuxrc
 }
 
 firmware_install_module_post() {
 	local module="$1"
-	local linuxrc="$2"
-	local firmware_files="$3"
-	echo "umount /sys" >> "$linuxrc"
-	echo "umount /proc" >> "$linuxrc"
+	local firmware_files="$2"
+
+	add_linuxrc <<-'EOF'
+		umount /sys
+		umount /proc
+	EOF
 }
 
 modules_install() {
@@ -850,7 +857,6 @@
 
 modules_add_linuxrc() {
 	local modules="$1"
-	local linuxrc="$2"
 	local mod
 
 	for mod in $modules; do
@@ -879,14 +885,14 @@
 		fi
 
 		if [ -n "$firmware_var" ]; then
-			firmware_install_module_pre "$module" "$linuxrc" "$firmware_var"
+			firmware_install_module_pre "$module" "$firmware_var"
 		fi
-		echo "$insmod /lib/modules/$kernel/$MODULE2 $options" >> "$linuxrc"
+		echo "$insmod /lib/modules/$kernel/$MODULE2 $options" | add_linuxrc
 		if [ -n "${sleep_var}" ]; then
-			echo "usleep $sleep_var" >> "$linuxrc"
+			echo "usleep $sleep_var" | add_linuxrc
 		fi
 		if [ -n "$firmware_var" ]; then
-			firmware_install_module_post "$module" "$linuxrc" "$firmware_var"
+			firmware_install_module_post "$module" "$firmware_var"
 		fi
 	done
 }
@@ -1228,6 +1234,8 @@
 inst_d /dev/pts /dev/shm
 
 s="$RCFILE"
+> "$s"
+chmod 755 "$s"
 ln -s /linuxrc $MNTIMAGE/init
 
 inst /bin/initrd-busybox /bin/initrd-busybox
@@ -1238,18 +1246,26 @@
 	inst "$INSMOD" /bin/insmod.static
 fi
 
-cat > "$s" <<'EOF'
-#! /bin/sh
-mount -t proc none /proc
-CMDLINE="$(cat /proc/cmdline)"
-if [[ "$CMDLINE" = *debuginitrd* ]]; then
-	set -x
-fi
-umount /proc
+add_linuxrc <<-'EOF'
+	#!/bin/sh
+	mount -t proc none /proc
+	export CMDLINE="$(cat /proc/cmdline)"
+	if [ "$(awk '/debuginitrd/ { print "yes" }' /proc/cmdline)" = "yes" ]; then
+		export DEBUGINITRD=yes
+		debugshell() {
+			: 'Entering debug shell. Type Ctrl-D to exit it.'
+			sh
+		}
+		set -x
+	else
+		debugshell() {
+			:
+		}
+	fi
+	umount /proc
 EOF
-chmod 755 "$s"
 
-modules_add_linuxrc "$MODULES" "$s"
+modules_add_linuxrc "$MODULES"
 
 # TODO: rewrite for busybox
 #if [ -n "$loopDev" ]; then
@@ -1279,24 +1295,22 @@
 	else
 		inst /usr/sbin/resume /bin/resume
 	fi
-	echo "resume" >> "$s"
+	echo "resume" | add_linuxrc
 }
 
 initrd_gen_tuxonice() {
 	inst_d /sys /proc
-cat << 'EOF' >> "$s"
-mount -t proc none /proc
-mount -t sysfs none /sys
-if [ "$(awk ' /resume2=/  { print "yes"; } ' /proc/cmdline)" = "yes" ]; then
-EOF
-cat << EOF >> "$s"
-		[ -e /proc/suspend2/do_resume ] && echo > /proc/suspend2/do_resume
-		[ -e /sys/power/suspend2/do_resume ] && echo > /sys/power/suspend2/do_resume
-		[ -e /sys/power/tuxonice/do_resume ] && echo >  /sys/power/tuxonice/do_resume
-fi
-umount /sys
-umount /proc
-EOF
+	add_linuxrc <<-'EOF'
+		mount -t proc none /proc
+		mount -t sysfs none /sys
+		if [ "$(echo "$CMDLINE" | awk ' /resume2=/  { print "yes"; } ' /proc/cmdline)" = "yes" ]; then
+			[ -e /proc/suspend2/do_resume ] && echo > /proc/suspend2/do_resume
+			[ -e /sys/power/suspend2/do_resume ] && echo > /sys/power/suspend2/do_resume
+			[ -e /sys/power/tuxonice/do_resume ] && echo >  /sys/power/tuxonice/do_resume
+		fi
+		umount /sys
+		umount /proc
+	EOF
 }
 
 # generate code to mount /dev on tmpfs and create initial nodes
@@ -1316,15 +1330,15 @@
 	tmpfs_dev=yes
 
 	busybox_applet mount mknod mkdir
-	cat >> "$s" <<-EOF
-: 'Creating /dev'
-mount -o mode=0755 -t tmpfs none /dev
-mknod /dev/console c 5 1
-mknod /dev/null c 1 3
-mknod /dev/zero c 1 5
-mkdir /dev/pts
-mkdir /dev/shm
-EOF
+	add_linuxrc <<-EOF
+		: 'Creating /dev'
+		mount -o mode=0755 -t tmpfs none /dev
+		mknod /dev/console c 5 1
+		mknod /dev/null c 1 3
+		mknod /dev/zero c 1 5
+		mkdir /dev/pts
+		mkdir /dev/shm
+	EOF
 }
 
 initrd_gen_udev() {
@@ -1340,7 +1354,7 @@
 
 	if is_yes "$USE_UDEV"; then
 		initrd_gen_tmpfs_dev
-		cat >> "$s" <<- 'EOF'
+		add_linuxrc <<-'EOF'
 			mount -t proc none /proc
 			mount -t sysfs none /sys
 			: 'Starting udev'
@@ -1349,14 +1363,14 @@
 		if is_yes "$PROBESTATICMODS"; then
 			inst /sbin/initrd-udevtrigger /sbin/udevtrigger
 			inst /sbin/initrd-udevsettle /sbin/udevsettle
-			cat >> "$s" <<-'EOF'
+			add_linuxrc <<-'EOF'
 				/sbin/udevtrigger
 				/sbin/udevsettle
 			EOF
 		fi
 
 		busybox_applet killall
-		cat >> "$s" <<-'EOF'
+	   	add_linuxrc	<<-'EOF'
 			killall udevd
 			umount /proc
 			umount /sys
@@ -1378,26 +1392,28 @@
 		inst /var/lib/multipath/bindings /var/lib/multipath
 	fi
 
-	cat <<-'EOF' >> "$s"
-	mount -t proc none /proc
-	mount -t sysfs none /sys
-EOF
+	add_linuxrc <<-'EOF'
+		mount -t proc none /proc
+		mount -t sysfs none /sys
+	EOF
 
 	initrd_gen_tmpfs_dev
 	initrd_gen_devices
 
-	echo "export multipath_id=$MULTIPATH_ID" >> "$s"
-	cat <<-'EOF' >> "$s"
-	/sbin/multipath -v 0 $multipath_id
-
-	for a in /dev/mapper/*; do
-		[ $a = /dev/mapper/control ] && continue
-		/sbin/kpartx -a $a
-	done
+	echo "export multipath_id=$MULTIPATH_ID" | add_linuxrc
+	add_linuxrc <<-'EOF'
+		/sbin/multipath -v 0 $multipath_id
+
+		for a in /dev/mapper/*; do
+			[ $a = /dev/mapper/control ] && continue
+			/sbin/kpartx -a $a
+		done
 
-	umount /sys
-	umount /proc
-EOF
+		debugshell
+
+		umount /sys
+		umount /proc
+	EOF
 }
 
 initrd_gen_dmraid() {
@@ -1410,21 +1426,24 @@
 
 	inst_d /sbin /sys
 	inst /sbin/dmraid-initrd /sbin/dmraid
-	cat <<-EOF >> "$s"
-	mount -t proc none /proc
-	mount -t sysfs none /sys
-EOF
+	add_linuxrc <<-EOF
+		mount -t proc none /proc
+		mount -t sysfs none /sys
+	EOF
 
 	initrd_gen_devices
 
-	cat <<-EOF >> "$s"
-	# 2 secs was enough for my system to initialize. but really this is udev issue?
-	usleep 2000000
-	: 'Activating Device-Mapper RAID(s)'
-	/sbin/dmraid -ay -i
-	umount /sys
-	umount /proc
-EOF
+	add_linuxrc <<-EOF
+		# 2 secs was enough for my system to initialize. but really this is udev issue?
+		usleep 2000000
+		: 'Activating Device-Mapper RAID(s)'
+		/sbin/dmraid -ay -i
+
+		debugshell
+
+		umount /sys
+		umount /proc
+	EOF
 }
 
 # Generates /dev nodes based on /proc/partitions information.
@@ -1436,16 +1455,19 @@
 	fi
 	proc_partitions=yes
 
-	cat <<-'EOF' >> "$s"
-	: 'Making device nodes'
-	# ignore first two lines, header, empty line and process rest
-	cat /proc/partitions | (read b; read b; while read major minor blocks dev rest; do
-		node=/dev/$dev
-		mkdir -p ${node%/*}
-		mknod $node b $major $minor
-	done
-	)
-EOF
+	add_linuxrc <<-'EOF'
+		: 'Making device nodes'
+		cat /proc/partitions | (
+			# ignore first two lines, header, empty line and process rest
+			read b; read b
+
+			while read major minor blocks dev rest; do
+				node=/dev/$dev
+				mkdir -p ${node%/*}
+				mknod $node b $major $minor
+			done
+		)
+	EOF
 }
 
 initrd_gen_md() {
@@ -1488,7 +1510,7 @@
 		done
 	done
 
-	echo "mdassemble" >> "$s"
+	echo "mdassemble" | add_linuxrc
 
 	# needed to determine md-version
 	if [ "$do_md0" -eq 1 ]; then
@@ -1503,45 +1525,49 @@
 	mknod "$MNTIMAGE/dev/urandom" c 1 9
 	mkdir "$MNTIMAGE/newroot"
 	mkdir "$MNTIMAGE/proc"
-	echo "ifconfig lo 127.0.0.1 up" >> "$s"
-	echo "route add -net 127.0.0.0 netmask 255.0.0.0 lo" >> "$s"
-	echo "ifconfig eth0 0.0.0.0 up" >> "$s"
-	echo "udhcpc -i eth0 -f -q -s /bin/setdhcp" >> "$s"
-	cat << 'EOF' > "$MNTIMAGE/bin/setdhcp"
-#!/bin/sh
-[ "$1" != "bound" ] && exit
-[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
-[ -n "$subnet" ] && NETMASK="netmask $subnet"
-ifconfig $interface $ip $BROADCAST $NETMASK up
-if [ -n "$router" ]; then
-	for r in $router; do
-		route add default gw $r dev $interface
-	done
-fi
+	echo "ifconfig lo 127.0.0.1 up" | add_linuxrc
+	echo "route add -net 127.0.0.0 netmask 255.0.0.0 lo" | add_linuxrc
+	echo "ifconfig eth0 0.0.0.0 up" | add_linuxrc
+	echo "udhcpc -i eth0 -f -q -s /bin/setdhcp" | add_linuxrc
+
+	cat <<-'EOF' > "$MNTIMAGE/bin/setdhcp"
+		#!/bin/sh
+		[ "$1" != "bound" ] && exit
+		[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
+		[ -n "$subnet" ] && NETMASK="netmask $subnet"
+		ifconfig $interface $ip $BROADCAST $NETMASK up
+		if [ -n "$router" ]; then
+			for r in $router; do
+				route add default gw $r dev $interface
+			done
+		fi
 
-mount -t proc none /proc
-for o in $(cat /proc/cmdline); do
-	case $o in
-	nfsroot=*)
-		rootpath=${o#nfsroot=}
-		;;
-	esac
-done
-umount /proc
+		mount -t proc none /proc
+		for o in $(cat /proc/cmdline); do
+			case $o in
+			nfsroot=*)
+				rootpath=${o#nfsroot=}
+				;;
+			esac
+		done
+		umount /proc
+
+		if [ -n "$rootpath" ]; then
+			mount -n -t nfs -o ro,nolock,posix,tcp,wsize=8192,rsize=8192 $rootpath /newroot
+		else
+			echo "Missing rootpath in what DHCP server sent to us. Failing..."
+			echo "All seen variables are listed below:"
+			set
+		fi
+	EOF
 
-if [ -n "$rootpath" ]; then
-	mount -n -t nfs -o ro,nolock,posix,tcp,wsize=8192,rsize=8192 $rootpath /newroot
-else
-	echo "Missing rootpath in what DHCP server sent to us. Failing..."
-	echo "All seen variables are listed below:"
-	set
-fi
-EOF
 	chmod 755 "$MNTIMAGE/bin/setdhcp"
-	echo "cd /newroot" >> "$s"
-	echo "pivot_root . initrd" >> "$s"
-	echo "[ -x /sbin/chroot ] && exec /sbin/chroot . /sbin/init -i < dev/console > dev/console 2>&1" >> "$s"
-	echo "exec /usr/sbin/chroot . /sbin/init -i < dev/console > dev/console 2>&1" >> "$s"
+	add_linuxrc <<-'EOF'
+		cd /newroot
+		pivot_root . initrd
+		[ -x /sbin/chroot ] && exec /sbin/chroot . /sbin/init -i < dev/console > dev/console 2>&1
+		exec /usr/sbin/chroot . /sbin/init -i < dev/console > dev/console 2>&1
+	EOF
 }
 
 initrd_gen_lvm() {
@@ -1563,16 +1589,20 @@
 			inst $device /dev
 		done
 	fi
-	echo "mount -t proc none /proc" >> "$s"
-	echo "mount -t tmpfs none /tmp" >> "$s"
+	add_linuxrc <<-'EOF'
+		mount -t proc none /proc
+		mount -t tmpfs none /tmp
+	EOF
 	if [ "$LVMTOOLSVERSION" = "1" ]; then
-		echo "lvm vgscan -T" >> "$s"
-		echo "lvm vgchange -T -a y $VGVOLUME" >> "$s"
-		echo "umount /tmp" >> "$s"
-		# fail to umount
-		echo "umount /proc" >> "$s"
+		add_linuxrc <<-EOF
+			lvm vgscan -T
+			lvm vgchange -T -a y $VGVOLUME
+			umount /tmp
+			# fail to umount
+			umount /proc
+		EOF
 	else
-		echo "cat /etc/lvm.conf > /tmp/lvm.conf" >> "$s"
+		echo "cat /etc/lvm.conf > /tmp/lvm.conf" | add_linuxrc
 		echo "global {" > "$MNTIMAGE/etc/lvm.conf"
 		echo "	locking_type = 0" >> "$MNTIMAGE/etc/lvm.conf"
 		echo "	locking_dir = \"/tmp\"" >> "$MNTIMAGE/etc/lvm.conf"
@@ -1601,50 +1631,49 @@
 
 		initrd_gen_devices
 
-		cat <<-EOF >> "$s"
-
-		# disable noise from lvm accessing devices that aren't ready.
-		printk=\$(cat /proc/sys/kernel/printk)
-		echo 0 > /proc/sys/kernel/printk
-
-		export LVM_SYSTEM_DIR=/tmp
-		: 'Scanning for Volume Groups'
-		lvm vgscan --mknodes --ignorelockingfailure 2>/dev/null
-
-		: 'Activating Volume Groups'
-		lvm vgchange --ignorelockingfailure -a y $VGVOLUME 2>/dev/null
-
-		echo "\$printk" > /proc/sys/kernel/printk
-
-		# Find out major/minor
-		majmin="\$(lvm lvdisplay --ignorelockingfailure -c $rootdev 2>/dev/null)"
-		majmin="\${majmin#*/}"
-		majmin="\${majmin#*:*:*:*:*:*:*:*:*:*:*:*}"
-		major="\${majmin%:*}"
-		minor="\${majmin#*:}"
-		# Pass it to kernel
-		val=\$((256 * \$major + \$minor))
-		echo \$val > /proc/sys/kernel/real-root-dev
-		umount /tmp
-		umount /proc
-EOF
+		add_linuxrc <<-EOF
+			# disable noise from lvm accessing devices that aren't ready.
+			printk=\$(cat /proc/sys/kernel/printk)
+			echo 0 > /proc/sys/kernel/printk
+
+			export LVM_SYSTEM_DIR=/tmp
+			: 'Scanning for Volume Groups'
+			lvm vgscan --mknodes --ignorelockingfailure 2>/dev/null
+
+			: 'Activating Volume Groups'
+			lvm vgchange --ignorelockingfailure -a y $VGVOLUME 2>/dev/null
+
+			echo "\$printk" > /proc/sys/kernel/printk
+
+			# Find out major/minor
+			majmin="\$(lvm lvdisplay --ignorelockingfailure -c $rootdev 2>/dev/null)"
+			majmin="\${majmin#*/}"
+			majmin="\${majmin#*:*:*:*:*:*:*:*:*:*:*:*}"
+			major="\${majmin%:*}"
+			minor="\${majmin#*:}"
+			# Pass it to kernel
+			val=\$((256 * \$major + \$minor))
+			echo \$val > /proc/sys/kernel/real-root-dev
<<diff output has been trimmed to 500 lines, 165 line(s) remained.>>


More information about the pld-cvs-commit mailing list