Virt-inspector can produce output in several formats, including a
readable text report, and XML for feeding into other programs.
Virt-inspector can produce output in several formats, including a
readable text report, and XML for feeding into other programs.
In the normal usage, use C<virt-inspector domname> where C<domname> is
the libvirt domain (see: C<virsh list --all>).
In the normal usage, use C<virt-inspector domname> where C<domname> is
the libvirt domain (see: C<virsh list --all>).
+my $format;
+
+=item B<--format> raw
+
+Specify the format of disk images given on the command line. If this
+is omitted then the format is autodetected from the content of the
+disk image.
+
+If disk images are requested from libvirt, then this program asks
+libvirt for this information. In this case, the value of the format
+parameter is ignored.
+
+If working with untrusted raw-format guest disk images, you should
+ensure the format is always specified.
+
+=cut
+
-If this item is passed, I<and> the guest is Windows, I<and> the
-external program C<reged> is available (see SEE ALSO section), then we
-attempt to parse the Windows registry. This allows much more
-information to be gathered for Windows guests.
+This flag is ignored for compatibility with earlier releases of the
+software.
-This is quite an expensive and slow operation, so we don't do it by
-default.
+In this version, if L<Win::Hivex(3)> is available, then we attempt to
+parse information out of the Registry for any Windows guest.
"text" => sub { $output = "text" },
"none" => sub { $output = "none" },
"xml" => sub { $output = "xml" },
"text" => sub { $output = "text" },
"none" => sub { $output = "none" },
"xml" => sub { $output = "xml" },
+
+# XXX This is a bug: Originally we intended to open the guest with
+# rw=>1 in order to tell Sys::Guestfs::Lib that we should disallow
+# active domains. However this also has the effect of opening the
+# disk image in write mode, and in any case we don't use this option
+# in guestfish any more since we moved all the inspection code into
+# the core library. We should drop the fish output modes completely.
my $g;
my @images;
if ($uri) {
my ($conn, $dom);
($g, $conn, $dom, @images) =
my $g;
my @images;
if ($uri) {
my ($conn, $dom);
($g, $conn, $dom, @images) =
- open_guest (\@ARGV, rw => $rw, address => $uri);
+ open_guest (\@ARGV, rw => $rw, address => $uri, format => $format);
} else {
my ($conn, $dom);
($g, $conn, $dom, @images) =
} else {
my ($conn, $dom);
($g, $conn, $dom, @images) =
- inspect_all_partitions ($g, \@partitions,
- use_windows_registry => $windows_registry);
+ inspect_all_partitions ($g, \@partitions);
- print "-a $_ " foreach @images;
+ foreach (@images) {
+ unless (defined $_->[1]) {
+ printf "-a %s ", shell_quote ($_->[0]);
+ } else {
+ printf "--format %s -a %s ",
+ shell_quote ($_->[1]), shell_quote ($_->[0]);
+ }
+ }
my $mounts = $oses->{$root_dev}->{mounts};
# Have to mount / first. Luckily '/' is early in the ASCII
# character set, so this should be OK.
foreach (sort keys %$mounts) {
my $mounts = $oses->{$root_dev}->{mounts};
# Have to mount / first. Luckily '/' is early in the ASCII
# character set, so this should be OK.
foreach (sort keys %$mounts) {
print $os->{arch}, " " if exists $os->{arch};
print $os->{major_version} if exists $os->{major_version};
print ".", $os->{minor_version} if exists $os->{minor_version};
print $os->{arch}, " " if exists $os->{arch};
print $os->{major_version} if exists $os->{major_version};
print ".", $os->{minor_version} if exists $os->{minor_version};
- print __" Kernels:\n";
- my @kernels = @{$os->{kernels}};
- foreach (@kernels) {
- print " $_->{version} ($_->{arch})\n";
- my @modules = @{$_->{modules}};
- foreach (@modules) {
- print " $_\n";
+ if ($os->{kernels}) {
+ print __" Kernels:\n";
+ my @kernels = @{$os->{kernels}};
+ foreach (@kernels) {
+ print " $_->{version} ($_->{arch})\n";
+ my @modules = @{$_->{modules}};
+ foreach (@modules) {
+ print " $_\n";
+ }
foreach ( [ "name" => "os" ],
[ "distro" => "distro" ],
foreach ( [ "name" => "os" ],
[ "distro" => "distro" ],
[ "arch" => "arch" ],
[ "major_version" => "major_version" ],
[ "minor_version" => "minor_version" ],
[ "arch" => "arch" ],
[ "major_version" => "major_version" ],
[ "minor_version" => "minor_version" ],
foreach (@apps) {
$xml->startTag("application");
$xml->dataElement("name", $_->{name});
foreach (@apps) {
$xml->startTag("application");
$xml->dataElement("name", $_->{name});
- $xml->startTag("kernels");
- my @kernels = @{$os->{kernels}};
- foreach (@kernels) {
- $xml->startTag("kernel",
- "version" => $_->{version},
- "arch" => $_->{arch});
- $xml->startTag("modules");
- my @modules = @{$_->{modules}};
- foreach (@modules) {
- $xml->dataElement("module", $_);
- }
- $xml->endTag("modules");
- $xml->dataElement("path", $_->{path}) if(defined($_->{path}));
- $xml->dataElement("package", $_->{package}) if(defined($_->{package}));
- $xml->endTag("kernel");
- }
- $xml->endTag("kernels");
+ $xml->startTag("kernels");
+ my @kernels = @{$os->{kernels}};
+ foreach (@kernels) {
+ $xml->startTag("kernel",
+ "version" => $_->{version},
+ "arch" => $_->{arch});
+ $xml->startTag("modules");
+ my @modules = @{$_->{modules}};
+ foreach (@modules) {
+ $xml->dataElement("module", $_);
+ }
+ $xml->endTag("modules");
+ $xml->dataElement("path", $_->{path}) if(defined($_->{path}));
+ $xml->dataElement("package", $_->{package}) if(defined($_->{package}));
+ $xml->endTag("kernel");
+ }
+ $xml->endTag("kernels");
+=head1 SHELL QUOTING
+
+Libvirt guest names can contain arbitrary characters, some of which
+have meaning to the shell such as C<#> and space. You may need to
+quote or escape these characters on the command line. See the shell
+manual page L<sh(1)> for details.
+