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
 config.log
 config.status
 configure
+initramfs
+initramfs.*.img
 libtool
 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.
 
 # 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
 ----------------------------------------------------------------------
 
 Requirements
 ----------------------------------------------------------------------
 
-- Recent QEMU with vmchannel support
+- recent QEMU with vmchannel support
 
 - febootstrap >= 1.2
 
 - XDR, rpcgen
 
 
 - 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.
 
 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:
 
 
 Then make the daemon, library and root filesystem:
 
-  ./configure [--mirror=URI]
+  ./configure [--with-mirror=URI]
   make
 
   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.
 
 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])
        ])
 
        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.
 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.])
 
 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])
 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
 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