X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=guestfs.pod;h=fdac80a66b76b3030a19c4dd2451161dc74bccd4;hp=4dc5757d021312bd241270cbcce3d234d3c2d472;hb=b1e1ca2f74a921b3f784537d59c617df29ea1d60;hpb=e8ecc08f663b44f3d79517affe52f137858dfe00 diff --git a/guestfs.pod b/guestfs.pod index 4dc5757..fdac80a 100644 --- a/guestfs.pod +++ b/guestfs.pod @@ -7,11 +7,10 @@ guestfs - Library for accessing and modifying virtual machine images =head1 SYNOPSIS #include - + guestfs_h *handle = guestfs_create (); guestfs_add_drive (handle, "guest.img"); guestfs_launch (handle); - guestfs_wait_ready (handle); guestfs_mount (handle, "/dev/sda1", "/"); guestfs_touch (handle, "/hello"); guestfs_sync (handle); @@ -49,36 +48,35 @@ If you are using the high-level API, then you should call the functions in the following order: guestfs_h *handle = guestfs_create (); - + guestfs_add_drive (handle, "guest.img"); /* call guestfs_add_drive additional times if the guest has * multiple disks */ - + guestfs_launch (handle); - guestfs_wait_ready (handle); /* now you can examine what partitions, LVs etc are available * you have to mount / at least - */ + */ guestfs_mount (handle, "/dev/sda1", "/"); /* now you can perform actions on the guest disk image */ guestfs_touch (handle, "/hello"); - + /* you only need to call guestfs_sync if you have made * changes to the guest image */ guestfs_sync (handle); - + guestfs_close (handle); -C and all of the actions including C +C and all of the actions including C are blocking calls. You can use the low-level event API to do non-blocking operations instead. All functions that return integers, return C<-1> on error. See -section ERROR HANDLING below for how to handle errors. +section L below for how to handle errors. =head2 guestfs_h * @@ -87,7 +85,7 @@ Create a handle by calling C. Call C to free the handle and release all resources used. For information on using multiple handles and threads, see the section -MULTIPLE HANDLES AND MULTIPLE THREADS below. +L below. =head2 guestfs_create @@ -100,11 +98,10 @@ You have to call C 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 and -C. +After configuring the handle, you have to call C. You may also want to configure error handling for the handle. See -ERROR HANDLING section below. +L section below. =head2 guestfs_close @@ -168,7 +165,7 @@ If you set C to C then I handler is called. Returns the current error handler callback. -=head2 guestfs_set_out_of_memory_handler +=head2 guestfs_set_out_of_memory_handler typedef void (*guestfs_abort_cb) (void); int guestfs_set_out_of_memory_handler (guestfs_h *handle, @@ -203,8 +200,194 @@ directory is I searched unless the path contains an empty element or C<.>. For example C would search the current directory and then C. +=head1 API OVERVIEW + +This section provides additional documentation for groups of API +calls, which may not be obvious from reading about the individual +calls below. + +=head2 LVM2 + +Libguestfs provides access to a large part of the LVM2 API. It won't +make much sense unless you familiarize yourself with the concepts of +physical volumes, volume groups and logical volumes. + +This author strongly recommends reading the LVM HOWTO, online at +L. + +=head2 PARTITIONING + +In the common case where you want to create a single partition +covering the whole disk, you should use the C +call: + + const char *parttype = "mbr"; + if (disk_is_larger_than_2TB) + parttype = "gpt"; + guestfs_part_disk (g, "/dev/sda", parttype); + +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 UPLOADING + +For small, single files, use C. In some versions +of libguestfs there was a bug which limited this call to text files +(not containing ASCII NUL characters). + +To upload a single file, use C. This call has no +limits on file content or size (even files larger than 4 GB). + +To upload multiple files, see C and C. + +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 +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 +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. + +=head2 DOWNLOADING + +Use C 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 +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 +limits on content or size (even files larger than 4 GB). + +To download multiple files, see C and +C. + +=head2 RUNNING COMMANDS + +Although libguestfs is a primarily an API for manipulating files +inside guest images, we also provide some limited facilities for +running commands inside guests. + +There are many limitations to this: + +=over 4 + +=item * + +The kernel version that the command runs under will be different +from what it expects. + +=item * + +If the command needs to communicate with daemons, then most likely +they won't be running. + +=item * + +The command will be running in limited memory. + +=item * + +Only supports Linux guests (not Windows, BSD, etc). + +=item * + +Architecture limitations (eg. won't work for a PPC guest on +an X86 host). + +=item * + +For SELinux guests, you may need to enable SELinux and load policy +first. See L in this manpage. + +=back + +The two main API calls to run commands are C and +C (there are also variations). + +The difference is that C runs commands using the shell, so +any shell globs, redirections, etc will work. + +=head2 LISTING FILES + +C 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 +from programs. + +C is a programmatic way to get a list of files in a +directory, plus additional information about each one. + +C can be used to recursively list files. + +=head2 SELINUX + +We support SELinux guests. To ensure that labeling happens correctly +in SELinux guests, you need to enable SELinux and load the guest's +policy: + +=over 4 + +=item 1. + +Before launching, do: + + guestfs_set_selinux (g, 1); + +=item 2. + +After mounting the guest's filesystem(s), load the policy. This +is best done by running the L command in the +guest itself: + + guestfs_sh (g, "/usr/sbin/load_policy"); + +(Older versions of C require you to specify the +name of the policy file). + +=item 3. + +Optionally, set the security context for the API. The correct +security context to use can only be known by inspecting the +guest. As an example: + + guestfs_setcon (g, "unconfined_u:unconfined_r:unconfined_t:s0"); + +=back + +This will work for running commands and editing existing files. + +When new files are created, you may need to label them explicitly, +for example by running the external command +C. + =head1 HIGH-LEVEL API ACTIONS +=head2 ABI GUARANTEE + +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. + @ACTIONS@ =head1 STRUCTURES @@ -255,7 +438,7 @@ libguestfs uses a state machine to model the child process: / | | LAUNCHING | / | \___________/ / | / - / | guestfs_wait_ready + / | guestfs_launch / | / ______ / __|____V / \ ------> / \ @@ -275,12 +458,10 @@ Configuration commands for qemu such as C 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 is a non-blocking call that -starts up the child process, immediately moving from CONFIG to -LAUNCHING. C blocks until the child process is -READY to accept commands (or until some failure or timeout). The -low-level event API described below provides a non-blocking way to -replace C. +LAUNCHING to READY. C 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 +while it is running. High-level API actions such as C can only be issued when in the READY state. These high-level API calls block waiting for @@ -298,8 +479,7 @@ register to receive these messages. =head2 SETTING CALLBACKS TO HANDLE EVENTS The child process generates events in some situations. Current events -include: receiving a reply message after some action, receiving a log -message, the child process exits, &c. +include: receiving a log message, the child process exits. Use the C functions to set a callback for different types of events. @@ -309,39 +489,6 @@ Calling C again overwrites the previous callback of that type. Cancel all callbacks of this type by calling this function with C set to C. -=head2 NON-BLOCKING ACTIONS - -XXX This section was documented in previous versions but never -implemented in a way which matched the documentation. For now I have -removed the documentation, pending a working implementation. See also -C in the source. - - -=head2 guestfs_set_send_callback - - typedef void (*guestfs_send_cb) (guestfs_h *g, void *opaque); - void guestfs_set_send_callback (guestfs_h *handle, - guestfs_send_cb cb, - void *opaque); - -The callback function C will be called whenever a message -which is queued for sending, has been sent. - -=head2 guestfs_set_reply_callback - - typedef void (*guestfs_reply_cb) (guestfs_h *g, void *opaque, XDR *xdr); - void guestfs_set_reply_callback (guestfs_h *handle, - guestfs_reply_cb cb, - void *opaque); - -The callback function C will be called whenever a reply is -received from the child process. (This corresponds to a transition -from the BUSY state to the READY state). - -Note that the C that you get in the callback is in C -mode, and you need to consume it before you return from the callback -function (since it gets destroyed after). - =head2 guestfs_set_log_message_callback typedef void (*guestfs_log_message_cb) (guestfs_h *g, void *opaque, @@ -381,115 +528,108 @@ The callback function C will be called when the child process becomes ready first time after it has been launched. (This corresponds to a transition from LAUNCHING to the READY state). -You can use this instead of C to implement a -non-blocking wait for the child process to finish booting up. - -=head2 EVENT MAIN LOOP - -To use the low-level event API and/or to use handles from multiple -threads, you have to provide an event "main loop". You can write your -own, but if you don't want to write one, two types are provided for -you: +=head1 BLOCK DEVICE NAMING + +In the kernel there is now quite a profusion of schemata for naming +block devices (in this context, by I I mean a physical +or virtual hard drive). The original Linux IDE driver used names +starting with C. SCSI devices have historically used a +different naming scheme, C. When the Linux kernel I +driver became a popular replacement for the old IDE driver +(particularly for SATA devices) those devices also used the +C scheme. Additionally we now have virtual machines with +paravirtualized drivers. This has created several different naming +systems, such as C for virtio disks and C for Xen +PV disks. + +As discussed above, libguestfs uses a qemu appliance running an +embedded Linux kernel to access block devices. We can run a variety +of appliances based on a variety of Linux kernels. + +This causes a problem for libguestfs because many API calls use device +or partition names. Working scripts and the recipe (example) scripts +that we make available over the internet could fail if the naming +scheme changes. + +Therefore libguestfs defines C as the I. Internally C names are translated, if necessary, +to other names as required. For example, under RHEL 5 which uses the +C scheme, any device parameter C is translated to +C transparently. + +Note that this I applies to parameters. The +C, C and similar calls +return the true names of the devices and partitions as known to the +appliance. + +=head2 ALGORITHM FOR BLOCK DEVICE NAME TRANSLATION + +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 +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. =over 4 -=item libguestfs-select +=item * -A simple main loop that is implemented using L. +Is the string a parameter which is a device or partition name? -This is the default main loop for new guestfs handles, unless you -call C after a handle is created. +=item * -=item libguestfs-glib +Does the string begin with C? -An implementation which can be used with GLib and GTK+ programs. You -can use this to write graphical (GTK+) programs which use libguestfs -without hanging during long or slow operations. +=item * -=back - -=head2 MULTIPLE HANDLES AND MULTIPLE THREADS - -The support for multiple handles and multiple threads is modelled -after glib (although doesn't require glib, if you use the select-based -main loop). - -L - -You will need to create one main loop for each thread that wants to -use libguestfs. Each guestfs handle should be confined to one thread. -If you try to pass guestfs handles between threads, you will get -undefined results. - -If you only want to use guestfs handles from one thread in your -program, but your program has other threads doing other things, then -you don't need to do anything special. - -=head2 SINGLE THREAD CASE - -In the single thread case, there is a single select-based main loop -created for you. All guestfs handles will use this main loop to -execute high level API actions. +Does the named device exist? If so, we use that device. +However if I then we continue with this algorithm. -=head2 MULTIPLE THREADS CASE +=item * -In the multiple threads case, you will need to create a main loop for -each thread that wants to use libguestfs. +Replace initial C string with C. -To create main loops for other threads, use -C or C. +For example, change C to C. -Then you will need to attach each handle to the thread-specific main -loop by calling: +If that named device exists, use it. If not, continue. - handle = guestfs_create (); - guestfs_set_main_loop (handle, main_loop_of_current_thread); +=item * -=head2 guestfs_set_main_loop +Replace initial C string with C. - void guestfs_set_main_loop (guestfs_h *handle, - guestfs_main_loop *main_loop); +If that named device exists, use it. If not, return an error. -Sets the main loop used by high level API actions for this handle. By -default, the select-based main loop is used (see -C). - -You only need to use this in multi-threaded programs, where multiple -threads want to use libguestfs. Create a main loop for each thread, -then call this function. - -You cannot pass guestfs handles between threads. - -=head2 guestfs_get_main_loop - - guestfs_main_loop *guestfs_get_main_loop (guestfs_h *handle); - -Return the main loop used by C. - -=head2 guestfs_get_default_main_loop +=back - guestfs_main_loop *guestfs_get_default_main_loop (void); +=head2 PORTABILITY CONCERNS -Return the default select-based main loop. +Although the standard naming scheme and automatic translation is +useful for simple programs and guestfish scripts, for larger programs +it is best not to rely on this mechanism. -=head2 guestfs_create_main_loop +Where possible for maximum future portability programs using +libguestfs should use these future-proof techniques: - guestfs_main_loop *guestfs_create_main_loop (void); +=over 4 -This creates a select-based main loop. You should create one main -loop for each additional thread that needs to use libguestfs. +=item * -=head2 guestfs_free_main_loop +Use C or C to list +actual device names, and then use those names directly. - void guestfs_free_main_loop (guestfs_main_loop *); +Since those device names exist by definition, they will never be +translated. -Free the select-based main loop which was previously allocated with -C. +=item * -=head2 WRITING A CUSTOM MAIN LOOP +Use higher level ways to identify filesystems, such as LVM names, +UUIDs and filesystem labels. -This isn't documented. Please see the libguestfs-select and -libguestfs-glib implementations. +=back =head1 INTERNALS @@ -630,7 +770,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 C waits for. =head1 QEMU WRAPPERS @@ -656,15 +796,29 @@ For example: LIBGUESTFS_QEMU=/tmp/qemu.wrapper guestfish +Note that libguestfs also calls qemu with the -help and -version +options in order to determine features. + =head1 ENVIRONMENT VARIABLES =over 4 +=item LIBGUESTFS_APPEND + +Pass additional options to the guest kernel. + =item LIBGUESTFS_DEBUG Set C to enable verbose messages. This has the same effect as calling C. +=item LIBGUESTFS_MEMSIZE + +Set the memory allocated to the qemu process, in megabytes. For +example: + + LIBGUESTFS_MEMSIZE=700 + =item LIBGUESTFS_PATH Set the path that libguestfs uses to search for kernel and initrd.img. @@ -676,11 +830,22 @@ Set the default qemu binary that libguestfs uses. If not set, then the qemu which was found at compile time by the configure script is used. -See also L above. +See also L above. -=item LIBGUESTFS_APPEND +=item LIBGUESTFS_TRACE -Pass additional options to the guest kernel. +Set C to enable command traces. This +has the same effect as calling C. + +=item TMPDIR + +Location of temporary directory, defaults to C. + +If libguestfs was compiled to use the supermin appliance then each +handle will require rather a large amount of space in this directory +for short periods of time (~ 80 MB). You can use C<$TMPDIR> to +configure another directory to use in case C is not large +enough. =back @@ -689,7 +854,47 @@ Pass additional options to the guest kernel. L, L, L, -L. +L. + +Tools with a similar purpose: +L, +L, +L, +L, +L. + +=head1 BUGS + +To get a list of bugs against libguestfs use this link: + +L + +To report a new bug against libguestfs use this link: + +L + +When reporting a bug, please check: + +=over 4 + +=item * + +That the bug hasn't been reported already. + +=item * + +That you are testing a recent version. + +=item * + +Describe the bug accurately, and give a way to reproduce it. + +=item * + +Run libguestfs-test-tool and paste the B +output into the bug report. + +=back =head1 AUTHORS @@ -698,7 +903,7 @@ Richard W.M. Jones (C) =head1 COPYRIGHT Copyright (C) 2009 Red Hat Inc. -L +L This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public