Ignore old-style initrd which is a compressed ext2 filesystem.
[libguestfs.git] / perl / lib / Sys / Guestfs / Lib.pm
index 44c4d56..d5dfb4e 100644 (file)
@@ -174,6 +174,10 @@ sub open_guest
 
        my $p = XML::XPath->new (xml => $xml);
        my @disks = $p->findnodes ('//devices/disk/source/@dev');
+       push (@disks, $p->findnodes ('//devices/disk/source/@file'));
+
+       die "$images[0] seems to have no disk devices\n" unless @disks;
+
        @images = map { $_->getData } @disks;
     }
 
@@ -1204,14 +1208,20 @@ sub _check_for_initrd
            my $version = $1;
            my @modules;
 
-           eval {
-               @modules = $g->initrd_list ("/boot/$initrd");
-           };
-           unless ($@) {
-               @modules = grep { m,([^/]+)\.ko$, || m,([^/]+)\.o$, } @modules;
-               $initrd_modules{$version} = \@modules
-           } else {
-               warn "/boot/$initrd: could not read initrd format"
+           # Disregard old-style compressed ext2 files, since cpio
+           # takes ages to (fail to) process these.
+           if ($g->file ("/boot/$initrd") !~ /gzip compressed/ ||
+               $g->zfile ("gzip", "/boot/$initrd") !~ /ext2 filesystem/) {
+               eval {
+                   @modules = $g->initrd_list ("/boot/$initrd");
+               };
+               unless ($@) {
+                   @modules = grep { m,([^/]+)\.ko$, || m,([^/]+)\.o$, }
+                   @modules;
+                   $initrd_modules{$version} = \@modules
+               } else {
+                   warn "/boot/$initrd: could not read initrd format";
+               }
            }
        }
     }