SVN: geninitrd/trunk/geninitrd

glen glen at pld-linux.org
Tue Oct 30 22:25:46 CET 2007


Author: glen
Date: Tue Oct 30 22:25:46 2007
New Revision: 8907

Modified:
   geninitrd/trunk/geninitrd
Log:
- new functions: mount_{dev,sys,proc,tmp} to mount those filesystems and use them

Modified: geninitrd/trunk/geninitrd
==============================================================================
--- geninitrd/trunk/geninitrd	(original)
+++ geninitrd/trunk/geninitrd	Tue Oct 30 22:25:46 2007
@@ -51,8 +51,15 @@
 
 # internal variables
 # is /dev on tmpfs
-tmpfs_dev=no
-# is /proc/devices entries already created
+dev_mounted=no
+# is /proc mounted
+proc_mounted=no
+# is /sys mounted
+sys_mounted=no
+# is /tmp mounted on tmpfs
+tmp_mounted=no
+
+# are /dev nodes already created from /proc/devices info?
 proc_partitions=no
 
 # LVM devices that should not be included in vgscan on initrd
@@ -86,7 +93,7 @@
 	USE_MULTIPATH=yes
 fi
 
-usage () {
+usage() {
 	uname_r=$(uname -r)
 	echo "usage: $PROGRAM [--version] [-v] [-f] [--ifneeded] [--preload <module>]"
 	echo "       [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]"
@@ -119,9 +126,96 @@
 # append text to /linuxrc
 # takes STDIN as input
 add_linuxrc() {
-	cat >> "$s"
+	cat >> "$RCFILE"
+}
+
+# generate code to mount /dev on tmpfs and create initial nodes
+# can be called multiple times. /dev is cleaned up (umounted) automatically at
+# the end of script.
+mount_dev() {
+    if [ "$INITRDFS" = "initramfs" ]; then
+		# initramfs is read-write filesystem, no need for tmpfs
+		return
+	fi
+
+	# we already generated tmpfs code; return
+	if is_yes "$dev_mounted"; then
+		return
+	fi
+
+	dev_mounted=yes
+
+	busybox_applet mount mknod mkdir
+	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
+}
+
+# generate code to mount /proc on initrd
+# can be called multiple times
+mount_proc() {
+	if is_yes "$proc_mounted"; then
+		return
+	fi
+
+	proc_mounted=yes
+	echo "mount -t proc none /proc" | add_linuxrc
+}
+
+# generate code to mount /sys on initrd
+# can be called multiple times
+mount_sys() {
+	if is_yes "$sys_mounted"; then
+		return
+	fi
+
+	sys_mounted=yes
+	echo "mount -t sysfs none /sys" | add_linuxrc
+}
+
+# generate code to mount /tmp on initrd
+# can be called multiple times
+mount_tmp() {
+    if [ "$INITRDFS" = "initramfs" ]; then
+		# initramfs is read-write filesystem, no need for tmpfs
+		return
+	fi
+
+	if is_yes "$tmp_mounted"; then
+		return
+	fi
+
+	tmp_mounted=yes
+	echo "mount -t tmpfs none /tmp" | add_linuxrc
+}
+
+# unmount all mountpoints mounted by geninitrd
+umount_all() {
+	if is_yes "$dev_mounted"; then
+		echo 'umount /dev' | add_linuxrc
+		dev_mounted=no
+	fi
+	if is_yes "$proc_mounted"; then
+		echo 'umount /proc' | add_linuxrc
+		proc_mounted=no
+	fi
+	if is_yes "$sys_mounted"; then
+		echo 'umount /sys' | add_linuxrc
+		sys_mounted=no
+	fi
+	if is_yes "$tmp_mounted"; then
+		echo 'umount /tmp' | add_linuxrc
+		tmp_mounted=no
+	fi
 }
 
+
 # Checks if busybox has support for APPLET(s)
 # Exits from geninitrd if the support is not present.
 #
@@ -803,7 +897,7 @@
 	fi
 }
 
-firmware_install_module_pre() {
+firmware_install_module() {
 	local module="$1"
 	local firmware_files="$2"
 
@@ -827,21 +921,11 @@
 		inst /lib/firmware/$firmware /lib/firmware/$firmware
 	done
 
-	echo "mount -t proc none /proc" | add_linuxrc
-	echo "mount -t sysfs none /sys" | add_linuxrc
+	mount_proc
+	mount_sys
 	echo "echo -n "/lib/firmware/firmware.sh" > /proc/sys/kernel/hotplug" | add_linuxrc
 }
 
-firmware_install_module_post() {
-	local module="$1"
-	local firmware_files="$2"
-
-	add_linuxrc <<-'EOF'
-		umount /sys
-		umount /proc
-	EOF
-}
-
 modules_install() {
 	local modules="$1"
 	local mod
@@ -884,15 +968,12 @@
 		fi
 
 		if [ -n "$firmware_var" ]; then
-			firmware_install_module_pre "$module" "$firmware_var"
+			firmware_install_module "$module" "$firmware_var"
 		fi
 		echo "$insmod /lib/modules/$kernel/$MODULE2 $options" | add_linuxrc
 		if [ -n "${sleep_var}" ]; then
 			echo "usleep $sleep_var" | add_linuxrc
 		fi
-		if [ -n "$firmware_var" ]; then
-			firmware_install_module_post "$module" "$firmware_var"
-		fi
 	done
 }
 
@@ -1230,9 +1311,6 @@
 mknod "$MNTIMAGE/dev/zero" c 1 5
 inst_d /dev/pts /dev/shm
 
-s="$RCFILE"
-> "$s"
-chmod 755 "$s"
 ln -s /linuxrc $MNTIMAGE/init
 
 inst /bin/initrd-busybox /bin/initrd-busybox
@@ -1243,11 +1321,10 @@
 	inst "$INSMOD" /bin/insmod.static
 fi
 
+echo '#!/bin/sh' | add_linuxrc
+mount_proc
 add_linuxrc <<-'EOF'
-	#!/bin/sh
-	mount -t proc none /proc
 	export CMDLINE="$(cat /proc/cmdline)"
-	umount /proc
 
 	export DEBUGINITRD=$(echo "$CMDLINE" | awk '{ for (i=1; i<=NF; i++) { if ($i == "debuginitrd") { print "yes"; exit }; if ($i ~ /^debuginitrd=/) { gsub(/^debuginitrd=/, NIL, $i); print $i; exit; } } }')
 
@@ -1302,44 +1379,14 @@
 
 initrd_gen_tuxonice() {
 	inst_d /sys /proc
+	mount_proc
+	mount_sys
 	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
-# can be called multiple times. /dev is cleaned up (umounted) automatically at
-# the end of script.
-initrd_gen_tmpfs_dev() {
-    if [ "$INITRDFS" = "initramfs" ]; then
-		# initramfs is read-write filesystem, no need for tmpfs
-		return
-	fi
-
-	# we already generated tmpfs code; return
-	if is_yes "$tmpfs_dev"; then
-		return
-	fi
-
-	tmpfs_dev=yes
-
-	busybox_applet mount mknod mkdir
-	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
 }
 
@@ -1354,30 +1401,25 @@
 	inst /sbin/initrd-udevd /sbin/udevd
 	inst /etc/udev/udev.conf /etc/udev/udev.conf
 
-	if is_yes "$USE_UDEV"; then
-		initrd_gen_tmpfs_dev
+	mount_dev
+	mount_sys
+	add_linuxrc <<-'EOF'
+		: 'Starting udev'
+		/sbin/udevd --daemon
+	EOF
+	if is_yes "$PROBESTATICMODS"; then
+		inst /sbin/initrd-udevtrigger /sbin/udevtrigger
+		inst /sbin/initrd-udevsettle /sbin/udevsettle
 		add_linuxrc <<-'EOF'
-			mount -t proc none /proc
-			mount -t sysfs none /sys
-			: 'Starting udev'
-			/sbin/udevd --daemon
-		EOF
-		if is_yes "$PROBESTATICMODS"; then
-			inst /sbin/initrd-udevtrigger /sbin/udevtrigger
-			inst /sbin/initrd-udevsettle /sbin/udevsettle
-			add_linuxrc <<-'EOF'
-				/sbin/udevtrigger
-				/sbin/udevsettle
-			EOF
-		fi
-
-		busybox_applet killall
-	   	add_linuxrc	<<-'EOF'
-			killall udevd
-			umount /proc
-			umount /sys
+			/sbin/udevtrigger
+			/sbin/udevsettle
 		EOF
 	fi
+
+	busybox_applet killall
+	add_linuxrc	<<-'EOF'
+		killall udevd
+	EOF
 }
 
 initrd_gen_multipath() {
@@ -1393,14 +1435,11 @@
 		inst /var/lib/multipath/bindings /var/lib/multipath
 	fi
 
-	add_linuxrc <<-'EOF'
-		mount -t proc none /proc
-		mount -t sysfs none /sys
-	EOF
-
-	initrd_gen_tmpfs_dev
+	mount_proc
+	mount_dev
 	initrd_gen_devices
 
+	mount_sys
 	echo "export multipath_id=$MULTIPATH_ID" | add_linuxrc
 	add_linuxrc <<-'EOF'
 		debugshell
@@ -1411,9 +1450,6 @@
 			/sbin/kpartx -a $a
 		done
 		debugshell
-
-		umount /sys
-		umount /proc
 	EOF
 }
 
@@ -1422,18 +1458,13 @@
 		die "/sbin/dmraid-initrd is missing!"
 	fi
 
-	# always make /dev on tmpfs
-	initrd_gen_tmpfs_dev
-
 	inst_d /sbin /sys
 	inst /sbin/dmraid-initrd /sbin/dmraid
-	add_linuxrc <<-EOF
-		mount -t proc none /proc
-		mount -t sysfs none /sys
-	EOF
 
+	mount_dev
+	mount_proc
+	mount_sys
 	initrd_gen_devices
-
 	add_linuxrc <<-EOF
 		# 2 secs was enough for my system to initialize. but really this is udev issue?
 		usleep 2000000
@@ -1441,9 +1472,6 @@
 		/sbin/dmraid -ay -i
 
 		debugshell
-
-		umount /sys
-		umount /proc
 	EOF
 }
 
@@ -1456,6 +1484,8 @@
 	fi
 	proc_partitions=yes
 
+	mount_proc
+	mount_dev
 	add_linuxrc <<-'EOF'
 		: 'Making device nodes'
 		cat /proc/partitions | (
@@ -1542,8 +1572,11 @@
 				route add default gw $r dev $interface
 			done
 		fi
+	EOF
 
-		mount -t proc none /proc
+	mount_proc
+
+	cat <<-'EOF' > "$MNTIMAGE/bin/setdhcp"
 		for o in $(cat /proc/cmdline); do
 			case $o in
 			nfsroot=*)
@@ -1551,7 +1584,6 @@
 				;;
 			esac
 		done
-		umount /proc
 
 		if [ -n "$rootpath" ]; then
 			mount -n -t nfs -o ro,nolock,posix,tcp,wsize=8192,rsize=8192 $rootpath /newroot
@@ -1578,10 +1610,10 @@
 
 	# always make /dev on tmpfs for LVM2
 	if [ "$LVMTOOLSVERSION" = "2" ]; then
-		initrd_gen_tmpfs_dev
+		mount_dev
 	fi
 
-	if ! is_yes "$tmpfs_dev"; then
+	if ! is_yes "$dev_mounted"; then
 		inst_d /dev/mapper
 		mknod $MNTIMAGE/dev/mapper/control c 10 63
 		for device in $PVDEVICES; do
@@ -1590,17 +1622,13 @@
 			inst $device /dev
 		done
 	fi
-	add_linuxrc <<-'EOF'
-		mount -t proc none /proc
-		mount -t tmpfs none /tmp
-	EOF
+
+	mount_proc
+	mount_tmp
 	if [ "$LVMTOOLSVERSION" = "1" ]; then
 		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" | add_linuxrc
@@ -1655,8 +1683,6 @@
 			# Pass it to kernel
 			val=\$((256 * \$major + \$minor))
 			echo \$val > /proc/sys/kernel/real-root-dev
-			umount /tmp
-			umount /proc
 		EOF
 	fi
 }
@@ -1664,8 +1690,8 @@
 initrd_gen_procdata() {
 	debug "Adding rootfs finding based on root= option support."
 	inst_d /proc
+	mount_proc
 	add_linuxrc <<-'EOF'
-		mount -t proc none /proc
 		root="$(busybox awk ' /root=\/dev\// { gsub(/.*root=\/dev\//,NIL,$0); gsub(/ .*/,NIL,$0); print $0; } ' /proc/cmdline)"
 		if [ -n "$root" ]; then
 			rootnr="$(busybox awk -v root="$root" ' { if ($4 == root) { print 256*$1+$2; } } ' /proc/partitions)"
@@ -1673,12 +1699,10 @@
 				echo "$rootnr" > /proc/sys/kernel/real-root-dev
 			fi
 		fi
-		umount /proc
 	EOF
 }
 
 # main generation
-
 if is_yes "$USE_UDEV"; then
 	initrd_gen_udev
 fi
@@ -1714,14 +1738,6 @@
 	initrd_gen_procdata
 fi
 
-# finally umount /dev if it was on tmpfs
-if is_yes "$tmpfs_dev"; then
-	add_linuxrc <<-EOF
-		umount /dev
-	EOF
-	tmpfs_dev=no
-fi
-
 # additional devs always needed
 [ ! -e "$MNTIMAGE/$rootdev_add" ] && inst $rootdev_add /dev
 
@@ -1730,9 +1746,8 @@
 	[ ! -e "$MNTIMAGE/$rootdev" ] && inst $rootdev /dev
 	# Parsing root parameter
 	# We support passing root as hda3 /dev/hda3 0303 0x0303 and 303
+	mount_proc
 	add_linuxrc <<-'EOF'
-		mount -t proc none /proc
-
 		eval "$(busybox awk -v c="$CMDLINE" '
 		BEGIN {
 			num_pattern_short = "[0-9a-f][0-9a-f][0-9a-f]";
@@ -1778,7 +1793,9 @@
 		if [ -z "\$init" -o ! -x "/newroot\$init" ]; then
 			init=/sbin/init
 		fi
-		umount /proc
+	EOF
+		umount_all
+	add_linuxrc <<-EOF
 		exec switch_root /newroot \$init
 
 		echo "Error ! initramfs should not reach this place."
@@ -1792,6 +1809,9 @@
 	# we need real file, not symlink
 	rm -f $MNTIMAGE/init
 	cp -a $MNTIMAGE/linuxrc $MNTIMAGE/init
+else
+	# other than initramfs
+	umount_all
 fi
 
 chmod +x "$RCFILE"


More information about the pld-cvs-commit mailing list