config.log
config.status
configure
+initramfs
+initramfs.*.img
libtool
-stamp-h1
\ No newline at end of file
+make-initramfs.sh
+stamp-h1
+vmlinuz.*
# 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
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.
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.
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.
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
--- /dev/null
+#!/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