From 7df987a652b93d55dd8eca363706d3bacc469b55 Mon Sep 17 00:00:00 2001 From: William Harrington Date: Thu, 27 Nov 2014 16:29:31 -0600 Subject: Initial commit message for lfs live howto. --- book/initrd.html | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 book/initrd.html (limited to 'book/initrd.html') diff --git a/book/initrd.html b/book/initrd.html new file mode 100644 index 0000000..d92a5ed --- /dev/null +++ b/book/initrd.html @@ -0,0 +1,102 @@ + +4.1.  Building the initramfs image

4.1. Building the initramfs image

[Note]

Note

This chapter is mandatory for both the livecd and the livekey.

To boot our live system, we will need an initramfs image, which will contain a couple of utilities and kernel modules, necessary to find our rootfs and mount it. +

Create a directory structure:

mkdir -p initramfs/{bin,sbin,dev/{pts,shm},etc,proc,sys,rtmnt,lib}

Copy busybox which we created in the chapter busybox 1.19.2 to the bin directory

cp <path-to-busybox-builddir>/busybox initramfs/bin 

Busybox can install symlinks for the desired utilities itself, however this can be done until the init script is running. So for some utilities that we need before this stage, we need to create the symlinks our selfs.

ln -s /bin/busybox initramfs/bin/ash 
+ln -s /bin/busybox initramfs/bin/mount 

We need access to some devicenodes before udev starts:

mknod initramfs/dev/null c 1 3 
+mknod initramfs/dev/tty c 5 0 
+mknod initramfs/dev/console c 5 1 

Add the necessary kernel modules:

for filename in sd_mod usbcore ehci-hcd usb-storage usb-libusual uhci-hcd ext3 mbcache jbd 
+do
+	find /lib/modules/`uname -r` -name "$filename"* -exec cp -r --parents {} initramfs \;
+done

This will search for the given modules, and copy them to the initramfs

Now we need to create the initscript:

cat > initramfs/init << "EOF" 
+#!/bin/ash
+
+PATH=/bin:/sbin
+
+# Mount proc and sysfs
+
+mount -t proc none /proc 
+mount -t sysfs none /sys 
+mount -t devtmpfs none /dev
+
+# Unpack the busybox
+
+/bin/busybox --install -s
+
+# Add modules
+
+if [ -z $(ls /lib/modules/) ]; then
+
+	depmod -a
+
+	modprobe sd_mod
+	modprobe usbcore
+	modprobe ehci-hcd
+	modprobe usb-storage
+	modprobe ext3
+
+fi
+
+# Check the command line 
+
+initfile="/sbin/init"
+root=""
+
+# Check the parameterlist for rootdelay 
+
+for arg in $(cat /proc/cmdline); do
+	case $arg in
+
+	rootdelay=*)
+		dt=$(echo $arg | cut -d= -f2)
+		sleep $dt
+		;;
+	esac
+done
+
+# Check the parameterlist for UUID= and LABEL=
+
+for arg in $(cat /proc/cmdline); do
+	case $arg in
+
+	 root=*)
+		option=$(echo $arg | cut -d= -f2)
+
+		if [ $option == "LABEL" ] ; then
+			root=$(findfs LABEL=$(echo $arg | cut -d= -f3))
+		fi
+
+		if [ $option == "UUID" ] ; then
+			root=$(findfs UUID=$(echo $arg | cut -d= -f3))
+		fi
+
+		;;
+
+	init=*)
+		initfile=$(echo "$@" | cut -d "=" -f 2 )
+
+		;;
+
+	esac
+done
+
+if [ $root != "" ] ; then
+
+	mount "${root}" /rtmnt
+
+	if [[ -x "/rtmnt/${initfile}" ]] ; then
+
+		umount /dev
+		umount /sys 
+		umount /proc
+
+		exec switch_root /rtmnt "${initfile}"
+	fi
+fi
+
+# We shouldn't come here
+
+exec ash
+EOF
+chmod 0755 initramfs/init

Pack our stuff:

cd initramfs 
+find ./ | cpio -H newc -o > ../initrd 
+cd .. 
+gzip initrd

Keep our created initrd.gz for later use.

-- cgit v1.2.3-54-g00ecf