Notes on compiling libguestfs 1.19.59 on Debian 7 (Wheezy) beta
In no particular order. Some of these need further investigation. ---------------------------------------------------------------------- I had to patch libguestfs not to use febootstrap-supermin-helper --copy-kernel option. See attachment #1. This could be avoided by providing a newer febootstrap in Wheezy. I had to patch libguestfs to make it not use the (not working) virtio-scsi in old kvm. See attachment #2. mdadm is missing as a dependency from the Debian package. test_mke2fs_0 fails: this seems to be a bug in libguestfs block device renaming code: libguestfs: trace: mke2fs "/dev/sda2" "blocksize:4096" "journaldevice:/dev/sda1" "fstype:ext2" libguestfs: send_to_daemon: 276 bytes: 00 00 01 10 | 20 00 f5 f5 | 00 00 00 04 | 00 00 01 70 | 00 00 00 00 | ... guestfsd: main_loop: proc 368 (mke2fs) took 4.52 seconds guestfsd: main_loop: new request, len 0x110 /dev/sda2: No such file or directory mke2fs -b 4096 -J device=/dev/sda1 -t ext2 /dev/vda2 mke2fs 1.42.5 (29-Jul-2012) test_tune2fs* fail because the output (username) expected by the test script is different from what the test expects. This is not important and this test should just be skipped. For some reason, the behaviour of vfat with the utf8 option is different from the same driver in the Fedora kernel. The Debian kernel prints this warning: [ 65.576097] FAT-fs (vda1): utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case sensitive! and indeed the resulting filesystem is case sensitive, which is definitely not expected or correct for vfat. It's probably some kernel config option. The udev rule (appliance/99-guestfs-serial.rules) either isn't being installed or doesn't work for some reason. I didn't look into it, but this breaks /dev/disk/guestfs/<label> disk names (see 7786d56db8c2241). tests/regressions/rhbz690819.sh fails, because either the kernel or qemu doesn't support the IDE interface. This will break virt-v2v. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming blog: http://rwmj.wordpress.com Fedora now supports 80 OCaml packages (the OPEN alternative to F#) http://cocan.org/getting_started_with_ocaml_on_red_hat_and_fedora
On Wed, Nov 14, Richard W.M. Jones wrote:
In no particular order. Some of these need further investigation.
----------------------------------------------------------------------
I had to patch libguestfs not to use febootstrap-supermin-helper --copy-kernel option. See attachment #1. This could be avoided by providing a newer febootstrap in Wheezy.
I had to patch libguestfs to make it not use the (not working) virtio-scsi in old kvm. See attachment #2.
This is the patch I use to force virtio-blk for sles11sp2, opensuse12.1 and older: # From 61db8e97180efa70243d8b7b116f11ca1f36b375 Mon Sep 17 00:00:00 2001 # From: Olaf Hering <olaf@aepfle.de> # Date: Mon, 3 Sep 2012 19:50:44 +0200 # Subject: [PATCH] force virtio_blk in old guest kernel Signed-off-by: Olaf Hering <olaf@aepfle.de> --- df/output.c | 13 +++++++++---- fish/options.c | 8 +++++++- src/guestfs-internal.h | 2 ++ src/handle.c | 16 ++++++++++++++++ src/inspect-fs-unix.c | 4 ++-- src/launch-appliance.c | 3 +++ src/launch-libvirt.c | 7 +++++++ test-tool/test-tool.c | 16 +++++++++++++--- 8 files changed, 59 insertions(+), 10 deletions(-) diff --git a/df/output.c b/df/output.c index 5729dd4..fb33ca1 100644 --- a/df/output.c +++ b/df/output.c @@ -42,6 +42,7 @@ #include "virt-df.h" static void write_csv_field (const char *field); +static int use_virtio_blk; void print_title (void) @@ -82,7 +83,7 @@ print_title (void) } } -static char *adjust_device_offset (const char *device, int offset); +static char *adjust_device_offset (guestfs_h *g, const char *device, int offset); void print_stat (const char *name, const char *uuid_param, @@ -110,7 +111,7 @@ print_stat (const char *name, const char *uuid_param, exit (EXIT_FAILURE); if (offset >= 0) { char *p = dev; - dev = adjust_device_offset (p, offset); + dev = adjust_device_offset (g, p, offset); free (p); } @@ -237,8 +238,9 @@ write_csv_field (const char *field) static char *drive_name (int index, char *ret); static char * -adjust_device_offset (const char *device, int offset) +adjust_device_offset (guestfs_h *g, const char *device, int offset) { + ; int index; int part_num; char *whole_device; @@ -282,7 +284,10 @@ adjust_device_offset (const char *device, int offset) exit (EXIT_FAILURE); } - strcpy (ret, "/dev/sd"); +#ifdef GUESTFS_QEMU_NO_VIRTIO_BLK + use_virtio_blk = 1; +#endif + strcpy (ret, use_virtio_blk ? "/dev/vd" : "/dev/sd"); drive_name (index, &ret[7]); len = strlen (ret); if (part_num > 0) diff --git a/fish/options.c b/fish/options.c index 0db790e..54190bc 100644 --- a/fish/options.c +++ b/fish/options.c @@ -27,6 +27,8 @@ #include "options.h" +static int use_virtio_blk; + char add_drives (struct drv *drv, char next_drive) { @@ -40,13 +42,17 @@ add_drives (struct drv *drv, char next_drive) exit (EXIT_FAILURE); } +#ifdef GUESTFS_QEMU_NO_VIRTIO_BLK + use_virtio_blk = 1; +#endif + if (drv) { next_drive = add_drives (drv->next, next_drive); free (drv->device); drv->device = NULL; - if (asprintf (&drv->device, "/dev/sd%c", next_drive) == -1) { + if (asprintf (&drv->device, "/dev/%s%c", use_virtio_blk ? "vd" : "sd", next_drive) == -1) { perror ("asprintf"); exit (EXIT_FAILURE); } diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h index 6e0b368..fe7b7dd 100644 --- a/src/guestfs-internal.h +++ b/src/guestfs-internal.h @@ -350,6 +350,8 @@ struct guestfs_h virDomainPtr dom; /* libvirt domain */ } virt; #endif + + int use_virtio_blk; }; /* Per-filesystem data stored for inspect_os. */ diff --git a/src/handle.c b/src/handle.c index fd7db69..d9ecc5d 100644 --- a/src/handle.c +++ b/src/handle.c @@ -210,6 +210,22 @@ parse_environment (guestfs_h *g, return -1; } +/* + * Currently virtio_scsi is forced if qemu in the host supports this + * feature. This test does however not take the capabilities of the started + * guest into account. As a result no disks will be found if the guest + * kernel is older than 3.4. + */ +#ifdef GUESTFS_QEMU_NO_VIRTIO_BLK + static const char env_string[] = "GUESTFS_QEMU_NO_VIRTIO_BLK"; + str = getenv(env_string); + g->use_virtio_blk = str == NULL; + if (str) + debug (g, "SuSE: %s in environment, preserving virtio-scsi setting.", env_string); + else + debug (g, "SuSE: %s not in environment, preventing virtio-scsi usage in old guest kernel.", env_string); +#endif + return 0; } diff --git a/src/inspect-fs-unix.c b/src/inspect-fs-unix.c index a48d176..b2d6766 100644 --- a/src/inspect-fs-unix.c +++ b/src/inspect-fs-unix.c @@ -1411,7 +1411,7 @@ resolve_fstab_device_diskbyid (guestfs_h *g, const char *part, return 0; /* Make the partition name and check it exists. */ - device = safe_asprintf (g, "/dev/sda%s", part); + device = safe_asprintf (g, "/dev/%sa%s", g->use_virtio_blk ? "vd" : "sd", part); if (!is_partition (g, device)) { free (device); return 0; @@ -1488,7 +1488,7 @@ resolve_fstab_device (guestfs_h *g, const char *spec, Hash_table *md_map) if (disk_i != -1 && disk_i <= 26 && slice_i > 0 && slice_i <= 1 /* > 4 .. see comment above */ && part_i >= 0 && part_i < 26) { - device = safe_asprintf (g, "/dev/sd%c%d", disk_i + 'a', part_i + 5); + device = safe_asprintf (g, "/dev/%s%c%d", g->use_virtio_blk ? "vd" : "sd", disk_i + 'a', part_i + 5); } } else if ((part = match1 (g, spec, re_diskbyid)) != NULL) { diff --git a/src/launch-appliance.c b/src/launch-appliance.c index 17e90d9..902cf9a 100644 --- a/src/launch-appliance.c +++ b/src/launch-appliance.c @@ -875,6 +875,9 @@ qemu_supports_virtio_scsi (guestfs_h *g) g->app.virtio_scsi = 3; } + if (g->use_virtio_blk) + g->app.virtio_scsi = 2; + return g->app.virtio_scsi == 1; } diff --git a/src/launch-libvirt.c b/src/launch-libvirt.c index e4df2a6..dbeb97a 100644 --- a/src/launch-libvirt.c +++ b/src/launch-libvirt.c @@ -150,6 +150,13 @@ launch_libvirt (guestfs_h *g, const char *libvirt_uri) return -1; } +#ifdef GUESTFS_QEMU_NO_VIRTIO_BLK + if (g->use_virtio_blk) { + error (g, "Using libvirt is not possible with this binary package due to forced virtio-blk usage."); + return -1; + } +#endif + guestfs___launch_send_progress (g, 0); TRACE0 (launch_libvirt_start); diff --git a/test-tool/test-tool.c b/test-tool/test-tool.c index 67e778b..74ea6d6 100644 --- a/test-tool/test-tool.c +++ b/test-tool/test-tool.c @@ -35,6 +35,7 @@ #include <guestfs.h> +static int use_virtio_blk; #define _(str) dgettext(PACKAGE, (str)) //#define N_(str) dgettext(PACKAGE, (str)) @@ -103,7 +104,11 @@ main (int argc, char *argv[]) int i; struct guestfs_version *vers; char *p; + char *disk_name, *partition_name; +#ifdef GUESTFS_QEMU_NO_VIRTIO_BLK + use_virtio_blk = 1; +#endif /* Everyone ignores the documentation, so ... */ printf (" ************************************************************\n" " * IMPORTANT NOTICE\n" @@ -129,6 +134,11 @@ main (int argc, char *argv[]) exit (EXIT_FAILURE); } + if (asprintf(&disk_name, "/dev/%s", use_virtio_blk ? "vda" : "sda") < 0) + exit (EXIT_FAILURE); + if (asprintf(&partition_name, "%s1", disk_name) < 0) + exit (EXIT_FAILURE); + for (;;) { c = getopt_long (argc, argv, options, long_options, &option_index); if (c == -1) break; @@ -257,19 +267,19 @@ main (int argc, char *argv[]) fflush (stdout); /* Create the filesystem and mount everything. */ - if (guestfs_part_disk (g, "/dev/sda", "mbr") == -1) { + if (guestfs_part_disk (g, disk_name, "mbr") == -1) { fprintf (stderr, _("libguestfs-test-tool: failed to run part-disk\n")); exit (EXIT_FAILURE); } - if (guestfs_mkfs (g, "ext2", "/dev/sda1") == -1) { + if (guestfs_mkfs (g, "ext2", partition_name) == -1) { fprintf (stderr, _("libguestfs-test-tool: failed to mkfs.ext2\n")); exit (EXIT_FAILURE); } - if (guestfs_mount (g, "/dev/sda1", "/") == -1) { + if (guestfs_mount (g, partition_name, "/") == -1) { fprintf (stderr, _("libguestfs-test-tool: failed to mount /dev/sda1 on /\n")); exit (EXIT_FAILURE); -- 1.8.0
On Wed, Nov 14, 2012 at 02:59:00PM +0100, Olaf Hering wrote:
@@ -103,7 +104,11 @@ main (int argc, char *argv[]) + if (asprintf(&disk_name, "/dev/%s", use_virtio_blk ? "vda" : "sda") < 0) + exit (EXIT_FAILURE); + if (asprintf(&partition_name, "%s1", disk_name) < 0) + exit (EXIT_FAILURE); + for (;;) { c = getopt_long (argc, argv, options, long_options, &option_index); if (c == -1) break; @@ -257,19 +267,19 @@ main (int argc, char *argv[]) fflush (stdout);
/* Create the filesystem and mount everything. */ - if (guestfs_part_disk (g, "/dev/sda", "mbr") == -1) { + if (guestfs_part_disk (g, disk_name, "mbr") == -1) { fprintf (stderr, _("libguestfs-test-tool: failed to run part-disk\n")); exit (EXIT_FAILURE); } [etc]
This part should not be necessary. The daemon translates strings like /dev/sda to the correct format automatically: http://libguestfs.org/guestfs.3.html#block-device-naming However there is a bug in the new mke2fs API where it doesn't translate the optional journaldevice argument properly. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into Xen guests. http://et.redhat.com/~rjones/virt-p2v
On Wed, Nov 14, Richard W.M. Jones wrote:
On Wed, Nov 14, 2012 at 02:59:00PM +0100, Olaf Hering wrote:
@@ -103,7 +104,11 @@ main (int argc, char *argv[]) + if (asprintf(&disk_name, "/dev/%s", use_virtio_blk ? "vda" : "sda") < 0) + exit (EXIT_FAILURE); + if (asprintf(&partition_name, "%s1", disk_name) < 0) + exit (EXIT_FAILURE); + for (;;) { c = getopt_long (argc, argv, options, long_options, &option_index); if (c == -1) break; @@ -257,19 +267,19 @@ main (int argc, char *argv[]) fflush (stdout);
/* Create the filesystem and mount everything. */ - if (guestfs_part_disk (g, "/dev/sda", "mbr") == -1) { + if (guestfs_part_disk (g, disk_name, "mbr") == -1) { fprintf (stderr, _("libguestfs-test-tool: failed to run part-disk\n")); exit (EXIT_FAILURE); } [etc]
This part should not be necessary. The daemon translates strings like /dev/sda to the correct format automatically:
I havent tested every single part of this change, most of it was done mechanically. But, I think the test-tool used to fail due to sda/vda mismatch, thats the reason why this hunk is still there. Olaf
participants (2)
-
Olaf Hering -
Richard W.M. Jones