Richard W.M. Jones
2010-Oct-28 11:35 UTC
[Libguestfs] [PATCH 0/4] Deprecate and remove use of the Perl inspection API
This is a fix for: https://bugzilla.redhat.com/show_bug.cgi?id=642930 These patches remove all use of the Perl inspection API (although leaving the code, since it is used by virt-v2v). The tools have been modified so they use the core inspection API. Virt inspector has been basically rewritten to remove excess cruft and to only use the core API (see the final commit for more details). Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones New in Fedora 11: Fedora Windows cross-compiler. Compile Windows programs, test, and build Windows installers. Over 70 libraries supprt'd http://fedoraproject.org/wiki/MinGW http://www.annexia.org/fedora_mingw
Richard W.M. Jones
2010-Oct-28 11:36 UTC
[Libguestfs] [PATCH 1/4] Sys::Guestfs::Lib: deprecate inspection functions
-- 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 -------------- next part -------------->From b3394208522cd993788aa642e0082e6e5296fe02 Mon Sep 17 00:00:00 2001From: Richard W.M. Jones <rjones at redhat.com> Date: Wed, 27 Oct 2010 15:47:45 +0100 Subject: [PATCH 1/4] Sys::Guestfs::Lib: deprecate inspection functions (RHBZ#642930). Deprecate the guest inspection functions in this module, remove documentation, and point users at the core API functions instead. However we will keep the code here since it is used by virt-v2v and virt-inspector. --- perl/lib/Sys/Guestfs/Lib.pm | 419 +++---------------------------------------- 1 files changed, 29 insertions(+), 390 deletions(-) diff --git a/perl/lib/Sys/Guestfs/Lib.pm b/perl/lib/Sys/Guestfs/Lib.pm index 2292839..5df6229 100644 --- a/perl/lib/Sys/Guestfs/Lib.pm +++ b/perl/lib/Sys/Guestfs/Lib.pm @@ -25,7 +25,7 @@ use warnings; # make a change which is not backwards compatible. It is not related # to the libguestfs version number. use vars qw($VERSION); -$VERSION = '0.2'; +$VERSION = '0.3'; use Carp qw(croak); @@ -47,14 +47,10 @@ Sys::Guestfs::Lib - Useful functions for using libguestfs from Perl =head1 SYNOPSIS - use Sys::Guestfs::Lib qw(open_guest inspect_all_partitions ...); + use Sys::Guestfs::Lib qw(open_guest ...); $g = open_guest ($name); - %fses = inspect_all_partitions ($g, \@partitions); - -(and many more calls - see the rest of this manpage) - =head1 DESCRIPTION C<Sys::Guestfs::Lib> is an extra library of useful functions for using @@ -65,6 +61,14 @@ The basic libguestfs API is not covered by this manpage. Please refer instead to L<Sys::Guestfs(3)> and L<guestfs(3)>. The libvirt API is also not covered. For that, see L<Sys::Virt(3)>. +=head1 DEPRECATION OF SOME FUNCTIONS + +This module contains functions and code to perform inspection of guest +images. Since libguestfs 1.5.3 this ability has moved into the core +API (see L<guestfs(3)/INSPECTION>). The inspection functions in this +module are deprecated and will not be updated. Each deprecated +function is marked in the documentation below. + =head1 BASIC FUNCTIONS =cut @@ -376,109 +380,11 @@ sub file_architecture =head1 OPERATING SYSTEM INSPECTION FUNCTIONS -The functions in this section can be used to inspect the operating -system(s) available inside a virtual machine image. For example, you -can find out if the VM is Linux or Windows, how the partitions are -meant to be mounted, and what applications are installed. - -If you just want a simple command-line interface to this -functionality, use the L<virt-inspector(1)> tool. The documentation -below covers the case where you want to access this functionality from -a Perl program. - -Once you have the list of partitions (from C<get_partitions>) there -are several steps involved: - -=over 4 - -=item 1. - -Look at each partition separately and find out what is on it. - -The information you get back includes whether the partition contains a -filesystem or swapspace, what sort of filesystem (eg. ext3, ntfs), and -a first pass guess at the content of the filesystem (eg. Linux boot, -Windows root). - -The result of this step is a C<%fs> hash of information, one hash for -each partition. - -See: C<inspect_partition>, C<inspect_all_partitions> - -=item 2. - -Work out the relationship between partitions. - -In this step we work out how partitions are related to each other. In -the case of a single-boot VM, we work out how the partitions are -mounted in respect of each other (eg. C</dev/sda1> is mounted as -C</boot>). In the case of a multi-boot VM where there are several -roots, we may identify several operating system roots, and mountpoints -can even be shared. - -The result of this step is a single hash called C<%oses> which is -described in more detail below, but at the top level looks like: - - %oses = { - '/dev/VG/Root1' => \%os1, - '/dev/VG/Root2' => \%os2, - } - - %os1 = { - os => 'linux', - mounts => { - '/' => '/dev/VG/Root1', - '/boot' => '/dev/sda1', - }, - ... - } - -(example shows a multi-boot VM containing two root partitions). - -See: C<inspect_operating_systems> - -=item 3. - -Mount up the disks. - -Previous to this point we've essentially been looking at each -partition in isolation. Now we construct a true guest filesystem by -mounting up all of the disks. Only once everything is mounted up can -we run commands in the OS context to do more detailed inspection. - -See: C<mount_operating_system> - -=item 4. - -Check for kernels and applications. - -This step now does more detailed inspection, where we can look for -kernels, applications and more installed in the guest. - -The result of this is an enhanced C<%os> hash. - -See: C<inspect_in_detail> - -=item 5. - -Generate output. - -This library does not contain functions for generating output based on -the analysis steps above. Use a command line tool such as -L<virt-inspector(1)> to get useful output. - -=back - =head2 inspect_all_partitions - %fses = inspect_all_partitions ($g, \@partitions); - -This calls C<inspect_partition> for each partition in the list -C<@partitions>. - -The result is a hash which maps partition name to C<\%fs> hashref. - -The contents of the C<%fs> hash is explained below. +This function is deprecated. It will not be updated in future +versions of libguestfs. New code should not use this function. Use +the core API functions instead, see L<guestfs(3)/INSPECTION>. =cut @@ -503,94 +409,9 @@ sub inspect_all_partitions =head2 inspect_partition - \%fs = inspect_partition ($g, $partition); - -This function inspects the device named C<$partition> in isolation and -tries to determine what it is. It returns information such as whether -the partition is formatted, and with what, whether it is mountable, -and what it appears to contain (eg. a Windows root, or a Linux /usr). - -If the Perl module L<Win::Hivex(3)> is installed, then additional -information is made available for Windows guests, if we can locate and -read their registries. - -The returned value is a hashref C<\%fs> which may contain the -following top-level keys (any key can be missing): - -=over 4 - -=item fstype - -Filesystem type, eg. "ext2" or "ntfs" - -=item fsos - -Apparent filesystem OS, eg. "linux" or "windows" - -=item is_swap - -If set, the partition is a swap partition. - -=item uuid - -Filesystem UUID. - -=item label - -Filesystem label. - -=item is_mountable - -If set, the partition could be mounted by libguestfs. - -=item content - -Filesystem content, if we could determine it. One of: "linux-grub", -"linux-root", "linux-usrlocal", "linux-usr", "windows-root". - -=item osdistro - -(For Linux root partitions only). -Operating system distribution. One of: "fedora", "rhel", "centos", -"scientific", "debian". - -=item package_format - -(For Linux root partitions only) -The package format used by the guest distribution. One of: "rpm", "deb". - -=item package_management - -(For Linux root partitions only) -The package management tool used by the guest distribution. One of: "rhn", -"yum", "apt". - -=item os_major_version - -(For root partitions only). -Operating system major version number. - -=item os_minor_version - -(For root partitions only). -Operating system minor version number. - -=item fstab - -(For Linux root partitions only). -The contents of the C</etc/fstab> file. - -=item boot_ini - -(For Windows root partitions only). -The contents of the C</boot.ini> (NTLDR) file. - -=item registry - -The value is an arrayref, which is a list of Windows registry -file contents, in Windows C<.REG> format. - -=back +This function is deprecated. It will not be updated in future +versions of libguestfs. New code should not use this function. Use +the core API functions instead, see L<guestfs(3)/INSPECTION>. =cut @@ -982,83 +803,9 @@ sub _check_grub =head2 inspect_operating_systems - \%oses = inspect_operating_systems ($g, \%fses); - -This function works out how partitions are related to each other. In -the case of a single-boot VM, we work out how the partitions are -mounted in respect of each other (eg. C</dev/sda1> is mounted as -C</boot>). In the case of a multi-boot VM where there are several -roots, we may identify several operating system roots, and mountpoints -can even be shared. - -This function returns a hashref C<\%oses> which at the top level looks -like: - - %oses = { - '/dev/VG/Root' => \%os, - } - -There can be multiple roots for a multi-boot VM, but this function -will throw an error if no roots (ie. OSes) could be found. - -The C<\%os> hash contains the following keys (any can be omitted): - -=over 4 - -=item os - -Operating system type, eg. "linux", "windows". - -=item arch - -Operating system userspace architecture, eg. "i386", "x86_64". - -=item distro - -Operating system distribution, eg. "debian". - -=item product_name - -Free text product name. - -=item major_version - -Operating system major version, eg. "4". - -=item minor_version - -Operating system minor version, eg "3". - -=item root - -The value is a reference to the root partition C<%fs> hash. - -=item root_device - -The value is the name of the root partition (as a string). - -=item mounts - -Mountpoints. -The value is a hashref like this: - - mounts => { - '/' => '/dev/VG/Root', - '/boot' => '/dev/sda1', - } - -=item filesystems - -Filesystems (including swap devices and unmounted partitions). -The value is a hashref like this: - - filesystems => { - '/dev/sda1' => \%fs, - '/dev/VG/Root' => \%fs, - '/dev/VG/Swap' => \%fs, - } - -=back +This function is deprecated. It will not be updated in future +versions of libguestfs. New code should not use this function. Use +the core API functions instead, see L<guestfs(3)/INSPECTION>. =cut @@ -1197,17 +944,9 @@ sub _find_filesystem =head2 mount_operating_system - mount_operating_system ($g, \%os, [$ro]); - -This function mounts the operating system described in the -C<%os> hash according to the C<mounts> table in that hash (see -C<inspect_operating_systems>). - -The partitions are mounted read-only unless the third parameter -is specified as zero explicitly. - -To reverse the effect of this call, use the standard -libguestfs API call C<$g-E<gt>umount_all ()>. +This function is deprecated. It will not be updated in future +versions of libguestfs. New code should not use this function. Use +the core API functions instead, see L<guestfs(3)/INSPECTION>. =cut @@ -1237,107 +976,9 @@ sub mount_operating_system =head2 inspect_in_detail - mount_operating_system ($g, \%os); - inspect_in_detail ($g, \%os); - $g->umount_all (); - -The C<inspect_in_detail> function inspects the mounted operating -system for installed applications, installed kernels, kernel modules, -system architecture, and more. - -It adds extra keys to the existing C<%os> hash reflecting what it -finds. These extra keys are: - -=over 4 - -=item apps - -List of applications. - -=item boot - -Boot configurations. A hash containing: - -=over 4 - -=item configs - -An array of boot configurations. Each array entry is a hash containing: - -=over 4 - -=item initrd - -A reference to the expanded initrd structure (see below) for the initrd used by -this boot configuration. - -=item kernel - -A reference to the expanded kernel structure (see below) for the kernel used by -this boot configuration. - -=item title - -The human readable name of the configuration. - -=item cmdline - -The kernel command line. - -=back - -=item default - -The index of the default configuration in the configs array. - -=item grub_fs - -The path of the filesystem containing the grub partition. - -=back - -=item kernels - -List of kernels. - -This is a hash of kernel version =E<gt> a hash with the following keys: - -=over 4 - -=item version - -Kernel version. - -=item arch - -Kernel architecture (eg. C<x86-64>). - -=item modules - -List of modules. - -=item path - -The path to the kernel's vmlinuz file. - -=item package - -If the kernel was installed in a package, the name of that package. - -=back - -=item modprobe_aliases - -(For Linux VMs). -The contents of the modprobe configuration. - -=item initrd_modules - -(For Linux VMs). -The kernel modules installed in the initrd. The value is -a hashref of kernel version to list of modules. - -=back +This function is deprecated. It will not be updated in future +versions of libguestfs. New code should not use this function. Use +the core API functions instead, see L<guestfs(3)/INSPECTION>. =cut @@ -1604,11 +1245,9 @@ sub _check_for_kernels =head2 inspect_linux_kernel - my $kernel_hash = inspect_linux_kernel($g, $vmlinuz_path, $package_format); - -inspect_linux_kernel returns a hash describing the target linux kernel. For the -contents of the hash, see the I<kernels> structure described under -L</inspect_in_detail>. +This function is deprecated. It will not be updated in future +versions of libguestfs. New code should not use this function. Use +the core API functions instead, see L<guestfs(3)/INSPECTION>. =cut @@ -1762,7 +1401,7 @@ sub _inspect_initrd =head1 COPYRIGHT -Copyright (C) 2009 Red Hat Inc. +Copyright (C) 2009-2010 Red Hat Inc. =head1 LICENSE -- 1.7.3.1
Richard W.M. Jones
2010-Oct-28 11:37 UTC
[Libguestfs] [PATCH 2/4] New API: inspect-get-windows-systemroot to get systemroot.
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://et.redhat.com/~rjones/libguestfs/ See what it can do: http://et.redhat.com/~rjones/libguestfs/recipes.html -------------- next part -------------->From 2b38ae9db560523c1b417e5888295cb1016ee930 Mon Sep 17 00:00:00 2001From: Richard W.M. Jones <rjones at redhat.com> Date: Wed, 27 Oct 2010 16:47:33 +0100 Subject: [PATCH 2/4] New API: inspect-get-windows-systemroot to get systemroot. We are already using heuristics in the C inspection code to determine the Windows %SYSTEMROOT% directory. This change just exposes this information through the API. --- generator/generator_actions.ml | 16 ++++++++++++ src/guestfs-internal.h | 1 + src/inspect.c | 53 ++++++++++++++++++++++----------------- 3 files changed, 47 insertions(+), 23 deletions(-) diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml index 63ece15..086584c 100644 --- a/generator/generator_actions.ml +++ b/generator/generator_actions.ml @@ -1002,6 +1002,22 @@ deprecated C<guestfs_add_drive_with_if> call (q.v.) =back"); + ("inspect_get_windows_systemroot", (RString "systemroot", [Device "root"], []), -1, [], + [], + "get Windows systemroot of inspected operating system", + "\ +This function should only be called with a root device string +as returned by C<guestfs_inspect_os>. + +This returns the Windows systemroot of the inspected guest. +The systemroot is a directory path such as C</WINDOWS>. + +This call assumes that the guest is Windows and that the +systemroot could be determined by inspection. If this is not +the case then an error is returned. + +Please read L<guestfs(3)/INSPECTION> for more details."); + ] (* daemon_functions are any functions which cause some action diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h index a42375f..6fc9412 100644 --- a/src/guestfs-internal.h +++ b/src/guestfs-internal.h @@ -180,6 +180,7 @@ struct inspect_fs { int major_version; int minor_version; char *arch; + char *windows_systemroot; struct inspect_fstab_entry *fstab; size_t nr_fstab; }; diff --git a/src/inspect.c b/src/inspect.c index 992573a..5bd332f 100644 --- a/src/inspect.c +++ b/src/inspect.c @@ -456,6 +456,7 @@ guestfs___free_inspect_info (guestfs_h *g) free (g->fses[i].device); free (g->fses[i].product_name); free (g->fses[i].arch); + free (g->fses[i].windows_systemroot); size_t j; for (j = 0; j < g->fses[i].nr_fstab; ++j) { free (g->fses[i].fstab[j].device); @@ -502,10 +503,8 @@ static int check_filesystem (guestfs_h *g, const char *device); static int check_linux_root (guestfs_h *g, struct inspect_fs *fs); static int check_fstab (guestfs_h *g, struct inspect_fs *fs); static int check_windows_root (guestfs_h *g, struct inspect_fs *fs); -static int check_windows_arch (guestfs_h *g, struct inspect_fs *fs, - const char *systemroot); -static int check_windows_registry (guestfs_h *g, struct inspect_fs *fs, - const char *systemroot); +static int check_windows_arch (guestfs_h *g, struct inspect_fs *fs); +static int check_windows_registry (guestfs_h *g, struct inspect_fs *fs); static char *resolve_windows_path_silently (guestfs_h *g, const char *); static int extend_fses (guestfs_h *g); static int parse_unsigned_int (guestfs_h *g, const char *str); @@ -962,34 +961,27 @@ check_windows_root (guestfs_h *g, struct inspect_fs *fs) return -1; } - /* XXX There is a case for exposing systemroot and many variables - * from the registry through the libguestfs API. - */ - if (g->verbose) fprintf (stderr, "windows %%SYSTEMROOT%% = %s", systemroot); - if (check_windows_arch (g, fs, systemroot) == -1) { - free (systemroot); + /* Freed by guestfs___free_inspect_info. */ + fs->windows_systemroot = systemroot; + + if (check_windows_arch (g, fs) == -1) return -1; - } - if (check_windows_registry (g, fs, systemroot) == -1) { - free (systemroot); + if (check_windows_registry (g, fs) == -1) return -1; - } - free (systemroot); return 0; } static int -check_windows_arch (guestfs_h *g, struct inspect_fs *fs, - const char *systemroot) +check_windows_arch (guestfs_h *g, struct inspect_fs *fs) { - size_t len = strlen (systemroot) + 32; + size_t len = strlen (fs->windows_systemroot) + 32; char cmd_exe[len]; - snprintf (cmd_exe, len, "%s/system32/cmd.exe", systemroot); + snprintf (cmd_exe, len, "%s/system32/cmd.exe", fs->windows_systemroot); char *cmd_exe_path = resolve_windows_path_silently (g, cmd_exe); if (!cmd_exe_path) @@ -1009,8 +1001,7 @@ check_windows_arch (guestfs_h *g, struct inspect_fs *fs, * registry fields available to callers. */ static int -check_windows_registry (guestfs_h *g, struct inspect_fs *fs, - const char *systemroot) +check_windows_registry (guestfs_h *g, struct inspect_fs *fs) { TMP_TEMPLATE_ON_STACK (dir); #define dir_len (strlen (dir)) @@ -1019,9 +1010,10 @@ check_windows_registry (guestfs_h *g, struct inspect_fs *fs, #define cmd_len (dir_len + 16) char cmd[cmd_len]; - size_t len = strlen (systemroot) + 64; + size_t len = strlen (fs->windows_systemroot) + 64; char software[len]; - snprintf (software, len, "%s/system32/config/software", systemroot); + snprintf (software, len, "%s/system32/config/software", + fs->windows_systemroot); char *software_path = resolve_windows_path_silently (g, software); if (!software_path) @@ -1275,6 +1267,21 @@ guestfs__inspect_get_product_name (guestfs_h *g, const char *root) return safe_strdup (g, fs->product_name ? : "unknown"); } +char * +guestfs__inspect_get_windows_systemroot (guestfs_h *g, const char *root) +{ + struct inspect_fs *fs = search_for_root (g, root); + if (!fs) + return NULL; + + if (!fs->windows_systemroot) { + error (g, _("not a Windows guest, or systemroot could not be determined")); + return NULL; + } + + return safe_strdup (g, fs->windows_systemroot); +} + char ** guestfs__inspect_get_mountpoints (guestfs_h *g, const char *root) { -- 1.7.3.1
Richard W.M. Jones
2010-Oct-28 11:37 UTC
[Libguestfs] [PATCH 3/4] tools: Use C API for inspection
-- 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 6e19d032d0d28e62f38223b6cc05dc36d9352add Mon Sep 17 00:00:00 2001From: Richard W.M. Jones <rjones at redhat.com> Date: Wed, 27 Oct 2010 16:06:11 +0100 Subject: [PATCH 3/4] tools: Use C API for inspection (RHBZ#642930). Update the following tools to use the C API for inspection: - virt-cat - virt-edit - virt-ls - virt-tar - virt-win-reg None of the tools in the tools/ directory now use the deprecated Perl inspection APIs. --- tools/virt-cat | 37 +++++++++++++++++-------------------- tools/virt-edit | 35 ++++++++++++++++------------------- tools/virt-ls | 39 ++++++++++++++++++--------------------- tools/virt-tar | 38 ++++++++++++++++++-------------------- tools/virt-win-reg | 39 ++++++++++++++++++--------------------- 5 files changed, 87 insertions(+), 101 deletions(-) diff --git a/tools/virt-cat b/tools/virt-cat index 66806a1..546e85c 100755 --- a/tools/virt-cat +++ b/tools/virt-cat @@ -1,6 +1,6 @@ #!/usr/bin/perl -w # virt-cat -# Copyright (C) 2009 Red Hat Inc. +# 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 @@ -20,11 +20,10 @@ use warnings; use strict; use Sys::Guestfs; -use Sys::Guestfs::Lib qw(open_guest get_partitions resolve_windows_path - inspect_all_partitions inspect_partition - inspect_operating_systems mount_operating_system); +use Sys::Guestfs::Lib qw(open_guest); use Pod::Usage; use Getopt::Long; +use File::Basename; use Locale::TextDomain 'libguestfs'; =encoding utf8 @@ -157,22 +156,20 @@ if ($uri) { $g->launch (); -# List of possible filesystems. -my @partitions = get_partitions ($g); - -# Now query each one to build up a picture of what's in it. -my %fses - inspect_all_partitions ($g, \@partitions, - use_windows_registry => 0); - -my $oses = inspect_operating_systems ($g, \%fses); - -my @roots = keys %$oses; -die __"multiboot operating systems are not supported by virt-cat" if @roots > 1; -my $root_dev = $roots[0]; - -my $os = $oses->{$root_dev}; -mount_operating_system ($g, $os); +my @roots = $g->inspect_os (); +if (@roots == 0) { + die __x("{prog}: No operating system could be detected inside this disk image.\n\nThis may be because the file is not a disk image, or is not a virtual machine\nimage, or because the OS type is not understood by libguestfs.\n\nIf you feel this is an error, please file a bug report including as much\ninformation about the disk image as possible.\n", + prog => basename ($0)); +} +if (@roots > 1) { + die __x("{prog}: multiboot operating systems are not supported.\n", + prog => basename ($0)) +} +my %fses = $g->inspect_get_mountpoints ($roots[0]); +my @fses = sort { length $a <=> length $b } keys %fses; +foreach (@fses) { + $g->mount_ro ($fses{$_}, $_); +} # Allow this to fail in case eg. the file does not exist. # NB: https://bugzilla.redhat.com/show_bug.cgi?id=501888 diff --git a/tools/virt-edit b/tools/virt-edit index 78316fd..ad45582 100755 --- a/tools/virt-edit +++ b/tools/virt-edit @@ -20,12 +20,11 @@ use warnings; use strict; use Sys::Guestfs; -use Sys::Guestfs::Lib qw(open_guest get_partitions resolve_windows_path - inspect_all_partitions inspect_partition - inspect_operating_systems mount_operating_system); +use Sys::Guestfs::Lib qw(open_guest); use Pod::Usage; use Getopt::Long; use File::Temp qw/tempfile/; +use File::Basename; use Locale::TextDomain 'libguestfs'; =encoding utf8 @@ -181,22 +180,20 @@ if ($uri) { $g->launch (); -# List of possible filesystems. -my @partitions = get_partitions ($g); - -# Now query each one to build up a picture of what's in it. -my %fses - inspect_all_partitions ($g, \@partitions, - use_windows_registry => 0); - -my $oses = inspect_operating_systems ($g, \%fses); - -my @roots = keys %$oses; -die __"multiboot operating systems are not supported by virt-edit" if @roots > 1; -my $root_dev = $roots[0]; - -my $os = $oses->{$root_dev}; -mount_operating_system ($g, $os, 0); +my @roots = $g->inspect_os (); +if (@roots == 0) { + die __x("{prog}: No operating system could be detected inside this disk image.\n\nThis may be because the file is not a disk image, or is not a virtual machine\nimage, or because the OS type is not understood by libguestfs.\n\nIf you feel this is an error, please file a bug report including as much\ninformation about the disk image as possible.\n", + prog => basename ($0)); +} +if (@roots > 1) { + die __x("{prog}: multiboot operating systems are not supported.\n", + prog => basename ($0)) +} +my %fses = $g->inspect_get_mountpoints ($roots[0]); +my @fses = sort { length $a <=> length $b } keys %fses; +foreach (@fses) { + $g->mount_options ("", $fses{$_}, $_); +} my ($fh, $tempname) = tempfile (UNLINK => 1); my $fddev = "/dev/fd/" . fileno ($fh); diff --git a/tools/virt-ls b/tools/virt-ls index 9518cf0..03733f7 100755 --- a/tools/virt-ls +++ b/tools/virt-ls @@ -1,6 +1,6 @@ #!/usr/bin/perl -w # virt-ls -# Copyright (C) 2009 Red Hat Inc. +# 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 @@ -20,13 +20,12 @@ use warnings; use strict; use Sys::Guestfs; -use Sys::Guestfs::Lib qw(open_guest get_partitions resolve_windows_path - inspect_all_partitions inspect_partition - inspect_operating_systems mount_operating_system); +use Sys::Guestfs::Lib qw(open_guest); use Pod::Usage; use Getopt::Long; -use Locale::TextDomain 'libguestfs'; use File::Temp qw/tempdir/; +use File::Basename; +use Locale::TextDomain 'libguestfs'; =encoding utf8 @@ -190,22 +189,20 @@ if ($uri) { $g->launch (); -# List of possible filesystems. -my @partitions = get_partitions ($g); - -# Now query each one to build up a picture of what's in it. -my %fses - inspect_all_partitions ($g, \@partitions, - use_windows_registry => 0); - -my $oses = inspect_operating_systems ($g, \%fses); - -my @roots = keys %$oses; -die __"multiboot operating systems are not supported by virt-ls\n" if @roots > 1; -my $root_dev = $roots[0]; - -my $os = $oses->{$root_dev}; -mount_operating_system ($g, $os); +my @roots = $g->inspect_os (); +if (@roots == 0) { + die __x("{prog}: No operating system could be detected inside this disk image.\n\nThis may be because the file is not a disk image, or is not a virtual machine\nimage, or because the OS type is not understood by libguestfs.\n\nIf you feel this is an error, please file a bug report including as much\ninformation about the disk image as possible.\n", + prog => basename ($0)); +} +if (@roots > 1) { + die __x("{prog}: multiboot operating systems are not supported.\n", + prog => basename ($0)) +} +my %fses = $g->inspect_get_mountpoints ($roots[0]); +my @fses = sort { length $a <=> length $b } keys %fses; +foreach (@fses) { + $g->mount_ro ($fses{$_}, $_); +} unless ($mode) { my @r = $g->ls ($directory); diff --git a/tools/virt-tar b/tools/virt-tar index ea33fcf..af9f817 100755 --- a/tools/virt-tar +++ b/tools/virt-tar @@ -1,6 +1,6 @@ #!/usr/bin/perl -w # virt-tar -# Copyright (C) 2009 Red Hat Inc. +# 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 @@ -20,11 +20,10 @@ use warnings; use strict; use Sys::Guestfs; -use Sys::Guestfs::Lib qw(open_guest get_partitions resolve_windows_path - inspect_all_partitions inspect_partition - inspect_operating_systems mount_operating_system); +use Sys::Guestfs::Lib qw(open_guest); use Pod::Usage; use Getopt::Long; +use File::Basename; use Locale::TextDomain 'libguestfs'; =encoding utf8 @@ -234,22 +233,21 @@ push @args, format => $format if defined $format; my $g = open_guest (@args); $g->launch (); -# List of possible filesystems. -my @partitions = get_partitions ($g); - -# Now query each one to build up a picture of what's in it. -my %fses - inspect_all_partitions ($g, \@partitions, - use_windows_registry => 0); - -my $oses = inspect_operating_systems ($g, \%fses); - -my @roots = keys %$oses; -die __"multiboot operating systems are not supported by virt-tar\n" if @roots > 1; -my $root_dev = $roots[0]; - -my $os = $oses->{$root_dev}; -mount_operating_system ($g, $os, $mode eq "u" ? 0 : 1); +my @roots = $g->inspect_os (); +if (@roots == 0) { + die __x("{prog}: No operating system could be detected inside this disk image.\n\nThis may be because the file is not a disk image, or is not a virtual machine\nimage, or because the OS type is not understood by libguestfs.\n\nIf you feel this is an error, please file a bug report including as much\ninformation about the disk image as possible.\n", + prog => basename ($0)); +} +if (@roots > 1) { + die __x("{prog}: multiboot operating systems are not supported.\n", + prog => basename ($0)) +} +my %fses = $g->inspect_get_mountpoints ($roots[0]); +my @fses = sort { length $a <=> length $b } keys %fses; +my $mountopts = $mode eq "u" ? "" : "ro"; +foreach (@fses) { + $g->mount_options ($mountopts, $fses{$_}, $_); +} # Do the tar command. if ($mode eq "x") { diff --git a/tools/virt-win-reg b/tools/virt-win-reg index ed298fb..4c9308a 100755 --- a/tools/virt-win-reg +++ b/tools/virt-win-reg @@ -20,15 +20,14 @@ use warnings; use strict; use Sys::Guestfs; -use Sys::Guestfs::Lib qw(open_guest get_partitions resolve_windows_path - inspect_all_partitions inspect_partition - inspect_operating_systems mount_operating_system); +use Sys::Guestfs::Lib qw(open_guest); use Win::Hivex; use Win::Hivex::Regedit qw(reg_import reg_export); use Pod::Usage; use Getopt::Long; use File::Temp qw/tempdir/; +use File::Basename; use Locale::TextDomain 'libguestfs'; =encoding utf8 @@ -288,23 +287,23 @@ $g->launch (); warn "inspecting guest ..." if $debug; -# List of possible filesystems. -my @partitions = get_partitions ($g); - -# Now query each one to build up a picture of what's in it. -my %fses - inspect_all_partitions ($g, \@partitions, - use_windows_registry => 0); - -my $oses = inspect_operating_systems ($g, \%fses); - -my @roots = keys %$oses; -die __"multiboot operating systems are not supported by virt-win-reg" if @roots > 1; -my $root_dev = $roots[0]; +my @roots = $g->inspect_os (); +if (@roots == 0) { + die __x("{prog}: No operating system could be detected inside this disk image.\n\nThis may be because the file is not a disk image, or is not a virtual machine\nimage, or because the OS type is not understood by libguestfs.\n\nIf you feel this is an error, please file a bug report including as much\ninformation about the disk image as possible.\n", + prog => basename ($0)); +} +if (@roots > 1) { + die __x("{prog}: multiboot operating systems are not supported.\n", + prog => basename ($0)) +} +my %fses = $g->inspect_get_mountpoints ($roots[0]); +my @fses = sort { length $a <=> length $b } keys %fses; +my $mountopts = $merge ? "" : "ro"; +foreach (@fses) { + $g->mount_options ($mountopts, $fses{$_}, $_); +} -my $os = $oses->{$root_dev}; -my $ro = $merge ? 0 : 1; -mount_operating_system ($g, $os, $ro); +my $systemroot = $g->inspect_get_windows_systemroot ($roots[0]); # Create a working directory to store the downloaded registry files. my $tmpdir = tempdir (CLEANUP => 1); @@ -437,7 +436,6 @@ sub download_hive local $_; my $hivename = shift; - my $systemroot = $os->{root}->{systemroot} || "/windows"; my $winfile_before = "$systemroot/system32/config/$hivename"; my $winfile; eval { $winfile = $g->case_sensitive_path ($winfile_before); }; @@ -460,7 +458,6 @@ sub upload_hive local $_; my $hivename = shift; - my $systemroot = $os->{root}->{systemroot} || "/windows"; my $winfile_before = "$systemroot/system32/config/$hivename"; my $winfile; eval { $winfile = $g->case_sensitive_path ($winfile_before); }; -- 1.7.3.1
Maybe Matching Threads
- [PATCH 0/3] 3 small code fixes
- [PATCH 0/4] Allow QEMU if=... (block device emulation) to be overridden
- [PATCH] Add version numbers to Perl modules (RHBZ#521674).
- [PATCH 0/12] Add support for writing to hive files
- Attempts to install a Windows driver from WinPE