mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-22 07:03:38 +00:00
In libguestfs 1.20, you will be able to use 'add_drive' instead of 'add_drive_opts' (except in the C bindings). However until libguestfs 1.20 is the minimum stable version people will still be using old versions where you have to use 'add_drive_opts'. This makes the examples confusing. Therefore continue to use 'add_drive_opts' in the examples for now.
63 lines
1.8 KiB
OCaml
63 lines
1.8 KiB
OCaml
(* Example showing how to inspect a virtual machine disk. *)
|
|
|
|
open Printf
|
|
|
|
let disk =
|
|
if Array.length Sys.argv = 2 then
|
|
Sys.argv.(1)
|
|
else
|
|
failwith "usage: inspect_vm disk.img"
|
|
|
|
let () =
|
|
let g = new Guestfs.guestfs () in
|
|
|
|
(* Attach the disk image read-only to libguestfs. *)
|
|
g#add_drive_opts (*~format:"raw"*) ~readonly:true disk;
|
|
|
|
(* Run the libguestfs back-end. *)
|
|
g#launch ();
|
|
|
|
(* Ask libguestfs to inspect for operating systems. *)
|
|
let roots = g#inspect_os () in
|
|
if Array.length roots = 0 then
|
|
failwith "inspect_vm: no operating systems found";
|
|
|
|
Array.iter (
|
|
fun root ->
|
|
printf "Root device: %s\n" root;
|
|
|
|
(* Print basic information about the operating system. *)
|
|
printf " Product name: %s\n" (g#inspect_get_product_name root);
|
|
printf " Version: %d.%d\n"
|
|
(g#inspect_get_major_version root)
|
|
(g#inspect_get_minor_version root);
|
|
printf " Type: %s\n" (g#inspect_get_type root);
|
|
printf " Distro: %s\n" (g#inspect_get_distro root);
|
|
|
|
(* Mount up the disks, like guestfish -i.
|
|
*
|
|
* Sort keys by length, shortest first, so that we end up
|
|
* mounting the filesystems in the correct order.
|
|
*)
|
|
let mps = g#inspect_get_mountpoints root in
|
|
let cmp (a,_) (b,_) =
|
|
compare (String.length a) (String.length b) in
|
|
let mps = List.sort cmp mps in
|
|
List.iter (
|
|
fun (mp, dev) ->
|
|
try g#mount_ro dev mp
|
|
with Guestfs.Error msg -> eprintf "%s (ignored)\n" msg
|
|
) mps;
|
|
|
|
(* If /etc/issue.net file exists, print up to 3 lines. *)
|
|
let filename = "/etc/issue.net" in
|
|
if g#is_file filename then (
|
|
printf "--- %s ---\n" filename;
|
|
let lines = g#head_n 3 filename in
|
|
Array.iter print_endline lines
|
|
);
|
|
|
|
(* Unmount everything. *)
|
|
g#umount_all ()
|
|
) roots
|