From 88ffd2df3fcc78cb656b077acb3e8374474b1356 Mon Sep 17 00:00:00 2001 From: Victor Lowther Date: Mon, 16 Mar 2009 04:42:02 -0500 Subject: [PATCH 01/28] Update test framework to create and use LVM on cryptroot --- dracut | 6 ++++++ modules.d/00test/check | 2 ++ modules.d/00test/copy-root.sh | 2 ++ modules.d/00test/create-root.sh | 19 ++++++++++++++++++ modules.d/00test/halt.sh | 5 +++++ modules.d/00test/install | 5 +++++ modules.d/90crypt/cryptroot.sh | 4 ++-- modules.d/90crypt/install | 1 + modules.d/99base/init | 8 +++++--- test/dracut.conf.test | 2 +- test/make-test-root | 35 ++++++++++++++++++++------------- test/test-initramfs | 4 ++-- 12 files changed, 71 insertions(+), 22 deletions(-) create mode 100755 modules.d/00test/check create mode 100755 modules.d/00test/copy-root.sh create mode 100755 modules.d/00test/create-root.sh create mode 100755 modules.d/00test/halt.sh create mode 100755 modules.d/00test/install diff --git a/dracut b/dracut index eb3ff24a..7a14765a 100755 --- a/dracut +++ b/dracut @@ -19,6 +19,7 @@ while (($# > 0)); do -c|--conf) conffile="$2"; shift;; -l|--local) allowlocal="yes" ;; -h|--hostonly) hostonly="-h" ;; + -i|--include) include_src="$2"; include_target="$3"; shift 2;; --skip-missing) skipmissing="yes" ;; *) break ;; esac @@ -102,4 +103,9 @@ unset moddir # make sure that library links are correct and up to date ldconfig -n -r "$initdir" /lib* /usr/lib* +[[ $include_src && $include_target ]] && { + mkdir -p "$initdir$include_target" + cp -a -t "$initdir$include_target" "$include_src"/* +} + ( cd "$initdir"; find . |cpio -H newc -o |gzip -9 > "$outfile"; ) diff --git a/modules.d/00test/check b/modules.d/00test/check new file mode 100755 index 00000000..afe8ade3 --- /dev/null +++ b/modules.d/00test/check @@ -0,0 +1,2 @@ +#!/bin/bash +exit 1 diff --git a/modules.d/00test/copy-root.sh b/modules.d/00test/copy-root.sh new file mode 100755 index 00000000..fe9f57ae --- /dev/null +++ b/modules.d/00test/copy-root.sh @@ -0,0 +1,2 @@ +#!/bin/sh +cp -a -t "$NEWROOT" /source/* \ No newline at end of file diff --git a/modules.d/00test/create-root.sh b/modules.d/00test/create-root.sh new file mode 100755 index 00000000..ce9f40bf --- /dev/null +++ b/modules.d/00test/create-root.sh @@ -0,0 +1,19 @@ +#!/bin/sh +sfdisk /dev/sda </dev/console 2>&1 /cryptroot - udevadm control --start-exec-queue + udevadm control --start_exec_queue udevadm settle --timeout=30 } diff --git a/modules.d/90crypt/install b/modules.d/90crypt/install index 92b51699..82f8ffdb 100755 --- a/modules.d/90crypt/install +++ b/modules.d/90crypt/install @@ -1,4 +1,5 @@ #!/bin/bash inst cryptsetup +instmods dm_crypt =crypto inst_rules "$moddir/63-luks.rules" inst_hook mount 10 "$moddir/cryptroot.sh" \ No newline at end of file diff --git a/modules.d/99base/init b/modules.d/99base/init index b45bb7b1..5661d600 100755 --- a/modules.d/99base/init +++ b/modules.d/99base/init @@ -41,7 +41,7 @@ mount -t sysfs /sys /sys >/dev/null 2>&1 mount -t tmpfs -omode=0755 udev /dev >/dev/null 2>&1 read CMDLINE Date: Thu, 19 Mar 2009 09:31:28 -0500 Subject: [PATCH 02/28] Move processing root options into a pre-udev hook. Also make changes that will make it easier to udevify resuming from hibernate and mounting root. --- modules.d/99base/mount-root.sh | 5 ++-- modules.d/99base/parse-root-opts.sh | 45 +++++++++++++++-------------- modules.d/99base/resume.sh | 3 +- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/modules.d/99base/mount-root.sh b/modules.d/99base/mount-root.sh index b0c82508..8acd3c5f 100755 --- a/modules.d/99base/mount-root.sh +++ b/modules.d/99base/mount-root.sh @@ -1,3 +1,4 @@ #!/bin/sh -[ "$root" ] && mount $fstype -o "$rflags" "$root" "$NEWROOT" && \ - ROOTFS_MOUNTED=yes +if [ ! -s /.resume -a "$root" ]; then + mount $fstype -o "$rflags" "$root" "$NEWROOT" && ROOTFS_MOUNTED=yes +fi diff --git a/modules.d/99base/parse-root-opts.sh b/modules.d/99base/parse-root-opts.sh index 799c9565..473c34dc 100755 --- a/modules.d/99base/parse-root-opts.sh +++ b/modules.d/99base/parse-root-opts.sh @@ -1,24 +1,27 @@ #!/bin/sh -[ "$root" ] || { - root=$(getarg root=) - case $root in - LABEL=*) root=${root#LABEL=} - root="$(echo $root |sed 's,/,\\x2f,g')" - root="/dev/disk/by-label/${root}" ;; - UUID=*) root="/dev/disk/by-uuid/${root#UUID=}" ;; - '') echo "Warning: no root specified" - root="/dev/sda1" ;; - esac -} +if resume=$(getarg resume=) && ! getarg noresume; then + export resume + echo "$resume" >/.resume +else + unset resume +fi -[ "$rflags" ] || { - if rflags="$(getarg rootflags=)"; then - getarg rw && rflags="${rflags},rw" || rflags="${rflags},ro" - else - getarg rw && rflags=rw || rflags=ro - fi -} +root=$(getarg root=) +case $root in + LABEL=*) root=${root#LABEL=} + root="$(echo $root |sed 's,/,\\x2f,g')" + root="/dev/disk/by-label/${root}" ;; + UUID=*) root="/dev/disk/by-uuid/${root#UUID=}" ;; + '') echo "Warning: no root specified" + root="/dev/sda1" ;; +esac -[ "$fstype" ] || { - fstype="$(getarg rootfstype=)" && fstype="-t ${fstype}" -} +if rflags="$(getarg rootflags=)"; then + getarg rw && rflags="${rflags},rw" || rflags="${rflags},ro" +else + getarg rw && rflags=rw || rflags=ro +fi + +fstype="$(getarg rootfstype=)" && fstype="-t ${fstype}" + +export fstype rflags root diff --git a/modules.d/99base/resume.sh b/modules.d/99base/resume.sh index a01a6131..8bb4114f 100755 --- a/modules.d/99base/resume.sh +++ b/modules.d/99base/resume.sh @@ -1,7 +1,8 @@ #!/bin/sh -resume=$(getarg resume=) && ! getarg noresume && [ -b "$resume" ] && { +[ -s /.resume -a -b "$resume" ] && { # parsing the output of ls is Bad, but until there is a better way... ls -lH "$resume" | ( read x x x x maj min x; echo "${maj%,}:$min"> /sys/power/resume) + >/.resume } From fa0115c3c06176bd0fdfcd8966021979ec84f3d7 Mon Sep 17 00:00:00 2001 From: Victor Lowther Date: Thu, 19 Mar 2009 09:59:06 -0500 Subject: [PATCH 03/28] Unlock our encrypted root in a udev rule. --- modules.d/90crypt/63-luks.rules | 2 +- modules.d/90crypt/cryptroot.sh | 15 +++------------ modules.d/90crypt/install | 2 +- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/modules.d/90crypt/63-luks.rules b/modules.d/90crypt/63-luks.rules index 802ea062..d225f75c 100644 --- a/modules.d/90crypt/63-luks.rules +++ b/modules.d/90crypt/63-luks.rules @@ -8,6 +8,6 @@ SUBSYSTEM!="block", GOTO="luks_end" ACTION!="add|change", GOTO="luks_end" KERNEL!="sr*", IMPORT{program}="vol_id --export $tempnode" -ENV{ID_FS_TYPE}=="crypto_LUKS", RUN+="/bin/sh -c 'echo $env{DEVNAME} luks-$env{ID_FS_UUID} >>/cryptroot'" +ENV{ID_FS_TYPE}=="crypto_LUKS", RUN+="/bin/cryptroot.sh $env{DEVNAME} luks-$env{ID_FS_UUID}" LABEL="luks_end" diff --git a/modules.d/90crypt/cryptroot.sh b/modules.d/90crypt/cryptroot.sh index d00d5cc1..21323665 100755 --- a/modules.d/90crypt/cryptroot.sh +++ b/modules.d/90crypt/cryptroot.sh @@ -1,13 +1,4 @@ #!/bin/sh -[ -s /cryptroot ] && { - udevadm control --stop_exec_queue - while read cryptopts; do - ( exec >/dev/console 2>&1 /cryptroot - udevadm control --start_exec_queue - udevadm settle --timeout=30 -} +exec >/dev/console 2>&1 Date: Thu, 19 Mar 2009 10:38:22 -0500 Subject: [PATCH 04/28] Update plymouth to work with running cryptsetup from a udev rule. --- modules.d/50plymouth/63-luks.rules | 13 ------------- modules.d/50plymouth/cryptroot.sh | 17 ++++------------- modules.d/50plymouth/install | 2 +- 3 files changed, 5 insertions(+), 27 deletions(-) delete mode 100644 modules.d/50plymouth/63-luks.rules diff --git a/modules.d/50plymouth/63-luks.rules b/modules.d/50plymouth/63-luks.rules deleted file mode 100644 index 5463139c..00000000 --- a/modules.d/50plymouth/63-luks.rules +++ /dev/null @@ -1,13 +0,0 @@ -# hacky rules to try to try unlocking dm-crypt devs -# -# Copyright 2008, Red Hat, Inc. -# Jeremy Katz - - -SUBSYSTEM!="block", GOTO="luks_end" -ACTION!="add|change", GOTO="luks_end" - -KERNEL!="sr*", IMPORT{program}="vol_id --export $tempnode" -ENV{ID_FS_TYPE}=="crypto_LUKS", RUN+="plymouth-ask $env{DEVNAME} luks-$env{ID_FS_UUID}" - -LABEL="luks_end" diff --git a/modules.d/50plymouth/cryptroot.sh b/modules.d/50plymouth/cryptroot.sh index afb5f84f..d2fb43f4 100755 --- a/modules.d/50plymouth/cryptroot.sh +++ b/modules.d/50plymouth/cryptroot.sh @@ -1,14 +1,5 @@ #!/bin/sh -[ -s /cryptroot ] && { - udevadm control --stop-exec-queue - while read cryptopts; do - ( exec >/dev/console 2>&1 /cryptroot - udevadm control --start-exec-queue - udevadm settle --timeout=30 -} +exec >/dev/console 2>&1 Date: Thu, 19 Mar 2009 10:41:03 -0500 Subject: [PATCH 05/28] Move parsing rootfs options to a pre-udev hook. --- modules.d/99base/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.d/99base/install b/modules.d/99base/install index 922dca9d..30f18f9c 100755 --- a/modules.d/99base/install +++ b/modules.d/99base/install @@ -3,7 +3,7 @@ dracut_install mount mknod mkdir modprobe pidof sleep chroot echo sed sh ls # install our scripts and hooks inst "$moddir/init" "/init" inst "$moddir/switch_root" "/sbin/switch_root" -inst_hook pre-mount 10 "$moddir/parse-root-opts.sh" +inst_hook pre-udev 10 "$moddir/parse-root-opts.sh" inst_hook pre-pivot 50 "$moddir/selinux-loadpolicy.sh" inst_hook mount 90 "$moddir/resume.sh" inst_hook mount 99 "$moddir/mount-root.sh" From 99576a2a63bc8b482ffb0e2f45276f8cbefc67cf Mon Sep 17 00:00:00 2001 From: Victor Lowther Date: Thu, 19 Mar 2009 12:07:31 -0500 Subject: [PATCH 06/28] Split out resume handling into its own hook. --- modules.d/95resume/install | 4 ++++ modules.d/95resume/parse-resume.sh | 7 +++++++ modules.d/{99base => 95resume}/resume.sh | 0 3 files changed, 11 insertions(+) create mode 100755 modules.d/95resume/install create mode 100755 modules.d/95resume/parse-resume.sh rename modules.d/{99base => 95resume}/resume.sh (100%) diff --git a/modules.d/95resume/install b/modules.d/95resume/install new file mode 100755 index 00000000..532fcc3f --- /dev/null +++ b/modules.d/95resume/install @@ -0,0 +1,4 @@ +#!/bin/bash +inst_hook pre-udev 10 "$moddir/parse-resume.sh" +inst_hook mount 90 "$moddir/resume.sh" + diff --git a/modules.d/95resume/parse-resume.sh b/modules.d/95resume/parse-resume.sh new file mode 100755 index 00000000..447e1512 --- /dev/null +++ b/modules.d/95resume/parse-resume.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if resume=$(getarg resume=) && ! getarg noresume; then + export resume + echo "$resume" >/.resume +else + unset resume +fi diff --git a/modules.d/99base/resume.sh b/modules.d/95resume/resume.sh similarity index 100% rename from modules.d/99base/resume.sh rename to modules.d/95resume/resume.sh From 35f90aafd20946176313b15ebcfd0c919bcd09b5 Mon Sep 17 00:00:00 2001 From: Victor Lowther Date: Thu, 19 Mar 2009 12:15:02 -0500 Subject: [PATCH 07/28] Move finding and mounting root on block devices into its own hook. --- modules.d/95rootfs-block/install | 3 +++ modules.d/{99base => 95rootfs-block}/mount-root.sh | 0 modules.d/{99base => 95rootfs-block}/parse-root-opts.sh | 0 modules.d/99base/install | 3 --- 4 files changed, 3 insertions(+), 3 deletions(-) create mode 100755 modules.d/95rootfs-block/install rename modules.d/{99base => 95rootfs-block}/mount-root.sh (100%) rename modules.d/{99base => 95rootfs-block}/parse-root-opts.sh (100%) diff --git a/modules.d/95rootfs-block/install b/modules.d/95rootfs-block/install new file mode 100755 index 00000000..8782fb5b --- /dev/null +++ b/modules.d/95rootfs-block/install @@ -0,0 +1,3 @@ +#!/bin/sh +inst_hook pre-udev 10 "$moddir/parse-root-opts.sh" +inst_hook mount 99 "$moddir/mount-root.sh" diff --git a/modules.d/99base/mount-root.sh b/modules.d/95rootfs-block/mount-root.sh similarity index 100% rename from modules.d/99base/mount-root.sh rename to modules.d/95rootfs-block/mount-root.sh diff --git a/modules.d/99base/parse-root-opts.sh b/modules.d/95rootfs-block/parse-root-opts.sh similarity index 100% rename from modules.d/99base/parse-root-opts.sh rename to modules.d/95rootfs-block/parse-root-opts.sh diff --git a/modules.d/99base/install b/modules.d/99base/install index 30f18f9c..2bb83e94 100755 --- a/modules.d/99base/install +++ b/modules.d/99base/install @@ -3,7 +3,4 @@ dracut_install mount mknod mkdir modprobe pidof sleep chroot echo sed sh ls # install our scripts and hooks inst "$moddir/init" "/init" inst "$moddir/switch_root" "/sbin/switch_root" -inst_hook pre-udev 10 "$moddir/parse-root-opts.sh" inst_hook pre-pivot 50 "$moddir/selinux-loadpolicy.sh" -inst_hook mount 90 "$moddir/resume.sh" -inst_hook mount 99 "$moddir/mount-root.sh" From 597bd00990242461c6c169bf7123033188819654 Mon Sep 17 00:00:00 2001 From: Victor Lowther Date: Thu, 19 Mar 2009 12:20:26 -0500 Subject: [PATCH 08/28] Load all our usual dracut modules --- test/dracut.conf.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/dracut.conf.test b/test/dracut.conf.test index d6c17425..bba48d72 100644 --- a/test/dracut.conf.test +++ b/test/dracut.conf.test @@ -1,2 +1,2 @@ -dracutmodules="kernel-modules crypt lvm udev-rules base" +dracutmodules="auto" modules="ata_piix ext2 sd_mod" From 8faaa8f08278ac6aba09b03fbaa487388acfefed Mon Sep 17 00:00:00 2001 From: Victor Lowther Date: Fri, 20 Mar 2009 02:19:33 -0500 Subject: [PATCH 09/28] Change default install target for udev rules. Also make sure that udev does not complain about a missing rules.d directory. --- dracut-functions | 4 ++-- test/dracut.conf.test | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dracut-functions b/dracut-functions index f5f24d89..2c98785c 100755 --- a/dracut-functions +++ b/dracut-functions @@ -140,8 +140,8 @@ find_rule() { # udev rules always get installed in the same place, so # create a function to install them to make life simpler. inst_rules() { - local target="/lib/udev/rules.d" - [[ -d $target ]] || target="/etc/udev/rules.d" + local target="/etc/udev/rules.d" + mkdir -p "$initdir/lib/udev/rules.d" "$initdir$target" for rule in "$@"; do rule=$(find_rule $rule) && \ inst_simple "$rule" "$target/${rule##*/}" diff --git a/test/dracut.conf.test b/test/dracut.conf.test index bba48d72..31741b57 100644 --- a/test/dracut.conf.test +++ b/test/dracut.conf.test @@ -1,2 +1,2 @@ -dracutmodules="auto" +dracutmodules="base dash crypt lvm kernel-modules resume rootfs-block udev-rules" modules="ata_piix ext2 sd_mod" From b5c7c7e829bb348f91d55659e3c63fbfe7ad17e5 Mon Sep 17 00:00:00 2001 From: Victor Lowther Date: Fri, 20 Mar 2009 02:25:13 -0500 Subject: [PATCH 10/28] Silence in the initramfs is golden. Get rid of gratuitous text -- we should only talk if asking a question or if something screwed up. --- modules.d/99base/init | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules.d/99base/init b/modules.d/99base/init index 5661d600..ca6121e5 100755 --- a/modules.d/99base/init +++ b/modules.d/99base/init @@ -28,7 +28,6 @@ source_all() { for f in "/$1"/*.sh; do [ -f "$f" ] && . "$f"; done } -echo "Starting initrd..." export PATH=/sbin:/bin:/usr/sbin:/usr/bin export TERM=linux trap "emergency_shell" 0 @@ -77,6 +76,7 @@ while :; do [ $i -gt 10 ] && emergency_shell done +# pre pivot scripts are sourced just before we switch over to the new root. getarg 'break=pre-pivot' && emergency_shell source_all pre-pivot @@ -91,11 +91,8 @@ done emergency_shell } -# pre pivot scripts are sourced just before we switch over to the new root. - getarg break && emergency_shell kill $(pidof udevd) -echo "Switching to real root filesystem $root" initargs="" for x in $CMDLINE; do [ "${x%%=*}" = "console" -o "${x%%=*}" = "BOOT_IMAGE" ] && continue From 80c9d068b2f83c3e9cc03c98d65f18ef67810d6a Mon Sep 17 00:00:00 2001 From: Victor Lowther Date: Fri, 20 Mar 2009 02:58:58 -0500 Subject: [PATCH 11/28] Just pass args the kernel passed to us, not /proc/cmdline args. --- modules.d/99base/init | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules.d/99base/init b/modules.d/99base/init index ca6121e5..2cf2f148 100755 --- a/modules.d/99base/init +++ b/modules.d/99base/init @@ -94,8 +94,10 @@ done getarg break && emergency_shell kill $(pidof udevd) initargs="" -for x in $CMDLINE; do - [ "${x%%=*}" = "console" -o "${x%%=*}" = "BOOT_IMAGE" ] && continue +for x in "$@"; do + [ "${x%%=*}" = "console" ] && continue + [ "${x%%=*}" = "BOOT_IMAGE" ] && continue + [ "${x%%=*}" = "break" ] && continue initargs="$initargs $x" done exec switch_root "$NEWROOT" "$INIT" $initargs || { From 92391334866747f09330103967157996d5f2effa Mon Sep 17 00:00:00 2001 From: Victor Lowther Date: Fri, 20 Mar 2009 03:34:30 -0500 Subject: [PATCH 12/28] Minor updates to the testing framework --- test/make-test-root | 2 +- test/test-init | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/make-test-root b/test/make-test-root index f310d5f6..6b6ea817 100755 --- a/test/make-test-root +++ b/test/make-test-root @@ -12,7 +12,7 @@ targetfs="$initdir" unset initdir dd if=/dev/zero of=test/root.ext2 bs=1M count=20 ./dracut -l -i "$targetfs" /source \ - -m "dash kernel-modules test crypt lvm udev-rules base" \ + -m "dash kernel-modules test crypt lvm udev-rules base rootfs-block" \ -d "ata_piix ext2 sd_mod" \ -f test/initramfs.makeroot diff --git a/test/test-init b/test/test-init index 63fde1ec..67563f84 100755 --- a/test/test-init +++ b/test/test-init @@ -1,8 +1,8 @@ #!/bin/sh exec >/dev/console 2>&1 export TERM=linux -ln -s /proc/mounts /etc/mtab -export PS1='initramfs-test:\w\$' +export PS1='initramfs-test:\w\$ ' +ln -s /proc/mounts /etc/fstab stty sane echo "made it to the rootfs!" echo 3 >/proc/sys/vm/drop_caches From 46202840737f8bbf658f297522a9cd0ffa78acc8 Mon Sep 17 00:00:00 2001 From: Victor Lowther Date: Fri, 20 Mar 2009 03:36:21 -0500 Subject: [PATCH 13/28] Move loading crypt kernel modules to the crypt module --- modules.d/90crypt/install | 2 +- modules.d/90kernel-modules/install | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules.d/90crypt/install b/modules.d/90crypt/install index 708d5a49..250139c4 100755 --- a/modules.d/90crypt/install +++ b/modules.d/90crypt/install @@ -1,5 +1,5 @@ #!/bin/bash inst cryptsetup -instmods dm_crypt =crypto +instmods dm_crypt cbc aes sha256 inst_rules "$moddir/63-luks.rules" inst "$moddir/cryptroot.sh" "/bin/cryptroot.sh" \ No newline at end of file diff --git a/modules.d/90kernel-modules/install b/modules.d/90kernel-modules/install index 70d16e9c..37062fb1 100755 --- a/modules.d/90kernel-modules/install +++ b/modules.d/90kernel-modules/install @@ -1,6 +1,6 @@ #!/bin/bash # FIXME: hard-coded module list of doom. -instmods ${modules:-=ata =block =drm dm-crypt aes sha256 cbc sd_mod} +instmods ${modules:-=ata =block sd_mod} # Grab modules for all filesystem types we currently have mounted while read d mp t rest; do From 0abfff0ddf9147ea6d8affb712447ed61966c079 Mon Sep 17 00:00:00 2001 From: Victor Lowther Date: Fri, 20 Mar 2009 03:40:02 -0500 Subject: [PATCH 14/28] Don't regenerate the test image when anything changes Only regenerate it if we changed test-init or make-test-root --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 45ad1a51..0474edeb 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ rpm: dracut-$(VERSION)-$(GITVERSION).tar.bz2 test: test/root.ext2 all sudo test/test-initramfs -test/root.ext2: test/test-init test/make-test-root all +test/root.ext2: test/test-init test/make-test-root sudo test/make-test-root testimage: all From 6ce3123192b2941738910dc7d7d2d828f49fc348 Mon Sep 17 00:00:00 2001 From: Victor Lowther Date: Fri, 20 Mar 2009 03:51:05 -0500 Subject: [PATCH 15/28] Updated test-init to only create fstab symlink as needed. --- test/test-init | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test-init b/test/test-init index 67563f84..fbcdec47 100755 --- a/test/test-init +++ b/test/test-init @@ -2,11 +2,11 @@ exec >/dev/console 2>&1 export TERM=linux export PS1='initramfs-test:\w\$ ' -ln -s /proc/mounts /etc/fstab +[ -f /etc/fstab ] || ln -s /proc/mounts /etc/fstab stty sane echo "made it to the rootfs!" echo 3 >/proc/sys/vm/drop_caches free sh -i -mount -o remount,ro / +mount -n -o remount,ro / poweroff -f \ No newline at end of file From 37dcb40001a992df19f88ca75f51a32cf3976adf Mon Sep 17 00:00:00 2001 From: Victor Lowther Date: Thu, 12 Mar 2009 06:30:14 -0500 Subject: [PATCH 16/28] do not use grep to test if sysroot is mounted --- modules.d/99base/init | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.d/99base/init b/modules.d/99base/init index 8f0ece16..39dd21aa 100755 --- a/modules.d/99base/init +++ b/modules.d/99base/init @@ -107,7 +107,7 @@ getarg 'break=mount' && emergency_shell # be sourced any number of times. As soon as one suceeds, no more are sourced. i=0 while :; do - grep -q '/sysroot' /proc/mounts && break; + [ -d "$NEWROOT/proc" ] && break; for f in /mount/*.sh; do [ -x "$f" ] && . "$f"; From 48677b2a8fad445c307535ae3843fb6e7904cbcf Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Tue, 24 Mar 2009 11:27:35 +0100 Subject: [PATCH 17/28] only install the dash symlink to /bin/sh, if dash is installed --- modules.d/00dash/install | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules.d/00dash/install b/modules.d/00dash/install index 9ee655ad..5bf7ae64 100755 --- a/modules.d/00dash/install +++ b/modules.d/00dash/install @@ -1,4 +1,3 @@ #!/bin/bash # Prefer dash as /bin/sh if it is available. -inst /bin/dash -ln -sf /bin/dash "${initdir}/bin/sh" \ No newline at end of file +inst /bin/dash && ln -sf dash "${initdir}/bin/sh" From 9d5fc7b46e02586dd20b19f1eec59a10b461d276 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Tue, 24 Mar 2009 11:28:25 +0100 Subject: [PATCH 18/28] add filesystem modules to the initrd --- modules.d/90kernel-modules/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.d/90kernel-modules/install b/modules.d/90kernel-modules/install index 37062fb1..6e7c02d8 100755 --- a/modules.d/90kernel-modules/install +++ b/modules.d/90kernel-modules/install @@ -1,6 +1,6 @@ #!/bin/bash # FIXME: hard-coded module list of doom. -instmods ${modules:-=ata =block sd_mod} +instmods ${modules:-=ata =block sd_mod =fs} # Grab modules for all filesystem types we currently have mounted while read d mp t rest; do From ef085215556b745a9d7dbcfb54293d5a68a0a0a4 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Tue, 24 Mar 2009 11:29:03 +0100 Subject: [PATCH 19/28] only create the /bin/sh symlink to bash, if it does not exist yet --- modules.d/99base/install | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules.d/99base/install b/modules.d/99base/install index e61ababc..c0ce2339 100755 --- a/modules.d/99base/install +++ b/modules.d/99base/install @@ -1,5 +1,6 @@ #!/bin/bash -dracut_install mount mknod mkdir modprobe pidof sleep chroot echo sed sh ls flock +dracut_install mount mknod mkdir modprobe pidof sleep chroot echo sed bash ls flock +[ -e "${initdir}/bin/sh" ] || (ln -s bash "${initdir}/bin/sh" || :) # install our scripts and hooks inst "$moddir/init" "/init" inst "$moddir/switch_root" "/sbin/switch_root" From 309ed9668bf6e91ba0eee555db1b129014111396 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Tue, 24 Mar 2009 11:29:53 +0100 Subject: [PATCH 20/28] add udev mount rule module to the test image --- test/dracut.conf.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/dracut.conf.test b/test/dracut.conf.test index 31741b57..c9d6d7e2 100644 --- a/test/dracut.conf.test +++ b/test/dracut.conf.test @@ -1,2 +1,2 @@ -dracutmodules="base dash crypt lvm kernel-modules resume rootfs-block udev-rules" +dracutmodules="base dash crypt lvm kernel-modules resume rootfs-block 95rootfs-block-udev udev-rules" modules="ata_piix ext2 sd_mod" From 93fea990ec396604a295c0b572e8baecd554a53d Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Tue, 24 Mar 2009 11:30:30 +0100 Subject: [PATCH 21/28] fixed the creation of the root filesystem --- test/make-test-root | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/test/make-test-root b/test/make-test-root index 6b6ea817..76869f41 100755 --- a/test/make-test-root +++ b/test/make-test-root @@ -1,5 +1,11 @@ #!/bin/bash -initdir=$(mktemp -d -t initramfs-test-target-XXXXXXXX) + +dd if=/dev/zero of=test/root.ext2 bs=1M count=20 +mke2fs -F test/root.ext2 +mkdir test/mnt +mount -o loop test/root.ext2 test/mnt + +initdir=test/mnt kernel=$(uname -r) ( . ./dracut-functions @@ -10,13 +16,16 @@ kernel=$(uname -r) ) targetfs="$initdir" unset initdir -dd if=/dev/zero of=test/root.ext2 bs=1M count=20 -./dracut -l -i "$targetfs" /source \ - -m "dash kernel-modules test crypt lvm udev-rules base rootfs-block" \ - -d "ata_piix ext2 sd_mod" \ - -f test/initramfs.makeroot -qemu-kvm -hda test/root.ext2 -m 512M -nographic -net none \ - -kernel "/boot/vmlinuz-$kernel" \ - -append "root=/dev/dracut/root rw rootfstype=ext2 quiet console=ttyS0,115200n81" \ - -initrd test/initramfs.makeroot \ No newline at end of file +umount test/mnt +rmdir test/mnt + +#./dracut -l -i "$targetfs" /source \ +# -m "dash kernel-modules test crypt lvm udev-rules base rootfs-block" \ +# -d "ata_piix ext2 sd_mod" \ +# -f test/initramfs.makeroot +# +#qemu-kvm -hda test/root.ext2 -m 512M -nographic -net none \ +# -kernel "/boot/vmlinuz-$kernel" \ +# -append "root=/dev/dracut/root rw rootfstype=ext2 quiet console=ttyS0,115200n81" \ +# -initrd test/initramfs.makeroot From f5f52afdca41a51ca42c5f8748676ae1dcf5f406 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Tue, 24 Mar 2009 11:31:07 +0100 Subject: [PATCH 22/28] fixed the root kernel command argument --- test/test-initramfs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test-initramfs b/test/test-initramfs index 3975d1f9..2b288d46 100755 --- a/test/test-initramfs +++ b/test/test-initramfs @@ -5,5 +5,5 @@ kernel=$(uname -r) qemu-kvm -hda test/root.ext2 -m 512M -nographic -net none \ -kernel /boot/vmlinuz-$kernel \ - -append "root=/dev/dracut/root rw rootfstype=ext2 quiet console=ttyS0,115200n81" \ - -initrd test/initramfs.testing \ No newline at end of file + -append "root=/dev/sda init=/init rw rootfstype=ext2 quiet ramfsdebug console=ttyS0,115200n81" \ + -initrd test/initramfs.testing From 2003e189622f2e58a71e5b3c061cf3e99986beb2 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Tue, 24 Mar 2009 11:32:54 +0100 Subject: [PATCH 23/28] rename "debug" to "ramfsdebug" to differ from the kernel "debug" argument --- modules.d/99base/init | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.d/99base/init b/modules.d/99base/init index b081a933..2539f602 100755 --- a/modules.d/99base/init +++ b/modules.d/99base/init @@ -42,7 +42,7 @@ mount -t sysfs /sys /sys >/dev/null 2>&1 mount -t tmpfs -omode=0755 udev /dev >/dev/null 2>&1 read CMDLINE Date: Tue, 24 Mar 2009 11:33:58 +0100 Subject: [PATCH 24/28] move root command line argument parsing to modules --- modules.d/99base/init | 38 -------------------------------------- 1 file changed, 38 deletions(-) diff --git a/modules.d/99base/init b/modules.d/99base/init index 2539f602..04cebfcf 100755 --- a/modules.d/99base/init +++ b/modules.d/99base/init @@ -53,44 +53,6 @@ mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts >/dev/null 2>&1 getarg 'break=pre-udev' && emergency_shell source_all pre-udev - -[ "$root" ] || { - root=$(getarg root=) - case $root in - LABEL=*) root=${root#LABEL=} - root="$(echo $root |sed 's,/,\\x2f,g')" - root="/dev/disk/by-label/${root}" ;; - UUID=*) root="/dev/disk/by-uuid/${root#UUID=}" ;; - '') echo "Warning: no root specified" - root="/dev/sda1" ;; - esac -} - -[ "$rflags" ] || { - if rflags="$(getarg rootflags=)"; then - getarg rw && rflags="${rflags},rw" || rflags="${rflags},ro" - else - getarg rw && rflags=rw || rflags=ro - fi -} - -[ "$fstype" ] || { - fstype="$(getarg rootfstype=)" && fstype="-t ${fstype}" -} - -resume=$(getarg resume=) && ! getarg noresume && [ -b "$resume" ] && { - # parsing the output of ls is Bad, but until there is a better way... - ( - echo -e 'NAME=="'${resume#/dev/}'", RUN+="/bin/sh -c \047 echo %M:%m > /sys/power/resume \047 "' - echo -e 'SYMLINK=="'${resume#/dev/}'", RUN+="/bin/sh -c \047 echo %M:%m > /sys/power/resume \047 "' - ) >> /lib/udev/rules.d/99-resume.rules -} - -( - echo -e ' NAME=="'${root#/dev/}'", RUN+="/bin/sh -c \047 mount '$fstype' -o '$rflags' '$root' '$NEWROOT' \047 " ' - echo -e ' SYMLINK=="'${root#/dev/}'", RUN+="/bin/sh -c \047 mount '$fstype' -o '$rflags' '$root' '$NEWROOT' \047 " ' -) >> /lib/udev/rules.d/99-mount.rules - # start up udev and trigger cold plugs udevd --daemon udevadm trigger >/dev/null 2>&1 From c7e0d91c80db79fc84969a1ff927f23939112ca1 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Tue, 24 Mar 2009 11:34:45 +0100 Subject: [PATCH 25/28] add udevdebug and udevinfo command line arguments --- modules.d/99base/init | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules.d/99base/init b/modules.d/99base/init index 04cebfcf..d3b6bc2c 100755 --- a/modules.d/99base/init +++ b/modules.d/99base/init @@ -55,6 +55,8 @@ source_all pre-udev # start up udev and trigger cold plugs udevd --daemon +getarg udevinfo && udevadm control --log_priority=info +getarg udevdebug && udevadm control --log_priority=debug udevadm trigger >/dev/null 2>&1 udevadm settle --timeout=30 >/dev/null 2>&1 From fea5683693e515226988190061e08ae4859dc85e Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Tue, 24 Mar 2009 11:35:52 +0100 Subject: [PATCH 26/28] sleep 0.5 seconds instead of 1 --- modules.d/99base/init | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules.d/99base/init b/modules.d/99base/init index d3b6bc2c..fbfad05c 100755 --- a/modules.d/99base/init +++ b/modules.d/99base/init @@ -77,11 +77,11 @@ while :; do [ "$ROOTFS_MOUNTED" ] && break; done - sleep 1 + sleep 0.5 i=$(($i+1)) ( flock -s 200 - [ $i -gt 10 ] && emergency_shell + [ $i -gt 20 ] && emergency_shell ) 200>/.console_lock done From c9a9cf7363a2f2bdf932b5f5fded53bdcf1542b0 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Tue, 24 Mar 2009 11:36:56 +0100 Subject: [PATCH 27/28] add module for rootfs mounting via udev rules --- modules.d/95rootfs-block-udev/genrules.sh | 15 +++++++++++ modules.d/95rootfs-block-udev/install | 3 +++ .../95rootfs-block-udev/parse-root-opts.sh | 27 +++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100755 modules.d/95rootfs-block-udev/genrules.sh create mode 100755 modules.d/95rootfs-block-udev/install create mode 100755 modules.d/95rootfs-block-udev/parse-root-opts.sh diff --git a/modules.d/95rootfs-block-udev/genrules.sh b/modules.d/95rootfs-block-udev/genrules.sh new file mode 100755 index 00000000..d4e226ce --- /dev/null +++ b/modules.d/95rootfs-block-udev/genrules.sh @@ -0,0 +1,15 @@ + +resume=$(getarg resume=) && ! getarg noresume && [ -b "$resume" ] && { + # parsing the output of ls is Bad, but until there is a better way... + ( + echo -e 'KERNEL=="'${resume#/dev/}'", RUN+="/bin/sh -c \047 echo %M:%m > /sys/power/resume \047 "' + echo -e 'SYMLINK=="'${resume#/dev/}'", RUN+="/bin/sh -c \047 echo %M:%m > /sys/power/resume \047 "' + ) >> /etc/udev/rules.d/99-resume.rules +} + +( + echo -e 'KERNEL=="'${root#/dev/}'", RUN+="/bin/sh -c \047 mount '$fstype' -o '$rflags' '$root' '$NEWROOT' \047 " ' + echo -e 'SYMLINK=="'${root#/dev/}'", RUN+="/bin/sh -c \047 mount '$fstype' -o '$rflags' '$root' '$NEWROOT' \047 " ' +) >> /etc/udev/rules.d/99-mount.rules + + diff --git a/modules.d/95rootfs-block-udev/install b/modules.d/95rootfs-block-udev/install new file mode 100755 index 00000000..641e7df0 --- /dev/null +++ b/modules.d/95rootfs-block-udev/install @@ -0,0 +1,3 @@ +#!/bin/sh +inst_hook pre-udev 10 "$moddir/parse-root-opts.sh" +inst_hook pre-udev 20 "$moddir/genrules.sh" diff --git a/modules.d/95rootfs-block-udev/parse-root-opts.sh b/modules.d/95rootfs-block-udev/parse-root-opts.sh new file mode 100755 index 00000000..473c34dc --- /dev/null +++ b/modules.d/95rootfs-block-udev/parse-root-opts.sh @@ -0,0 +1,27 @@ +#!/bin/sh +if resume=$(getarg resume=) && ! getarg noresume; then + export resume + echo "$resume" >/.resume +else + unset resume +fi + +root=$(getarg root=) +case $root in + LABEL=*) root=${root#LABEL=} + root="$(echo $root |sed 's,/,\\x2f,g')" + root="/dev/disk/by-label/${root}" ;; + UUID=*) root="/dev/disk/by-uuid/${root#UUID=}" ;; + '') echo "Warning: no root specified" + root="/dev/sda1" ;; +esac + +if rflags="$(getarg rootflags=)"; then + getarg rw && rflags="${rflags},rw" || rflags="${rflags},ro" +else + getarg rw && rflags=rw || rflags=ro +fi + +fstype="$(getarg rootfstype=)" && fstype="-t ${fstype}" + +export fstype rflags root From f0839301125ab0c837b481095dc274cf5553b553 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Tue, 24 Mar 2009 11:37:56 +0100 Subject: [PATCH 28/28] ignore generated test images test/initramfs.testing test/root.ext2 --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index b6bc0945..797ff74a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ test*.img modules.d/99base/switch_root +test/initramfs.testing +test/root.ext2 +