[Libguestfs] [PATCH] supermin: Prevent multilib corruption (RHBZ#558593).
Richard W.M. Jones
rjones at redhat.com
Tue Jan 26 10:55:14 UTC 2010
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://et.redhat.com/~rjones/virt-top
-------------- next part --------------
>From f2ac659a420bd22bfd69b087cf55edda2de97a11 Mon Sep 17 00:00:00 2001
From: Richard Jones <rjones at redhat.com>
Date: Tue, 26 Jan 2010 10:45:14 +0000
Subject: [PATCH] supermin: Prevent multilib corruption (RHBZ#558593).
On some combination of installing, upgrading and removing the base
libguestfs package on x86_64, multilib can corrupt libguestfs by
leaving a copy of /usr/bin/libguestfs-supermin-helper around which
references the wrong architecture (usually, contains links to the
i386-based appliance, when the x86_64 appliance should be constructed).
This commit changes libguestfs-supermin-helper so that the script is
the same on all architectures. Instead, the library passes the
differences to the script (eg. $host_cpu). Because the i386 and
x86_64 libraries should be at different locations (/usr/lib vs
/usr/lib64) this should prevent multilib from screwing things up.
Related links:
https://bugzilla.redhat.com/show_bug.cgi?id=558593
http://rwmj.wordpress.com/2009/11/16/please-someone-shoot-multilib/#content
https://bugzilla.redhat.com/show_bug.cgi?id=235752
---
.gitignore | 1 -
appliance/libguestfs-supermin-helper | 123 +++++++++++++++++++++++++++++++
appliance/libguestfs-supermin-helper.in | 95 ------------------------
configure.ac | 2 -
src/guestfs.c | 6 +-
5 files changed, 127 insertions(+), 100 deletions(-)
create mode 100755 appliance/libguestfs-supermin-helper
delete mode 100755 appliance/libguestfs-supermin-helper.in
diff --git a/.gitignore b/.gitignore
index ee33343..829f807 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,7 +11,6 @@ appliance/debian/debirf.conf
appliance/initramfs.*.img
appliance/initramfs.*.supermin.hostfiles
appliance/kmod.whitelist
-appliance/libguestfs-supermin-helper
appliance/make.sh
appliance/packagelist
appliance/stamp-debirf-modules
diff --git a/appliance/libguestfs-supermin-helper b/appliance/libguestfs-supermin-helper
new file mode 100755
index 0000000..0970776
--- /dev/null
+++ b/appliance/libguestfs-supermin-helper
@@ -0,0 +1,123 @@
+#!/bin/bash -
+# Copyright (C) 2009-2010 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.
+
+# Helper script which constructs the supermin appliance at runtime.
+
+unset CDPATH
+
+set -e
+
+if [ $# -ne 5 ]; then
+ p=`basename $0`
+ echo
+ echo "$p: Create supermin appliance."
+ echo
+ echo "Usage:"
+ echo "$p sourcedir host_cpu repo kernel initrd"
+ echo
+ echo "This script is used by libguestfs to build the supermin appliance"
+ echo "(kernel and initrd output files). You should NOT need to run this"
+ echo "program directly except if you are debugging tricky supermin"
+ echo "appliance problems."
+ echo
+ echo "NB: The kernel and initrd parameters are OUTPUT parameters. If"
+ echo "those files exist, they are overwritten by the output."
+ echo
+ echo "Typical usage when debugging supermin appliance problems:"
+ echo " $p /usr/lib64/guestfs x86_64 fedora-12 /tmp/kernel /tmp/initrd"
+ echo "Note: This will OVERWRITE any existing files called /tmp/kernel"
+ echo "and /tmp/initrd."
+ echo
+ exit 1
+fi
+
+# Source directory containing the supermin input files.
+sourcedir=$(cd "$1" > /dev/null; pwd)
+
+# Host CPU and repo constants passed from the library (see:
+# https://bugzilla.redhat.com/show_bug.cgi?id=558593).
+host_cpu=$2
+repo=$3
+
+# Output files.
+kernel="$4"
+initrd="$5"
+
+# Kernel:
+# Look for the most recent kernel named vmlinuz-*.<arch>* which has a
+# corresponding directory in /lib/modules/. If the architecture is x86, look
+# for any x86 kernel.
+#
+# RHEL 5 didn't append the arch to the kernel name, so look for kernels
+# without arch second.
+
+arch=$(echo $host_cpu | sed 's/^i.86$/i?86/')
+kernels=$(
+ ls -1dvr /boot/vmlinuz-*.$arch* 2>/dev/null | grep -v xen ||: ;
+ ls -1dvr /boot/vmlinuz-* 2>/dev/null | grep -v xen
+)
+
+if [ -z "$kernels" ]; then
+ echo "$0: failed to find a suitable kernel in /boot directory" >&2
+ exit 1
+fi
+
+for f in $kernels; do
+ b=$(basename "$f")
+ b=$(echo "$b" | sed 's,vmlinuz-,,')
+ modpath="/lib/modules/$b"
+ if [ -d "$modpath" ]; then
+ ln -sf "$f" "$kernel"
+ break
+ fi
+ modpath=
+done
+
+if [ -z "$modpath" ]; then
+ echo "$0: failed to find a suitable kernel" >&2
+ exit 1
+fi
+
+# The initrd consists of these components:
+# (1) The base skeleton appliance that we constructed at build time.
+# name = initramfs.$repo.$host_cpu.supermin.img
+# format = compressed cpio
+# (2) The modules from modpath which are on the module whitelist.
+# format = plain cpio
+# (3) The host files which match wildcards in *.supermin.hostfiles.
+# format = plain cpio
+
+cp "$sourcedir"/initramfs.$repo.$host_cpu.supermin.img "$initrd"
+
+# Kernel modules (2).
+exec 5<"$sourcedir"/kmod.whitelist
+whitelist=
+while read kmod 0<&5; do
+ whitelist="$whitelist -o -name $kmod"
+done
+exec 5<&-
+
+find "$modpath" \( -not -name '*.ko' $whitelist \) -a -print0 |
+ cpio --quiet -o -0 -H newc >> "$initrd"
+
+# Host files (3).
+
+(cd / && \
+ ls -1df $(
+ cat "$sourcedir"/initramfs.$repo.$host_cpu.supermin.hostfiles
+ ) 2>/dev/null |
+ cpio -C 65536 --quiet -o -H newc ) >> "$initrd"
diff --git a/appliance/libguestfs-supermin-helper.in b/appliance/libguestfs-supermin-helper.in
deleted file mode 100755
index ab3aad5..0000000
--- a/appliance/libguestfs-supermin-helper.in
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/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.
-
-# Helper script which constructs the supermin appliance at runtime.
-
-unset CDPATH
-
-set -e
-
-# Source directory containing the supermin input files.
-sourcedir=$(cd "$1" > /dev/null; pwd)
-
-# Output files.
-kernel="$2"
-initrd="$3"
-
-# Kernel:
-# Look for the most recent kernel named vmlinuz-*.<arch>* which has a
-# corresponding directory in /lib/modules/. If the architecture is x86, look
-# for any x86 kernel.
-#
-# RHEL 5 didn't append the arch to the kernel name, so look for kernels
-# without arch second.
-
-arch=$(echo "@host_cpu@" | sed 's/^i.86$/i?86/')
-kernels=$(
- ls -1dvr /boot/vmlinuz-*.$arch* 2>/dev/null | grep -v xen ||: ;
- ls -1dvr /boot/vmlinuz-* 2>/dev/null | grep -v xen
-)
-
-if [ -z "$kernels" ]; then
- echo "$0: failed to find a suitable kernel in /boot directory" >&2
- exit 1
-fi
-
-for f in $kernels; do
- b=$(basename "$f")
- b=$(echo "$b" | sed 's,vmlinuz-,,')
- modpath="/lib/modules/$b"
- if [ -d "$modpath" ]; then
- ln -sf "$f" "$kernel"
- break
- fi
- modpath=
-done
-
-if [ -z "$modpath" ]; then
- echo "$0: failed to find a suitable kernel" >&2
- exit 1
-fi
-
-# The initrd consists of these components:
-# (1) The base skeleton appliance that we constructed at build time.
-# name = initramfs. at REPO@. at host_cpu@.supermin.img
-# format = compressed cpio
-# (2) The modules from modpath which are on the module whitelist.
-# format = plain cpio
-# (3) The host files which match wildcards in *.supermin.hostfiles.
-# format = plain cpio
-
-cp "$sourcedir"/initramfs. at REPO@. at host_cpu@.supermin.img "$initrd"
-
-# Kernel modules (2).
-exec 5<"$sourcedir"/kmod.whitelist
-whitelist=
-while read kmod 0<&5; do
- whitelist="$whitelist -o -name $kmod"
-done
-exec 5<&-
-
-find "$modpath" \( -not -name '*.ko' $whitelist \) -a -print0 |
- cpio --quiet -o -0 -H newc >> "$initrd"
-
-# Host files (3).
-
-(cd / && \
- ls -1df $(
- cat "$sourcedir"/initramfs. at REPO@. at host_cpu@.supermin.hostfiles
- ) 2>/dev/null |
- cpio -C 65536 --quiet -o -H newc ) >> "$initrd"
diff --git a/configure.ac b/configure.ac
index 7d71a7d..2edafff 100644
--- a/configure.ac
+++ b/configure.ac
@@ -717,8 +717,6 @@ AC_CONFIG_FILES([appliance/supermin-split.sh],
[chmod +x appliance/supermin-split.sh])
AC_CONFIG_FILES([appliance/supermin-make.sh],
[chmod +x appliance/supermin-make.sh])
-AC_CONFIG_FILES([appliance/libguestfs-supermin-helper],
- [chmod +x appliance/libguestfs-supermin-helper])
AC_CONFIG_FILES([Makefile
src/Makefile fish/Makefile po/Makefile.in examples/Makefile
appliance/Makefile
diff --git a/src/guestfs.c b/src/guestfs.c
index a3d2762..1d6d40b 100644
--- a/src/guestfs.c
+++ b/src/guestfs.c
@@ -1,5 +1,5 @@
/* libguestfs
- * Copyright (C) 2009 Red Hat Inc.
+ * Copyright (C) 2009-2010 Red Hat Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -1506,9 +1506,11 @@ build_supermin_appliance (guestfs_h *g, const char *path,
snprintf (cmd, sizeof cmd,
"PATH='%s':$PATH "
- "libguestfs-supermin-helper '%s' %s %s",
+ "libguestfs-supermin-helper '%s' " host_cpu " " REPO " %s %s",
path,
path, *kernel, *initrd);
+ if (g->verbose)
+ print_timestamped_message (g, "%s", cmd);
r = system (cmd);
if (r == -1 || WEXITSTATUS(r) != 0) {
--
1.6.5.2
More information about the Libguestfs
mailing list