From 15cc3b2d510b5cc4cab6484fdf62341a2ae77913 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Sat, 21 Mar 2015 04:14:01 +0100 Subject: [PATCH] dracut: Provide minimalistic initramfs files - no udev, no systemd Provide simple script to run under busybox, this is all we need in the VM. --- dracut/Makefile | 5 ++- dracut/full/Makefile | 4 +++ dracut/{ => full}/module-setup.sh | 0 dracut/{ => full}/mount_modules.sh | 1 + dracut/{ => full}/qubes_cow_setup.sh | 0 dracut/simple/Makefile | 4 +++ dracut/simple/init.sh | 48 ++++++++++++++++++++++++++ dracut/simple/module-setup.sh | 14 ++++++++ kernel-modules/qubes-prepare-vm-kernel | 6 ++-- rpm_spec/qubes-kernel-vm-support.spec | 2 ++ 10 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 dracut/full/Makefile rename dracut/{ => full}/module-setup.sh (100%) rename dracut/{ => full}/mount_modules.sh (91%) rename dracut/{ => full}/qubes_cow_setup.sh (100%) create mode 100644 dracut/simple/Makefile create mode 100644 dracut/simple/init.sh create mode 100644 dracut/simple/module-setup.sh diff --git a/dracut/Makefile b/dracut/Makefile index 272669f..f3b6897 100644 --- a/dracut/Makefile +++ b/dracut/Makefile @@ -1,4 +1,3 @@ install: - install -d $(DESTDIR)/usr/lib/dracut/modules.d/90qubes-vm - install module-setup.sh mount_modules.sh qubes_cow_setup.sh \ - $(DESTDIR)/usr/lib/dracut/modules.d/90qubes-vm/ + $(MAKE) -C simple + $(MAKE) -C full diff --git a/dracut/full/Makefile b/dracut/full/Makefile new file mode 100644 index 0000000..272669f --- /dev/null +++ b/dracut/full/Makefile @@ -0,0 +1,4 @@ +install: + install -d $(DESTDIR)/usr/lib/dracut/modules.d/90qubes-vm + install module-setup.sh mount_modules.sh qubes_cow_setup.sh \ + $(DESTDIR)/usr/lib/dracut/modules.d/90qubes-vm/ diff --git a/dracut/module-setup.sh b/dracut/full/module-setup.sh similarity index 100% rename from dracut/module-setup.sh rename to dracut/full/module-setup.sh diff --git a/dracut/mount_modules.sh b/dracut/full/mount_modules.sh similarity index 91% rename from dracut/mount_modules.sh rename to dracut/full/mount_modules.sh index dc1c582..3bc795e 100644 --- a/dracut/mount_modules.sh +++ b/dracut/full/mount_modules.sh @@ -11,3 +11,4 @@ if ! [ -d $NEWROOT/lib/modules/`uname -r` ]; then mount -n -t ext3 /dev/xvdd $NEWROOT/lib/modules fi +killall udevd systemd-udevd diff --git a/dracut/qubes_cow_setup.sh b/dracut/full/qubes_cow_setup.sh similarity index 100% rename from dracut/qubes_cow_setup.sh rename to dracut/full/qubes_cow_setup.sh diff --git a/dracut/simple/Makefile b/dracut/simple/Makefile new file mode 100644 index 0000000..8c26d35 --- /dev/null +++ b/dracut/simple/Makefile @@ -0,0 +1,4 @@ +install: + install -d $(DESTDIR)/usr/lib/dracut/modules.d/90qubes-vm-simple + install module-setup.sh init.sh \ + $(DESTDIR)/usr/lib/dracut/modules.d/90qubes-vm-simple/ diff --git a/dracut/simple/init.sh b/dracut/simple/init.sh new file mode 100644 index 0000000..0f22715 --- /dev/null +++ b/dracut/simple/init.sh @@ -0,0 +1,48 @@ +#!/bin/sh +echo "Qubes initramfs script here:" + +mkdir -p /proc /sys /dev +mount -t proc proc /proc +mount -t sysfs sysfs /sys +mount -t devtmpfs devtmpfs /dev + +if [ -e /dev/mapper/dmroot ] ; then + die "Qubes: FATAL error: /dev/mapper/dmroot already exists?!" +fi + +modprobe xenblk || modprobe xen-blkfront || echo "Qubes: Cannot load Xen Block Frontend..." + +echo "Waiting for /dev/xvda* devices..." +while ! [ -e /dev/xvda ]; do sleep 0.1; done + +if [ `cat /sys/block/xvda/ro` = 1 ] ; then + echo "Qubes: Doing COW setup for AppVM..." + + while ! [ -e /dev/xvdc ]; do sleep 0.1; done + while ! [ -e /dev/xvdc2 ]; do sleep 0.1; done + + echo "0 `cat /sys/block/xvda/size` snapshot /dev/xvda /dev/xvdc2 N 16" | \ + dmsetup create dmroot || { echo "Qubes: FATAL: cannot create dmroot!"; } + echo Qubes: done. +else + echo "Qubes: Doing R/W setup for TemplateVM..." + echo "0 `cat /sys/block/xvda/size` linear /dev/xvda 0" | \ + dmsetup create dmroot || { echo "Qubes: FATAL: cannot create dmroot!"; exit 1; } + echo Qubes: done. +fi +dmsetup mknodes dmroot + +mkdir -p /sysroot +mount /dev/mapper/dmroot /sysroot -o ro + +if ! [ -d $NEWROOT/lib/modules/`uname -r` ]; then + echo "Waiting for /dev/xvdd device..." + while ! [ -e /dev/xvdd ]; do sleep 0.1; done + + mount -n -t ext3 /dev/xvdd $NEWROOT/lib/modules +fi + + +umount /dev /sys /proc + +exec switch_root /sysroot /sbin/init diff --git a/dracut/simple/module-setup.sh b/dracut/simple/module-setup.sh new file mode 100644 index 0000000..626798f --- /dev/null +++ b/dracut/simple/module-setup.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +check() { + return 255 +} + +depends() { + echo busybox dm + return 0 +} + +install() { + inst $moddir/init.sh /init +} diff --git a/kernel-modules/qubes-prepare-vm-kernel b/kernel-modules/qubes-prepare-vm-kernel index a6fb3a9..5d88043 100644 --- a/kernel-modules/qubes-prepare-vm-kernel +++ b/kernel-modules/qubes-prepare-vm-kernel @@ -28,7 +28,7 @@ basedir=/var/lib/qubes/vm-kernels function recompile_u2mfn() { kver=$1 u2mfn_ver=`dkms status u2mfn|tail -n 1|cut -f 2 -d ' '|tr -d ':,'` - dkms install u2mfn/$u2mfn_ver -k $kver + dkms install u2mfn/$u2mfn_ver -k $kver --no-initrd } function build_modules_img() { @@ -50,8 +50,8 @@ function build_initramfs() { output_file=$2 /sbin/dracut --nomdadmconf --nolvmconf --force \ - --modules "bash dm kernel-modules rootfs-block base fs-lib shutdown" \ - --modules "qubes-vm" --conf /dev/null --confdir /var/empty \ + --modules "kernel-modules qubes-vm-simple" \ + --conf /dev/null --confdir /var/empty \ -d "xenblk xen-blkfront cdrom ext4 jbd2 crc16 dm_snapshot" \ $output_file $kver } diff --git a/rpm_spec/qubes-kernel-vm-support.spec b/rpm_spec/qubes-kernel-vm-support.spec index dce3ad8..a1e468c 100644 --- a/rpm_spec/qubes-kernel-vm-support.spec +++ b/rpm_spec/qubes-kernel-vm-support.spec @@ -34,6 +34,7 @@ URL: http://www.qubes-os.org Requires: dracut Requires: dkms +Requires: busybox %define _builddir %(pwd) @@ -60,6 +61,7 @@ make install-kernel-support DESTDIR=%{buildroot} %files /usr/lib/dracut/modules.d/90qubes-vm +/usr/lib/dracut/modules.d/90qubes-vm-simple /usr/src/u2mfn-%{version}/ /usr/sbin/qubes-prepare-vm-kernel