diff --git a/libguestfs.changes b/libguestfs.changes index 3c09ec7..f557e8c 100644 --- a/libguestfs.changes +++ b/libguestfs.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Wed Aug 29 19:40:04 CEST 2012 - ohering@suse.de + +- build appliance as initramfs image with the help of mkinitrd + ------------------------------------------------------------------- Wed Aug 29 17:26:45 CEST 2012 - ohering@suse.de diff --git a/libguestfs.mkinitrd.boot.sh b/libguestfs.mkinitrd.boot.sh new file mode 100644 index 0000000..3ffeb57 --- /dev/null +++ b/libguestfs.mkinitrd.boot.sh @@ -0,0 +1,77 @@ +#!/bin/bash +#%stage: block +#%modules: dm-mod virtio_blk virtio_console virtio_net virtio_pci virtio_scsi +#%programs: guestfsd lvm mdadm lsmod ip date cat +# + +# from libguestfs-1.19.34/appliance/init: + +# Scan for MDs. +mdadm -As --auto=yes --run + +# Scan for LVM. +modprobe dm_mod ||: + +lvm vgscan --ignorelockingfailure +lvm vgchange -ay --ignorelockingfailure + +# Improve virtio-blk performance (RHBZ#509383). +for f in /sys/block/vd*/queue/rotational; do echo 1 > $f; done + +# These are useful when debugging. +if grep -sq guestfs_verbose=1 /proc/cmdline; then + ls -lR /dev + cat /proc/mounts + lvm pvs + lvm vgs + lvm lvs + ip a + ip r + lsmod + #hwclock -r + date + #ping -n -v -c 5 10.0.2.2 + #ping -n -v -c 5 10.0.2.4 + + echo -n "uptime: "; cat /proc/uptime +fi + +if ! grep -sq guestfs_rescue=1 /proc/cmdline; then + # Run the daemon under valgrind if ./configure --enable-valgrind-daemon + vg_channel=/dev/virtio-ports/org.libguestfs.valgrind + if [ -w $vg_channel ]; then + if [ -r /etc/guestfsd.suppressions ]; then + suppressions="--suppressions=/etc/guestfsd.suppressions" + fi + exec 3>$vg_channel + vg="valgrind --leak-check=full --log-fd=3 --error-exitcode=119 --max-stackframe=8388608 --child-silent-after-fork=yes $suppressions" + echo "enabling valgrind: $vg" + fi + + # The host will kill qemu abruptly if guestfsd shuts down normally + $vg guestfsd + + # Otherwise we try to clean up gracefully. For example, this ensures that a + # core dump generated by the guest daemon will be written to disk. +else + # Use appliance in rescue mode, also used by the virt-rescue command. + eval $(grep -Eo 'TERM=[^[:space:]]+' /proc/cmdline) + PS1='> ' + export TERM PS1 + echo + echo "------------------------------------------------------------" + echo + echo "Welcome to virt-rescue, the libguestfs rescue shell." + echo + echo "Note: The contents of / are the rescue appliance." + echo "You have to mount the guest's partitions under /sysroot" + echo "before you can examine them." + echo + bash -i + echo + echo "virt-rescue: Syncing the disk now before exiting ..." + echo +fi + +echo s > /proc/sysrq-trigger +echo o > /proc/sysrq-trigger diff --git a/libguestfs.mkinitrd.setup.sh b/libguestfs.mkinitrd.setup.sh new file mode 100644 index 0000000..ed5856b --- /dev/null +++ b/libguestfs.mkinitrd.setup.sh @@ -0,0 +1,3 @@ +#!/bin/bash +#%stage: block +# diff --git a/libguestfs.spec b/libguestfs.spec index 35c42f5..4c9513d 100644 --- a/libguestfs.spec +++ b/libguestfs.spec @@ -35,6 +35,9 @@ Name: libguestfs ExclusiveArch: %ix86 x86_64 Requires: kvm >= 1.1 +%if %{?sles_version}0 > 0 +BuildRequires: sles-release +%endif %if %suse_version >= 1140 BuildRequires: augeas-devel %endif @@ -47,12 +50,16 @@ BuildRequires: gcc-c++ BuildRequires: genisoimage BuildRequires: gperf BuildRequires: hivex-devel +BuildRequires: kernel-default BuildRequires: kvm >= 1.1 +BuildRequires: lvm2 %if %suse_version >= 1220 BuildRequires: libconfig-devel %endif BuildRequires: libtool BuildRequires: libvirt-devel +BuildRequires: mdadm +BuildRequires: mkinitrd BuildRequires: ncurses-devel BuildRequires: pcre-devel BuildRequires: pkg-config @@ -131,6 +138,8 @@ Patch100: libguestfs.perl.install_vendor.patch Patch101: libguestfs.perl.no-rpath.patch Source0: %{name}-%{version}.tar.gz Source1: guestfs.tar.xz +Source10: libguestfs.mkinitrd.boot.sh +Source11: libguestfs.mkinitrd.setup.sh Recommends: %{name}-data %description @@ -308,10 +317,39 @@ make %{?jobs:-j%jobs} %makeinstall find $RPM_BUILD_ROOT \( -name "*.pod" -o -name ".packlist" \) -print0 | xargs -0 --no-run-if-empty rm -fv rm -f $RPM_BUILD_ROOT/%{_libdir}/*.{l,}a -xz -cd %{S:1} | tar -C $RPM_BUILD_ROOT/%{_libdir} -xvf - +#xz -cd %{S:1} | tar -C $RPM_BUILD_ROOT/%{_libdir} -xvf - touch %{name}.lang %find_lang %{name} # +rm -rf mkinitrd +cp -av /lib/mkinitrd . +for bad in \ + setup-dm.sh \ + setup-storage.sh +do + rm mkinitrd/scripts/${bad} +done +cp -avL %{S:10} mkinitrd/scripts/boot-guestfs.sh +cp -avL %{S:11} mkinitrd/scripts/setup-guestfs.sh +chmod 755 mkinitrd/scripts/*guestfs.sh +/sbin/mkinitrd_setup \ + -s $PWD/mkinitrd/scripts \ + -i $PWD/mkinitrd +mkdir mkinitrd/boot_tmp +kver=`/sbin/get_kernel_version /boot/vmlinuz` +cp -avL /boot/vmlinuz /boot/System.map-${kver} mkinitrd/boot_tmp +env PATH=${RPM_BUILD_ROOT}/usr/bin:${RPM_BUILD_ROOT}/usr/sbin:${PATH} \ +/sbin/mkinitrd \ + -l $PWD/mkinitrd \ + -k vmlinuz \ + -i initrd \ + -b $PWD/mkinitrd/boot_tmp \ + -m 'dm-mod loop' \ + -B +# +mkdir -vp $RPM_BUILD_ROOT%{_libdir}/guestfs +cp -avL mkinitrd/boot_tmp/initrd $RPM_BUILD_ROOT%{_libdir}/guestfs/initramfs.`arch`.img +cp -avL mkinitrd/boot_tmp/vmlinuz $RPM_BUILD_ROOT%{_libdir}/guestfs/vmlinuz.`arch` %clean rm -rf $RPM_BUILD_ROOT