X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=src%2Fguestfs.pod;h=8404e742948277b4cf17106e333081053c9178d3;hp=779ecc55ad7da1e30e5c37e1e7f4c68aaf5c59e5;hb=3920ad95f6b2db8fbf20aa26692877a09070cb04;hpb=c2a8efc548d6f997049cbb3d63bab360b0d946b6 diff --git a/src/guestfs.pod b/src/guestfs.pod index 779ecc5..8404e74 100644 --- a/src/guestfs.pod +++ b/src/guestfs.pod @@ -56,7 +56,8 @@ introduction, please read the L section next. This section provides a gentler overview of the libguestfs API. We also try to group API calls together, where that may not be obvious -from reading about the individual calls below. +from reading about the individual calls in the main section of this +manual. =head2 HANDLES @@ -99,7 +100,8 @@ this: /* You only need to call guestfs_sync if you have made * changes to the guest image. (But if you've made changes - * then you *must* sync). + * then you *must* sync). See also: guestfs_umount and + * guestfs_umount_all calls. */ guestfs_sync (g); @@ -122,7 +124,7 @@ disk, an actual block device, or simply an empty file of zeroes that you have created through L. Libguestfs lets you do useful things to all of these. -You can add a disk read-only using C, in which +You can add a disk read-only using L, in which case libguestfs won't modify the file. Be extremely cautious if the disk image is in use, eg. if it is being @@ -134,8 +136,8 @@ images. In the API, the disk images are usually referred to as C (for the first one you added), C (for the second one you added), etc. -Once C has been called you cannot add any more images. -You can call C to get a list of the device +Once L has been called you cannot add any more images. +You can call L to get a list of the device names, in the order that you added them. See also L below. @@ -143,7 +145,7 @@ NAMING> below. Before you can read or write files, create directories and so on in a disk image that contains filesystems, you have to mount those -filesystems using C. If you already know that a disk +filesystems using L. If you already know that a disk image contains (for example) one partition with a filesystem on that partition, then you can mount it directly: @@ -155,13 +157,14 @@ Linux LVM2 logical volumes you could refer to those instead (eg. C). If you are given a disk image and you don't know what it contains then you have to find out. Libguestfs can do that too: use -C and C to list possible +L and L to list possible partitions and LVs, and either try mounting each to see what is -mountable, or else examine them with C. But you might -find it easier to look at higher level programs built on top of -libguestfs, in particular L. +mountable, or else examine them with L or +L. But you might find it easier to look at higher level +programs built on top of libguestfs, in particular +L. -To mount a disk image read-only, use C. There are +To mount a disk image read-only, use L. There are several other variations of the C call. =head2 FILESYSTEM ACCESS AND MODIFICATION @@ -172,7 +175,8 @@ mounted filesystems. There are over a hundred such calls which you can find listed in detail below in this man page, and we don't even pretend to cover them all in this overview. -Specify filenames as full paths including the mount point. +Specify filenames as full paths, starting with C<"/"> and including +the mount point. For example, if you mounted a filesystem at C<"/"> and you want to read the file called C<"etc/passwd"> then you could do: @@ -193,16 +197,17 @@ To create a symlink you could do: guestfs_ln_s (g, "/etc/init.d/portmap", "/etc/rc3.d/S30portmap"); -Libguestfs will reject attempts to use relative paths. There is no -concept of a current working directory. Libguestfs can return errors -in many situations: for example if the filesystem isn't writable, or -if a file or directory that you requested doesn't exist. If you are -using the C API (documented here) you have to check for those error -conditions after each call. (Other language bindings turn these -errors into exceptions). +Libguestfs will reject attempts to use relative paths and there is no +concept of a current working directory. + +Libguestfs can return errors in many situations: for example if the +filesystem isn't writable, or if a file or directory that you +requested doesn't exist. If you are using the C API (documented here) +you have to check for those error conditions after each call. (Other +language bindings turn these errors into exceptions). File writes are affected by the per-handle umask, set by calling -C and defaulting to 022. See L. +L and defaulting to 022. See L. =head2 PARTITIONING @@ -210,7 +215,7 @@ Libguestfs contains API calls to read, create and modify partition tables on disk images. In the common case where you want to create a single partition -covering the whole disk, you should use the C +covering the whole disk, you should use the L call: const char *parttype = "mbr"; @@ -221,23 +226,10 @@ call: Obviously this effectively wipes anything that was on that disk image before. -In general MBR partitions are both unnecessarily complicated and -depend on archaic details, namely the Cylinder-Head-Sector (CHS) -geometry of the disk. C can be used to -create more complex arrangements where the relative sizes are -expressed in megabytes instead of cylinders, which is a small win. -C will choose the nearest cylinder to approximate the -requested size. There's a lot of crazy stuff to do with IDE and -virtio disks having different, incompatible CHS geometries, that you -probably don't want to know about. - -My advice: make a single partition to cover the whole disk, then use -LVM on top. - =head2 LVM2 Libguestfs provides access to a large part of the LVM2 API, such as -C and C. It won't make much sense +L and L. It won't make much sense unless you familiarize yourself with the concepts of physical volumes, volume groups and logical volumes. @@ -246,42 +238,40 @@ L. =head2 DOWNLOADING -Use C to download small, text only files. This call +Use L to download small, text only files. This call is limited to files which are less than 2 MB and which cannot contain any ASCII NUL (C<\0>) characters. However it has a very simple to use API. -C can be used to read files which contain +L can be used to read files which contain arbitrary 8 bit data, since it returns a (pointer, size) pair. However it is still limited to "small" files, less than 2 MB. -C can be used to download any file, with no +L can be used to download any file, with no limits on content or size (even files larger than 4 GB). -To download multiple files, see C and -C. +To download multiple files, see L and +L. =head2 UPLOADING It's often the case that you want to write a file or files to the disk image. -For small, single files, use C. This call -currently contains a bug which limits the call to plain text files -(not containing ASCII NUL characters). +For small, single files, use L. -To upload a single file, use C. This call has no +To upload a single file, use L. This call has no limits on file content or size (even files larger than 4 GB). -To upload multiple files, see C and C. +To upload multiple files, see L and L. However the fastest way to upload I is to turn them into a squashfs or CD ISO (see L and -L), then attach this using C. If +L), then attach this using L. If you add the drive in a predictable way (eg. adding it last after all other drives) then you can get the device name from -C and mount it directly using -C. Note that squashfs images are sometimes +L and mount it directly using +L. Note that squashfs images are sometimes non-portable between kernel versions, and they don't support labels or UUIDs. If you want to pre-build an image or you need to mount it using a label or UUID, use an ISO image instead. @@ -309,7 +299,8 @@ Example: duplicate the contents of an LV: guestfs_dd (g, "/dev/VG/Original", "/dev/VG/Copy"); The destination (C) must be at least as large as the -source (C). +source (C). To copy less than the whole +source device, use L. =item B to B @@ -323,17 +314,18 @@ Use L. See L above. =head2 LISTING FILES -C is just designed for humans to read (mainly when using +L is just designed for humans to read (mainly when using the L-equivalent command C). -C is a quick way to get a list of files in a directory +L is a quick way to get a list of files in a directory from programs, as a flat list of strings. -C is a programmatic way to get a list of files in a +L is a programmatic way to get a list of files in a directory, plus additional information about each one. It is more equivalent to using the L call on a local filesystem. -C can be used to recursively list files. +L and L can be used to recursively list +files. =head2 RUNNING COMMANDS @@ -375,10 +367,10 @@ first. See L in this manpage. =back -The two main API calls to run commands are C and -C (there are also variations). +The two main API calls to run commands are L and +L (there are also variations). -The difference is that C runs commands using the shell, so +The difference is that L runs commands using the shell, so any shell globs, redirections, etc will work. =head2 CONFIGURATION FILES @@ -393,7 +385,7 @@ don't document Augeas itself here because there is excellent documentation on the L website. If you don't want to use Augeas (you fool!) then try calling -C to get the file as a list of lines which +L to get the file as a list of lines which you can iterate over. =head2 SELINUX @@ -441,7 +433,7 @@ C. Certain calls are affected by the current file mode creation mask (the "umask"). In particular ones which create files or directories, such -as C, C or C. This +as L, L or L. This affects either the default mode that the file is created with or modifies the mode that you supply. @@ -450,7 +442,7 @@ C<0644> and directories with C<0755>. There are two ways to avoid being affected by umask. Either set umask to 0 (call C early after launching). Or call -C after creating each file or directory. +L after creating each file or directory. For more information about umask, see L. @@ -474,14 +466,15 @@ Replacing backslash characters with forward slash characters is also outside the scope of libguestfs, but something that you can easily do. Where we can help is in resolving the case insensitivity of paths. -For this, call C. +For this, call L. Libguestfs also provides some help for decoding Windows Registry "hive" files, through the library C which is part of the -libguestfs project. You have to locate and download the hive file(s) -yourself, and then pass them to C functions. See also the -programs L, L and L for more -help on this issue. +libguestfs project although ships as a separate tarball. You have to +locate and download the hive file(s) yourself, and then pass them to +C functions. See also the programs L, +L, L and L for more help +on this issue. =head2 USING LIBGUESTFS WITH OTHER PROGRAMMING LANGUAGES @@ -506,8 +499,8 @@ what we provide in their favourite languages if they wish. =item B You can use the I header file from C++ programs. The C++ -API is identical to the C API. C++ classes and exceptions are -not implemented. +API is identical to the C API. C++ classes and exceptions are not +used. =item B @@ -516,9 +509,9 @@ at the top of C. =item B -This is the only language binding that working but incomplete. Only -calls which return simple integers have been bound in Haskell, and we -are looking for help to complete this binding. +This is the only language binding that is working but incomplete. +Only calls which return simple integers have been bound in Haskell, +and we are looking for help to complete this binding. =item B @@ -582,17 +575,17 @@ If you forget to do this, then it is entirely possible that your changes won't be written out, or will be partially written, or (very rarely) that you'll get disk corruption. -Note that in L I. So quick and +Note that in L autosync is the default. So quick and dirty guestfish scripts that forget to sync will work just fine, which -can make this extra-puzzling if you are trying to debug a problem. +can make this very puzzling if you are trying to debug a problem. =item Mount option C<-o sync> should not be the default. -If you use C, then C<-o sync,noatime> are added +If you use L, then C<-o sync,noatime> are added implicitly. However C<-o sync> does not add any reliability benefit, but does have a very large performance impact. -The work around is to use C and set the mount +The work around is to use L and set the mount options that you actually want to use. =item Read-only should be the default. @@ -604,15 +597,33 @@ This would reduce the potential to corrupt live VM images. Note that many filesystems change the disk when you just mount and unmount, even if you didn't perform any writes. You need to use -C to guarantee that the disk is not changed. +L to guarantee that the disk is not changed. =item guestfish command line is hard to use. C doesn't do what people expect (open C for examination). It tries to run a guestfish command C -which doesn't exist, so it fails, and it fails with a strange and -unintuitive error message. Like the Bourne shell, we should have used -C to run commands. +which doesn't exist, so it fails. In earlier versions of guestfish +the error message was also unintuitive, but we have corrected this +since. Like the Bourne shell, we should have used C to run commands. + +=item Protocol limit of 256 characters for error messages + +This limit is both rather small and quite unnecessary. We should be +able to return error messages up to the length of the protocol message +(2-4 MB). + +Note that we cannot change the protocol without some breakage, because +there are distributions that repackage the Fedora appliance. + +=item Protocol should return errno with error messages. + +It would be a nice-to-have to be able to get the original value of +'errno' from inside the appliance along error paths (where set). +Currently L goes through hoops to try to reverse the +error message string into an errno, see the function error() in +fuse/guestmount.c. =back @@ -626,7 +637,7 @@ need to be aware of this limit. The API calls which may be affected are individually documented, with a link back to this section of the documentation. -A simple call such as C returns its result (the file +A simple call such as L returns its result (the file data) in a simple string. Because this string is at some point internally encoded as a message, the maximum size that it can return is slightly under 4 MB. If the requested file is larger than this @@ -644,7 +655,7 @@ filesystem support (L). =head2 guestfs_h * C is the opaque type representing a connection handle. -Create a handle by calling C. Call C +Create a handle by calling L. Call L to free the handle and release all resources used. For information on using multiple handles and threads, see the section @@ -656,12 +667,12 @@ L below. Create a connection handle. -You have to call C on the handle at least once. +You have to call L on the handle at least once. This function returns a non-NULL pointer to a handle on success or NULL on error. -After configuring the handle, you have to call C. +After configuring the handle, you have to call L. You may also want to configure error handling for the handle. See L section below. @@ -676,14 +687,14 @@ This closes the connection handle and frees up all resources used. The convention in all functions that return C is that they return C<-1> to indicate an error. You can get additional information on -errors by calling C and/or by setting up an error -handler with C. +errors by calling L and/or by setting up an error +handler with L. The default error handler prints the information string to C. Out of memory errors are handled differently. The default action is to call L. If this is undesirable, then you can set a -handler using C. +handler using L. =head2 guestfs_last_error @@ -694,7 +705,7 @@ there has not been an error since the handle was created, then this returns C. The lifetime of the returned string is until the next error occurs, or -C is called. +L is called. The error string is not localized (ie. is always in English), because this makes searching for error messages in search engines give the @@ -756,8 +767,8 @@ along an internal path. By default it looks for these in the directory C<$libdir/guestfs> (eg. C or C). -Use C or set the environment variable -C to change the directories that libguestfs will +Use L or set the environment variable +L to change the directories that libguestfs will search in. The value is a colon-separated list of paths. The current directory is I searched unless the path contains an empty element or C<.>. For example C would @@ -771,7 +782,7 @@ We guarantee the libguestfs ABI (binary interface), for public, high-level actions as outlined in this section. Although we will deprecate some actions, for example if they get replaced by newer calls, we will keep the old actions forever. This allows you the -developer to program in confidence against libguestfs. +developer to program in confidence against the libguestfs API. @ACTIONS@ @@ -897,8 +908,8 @@ hence the appliance in the L function. Inside the appliance is a Linux kernel and a complete stack of userspace tools (such as LVM and ext2 programs) and a small -controlling daemon called C. The library talks to -C using remote procedure calls (RPC). There is a mostly +controlling daemon called L. The library talks to +L using remote procedure calls (RPC). There is a mostly one-to-one correspondence between libguestfs API calls and RPC calls to the daemon. Lastly the disk image(s) are attached to the qemu process which translates device access by the appliance's Linux kernel @@ -942,20 +953,20 @@ there is no child process), (2) LAUNCHING (when the child process is booting up), (3) alternating between READY and BUSY as commands are issued to, and carried out by, the child process. -The guest may be killed by C, or may die +The guest may be killed by L, or may die asynchronously at any time (eg. due to some internal error), and that causes the state to transition back to CONFIG. -Configuration commands for qemu such as C can only +Configuration commands for qemu such as L can only be issued when in the CONFIG state. The high-level API offers two calls that go from CONFIG through -LAUNCHING to READY. C blocks until the child process +LAUNCHING to READY. L blocks until the child process is READY to accept commands (or until some failure or timeout). -C internally moves the state from CONFIG to LAUNCHING +L internally moves the state from CONFIG to LAUNCHING while it is running. -High-level API actions such as C can only be issued +High-level API actions such as L can only be issued when in the READY state. These high-level API calls block waiting for the command to be carried out (ie. the state to transition to BUSY and then back to READY). But using the low-level event API, you get @@ -1006,7 +1017,7 @@ discarded. The callback function C will be called when the child process quits, either asynchronously or if killed by -C. (This corresponds to a transition from +L. (This corresponds to a transition from any state to the CONFIG state). =head2 guestfs_set_launch_done_callback @@ -1050,7 +1061,7 @@ C scheme, any device parameter C is translated to C transparently. Note that this I applies to parameters. The -C, C and similar calls +L, L and similar calls return the true names of the devices and partitions as known to the appliance. @@ -1058,13 +1069,13 @@ appliance. Usually this translation is transparent. However in some (very rare) cases you may need to know the exact algorithm. Such cases include -where you use C to add a mixture of virtio and IDE +where you use L to add a mixture of virtio and IDE devices to the qemu-based appliance, so have a mixture of C and C devices. The algorithm is applied only to I which are known to be either device or partition names. Return values from functions such -as C are never changed. +as L are never changed. =over 4 @@ -1110,7 +1121,7 @@ libguestfs should use these future-proof techniques: =item * -Use C or C to list +Use L or L to list actual device names, and then use those names directly. Since those device names exist by definition, they will never be @@ -1262,7 +1273,7 @@ parameters, but with the roles of daemon and library reversed. Because the underlying channel (QEmu -net channel) doesn't have any sort of connection control, when the daemon launches it sends an initial word (C) which indicates that the guest -and daemon is alive. This is what C waits for. +and daemon is alive. This is what L waits for. =head1 MULTIPLE HANDLES AND MULTIPLE THREADS @@ -1300,6 +1311,69 @@ For example: Note that libguestfs also calls qemu with the -help and -version options in order to determine features. +=head1 LIBGUESTFS VERSION NUMBERS + +Since April 2010, libguestfs has started to make separate development +and stable releases, along with corresponding branches in our git +repository. These separate releases can be identified by version +number: + + even numbers for stable: 1.2.x, 1.4.x, ... + .-------- odd numbers for development: 1.3.x, 1.5.x, ... + | + v + 1 . 3 . 5 + ^ ^ + | | + | `-------- sub-version + | + `------ always '1' because we don't change the ABI + +Thus "1.3.5" is the 5th update to the development branch "1.3". + +As time passes we cherry pick fixes from the development branch and +backport those into the stable branch, the effect being that the +stable branch should get more stable and less buggy over time. So the +stable releases are ideal for people who don't need new features but +would just like the software to work. + +Our criteria for backporting changes are: + +=over 4 + +=item * + +Documentation changes which don't affect any code are +backported unless the documentation refers to a future feature +which is not in stable. + +=item * + +Bug fixes which are not controversial, fix obvious problems, and +have been well tested are backported. + +=item * + +Simple rearrangements of code which shouldn't affect how it works get +backported. This is so that the code in the two branches doesn't get +too far out of step, allowing us to backport future fixes more easily. + +=item * + +We I backport new features, new APIs, new tools etc, except in +one exceptional case: the new feature is required in order to +implement an important bug fix. + +=back + +A new stable branch starts when we think the new features in +development are substantial and compelling enough over the current +stable branch to warrant it. When that happens we create new stable +and development versions 1.N.0 and 1.(N+1).0 [N is even]. The new +dot-oh release won't necessarily be so stable at this point, but by +backporting fixes from development, that branch will stabilize over +time. + =head1 ENVIRONMENT VARIABLES =over 4 @@ -1416,7 +1490,7 @@ Richard W.M. Jones (C) =head1 COPYRIGHT -Copyright (C) 2009 Red Hat Inc. +Copyright (C) 2009-2010 Red Hat Inc. L This library is free software; you can redistribute it and/or