Build the initramfs.
authorrjones <rjones>
Tue, 24 Mar 2009 14:15:13 +0000 (14:15 +0000)
committerrjones <rjones>
Tue, 24 Mar 2009 14:15:13 +0000 (14:15 +0000)
.cvsignore
Makefile.am
README
configure.ac
make-initramfs.sh.in [new file with mode: 0755]

index 9707adc..c8c5dca 100644 (file)
@@ -8,5 +8,9 @@ config.h.in
 config.log
 config.status
 configure
+initramfs
+initramfs.*.img
 libtool
-stamp-h1
\ No newline at end of file
+make-initramfs.sh
+stamp-h1
+vmlinuz.*
index efff275..cbc4c59 100644 (file)
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-SUBDIRS = daemon src examples
+SUBDIRS = src daemon examples
+
+EXTRA_DIST = make-initramfs.sh
+
+# Build the root filesystem.
+# Currently this is arch-dependent, so it seems like putting it in
+# $(libdir) is best.  When we build cross-architecture filesystems we
+# should probably move them to $(datadir).
+
+fsdir = $(libdir)/guestfs
+
+fs_DATA = initramfs.$(REPO).$(host_cpu).img vmlinuz.$(REPO).$(host_cpu)
+
+$(fs_DATA): make-initramfs.sh.in daemon/guestfsd
+       $(builddir)/make-initramfs.sh
+
+.PHONY: daemon/guestfsd
+
+# Make clean.
+
+CLEANFILES = $(fs_DATA)
+
+clean-local:
+       rm -rf initramfs
diff --git a/README b/README
index c8b4242..a017249 100644 (file)
--- a/README
+++ b/README
@@ -30,13 +30,13 @@ For discussion please use the fedora-virt mailing list:
 Requirements
 ----------------------------------------------------------------------
 
-- Recent QEMU with vmchannel support
+- recent QEMU with vmchannel support
 
 - febootstrap >= 1.2
 
 - XDR, rpcgen
 
-- (Optional) Local Fedora mirror
+- (Optional) local Fedora mirror
 
 Running ./configure will check you have all the requirements installed
 on your machine.
@@ -47,10 +47,10 @@ Building
 
 Then make the daemon, library and root filesystem:
 
-  ./configure [--mirror=URI]
+  ./configure [--with-mirror=URI]
   make
 
-Use the optional --mirror parameter to specify the URI of a local
+Use the optional --with-mirror parameter to specify the URI of a local
 Fedora mirror.  See the discussion of the MIRROR parameter in the
 febootstrap(8) manpage.
 
index a3c2166..297ae99 100644 (file)
@@ -39,10 +39,6 @@ AC_CHECK_LIB([portablexdr],[xdrmem_create],[],[
        AC_SEARCH_LIBS([xdrmem_create],[rpc xdr nsl])
        ])
 
-dnl Check for febootstrap.
-AC_CHECK_PROG([FEBOOTSTRAP],[febootstrap],[febootstrap],[no])
-test "x$FEBOOTSTRAP" = "xno" && AC_MSG_ERROR([febootstrap must be installed])
-
 dnl Check for QEMU.  We only check for the basic 'qemu' program here
 dnl (ie. the i386 full system qemu).  But at runtime we might choose
 dnl a different qemu to run, eg. qemu-system-ppc.
@@ -51,10 +47,45 @@ AC_PATH_PROG([QEMU],[qemu],[no],
 test "x$QEMU" = "xno" && AC_MSG_ERROR([qemu must be installed])
 AC_DEFINE_UNQUOTED([QEMU],["$QEMU"],[Location of qemu binary.])
 
+dnl Check for febootstrap etc.
+AC_CHECK_PROG([FEBOOTSTRAP],
+       [febootstrap],[febootstrap],[no])
+test "x$FEBOOTSTRAP" = "xno" && \
+     AC_MSG_ERROR([febootstrap must be installed])
+AC_CHECK_PROG([FEBOOTSTRAP_MINIMIZE],
+       [febootstrap-minimize],[febootstrap-minimize],[no])
+test "x$FEBOOTSTRAP_MINIMIZE" = "xno" && \
+     AC_MSG_ERROR([febootstrap-minimize must be installed])
+AC_CHECK_PROG([FEBOOTSTRAP_TO_INITRAMFS],
+       [febootstrap-to-initramfs],[febootstrap-to-initramfs],[no])
+test "x$FEBOOTSTRAP_TO_INITRAMFS" = "xno" && \
+     AC_MSG_ERROR([febootstrap-to-initramfs must be installed])
+
+dnl --with-repo to specify a Fedora repository.
+AC_ARG_WITH([repo],
+       [AS_HELP_STRING([--with-repo],
+         [set name of Fedora repository @<:@default=fedora-10@:>@])],
+       [],
+       [with_repo=fedora-10])
+REPO="$with_repo"
+AC_SUBST(REPO)
+
+dnl --with-mirror to specify a local Fedora mirror.
+AC_ARG_WITH([mirror],
+       [AS_HELP_STRING([--with-mirror],
+         [set URI of a local Fedora mirror])],
+       [],
+       [with_mirror=])
+MIRROR="$with_mirror"
+AC_SUBST(MIRROR)
+
 dnl Run in subdirs.
 AC_CONFIG_SUBDIRS([daemon])
 
 dnl Produce output files.
 AC_CONFIG_HEADERS([config.h])
-AC_CONFIG_FILES([Makefile src/Makefile examples/Makefile])
+AC_CONFIG_FILES([Makefile src/Makefile examples/Makefile make-initramfs.sh])
 AC_OUTPUT
+
+dnl WTF?
+chmod +x make-initramfs.sh
\ No newline at end of file
diff --git a/make-initramfs.sh.in b/make-initramfs.sh.in
new file mode 100755 (executable)
index 0000000..c8deae2
--- /dev/null
@@ -0,0 +1,110 @@
+#!/bin/bash -
+# @configure_input@
+# Copyright (C) 2009 Red Hat Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# This is called from the Makefile to build the initramfs.
+
+set -e
+
+# If you want to do some extra debugging and diagnosis of the
+# initramfs image, then uncomment this line.  This makes the image
+# larger.
+debug=yes
+
+modules="-i kernel -i bash -i coreutils -i lvm2 -i ntfs-3g -i nfs-utils -i util-linux-ng -i MAKEDEV -i net-tools"
+
+if [ "x$debug" = "xyes" ]; then
+    modules="$modules -i module-init-tools -i procps -i strace -i iputils"
+fi
+
+# Decide on names for the final output.  These have to match Makefile.am.
+output=initramfs.@REPO@.@host_cpu@.img
+koutput=vmlinuz.@REPO@.@host_cpu@
+rm -f $output $koutput
+
+# Create the basic initramfs.
+@FEBOOTSTRAP@ $modules @REPO@ initramfs @MIRROR@
+
+# Nuke some stuff.  The kernel pulls in plymouth crapola which pulls in
+# all of Python.  Sheez.
+find initramfs -name '*plymouth*' -print0 | xargs -0 rm -rf
+find initramfs -name '*python*' -print0 | xargs -0 rm -rf
+
+# Modules take up nearly half of the image.  It's a rough guess that
+# we don't need any drivers (which take up most of the space).
+# (We need to keep kernel/net/sunrpc for NFS)
+rm -rf initramfs/lib/modules/*/kernel/{drivers,sound}
+rm -rf initramfs/lib/modules/*/kernel/arch/x86/kvm
+
+# Pull the kernel out into the current directory.  We don't want it in
+# the initramfs image.
+mv initramfs/boot/vmlinuz* $koutput
+rm -rf initramfs/boot
+
+# Older versions of febootstrap-minimize didn't remove this, so:
+rm -rf initramfs/usr/share/gnome/help
+
+# Minimize the image.
+@FEBOOTSTRAP_MINIMIZE@ initramfs
+
+# Add some missing configuration files.
+if [ ! -f initramfs/etc/hosts ]; then
+    cat > initramfs/etc/hosts <<'__EOF__'
+127.0.0.1 guestfs localhost.localdomain localhost
+::1       localhost6.localdomain6 localhost6
+__EOF__
+fi
+
+if [ ! -f initramfs/etc/fstab ]; then
+    touch initramfs/etc/fstab
+fi
+
+# Copy the daemon into the filesystem.
+#cp daemon/guestfsd initramfs/sbin
+
+# Create the init script.
+cat > initramfs/init <<'__EOF__'
+#!/bin/sh
+PATH=/sbin:/usr/sbin:$PATH
+MAKEDEV mem null port zero core full ram tty console fd \
+  hda hdb hdc hdd sda sdb sdc sdd loop sd
+mount -t proc /proc /proc
+mount -t sysfs /sys /sys
+mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
+modprobe nfsd
+/sbin/ifconfig lo 127.0.0.1
+lvm vgscan --ignorelockingfailure
+lvm vgchange -ay --ignorelockingfailure
+rpcbind
+rpc.statd
+rpc.nfsd 4
+rpc.mountd
+__EOF__
+
+if [ "x$debug" != "xyes" ]; then
+    echo exec guestfsd -f >> initramfs/init
+else
+    echo guestfsd >> initramfs/init
+    echo exec bash -i >> initramfs/init
+fi
+
+chmod +x initramfs/init
+
+# Generate final image.
+@FEBOOTSTRAP_TO_INITRAMFS@ initramfs > $output-t
+mv $output-t $output
+ls -lh $output