From 863d13ea1aadddc122ad82f4dad20e73231b48f2 Mon Sep 17 00:00:00 2001 From: rjones Date: Tue, 24 Mar 2009 14:15:13 +0000 Subject: [PATCH] Build the initramfs. --- .cvsignore | 6 ++- Makefile.am | 25 +++++++++++- README | 8 ++-- configure.ac | 41 ++++++++++++++++--- make-initramfs.sh.in | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 179 insertions(+), 11 deletions(-) create mode 100755 make-initramfs.sh.in diff --git a/.cvsignore b/.cvsignore index 9707adc..c8c5dca 100644 --- a/.cvsignore +++ b/.cvsignore @@ -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.* diff --git a/Makefile.am b/Makefile.am index efff275..cbc4c59 100644 --- a/Makefile.am +++ b/Makefile.am @@ -15,4 +15,27 @@ # 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 --- 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. diff --git a/configure.ac b/configure.ac index a3c2166..297ae99 100644 --- a/configure.ac +++ b/configure.ac @@ -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 index 0000000..c8deae2 --- /dev/null +++ b/make-initramfs.sh.in @@ -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 -- 1.8.3.1