1 (** 'df' command for virtual domains. *)
2 (* (C) Copyright 2007-2008 Richard W.M. Jones, Red Hat Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 (** This module (Virt_df) contains functions and values which are
21 used throughout the plug-ins and main code.
25 (** If true, emit logs of debugging information to stderr. *)
27 val ( +* ) : int32 -> int32 -> int32
28 val ( -* ) : int32 -> int32 -> int32
29 val ( ** ) : int32 -> int32 -> int32
30 val ( /* ) : int32 -> int32 -> int32
31 val ( +^ ) : int64 -> int64 -> int64
32 val ( -^ ) : int64 -> int64 -> int64
33 val ( *^ ) : int64 -> int64 -> int64
34 val ( /^ ) : int64 -> int64 -> int64
35 (** int32 and int64 infix operators for convenience. *)
37 val uri : string option ref (** Hypervisor/libvirt URI. *)
38 val inodes : bool ref (** Display inodes. *)
39 val human : bool ref (** Display human-readable. *)
40 val all : bool ref (** Show all or just active domains. *)
41 val test_files : string list ref (** In test mode (-t) list of files. *)
42 (** State of command line arguments. *)
45 {2 Domain/device model}
47 The "domain/device model" that we currently understand looks
53 \--- host partitions / disk image files
57 +--> guest partitions (eg. using MBR)
59 \-(1)->+--- filesystems (eg. ext3)
66 (1) Filesystems and PVs may also appear directly on guest
69 Partition schemes (eg. MBR) and filesystems register themselves
70 with this main module and they are queried first to get an idea
71 of the physical devices, partitions and filesystems potentially
72 available to the guest.
74 Volume management schemes (eg. LVM2) register themselves here
75 and are called later with "spare" physical devices and partitions
76 to see if they contain LVM data. If this results in additional
77 logical volumes then these are checked for filesystems.
79 Swap space is considered to be a dumb filesystem for the purposes
83 class virtual device :
85 method virtual name : string
86 method virtual read : int64 -> int -> string
87 method read_bitstring : int64 -> int -> string * int * int
88 method virtual size : int64
91 A virtual (or physical!) device, encapsulating any translation
92 that has to be done to access the device. eg. For partitions
93 there is a simple offset, but for LVM you may need complicated
96 We keep the underlying file descriptors open for the duration
97 of the program. There aren't likely to be many of them, and
98 the program is short-lived, and it's easier than trying to
99 track which device is using what fd. As a result, there is no
100 need for any close/deallocation function.
102 Note the very rare use of OOP in OCaml!
109 method read : int64 -> int -> string
110 method read_bitstring : int64 -> int -> string * int * int
113 (** A concrete device which just direct-maps a file or /dev device. *)
115 val null_device : device
116 (** The null device. Any attempt to read generates an error. *)
119 dom_name : string; (** Domain name. *)
120 dom_id : int option; (** Domain ID (if running). *)
121 dom_disks : disk list; (** Domain disks. *)
122 dom_lv_filesystems : filesystem list; (** Domain LV filesystems. *)
125 d_type : string option; (** The <disk type=...> *)
126 d_device : string; (** The <disk device=...> (eg "disk") *)
127 d_source : string; (** The <source file=... or dev> *)
128 d_target : string; (** The <target dev=...> (eg "hda") *)
129 d_dev : device; (** Disk device. *)
130 d_content : disk_content; (** What's on it. *)
133 [ `Filesystem of filesystem (** Contains a direct filesystem. *)
134 | `Partitions of partitions (** Contains partitions. *)
135 | `PhysicalVolume of pv (** Contains an LVM PV. *)
136 | `Unknown (** Not probed or unknown. *)
139 parts_name : string; (** Name of partitioning scheme. *)
140 parts : partition list; (** Partitions. *)
143 part_status : partition_status; (** Bootable, etc. *)
144 part_type : int; (** Partition filesystem type. *)
145 part_dev : device; (** Partition device. *)
146 part_content : partition_content; (** What's on it. *)
148 and partition_status = Bootable | Nonbootable | Malformed | NullEntry
149 and partition_content =
150 [ `Filesystem of filesystem (** Filesystem. *)
151 | `PhysicalVolume of pv (** Contains an LVM PV. *)
152 | `Unknown (** Not probed or unknown. *)
155 fs_name : string; (** Name of filesystem. *)
156 fs_block_size : int64; (** Block size (bytes). *)
157 fs_blocks_total : int64; (** Total blocks. *)
158 fs_is_swap : bool; (** If swap, following not valid. *)
159 fs_blocks_reserved : int64; (** Blocks reserved for super-user. *)
160 fs_blocks_avail : int64; (** Blocks free (available). *)
161 fs_blocks_used : int64; (** Blocks in use. *)
162 fs_inodes_total : int64; (** Total inodes. *)
163 fs_inodes_reserved : int64; (** Inodes reserved for super-user. *)
164 fs_inodes_avail : int64; (** Inodes free (available). *)
165 fs_inodes_used : int64; (** Inodes in use. *)
168 lvm_plugin_id : lvm_plugin_id; (** The LVM plug-in which detected
170 pv_uuid : string; (** UUID. *)
173 lv_dev : device; (** Logical volume device. *)
178 val string_of_partition : partition -> string
179 val string_of_filesystem : filesystem -> string
180 (** Convert a partition or filesystem struct to a string (for debugging). *)
182 (** {2 Plug-in registration functions} *)
184 val partition_type_register : string -> (device -> partitions) -> unit
185 (** Register a partition probing plug-in. *)
187 val probe_for_partitions : device -> partitions option
188 (** Do a partition probe on a device. Returns [Some partitions] or [None]. *)
190 val filesystem_type_register : string -> (device -> filesystem) -> unit
191 (** Register a filesystem probing plug-in. *)
193 val probe_for_filesystem : device -> filesystem option
194 (** Do a filesystem probe on a device. Returns [Some filesystem] or [None]. *)
196 val lvm_type_register :
197 string -> (lvm_plugin_id -> device -> pv) -> (device list -> lv list) -> unit
198 (** [lvm_type_register lvm_name probe_fn list_lvs_fn]
199 registers a new LVM type. [probe_fn] is a function which
200 should probe a device to find out if it contains a PV.
201 [list_lvs_fn] is a function which should take a list of
202 devices (PVs) and construct a list of LV devices.
205 val probe_for_pv : device -> pv option
206 (** Do a PV probe on a device. Returns [Some pv] or [None]. *)
208 val list_lvs : lvm_plugin_id -> device list -> lv list
209 (** Construct LV devices from a list of PVs. *)
211 (** {2 Utility functions} *)
213 val group_by : ?cmp:('a -> 'a -> int) -> ('a * 'b) list -> ('a * 'b list) list
214 (** Group a sorted list of pairs by the first element of the pair. *)
216 val range : int -> int -> int list
217 (** [range a b] returns the list of integers [a <= i < b].
218 If [a >= b] then the empty list is returned.