guestfs(3)

๐ŸŽ€ guestfs(3) โ€” Virtualization Support ๐ŸŽ€

okay bestie, welcome to the guestfs(3) manual page from the Virtualization Support section ๐Ÿ’… this is the libguestfs C API, and yes, itโ€™s kind of a lot. but itโ€™s also iconic. letโ€™s get into it.

โœจ NAME โœจ

guestfs โ€” library for accessing and modifying virtual machine images.

๐ŸŒธ SYNOPSIS ๐ŸŒธ

#include <guestfs.h>

guestfs_h *g = guestfs_create ();
guestfs_add_drive (g, "guest.img");
guestfs_launch (g);
guestfs_mount (g, "/dev/sda1", "/");
guestfs_touch (g, "/hello");
guestfs_umount (g, "/");
guestfs_shutdown (g);
guestfs_close (g);

cc prog.c -o prog -lguestfs

or:

cc prog.c -o prog `pkg-config libguestfs --cflags --libs`

๐Ÿฆ‹ DESCRIPTION ๐Ÿฆ‹

Libguestfs is a library for accessing and modifying disk images and virtual machines. no cap.

This manual page documents the C API.

If you are looking for an introduction to libguestfs, see the web site: http://libguestfs.org/

Each virt tool has its own man page (for a full list, go to "SEE ALSO" at the end of this file).

Other libguestfs manual pages:

๐ŸŒˆ API OVERVIEW ๐ŸŒˆ

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 in the main section of this manual.

๐Ÿซถ HANDLES ๐Ÿซถ

Before you can use libguestfs calls, you have to create a handle. Then you must add at least one disk image to the handle, followed by launching the handle, then performing whatever operations you want, and finally closing the handle. By convention we use the single letter "g" for the name of the handle variable, although of course you can use any name you want.

The general structure of all libguestfs-using programs looks like this:

guestfs_h *g = guestfs_create ();

/* Call guestfs_add_drive additional times if there are
 * multiple disk images.
 */
guestfs_add_drive (g, "guest.img");

/* Most manipulation calls won't work until you've launched
 * the handle 'g'.  You have to do this _after_ adding drives
 * and _before_ other commands.
 */
guestfs_launch (g);

/* Either: examine what partitions, LVs etc are available: */
char **partitions = guestfs_list_partitions (g);
char **logvols = guestfs_lvs (g);

/* Or: ask libguestfs to find filesystems for you: */
char **filesystems = guestfs_list_filesystems (g);

/* Or: use inspection (see INSPECTION section below). */

/* To access a filesystem in the image, you must mount it. */
guestfs_mount (g, "/dev/sda1", "/");

/* Now you can perform filesystem actions on the guest
 * disk image.
 */
guestfs_touch (g, "/hello");

/* Synchronize the disk.  This is the opposite of guestfs_launch. */
guestfs_shutdown (g);

/* Close and free the handle 'g'. */
guestfs_close (g);

The code above doesn't include any error checking. In real code you should check return values carefully for errors. In general all functions that return integers return -1 on error, and all functions that return pointers return "NULL" on error. See section "ERROR HANDLING" below for how to handle errors, and consult the documentation for each function call below to see precisely how they return error indications.

The code above does not free(3) the strings and arrays returned from functions. Consult the documentation for each function to find out how to free the return value.

See guestfs-examples(3) for fully worked examples.

๐Ÿ’ฟ DISK IMAGES ๐Ÿ’ฟ

The image filename ("guest.img" in the example above) could be a disk image from a virtual machine, a dd(1) copy of a physical hard disk, an actual block device, or simply an empty file of zeroes that you have created through posix_fallocate(3). Libguestfs lets you do useful things to all of these.

The call you should use in modern code for adding drives is guestfs_add_drive_opts. To add a disk image, allowing writes, and specifying that the format is raw, do:

guestfs_add_drive_opts (g, filename,
                        GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw",
                        -1);

You can add a disk read-only using:

guestfs_add_drive_opts (g, filename,
                        GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw",
                        GUESTFS_ADD_DRIVE_OPTS_READONLY, 1,
                        -1);

or by calling the older function guestfs_add_drive_ro. If you use the readonly flag, libguestfs won't modify the file. (See also "DISK IMAGE FORMATS" below).

Be extremely cautious if the disk image is in use, eg. if it is being used by a virtual machine. Adding it read-write will almost certainly cause disk corruption, but adding it read-only is safe.

You should usually add at least one disk image, and you may add multiple disk images. If adding multiple disk images, they usually have to be "related", ie. from the same guest. In the API, the disk images are usually referred to as /dev/sda (for the first one you added), /dev/sdb (for the second one you added), etc.

Once guestfs_launch has been called you cannot add any more images. You can call guestfs_list_devices to get a list of the device names, in the order that you added them. See also "BLOCK DEVICE NAMING" below.

๐Ÿงš MOUNTING ๐Ÿงš

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 guestfs_mount or guestfs_mount_ro. 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:

guestfs_mount (g, "/dev/sda1", "/");

where /dev/sda1 means literally the first partition (1) of the first disk image that we added (/dev/sda). If the disk contains Linux LVM2 logical volumes you could refer to those instead (eg. /dev/VG/LV). Note that these are libguestfs virtual devices, and are nothing to do with host devices.

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 guestfs_list_partitions and guestfs_lvs to list possible partitions and LVs, and either try mounting each to see what is mountable, or else examine them with guestfs_vfs_type or guestfs_file. To list just filesystems, use guestfs_list_filesystems.

Libguestfs also has a set of APIs for inspection of unknown disk images (see "INSPECTION" below). You might also want to look at higher level programs built on top of libguestfs, in particular virt-inspector(1).

To mount a filesystem read-only, use guestfs_mount_ro. There are several other variations of the guestfs_mount_* call.

๐Ÿ“ FILESYSTEM ACCESS AND MODIFICATION ๐Ÿ“

The majority of the libguestfs API consists of fairly low-level calls for accessing and modifying the files, directories, symlinks etc on 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, starting with "/" and including the mount point.

For example, if you mounted a filesystem at "/" and you want to read the file called "etc/passwd" then you could do:

char *data = guestfs_cat (g, "/etc/passwd");

This would return "data" as a newly allocated buffer containing the full content of that file (with some conditions: see also "DOWNLOADING" below), or "NULL" if there was an error.

As another example, to create a top-level directory on that filesystem called "var" you would do:

guestfs_mkdir (g, "/var");

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 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 guestfs_umask and defaulting to 022. See "UMASK".

Since libguestfs 1.18, it is possible to mount the libguestfs filesystem on a local directory, subject to some restrictions. See "MOUNT LOCAL" below.

๐ŸŽ€ PARTITIONING ๐ŸŽ€

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 guestfs_part_disk call:

const char *parttype = "mbr";
if (disk_is_larger_than_2TB)
  parttype = "gpt";
guestfs_part_disk (g, "/dev/sda", parttype);

Obviously this effectively wipes anything that was on that disk image before. ๐Ÿ˜ญ

๐Ÿ’œ LVM2 ๐Ÿ’œ

Libguestfs provides access to a large part of the LVM2 API, such as guestfs_lvcreate and guestfs_vgremove. 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 http://tldp.org/HOWTO/LVM-HOWTO/.

๐Ÿ‘‘ DOWNLOADING ๐Ÿ‘‘

Use guestfs_cat to download small, text only files. This call cannot handle files containing any ASCII NUL ("\0") characters. However the API is very simple to use.

guestfs_read_file can be used to read files which contain arbitrary 8 bit data, since it returns a (pointer, size) pair.

guestfs_download can be used to download any file, with no limits on content or size.

To download multiple files, see guestfs_tar_out and guestfs_tgz_out.

๐Ÿ”ฅ UPLOADING ๐Ÿ”ฅ

To write a small file with fixed content, use guestfs_write. To create a file of all zeroes, use guestfs_truncate_size (sparse) or guestfs_fallocate64 (with all disk blocks allocated). There are a variety of other functions for creating test files, for example guestfs_fill and guestfs_fill_pattern.

To upload a single file, use guestfs_upload. This call has no limits on file content or size.

To upload multiple files, see guestfs_tar_in and guestfs_tgz_in. โœจ

Lowkey the fastest way to yeet a huge pile of arbitrary files into a guest is to bundle them into a squashfs or a CD ISO first (shoutout mksquashfs(8) and mkisofs(8), icons โœจ), then attach that thing with guestfs_add_drive_ro. And if you add the drive in a predictable way (like, adding it last after all your other drives, bestie โ€” keep it consistent), you can grab the device name from guestfs_list_devices and mount it straight up with guestfs_mount_ro.

โš ๏ธ Heads up though: squashfs images are sometimes non-portable between kernel versions, and they do not support labels or UUIDs. So if you wanna pre-build an image, or you need to mount it via a label or UUID, use an ISO image instead. Slay. ๐Ÿ’…

๐ŸŽ€ COPYING ๐ŸŽ€

Okay so there are a bunch of different commands for copying stuff between files and devices, and in and out of the guest filesystem. Here's the whole situation, summarised for you:

๐Ÿ—‚๏ธ file to file

Use guestfs_cp to copy a single file, or guestfs_cp_a to copy directories recursively.

Wanna copy just part of a file (offset and size)? That's guestfs_copy_file_to_file, bestie.

๐Ÿ”„ file to device / device to file / device to device

Use guestfs_copy_file_to_device, guestfs_copy_device_to_file, or guestfs_copy_device_to_device.

Example โ€” duplicating the contents of an LV, iconic:

 guestfs_copy_device_to_device (g,
         "/dev/VG/Original", "/dev/VG/Copy",
         /* -1 marks the end of the list of optional parameters */
         -1);

The destination (/dev/VG/Copy) must be at least as large as the source (/dev/VG/Original). No cap, that's just how it is. Want to copy less than the whole source device? Use the optional size parameter:

 guestfs_copy_device_to_device (g,
         "/dev/VG/Original", "/dev/VG/Copy",
         GUESTFS_COPY_DEVICE_TO_DEVICE_SIZE, 10000,
         -1);

๐Ÿ“ค file on the host โ†’ file or device

Use guestfs_upload. Peep the "UPLOADING" section above, bestie ๐Ÿซถ

๐Ÿ“ฅ file or device โ†’ file on the host

Use guestfs_download. That's the "DOWNLOADING" section above ๐Ÿ’–


๐Ÿงš UPLOADING AND DOWNLOADING TO PIPES AND FILE DESCRIPTORS ๐Ÿงš

So calls like guestfs_upload, guestfs_download, guestfs_tar_in, guestfs_tar_out etc appear to only take filenames as arguments โ€” which makes it look like you can only upload and download to actual files. But plot twist: many Un*x-like hosts let you use the special device files /dev/stdin, /dev/stdout, /dev/stderr and /dev/fd/N to read and write from stdin, stdout, stderr, and arbitrary file descriptor N. Literally so handy.

For example, virt-cat(1) writes its output to stdout by doing this:

 guestfs_download (g, filename, "/dev/stdout");

and you can write tar output to a file descriptor fd by doing:

 char devfd[64];
 snprintf (devfd, sizeof devfd, "/dev/fd/%d", fd);
 guestfs_tar_out (g, "/", devfd);

๐ŸŒธ LISTING FILES ๐ŸŒธ

guestfs_ll is just designed for humans to read (mainly when you're using the guestfish(1)-equivalent command ll). It's giving "for the girlies, not the compilers" ๐Ÿ’…

guestfs_ls is the quick way to get a list of files in a directory from programs โ€” a flat list of strings, clean and simple.

guestfs_readdir is the programmatic way to get a list of files in a directory plus additional info about each one. It's way more equivalent to using the readdir(3) call on a local filesystem.

And guestfs_find / guestfs_find0 can be used to recursively list files. Obsessed ๐Ÿ’–


๐Ÿ”ฅ RUNNING COMMANDS ๐Ÿ”ฅ

So libguestfs is primarily an API for manipulating files inside guest images, but we also provide some limited facilities for running commands inside guests. Limited being the key word, bestie โ€” there are many limitations to this:

  • The kernel version that the command runs under will be different from what it expects. Rude, honestly.
  • If the command needs to communicate with daemons, then most likely they won't be running. Rip.
  • The command will be running in limited memory.
  • The network may not be available unless you enable it (check guestfs_set_network).
  • Only supports Linux guests (not Windows, BSD, etc).
  • Architecture limitations (eg. wonโ€™t work for a PPC guest on an X86 host).
  • For SELinux guests, you may need to relabel the guest after creating new files. Peep "SELINUX" below.
  • Security: It is not safe to run commands from untrusted, possibly malicious guests. ๐Ÿ˜ญ These commands may attempt to exploit your program by sending unexpected output. They could also try to exploit the Linux kernel or qemu provided by the libguestfs appliance. They could use the network provided by the libguestfs appliance to bypass ordinary network partitions and firewalls. They could use the elevated privileges or different SELinux context of your program to their advantage.
A secure alternative is to use libguestfs to install a "firstboot" script (a script which runs when the guest next boots normally), and to have this script run the commands you want in the normal context of the running guest, network security and so on. For info about other security issues, see guestfs-security(1).

The two main API calls to run commands are guestfs_command and guestfs_sh (there are also variations, iykyk).

The difference? guestfs_sh runs commands using the shell, so any shell globs, redirections, etc will work. Main character energy vs. plain text energy.


๐Ÿฆ‹ CONFIGURATION FILES ๐Ÿฆ‹

Okay, for reading and writing config files in Linux guest filesystems, we strongly recommend using Augeas. Like, genuinely. For example, Augeas understands how to read and write, say, a Linux shadow password file or an X.org configuration file, and so it saves you from having to write that code yourself. It ate and left no crumbs ๐Ÿ’…

The main Augeas calls are bound through the guestfs_aug_* APIs. We don't document Augeas itself here because there's excellent documentation on the http://augeas.net/ website โ€” go look, bestie.

If you donโ€™t want to use Augeas (you fool! ๐Ÿ™ˆ โ€” jk, we love you), then try calling guestfs_read_lines to get the file as a list of lines which you can iterate over.


โญ SYSTEMD JOURNAL FILES โญ

To read the systemd journal from a Linux guest, use the guestfs_journal_* APIs starting with guestfs_journal_open.

Consult the journal documentation right here: sd-journal(3), sd_journal_open(3). Bookmark it, no cap ๐Ÿ“š


๐Ÿ‘‘ SELINUX ๐Ÿ‘‘

We support SELinux guests. ๐Ÿ’ช However, it is not possible to load the SELinux policy of the guest into the appliance kernel. So the strategy for dealing with SELinux guests is to relabel them after making changes.

In libguestfs โ‰ฅ 1.34 there's a new API, guestfs_setfiles, which can be used for this. To properly use this API you have to parse the guest SELinux configuration. See the virt-customize(1) module customize/SELinux_relabel.ml for how to do this.

A simpler but slower alternative is to touch /.autorelabel in the guest โ€” that means the guest will relabel itself at next boot. It's giving "I'll do it tomorrow" but it does work ๐Ÿซ 

Libguestfs โ‰ค 1.32 had APIs guestfs_set_selinux, guestfs_get_selinux, guestfs_setcon and guestfs_getcon. These did not work properly, they're deprecated, and they should not be used in new code. Periodt. ๐Ÿ’€


๐Ÿ“ UMASK ๐Ÿ“

Certain calls are affected by the current file mode creation mask (the "umask"). In particular ones which create files or directories, such as guestfs_touch, guestfs_mknod or guestfs_mkdir. This affects either the default mode that the file is created with, or it modifies the mode that you supply.

The default umask is 022, so files are created with modes such as 0644 and directories with 0755.

There are two ways to avoid being affected by umask:

  1. Set umask to 0 (call guestfs_umask (g, 0) early after launching).
  2. Call guestfs_chmod after creating each file or directory.

For more info about umask, see umask(2). โœจ


๐ŸŒˆ LABELS AND UUIDS ๐ŸŒˆ

Many filesystems, devices and logical volumes support either labels (short strings like "BOOT" which might not be unique) and/or UUIDs (globally unique IDs). Both are valid, both are iconic, but only one is guaranteed unique โ€” you know which ๐Ÿ’…

For filesystems, use guestfs_vfs_label or guestfs_vfs_uuid to read the label or UUID. Some filesystems let you call guestfs_set_label or guestfs_set_uuid to change the label or UUID.

You can locate a filesystem by its label or UUID using guestfs_findfs_label or guestfs_findfs_uuid. Chef's kiss ๐ŸŽ€

For LVM2 (which supports only UUIDs), there is a rich set of APIs for fetching UUIDs, fetching UUIDs of the contained objects, and changing UUIDs. See: guestfs_lvuuid, guestfs_vguuid, guestfs_pvuuid, guestfs_vglvuuids, guestfs_vgpvuuids, guestfs_vgchange_uuid, guestfs_vgchange_uuid_all, guestfs_pvchange_uuid, guestfs_pvchange_uuid_all.

Note: when cloning a filesystem, device or whole guest, it's a good idea to set new randomly generated UUIDs on the copy. Otherwise you've got twins with the same legal name and that's chaos ๐Ÿ”ฅ

๐Ÿ” ENCRYPTED DISKS ๐Ÿ”

Libguestfs lets you access Linux guests which have been encrypted using whole disk encryption that conforms to the Linux Unified Key Setup (LUKS) standard. That includes nearly all whole disk encryption systems used by modern Linux guests. Windows BitLocker is also supported. We stay versatile ๐Ÿ’…

Use guestfs_vfs_type to identify encrypted block devices. For LUKS it returns the string "crypto_LUKS". For Windows BitLocker it returns "BitLocker".

Then open these devices by calling guestfs_cryptsetup_open. Obviously you will require the passphrase! ๐Ÿ˜ญ No passphrase, no party.

Passphrase-less unlocking is supported for LUKS (not BitLocker) block devices that have been encrypted with network-bound disk encryption (NBDE), using Clevis on the Linux guest side, and Tang on a separate Linux server. Open such devices with guestfs_clevis_luks_unlock. The appliance will need networking enabled (refer to guestfs_set_network) and actual connectivity to the Tang servers noted in the "tang" Clevis pins that are bound to the LUKS header. (This includes the ability to resolve the names of the Tang servers.) So like, real network, real DNS, no vibes-only networking ๐Ÿ™ˆ

Opening an encrypted device creates a new device mapper device called /dev/mapper/mapname (where "mapname" is the string you supply to guestfs_cryptsetup_open or guestfs_clevis_luks_unlock). Reads and writes to this mapper device are decrypted from and encrypted to the underlying block device respectively. It's literally a little translation layer and I love her ๐Ÿซถ

LVM volume groups on the device can be made visible by calling guestfs_vgscan followed by guestfs_vg_activate_all. The logical volume(s) can now be mounted in the usual way.

Use the reverse process to close an encrypted device: unmount any logical volumes on it, deactivate the volume groups by calling guestfs_vg_activate (g, 0, ["/dev/VG"]). Then close the mapper device by calling guestfs_cryptsetup_close on the /dev/mapper/mapname device (not the underlying encrypted block device โ€” yes, this matters, read it twice bestie ๐Ÿ’€).


๐Ÿ’œ MOUNT LOCAL ๐Ÿ’œ

In libguestfs โ‰ฅ 1.18, it is possible to mount the libguestfs filesystem on a local directory and access it using ordinary POSIX calls and programs. Yes babe, that's the good stuff โœจ

but bestie, there are receipts on this one: it needs FUSE (that's Filesystem in USErspace, say it with me), and libfuse had to be chillin' on the system when libguestfs got compiled. FUSE might also want a kernel module loaded, and you might have to add your current user to a special fuse group. Check your distro's docs and http://fuse.sf.net for the whole story. ๐Ÿ’…

The call that actually mounts the libguestfs filesystem on a local directory is guestfs_mount_local (q.v., love a good cross-reference), and then guestfs_mount_local_run. Heads up: that second one does not come back until you unmount the filesystem. Why? Because it hops into the FUSE main loop and handles kernel requests, flipping them into libguestfs calls. They could've made a background thread for this instead, but libguestfs doesn't require pthreads, so nope. Also this way is lowkey more flexible โ€” like, you can spin up another thread for guestfs_mount_local_run if that's your vibe.

guestfs_mount_local needs a hot sec to set up the mountpoint. The mountpoint is not ready to use until that call returns. And at that point, accesses to the filesystem will just block until the main loop starts (i.e. guestfs_mount_local_run). So if you need to start another process to access the filesystem, put the fork between guestfs_mount_local and guestfs_mount_local_run. Timing is everything, bestie. โฐ


๐Ÿ’… MOUNT LOCAL COMPATIBILITY

Local mounting only showed up in libguestfs 1.18, and it might not even be available in those builds, so honestly? Consider writing your code so it doesn't hard-depend on this feature, and can fall back to regular libguestfs file system calls. Resilient queen behavior. ๐Ÿ‘‘

If libguestfs was compiled without support for guestfs_mount_local, then calling it returns an error with errno set to ENOTSUP (peep guestfs_last_errno). Not a crash, just a very polite "no <3".

๐Ÿƒ MOUNT LOCAL PERFORMANCE

Real talk: libguestfs on top of FUSE performs quite poorly. For best performance, do not use it. Periodt. Use ordinary libguestfs filesystem calls, upload, download etc. instead. Your future self will thank you. ๐Ÿ™


โ˜๏ธ REMOTE STORAGE

CEPH

Libguestfs can access Ceph (librbd/RBD) disks. Yes bestie, remote disks, we're fancy now. ๐Ÿซถ

To do this, set the optional protocol and server parameters of guestfs_add_drive_opts like this:

 char **servers = { "ceph1.example.org:3000", /* ... */, NULL };
 guestfs_add_drive_opts (g, "pool/image",
                         GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw",
                         GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, "rbd",
                         GUESTFS_ADD_DRIVE_OPTS_SERVER, servers,
                         GUESTFS_ADD_DRIVE_OPTS_USERNAME, "rbduser",
                         GUESTFS_ADD_DRIVE_OPTS_SECRET, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
                         -1);

servers (that's the server parameter) is a list of one or more Ceph servers. The server string is documented over in guestfs_add_drive_opts. The username and secret parameters are also optional โ€” and if you don't pass them, no authentication will be used. Feral. ๐Ÿ™ˆ

An encrypted RBD disk โ€” the kind where directly opening it would require the username and secret parameters โ€” cannot be accessed if all of these conditions hold:

  • the backend is libvirt,
  • the image specified by the filename parameter is different from the encrypted RBD disk,
  • the image specified by the filename parameter has qcow2 format,
  • the encrypted RBD disk is specified as a backing file at some level in the qcow2 backing chain.

This limitation is due to libvirt's (justified) separate handling of disks vs. secrets. When the RBD username and secret are provided inside a qcow2 backing file specification, libvirt does not construct an ephemeral secret object from those, for Ceph authentication. Refer to https://bugzilla.redhat.com/2033247. Not me reading bugzilla for fun... okay, maybe me. ๐Ÿ’€

NETWORK BLOCK DEVICE

Libguestfs can access Network Block Device (NBD) disks remotely. Same remote-disk energy, different protocol. โœจ

To do this, set the optional protocol and server parameters of guestfs_add_drive_opts like this:

 char **server = { "nbd.example.org:3000", NULL };
 guestfs_add_drive_opts (g, "" /* export name - see below */,
                         GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw",
                         GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, "nbd",
                         GUESTFS_ADD_DRIVE_OPTS_SERVER, server,
                         -1);

Notes, bestie, take notes ๐Ÿ“:

  • server is in fact a list of servers. For NBD you must always supply a list with a single element. (Other remote protocols require zero or more than one server, hence the requirement for this parameter to be a list. It's giving โœจconsistencyโœจ.)
  • The server string is documented in guestfs_add_drive_opts. To connect to a local qemu-nbd instance over a Unix domain socket, use unix:/path/to/socket.
  • The filename parameter is the NBD export name. Use an empty string to mean the default export. Many NBD servers, including qemu-nbd, do not support export names.
  • If using qemu-nbd as your server, you should always specify the -t option. The reason is that libguestfs may open several connections to the server. Several! Connections! She's social. ๐Ÿ’…
  • The libvirt backend requires that you set the format parameter of guestfs_add_drive_opts accurately when you use writable NBD disks.
  • The libvirt backend has a bug that stops Unix domain socket connections from working: https://bugzilla.redhat.com/show_bug.cgi?id=922888
  • The direct backend does not support readonly connections because of a bug in qemu: https://bugs.launchpad.net/qemu/+bug/1155677

๐Ÿ” INSPECTION

Libguestfs has APIs for inspecting an unknown disk image to find out if it contains operating systems, an install CD or a live CD. It's giving detective main character energy. ๐Ÿ•ต๏ธโ€โ™€๏ธ

Add all disks belonging to the unknown virtual machine and call guestfs_launch in the usual way. Then call guestfs_inspect_os. This function uses other libguestfs calls and certain heuristics, and returns a list of operating systems that were found. An empty list means none were found (sad, but valid). A single element is the root filesystem of the operating system. For dual- or multi-boot guests, multiple roots can be returned, each one corresponding to a separate operating system. (Multi-boot virtual machines are extremely rare in the world of virtualization, but since this scenario can happen, we have built libguestfs to deal with it. Overachiever behavior, honestly.)

For each root, you can then call various guestfs_inspect_get_* functions to get additional details about that operating system. For example, call guestfs_inspect_get_type to return the string windows or linux for Windows and Linux-based operating systems respectively.

Un*x-like and Linux-based operating systems usually consist of several filesystems which are mounted at boot time (for example, a separate boot partition mounted on /boot). The inspection rules are able to detect how filesystems correspond to mount points. Call guestfs_inspect_get_mountpoints to get this mapping. It might return a hash table like this example:

 /boot => /dev/sda1
 /     => /dev/vg_guest/lv_root
 /usr  => /dev/vg_guest/lv_usr

The caller can then make calls to guestfs_mount to mount the filesystems as suggested. Slay. ๐ŸŽ€

Be careful to mount filesystems in the right order (eg. / before /usr). Sorting the keys of the hash by length, shortest first, should work. Order matters, bestie, always. ๐Ÿ’œ

Inspection currently only works for some common operating systems. Contributors are welcome to send patches for other operating systems that we currently cannot detect. PRs open, come through! ๐ŸŒˆ

Encrypted disks must be opened before inspection. See "ENCRYPTED DISKS" for more details. The guestfs_inspect_os function just ignores any encrypted devices. Rude to them, but okay.

A note on the implementation: the call guestfs_inspect_os performs inspection and caches the results in the guest handle. Subsequent calls to guestfs_inspect_get_* return this cached information, but do not re-read the disks. If you change the content of the guest disks, you can redo inspection by calling guestfs_inspect_os again. (guestfs_inspect_list_applications2 works a little differently from the other calls and does read the disks. See documentation for that function for details.) Caching queen ๐Ÿ‘‘

INSPECTING INSTALL DISKS

Libguestfs (since 1.9.4) can detect some install disks, install CDs, live CDs and more. Iconic. ๐Ÿ’ฟ

Further information is available about the operating system that can be installed using the regular inspection APIs like guestfs_inspect_get_product_name, guestfs_inspect_get_major_version etc.


๐ŸชŸ SPECIAL CONSIDERATIONS FOR WINDOWS GUESTS

Libguestfs can mount NTFS partitions. It does this using the http://www.ntfs-3g.org/ driver. Shoutout ntfs-3g, doing the absolute most. ๐Ÿซก

DRIVE LETTERS AND PATHS

DOS and Windows still use drive letters, and the filesystems are always treated as case insensitive by Windows itself, and therefore you might find a Windows configuration file referring to a path like c:\windows\system32. When the filesystem is mounted in libguestfs, that directory might be referred to as /WINDOWS/System32. Same place, different fit. ๐Ÿ˜ญ

Drive letter mappings can be found using inspection (see "INSPECTION" and guestfs_inspect_get_drive_mappings).

Dealing with separator characters (backslash vs forward slash) is outside the scope of libguestfs, but usually a simple character replacement will work. Do it yourself bestie, we believe in you. โœจ

To resolve the case insensitivity of paths, call guestfs_case_sensitive_path.

LONG FILENAMES ON NTFS

NTFS supports filenames up to 255 characters long. "Character" means a 2 byte UTF-16 codepoint which can encode the most common Unicode codepoints.

Most Linux filesystems support filenames up to 255 bytes. This means you may get an error:

 File name too long

when you copy a file from NTFS to a Linux filesystem if the name, when reencoded as UTF-8, would exceed 255 bytes in length. Not the vibe. ๐Ÿ˜ค

This will most often happen when using non-ASCII names that are longer than ~127 characters (eg. Greek, Cyrillic) or longer than ~85 characters (Asian languages). Byte math is not beating the character-count allegations.

A workaround is not to try to store such long filenames on Linux native filesystems. Since the tar(1) format can store unlimited length filenames, keep the files in a tarball. Tarball supremacy ๐Ÿ“

ACCESSING THE WINDOWS REGISTRY

Libguestfs also provides some help for decoding Windows Registry "hive" files, through a separate C library called hivex(3). ๐Ÿ

Before libguestfs 1.19.35 you had to download the hive file, operate on it locally using hivex, and upload it again. Since this version, we have included the major hivex APIs directly in the libguestfs API (see guestfs_hivex_open). This means that if you have opened a Windows guest, you can read and write the registry directly. No download-upload round trip, we're efficient now. ๐Ÿ”ฅ

See also virt-win-reg(1).

Ntfs-3g tries to rewrite "Junction Points" and NTFS "symbolic links" to provide something which looks like a Linux symlink. The way it tries to do the rewriting is described here:

https://github.com/tuxera/ntfs-3g/wiki/Junctions-Points,-Symbolic-Links-and-Reparse-Points

Okay so here's the tea: the whole problem is that ntfs-3g just straight up doesn't have enough info to do the job right, no cap. NTFS links can have drive letters in them, and references to external device GUIDs that ntfs-3g has zero way of resolving. So it's basically almost certainly the case that if you're a libguestfs caller you should just ignore whatever ntfs-3g does โ€” like, do not use guestfs_readlink on NTFS volumes, bestie. Just don't.

Instead, if you bump into a symbolic link on an ntfs-3g filesystem, use guestfs_lgetxattr to read the system.ntfs_reparse_data extended attribute, and read the raw reparse data out of that (the format is documented in various places around the web, iykyk ๐Ÿ’…).

โœจ EXTENDED ATTRIBUTES ON NTFS-3G FILESYSTEMS โœจ

There are other useful extended attributes you can read off ntfs-3g filesystems (using guestfs_getxattr). Peep these:

https://github.com/tuxera/ntfs-3g/wiki/Using-Extended-Attributes


๐ŸŒธ WINDOWS HIBERNATION AND WINDOWS 8 FAST STARTUP ๐ŸŒธ

So Windows guests that have been hibernated (instead of fully shut down) cannot be mounted. That's not us being dramatic, it's a limitation of ntfs-3g. You'll get an error that looks like this:

 The disk contains an unclean file system (0, 0).
 Metadata kept in Windows cache, refused to mount.
 Failed to mount '/dev/sda2': Operation not permitted
 The NTFS partition is in an unsafe state. Please resume
 and shutdown Windows fully (no hibernation or fast
 restarting), or mount the volume read-only with the
 'ro' mount option.

And in Windows 8, the shutdown button doesn't actually shut the guest down at all ๐Ÿ˜ญ โ€” it usually hibernates it instead. This is what everyone calls "fast startup".

Some suggested workarounds, bestie:

  • Mount read-only (eg. guestfs_mount_ro).
  • On Windows 8, turn off fast startup. It's hiding in the Control Panel โ†’ Power Options โ†’ Choose what the power buttons do โ†’ Change settings that are currently unavailable โ†’ Turn on fast startup.
  • On Windows 7 and earlier, shut the guest off properly instead of hibernating it.

๐ŸŽ€ RESIZE2FS ERRORS ๐ŸŽ€

The guestfs_resize2fs, guestfs_resize2fs_size and guestfs_resize2fs_M calls are the ones you use to resize ext2/3/4 filesystems.

The underlying program (resize2fs(8)) requires that the filesystem is clean and recently fsck'd before you can resize it. Also, if the resize operation fails for some reason, then you had to call fsck the filesystem again to fix it.

So, in libguestfs lt 1.17.14, you usually had to call guestfs_e2fsck_f before the resize. But in ge 1.17.14, e2fsck(8) gets called automatically before the resize, so you no longer need to do this โ€” slay, one less thing ๐Ÿ’….

The resize2fs(8) program can still fail though, and when it does it prints an error message kinda like:

 Please run 'e2fsck -fy <device>' to fix the filesystem
 after the aborted resize operation.

You can do that by calling guestfs_e2fsck with the forceall option. But honestly, when you're working with disk images, it's usually better to just avoid this whole situation โ€” eg. by rolling back to an earlier snapshot, or by copying and resizing and on failure going back to the original. Lowkey the move, fr fr.


๐Ÿฆ‹ USING LIBGUESTFS WITH OTHER PROGRAMMING LANGUAGES ๐Ÿฆ‹

Okay so we're not trying to discourage you from using the C API, but we will mention here that the same API is also available in other languages. ๐Ÿซถ

The API is broadly identical in all supported languages. Which means the C call guestfs_add_drive_ro(g,file) is $g->add_drive_ro($file) in Perl, g.add_drive_ro(file) in Python, and g#add_drive_ro file in OCaml. In other words: a straightforward, predictable isomorphism between each language. Iconic behaviour tbh.

Error messages are automatically transformed into exceptions, if the language supports it.

We don't try to "object orientify" parts of the API in OO languages, although contributors are welcome to write higher level APIs above what we provide in their favourite languages if they wish. Go off, honestly. ๐Ÿ‘‘

C++

You can use the guestfs.h header file from C++ programs. The C++ API is identical to the C API. C++ classes and exceptions are not used.

C

The C# bindings are highly experimental. Please read the warnings at the top of csharp/Libguestfs.cs. (Seriously, read them ๐Ÿ™ˆ.)

Erlang

See guestfs-erlang(3).

Go

See guestfs-golang(3).

Haskell

This language binding is working but incomplete:

  • Functions with optional arguments are not bound. Implementing optional arguments in Haskell seems to be very complex.
  • Events are not bound.
  • Functions with the following return types are not bound:
    • Any function returning a struct.
    • Any function returning a list of structs.
    • A few functions that return fixed length buffers (specifically ones declared RBufferOut in the generator).
    • A tiny number of obscure functions that return constant strings (specifically ones declared RConstOptString in the generator).

Java

Full documentation is contained in the Javadoc which is distributed with libguestfs. For examples, see guestfs-java(3).

Lua

See guestfs-lua(3).

OCaml

See guestfs-ocaml(3).

Perl

See guestfs-perl(3) and Sys::Guestfs(3).

PHP

For documentation see README-PHP supplied with libguestfs sources or in the php-libguestfs package for your distribution.

Heads up: the PHP binding only works correctly on 64 bit machines.

Python

See guestfs-python(3).

Ruby

See guestfs-ruby(3).

For JRuby, use the Java bindings.

shell scripts

See guestfish(1).


๐Ÿ’€ LIBGUESTFS GOTCHAS ๐Ÿ’€

http://en.wikipedia.org/wiki/Gotcha_(programming): "A feature of a system [...] that works in the way it is documented but is counterintuitive and almost invites mistakes."

So, since we developed libguestfs and the associated tools, there are several things we'd have designed differently โ€” but we're stuck with them now, for backwards compatibility or other reasons. If there's ever a libguestfs 2.0 release, you can expect these to change. Beware of them. โš ๏ธ

Read-only should be the default.

In guestfish(3), --ro should be the default, and you should have to specify --rw if you want to make changes to the image.

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 guestfs_add_drive_ro to guarantee that the disk is not changed.

guestfish command line is hard to use.

guestfish disk.img doesn't do what people expect (open disk.img for examination). It tries to run a guestfish command disk.img 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 guestfish -c command to run commands.

guestfish megabyte modifiers don't work right on all commands

In recent guestfish you can use 1M to mean 1 megabyte (and similarly for other modifiers). What guestfish actually does is to multiply the number part by the modifier part and pass the result to the C API. However this doesn't work for a few APIs which aren't expecting bytes, but are already expecting some other unit (eg. megabytes).

The most common one is guestfs_lvcreate. This guestfish command:

 lvcreate LV VG 100M

does not do what you might expect. Instead, because guestfs_lvcreate is already expecting megabytes, this tries to create a 100 terabyte (100 megabytes * megabytes) logical volume. ๐Ÿ˜ญ And the error message you get from this is also a little obscure.

This could be fixed in the generator by specially marking parameters and return values which take bytes or other units.

Ambiguity between devices and paths

There's a subtle ambiguity in the API between a device name (eg. /dev/sdb2) and a similar pathname. A file might just happen to be called sdb2 in the directory /dev (consider some non-Unix VM image ๐Ÿ‘€).

In the current API we usually resolve this ambiguity by having two separate calls, for example guestfs_checksum and guestfs_checksum_device. Some API calls are ambiguous and (incorrectly) resolve the problem by detecting if the path supplied begins with /dev/.

To avoid both the ambiguity and the need to duplicate some calls, we could make paths/devices into structured names. One way to do this would be to use a notation like grub (hd(0,0)), although nobody really likes this aspect of grub. Another way would be to use a structured type, equivalent to this OCaml type:

 type path = Path of string | Device of int | Partition of int * int

which would allow you to pass arguments like:

 Path "/foo/bar"
 Device 1            (* /dev/sdb, or perhaps /dev/sda *)
 Partition (1, 2)    (* /dev/sdb2 (or is it /dev/sda2 or /dev/sdb3?) *)
 Path "/dev/sdb2"    (* not a device *)

As you can see there are still problems to resolve even with this representation. Also consider how it might work in guestfish. ๐Ÿค”


๐Ÿ”‘ KEYS AND PASSPHRASES ๐Ÿ”‘

Certain libguestfs calls take a parameter that contains sensitive key material, passed in as a C string.

In libguestfs โ‰ฅ 1.60 you can pass in 8 bit binary key data (allowing '\n' or '\0') by prefixing the string with:

  • "base64:..." โ€” Pass in base64-encoded key data. This supports 8 bit binary key data.
  • "text:..." โ€” Pass in regular text passphrase. This does not support 8 bit binary key data.
  • Unprefixed โ€” For backwards compatibility with libguestfs โ‰ค 1.58, a text passphrase can be passed in unprefixed. However this does not support 8 bit binary key data.

In the future we would hope to change the libguestfs implementation so that keys are mlock(2)-ed into physical RAM, and thus can never end up in swap. However this is not done at the moment, because of the complexity of such an implementation.

So you should be aware that any key parameter you pass to libguestfs might end up being written out to the swap partition. If this is a concern, scrub the swap partition or don't use libguestfs on encrypted devices. Genuinely, not a drill. ๐Ÿšจ

๐Ÿงš MULTIPLE HANDLES AND MULTIPLE THREADS ๐Ÿงš

All high-level libguestfs actions are synchronous. If you want to use libguestfs asynchronously then you must create a thread.

Threads in libguestfs โ‰ฅ 1.38

In libguestfs โ‰ฅ 1.38, each handle (guestfs_h) contains a lock which is acquired automatically when you call a libguestfs function. The practical effect of this is you can call libguestfs functions with the same handle from multiple threads without needing to do any locking. No cap, it just handles it for you ๐Ÿ’…โœจ

Okay so picking up mid-thought, bestie โ€” also in libguestfs โ‰ฅ 1.38, the last error on the handle (guestfs_last_error, guestfs_last_errno) is stored in thread-local storage, so it is safe to write code like:

if (guestfs_add_drive_ro (g, drive) == -1)
  fprintf (stderr, "error was: %s\n", guestfs_last_error (g));

even when other threads may be concurrently using the same handle g. Thread safety ate, no cap. โœจ

๐Ÿ’€ Threads in libguestfs < 1.38 ๐Ÿ’€

In libguestfs < 1.38, you must use the handle only from a single thread. Either use the handle exclusively from one thread, or provide your own mutex so that two threads cannot issue calls on the same handle at the same time. Even apparently innocent functions like guestfs_get_trace are not safe to be called from multiple threads without a mutex in libguestfs < 1.38. Lowkey important, don't skip this one. ๐Ÿ’…

Use guestfs_set_identifier to make it simpler to identify threads in trace output. Cute lil debugging helper, iykyk. ๐ŸŽ€


๐ŸŒˆ PATH ๐ŸŒˆ

Libguestfs needs a supermin appliance, which it finds by looking along an internal path.

By default it looks for these in the directory $libdir/guestfs (eg. /usr/local/lib/guestfs or /usr/lib64/guestfs).

Use guestfs_set_path or set the environment variable LIBGUESTFS_PATH to change the directories that libguestfs will search in. The value is a colon-separated list of paths. The current directory is not searched unless the path contains an empty element or .. For example LIBGUESTFS_PATH=:/usr/lib/guestfs would search the current directory and then /usr/lib/guestfs. Path vibes, check them carefully. ๐Ÿฆ‹

๐Ÿฆ‹ QEMU WRAPPERS ๐Ÿฆ‹

If you want to compile your own qemu, run qemu from a non-standard location, or pass extra arguments to qemu, then you can write a shell-script wrapper around qemu.

There is one important rule to remember: you must exec qemu as the last command in the shell script (so that qemu replaces the shell and becomes the direct child of the libguestfs-using program). If you don't do this, then the qemu process won't be cleaned up correctly. Not me warning youโ€ฆ it's giving essential. ๐Ÿ’€

Here is an example of a wrapper, where I have built my own copy of qemu from source:

#!/bin/sh -
qemudir=/home/rjones/d/qemu
exec $qemudir/x86_64-softmmu/qemu-system-x86_64 -L $qemudir/pc-bios "$@"

Save this script as /tmp/qemu.wrapper (or wherever), chmod +x, and then use it by setting the LIBGUESTFS_HV environment variable. For example:

LIBGUESTFS_HV=/tmp/qemu.wrapper guestfish

Note that libguestfs also calls qemu with the -help and -version options in order to determine features. Feature detective era. ๐Ÿ”

Wrappers can also be used to edit the options passed to qemu. In the following example, the -machine ... option (-machine and the following argument) are removed from the command line and replaced with -machine pc,accel=tcg. The while loop iterates over the options until it finds the right one to remove, putting the remaining options into the args array.

#!/bin/bash -

i=0
while [ $# -gt 0 ]; do
    case "$1" in
    -machine)
        shift 2;;
    *)
        args[i]="$1"
        (( i++ ))
        shift ;;
    esac
done

exec qemu-kvm -machine pc,accel=tcg "${args[@]}"

๐Ÿ‘‘ BACKEND ๐Ÿ‘‘

The backend (previously known as the "attach method") controls how libguestfs creates and/or connects to the backend daemon, eg. by starting qemu directly, or using libvirt to manage an appliance, running User-Mode Linux, or connecting to an already running daemon.

You can set the backend by calling guestfs_set_backend, or by setting the environment variable LIBGUESTFS_BACKEND.

Possible backends are described below:

๐Ÿ”ฅ direct / appliance ๐Ÿ”ฅ

Run qemu directly to launch an appliance.

direct and appliance are synonyms.

This is the ordinary method and normally the default, but see the note below. Main character backend energy. โœจ

๐Ÿ’œ libvirt, libvirt:null, libvirt:URI ๐Ÿ’œ

Use libvirt to launch and manage the appliance.

  • libvirt causes libguestfs to choose a suitable URI for creating session guests. If using the libvirt backend, you almost always should use this. Bestie recommendation, fr fr. ๐Ÿซถ
  • libvirt:null causes libguestfs to use the NULL connection URI, which causes libvirt to try to guess what the user meant. You probably don't want to use this. ๐Ÿ™ˆ
  • libvirt:URI uses URI as the libvirt connection URI (see http://libvirt.org/uri.html). The typical libvirt backend with a URI would be libvirt:qemu:///session
  • The libvirt backend supports more features, including sVirt. Fancy. ๐Ÿ’…

direct is usually the default backend. However since libguestfs โ‰ฅ 1.19.24, libguestfs can be built with a different default by doing:

./configure --with-default-backend=...

To find out if libguestfs was compiled with a different default backend, do:

unset LIBGUESTFS_BACKEND
guestfish get-backend

โœจ BACKEND SETTINGS โœจ

Each backend can be configured by passing a list of strings. You can either call guestfs_set_backend_settings with a list of strings, or set the LIBGUESTFS_BACKEND_SETTINGS environment variable to a colon-separated list of strings (before creating the handle).

๐ŸŒธ force_tcg ๐ŸŒธ

Using:

export LIBGUESTFS_BACKEND_SETTINGS=force_tcg

will force the direct and libvirt backends to use TCG (software emulation) instead of KVM (hardware accelerated virtualization).

๐Ÿ“ force_kvm ๐Ÿ“

Using:

export LIBGUESTFS_BACKEND_SETTINGS=force_kvm

will force the direct and libvirt backends to use KVM (hardware accelerated virtualization) instead of TCG (software emulation).

๐Ÿงš gdb ๐Ÿงš

The direct backend supports:

export LIBGUESTFS_BACKEND_SETTINGS=gdb

When this is set, qemu will not start running the appliance immediately. It will wait for you to connect to it using gdb:

$ gdb
(gdb) symbol-file /path/to/vmlinux
(gdb) target remote tcp::1234
(gdb) cont

You can then debug the appliance kernel, which is useful to debug boot failures (especially ones where there are no debug messages printed - tip: look in the kernel log_buf). Debugging era, obsessed. ๐Ÿ”

On Fedora, install kernel-debuginfo for the vmlinux file (containing symbols). Make sure the symbols precisely match the kernel being used. Matchy matchy, no cap. โœจ

๐Ÿ’– 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 the libguestfs API. Periodt. Iconic stability behavior. ๐Ÿ‘‘ โœจ

๐Ÿ”ฅ BLOCK DEVICE NAMING ๐Ÿ”ฅ

Libguestfs defines /dev/sd* as the standard naming scheme for devices passed to API calls. So /dev/sda means "the first device added by guestfs_add_drive_opts", and /dev/sdb3 means "the third partition on the second device".

Internally device names are sometimes translated, but this should not be visible at the API level. Behind the scenes magic, but the API stays clean. ๐Ÿฆ‹

๐ŸŽ€ DISK LABELS ๐ŸŽ€

In libguestfs โ‰ฅ 1.20, you can give a label to a disk when you add it, using the optional label parameter to guestfs_add_drive_opts. (Note that disk labels are different from and not related to filesystem labels).

Not all versions of libguestfs support setting a disk label, and when it is supported, it is limited to 20 ASCII characters [a-zA-Z].

When you add a disk with a label, it can either be addressed using /dev/sd*, or using /dev/disk/guestfs/label. Partitions on the disk can be addressed using /dev/disk/guestfs/labelpartnum.

Listing devices (guestfs_list_devices) and partitions (guestfs_list_partitions) returns the block device names. However you can use guestfs_list_disk_labels to map disk labels to block device and partition names. Label mapping slay. ๐Ÿ’…

๐Ÿ“ NULL DISKS ๐Ÿ“

When adding a disk using, eg., guestfs_add_drive, you can set the filename to /dev/null. This string is treated specially by libguestfs, causing it to add a "null disk".

A null disk has the following properties:

  • A null disk will appear as a normal device, eg. in calls to guestfs_list_devices.
  • You may add /dev/null multiple times.
  • You should not try to access a null disk in any way. For example, you shouldn't try to read it or mount it. Do not test the null disk, bestie. It's giving trap. ๐Ÿ’€

Null disks are used for three main purposes:

  1. Performance testing of libguestfs (see guestfs-performance(1)).
  2. The internal test suite.
  3. If you want to use libguestfs APIs that donโ€™t refer to disks, since libguestfs requires that at least one disk is added, you should add a null disk.

For example, to test if a feature is available, use code like this:

guestfs_h *g;
char **groups = [ "btrfs", NULL ];

g = guestfs_create ();
guestfs_add_drive (g, "/dev/null");
guestfs_launch (g);
if (guestfs_available (g, groups) == 0) {
  // group(s) are available
} else {
  // group(s) are not available
}
guestfs_close (g);

๐ŸŒธ DISK IMAGE FORMATS ๐ŸŒธ

Virtual disks come in a variety of formats. Some common formats are listed below.

Note that libguestfs itself is not responsible for handling the disk format: this is done using qemu(1). If support for a particular format is missing or broken, this has to be fixed in qemu. qemu handles the format drama, not libguestfs. ๐Ÿซถ

๐Ÿฆ‹ COMMON VIRTUAL DISK IMAGE FORMATS ๐Ÿฆ‹

๐ŸŒˆ raw

Raw format is simply a dump of the sequential bytes of the virtual hard disk. There is no header, container, compression or processing of any sort.

Since raw format requires no translation to read or write, it is both fast and very well supported by qemu and all other hypervisors. You can consider it to be a universal format that any hypervisor can access. Universal icon, no translation needed. โœจ

Raw format files are not compressed and so take up the full space of the original disk image even when they are empty. A variation (on Linux/Unix at least) is to not store ranges of all-zero bytes by storing the file as a sparse file. This "variant format" is sometimes called raw sparse. Many utilities, including virt-sparsify(1), can make raw disk images sparse. Sparse file glow-up, honestly. ๐ŸŽ€

๐Ÿฌ qcow2

Qcow2 is the native disk image format used by qemu. Internally it uses a two-level directory structure so that only blocks containing data are stored in the file. It also has many other features such as compression, snapshots and backing files.

There are at least two distinct variants of this format, although qemu (and hence libguestfs) handles both transparently to the user. Transparent handling is the vibe. ๐Ÿ’…

๐Ÿ’œ vmdk

VMDK is VMwareโ€™s native disk image format. There are many variations. Modern qemu (hence libguestfs) supports most variations, but you should be aware that older versions of qemu had some very bad data-corrupting bugs in this area. โš ๏ธ Data-corrupting bugs โ€” read that again. Modern qemu is the move. ๐Ÿ˜ญ

Note that VMware ESX exposes files with the name guest-flat.vmdk. These are not VMDK. They are raw format files which happen to have a .vmdk extension. ๐Ÿ’€

  • vdi โ€” VDI is VirtualBoxโ€™s native disk image format. Qemu (hence libguestfs) has generally good support for this. ๐Ÿ’–
  • vpc, vhd โ€” VPC (old) and VHD (modern) are the native disk image format of Microsoft (and previously, Connectix) Virtual PC and Hyper-V. ๐Ÿ‘‘

๐Ÿšซ Obsolete formats ๐Ÿšซ

The following formats are obsolete and should not be used: qcow (aka qcow1), cow, bochs. ๐Ÿ™ˆ

๐Ÿ” DETECTING THE FORMAT OF A DISK IMAGE ๐Ÿ”

Firstly note there is a security issue with auto-detecting the format of a disk image. It may or may not apply in your use case. Read CVE-2010-3851 below. โš ๏ธ

Libguestfs offers an API to get the format of a disk image (guestfs_disk_format), and it is safest to use this. ๐Ÿซถ

Donโ€™t be tempted to try parsing the text / human-readable output of qemu-img since it cannot be parsed reliably and securely. Also do not use the file command since the output of that changes over time. ๐Ÿ’…


๐Ÿ’– CONNECTION MANAGEMENT ๐Ÿ’–

๐Ÿฆ‹ guestfs_h * ๐Ÿฆ‹

guestfs_h is the opaque type representing a connection handle. Create a handle by calling guestfs_create or guestfs_create_flags. Call guestfs_close 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 above. ๐Ÿงš

โœจ guestfs_create โœจ

guestfs_h *guestfs_create (void);

Create a connection handle. ๐ŸŽ€

On success this returns a non-NULL pointer to a handle. On error it returns NULL. ๐Ÿ˜ญ

You have to "configure" the handle after creating it. This includes calling guestfs_add_drive_opts (or one of the equivalent calls) on the handle at least once. ๐Ÿ”ฅ

After configuring the handle, you have to call guestfs_launch. ๐Ÿ‘‘

You may also want to configure error handling for the handle. See the ERROR HANDLING section below. ๐Ÿ’œ

๐ŸŒธ guestfs_create_flags ๐ŸŒธ

guestfs_h *guestfs_create_flags (unsigned flags [, ...]);

Create a connection handle, supplying extra flags and extra arguments to control how the handle is created. ๐Ÿฆ‹

On success this returns a non-NULL pointer to a handle. On error it returns NULL. ๐Ÿ˜ญ

guestfs_create is equivalent to calling guestfs_create_flags(0). ๐ŸŒˆ

The following flags may be logically ORed together. (Currently no extra arguments are used). โญ

  • GUESTFS_CREATE_NO_ENVIRONMENT โ€” Donโ€™t parse any environment variables (such as LIBGUESTFS_DEBUG etc). You can call guestfs_parse_environment or guestfs_parse_environment_list afterwards to parse environment variables. Alternately, don't call these functions if you want the handle to be unaffected by environment variables. See the example below. The default (if this flag is not given) is to implicitly call guestfs_parse_environment. ๐Ÿ’–
  • GUESTFS_CREATE_NO_CLOSE_ON_EXIT โ€” Donโ€™t try to close the handle in an atexit(3) handler if the program exits without explicitly closing the handle. The default (if this flag is not given) is to install such an atexit handler. ๐ŸŽ€

๐ŸŽ€ USING GUESTFS_CREATE_NO_ENVIRONMENT ๐ŸŽ€

You might use GUESTFS_CREATE_NO_ENVIRONMENT and an explicit call to guestfs_parse_environment like this: ๐Ÿซถ

guestfs_h *g;
int r;

g = guestfs_create_flags (GUESTFS_CREATE_NO_ENVIRONMENT);
if (!g) {
  perror ("guestfs_create_flags");
  exit (EXIT_FAILURE);
}
r = guestfs_parse_environment (g);
if (r == -1)
  exit (EXIT_FAILURE);

Or to create a handle which is unaffected by environment variables, omit the call to guestfs_parse_environment from the above code. ๐ŸŒธ

The above code has another advantage which is that any errors from parsing the environment are passed through the error handler, whereas guestfs_create prints errors on stderr and ignores them. ๐Ÿ’…

๐Ÿ’… guestfs_close ๐Ÿ’…

void guestfs_close (guestfs_h *g);

This closes the connection handle and frees up all resources used. If a close callback was set on the handle, then it is called. โœจ

The correct way to close the handle is: ๐ŸŽ€

if (guestfs_shutdown (g) == -1) {
  /* handle write errors here */
}
guestfs_close (g);

guestfs_shutdown is only needed if all of the following are true: ๐Ÿ‘‘

  1. one or more disks were added in read-write mode, and
  2. guestfs_launch was called, and
  3. you made some changes, and
  4. you have a way to handle write errors (eg. by exiting with an error code or reporting something to the user). ๐Ÿ’–

๐Ÿ’– ERROR HANDLING ๐Ÿ’–

okay bestie so listen โ€” API functions can return errors. Like, it happens. Almost all the functions that return int will hand you back -1 to be like "nope, that failed ๐Ÿ’€".

But there's more tea available: you get an error message string, and optionally an error number (errno) if the thing that flopped was a system call.

You can grab that extra info about the last error on the handle by calling guestfs_last_error, guestfs_last_errno, and/or by setting up an error handler with guestfs_set_error_handler. Slay.

When the handle is created, a default error handler gets installed, and it prints the error message string to stderr. For small short-running command line programs that's literally all you need:

if (guestfs_launch (g) == -1)
  exit (EXIT_FAILURE);

because the default error handler makes sure an error message has been printed to stderr before the program exits. iconic behaviour honestly.

For other programs, the caller will almost certainly want to install an alternate error handler, or just do the error handling in-line like in the example below. The non-C language bindings all install NULL error handlers and turn errors into exceptions using code similar to this:

const char *msg;
int errnum;

/* This disables the default behaviour of printing errors
   on stderr. */
guestfs_set_error_handler (g, NULL, NULL);

if (guestfs_launch (g) == -1) {
  /* Examine the error message and print it, throw it,
     etc. */
  msg = guestfs_last_error (g);
  errnum = guestfs_last_errno (g);

  fprintf (stderr, "%s", msg);
  if (errnum != 0)
    fprintf (stderr, ": %s", strerror (errnum));
  fprintf (stderr, "\n");

  /* ... */
}

guestfs_create returns NULL if the handle cannot be created โ€” and because there's no handle when that happens, there's no way to get additional error info. ๐Ÿ˜ญ Since libguestfs โ‰ฅ 1.20, you can use guestfs_create_flags to properly deal with errors during handle creation, although the vast majority of programs can keep using guestfs_create and not worry about this situation at all.

Out of memory errors are handled differently. The default action is to call abort(3). If that's not the vibe for you, you can set a handler using guestfs_set_out_of_memory_handler.


๐Ÿซถ guestfs_last_error

const char *guestfs_last_error (guestfs_h *g);

This returns the last error message that happened on g. If there hasn't been an error since the handle was created, then it returns NULL.

Note that the returned string does not have a newline character at the end. Most error messages are single lines. Some are split over multiple lines and contain "\n" characters within the string but not at the end.

The lifetime of the returned string is until the next error occurs on the same handle, or until guestfs_close is called. So if you need to keep it longer โ€” copy it, bestie. ๐Ÿ’…

๐ŸŒธ guestfs_last_errno

int guestfs_last_errno (guestfs_h *g);

This returns the last error number (errno) that happened on g.

If successful, an errno integer not equal to zero is returned.

In many cases the special errno ENOTSUP comes back if you tried to call a function or use a feature that isn't supported.

If no error number is available, this returns 0. And this call can return 0 in three situations:

  1. There has not been any error on the handle.
  2. There has been an error but the errno was meaningless. This corresponds to the case where the error didn't come from a failed system call, but for some other reason.
  3. There was an error from a failed system call, but for some reason the errno was not captured and returned. This usually indicates a bug in libguestfs.

Libguestfs tries to convert the errno from inside the appliance into a corresponding errno for the caller (not entirely trivial: the appliance might be running a completely different operating system from the library, and error numbers are not standardized across Un*xen). If that couldn't be done, then the error is translated to EINVAL. In practice this should only happen in very rare circumstances.

๐ŸŽ€ guestfs_set_error_handler

typedef void (*guestfs_error_handler_cb) (guestfs_h *g,
                                          void *opaque,
                                          const char *msg);
void guestfs_set_error_handler (guestfs_h *g,
                                guestfs_error_handler_cb cb,
                                void *opaque);

The callback cb will be called if there is an error. The parameters passed to the callback are an opaque data pointer and the error message string.

errno is not passed to the callback โ€” to get that, the callback must call guestfs_last_errno.

Note that the message string msg is freed as soon as the callback function returns, so if you want to stash it somewhere you must make your own copy. no cap.

The default handler prints messages on stderr.

If you set cb to NULL then no handler is called.

๐Ÿฆ‹ guestfs_get_error_handler

guestfs_error_handler_cb guestfs_get_error_handler (guestfs_h *g,
                                                    void **opaque_rtn);

Returns the current error handler callback.

๐Ÿ’œ guestfs_push_error_handler

void guestfs_push_error_handler (guestfs_h *g,
                                 guestfs_error_handler_cb cb,
                                 void *opaque);

This is the same as guestfs_set_error_handler, except that the old error handler is stashed away in a stack inside the handle. You can restore the previous error handler by calling guestfs_pop_error_handler.

Use the following code to temporarily disable errors around a function:

guestfs_push_error_handler (g, NULL, NULL);
guestfs_mkdir (g, "/foo"); /* We don't care if this fails. */
guestfs_pop_error_handler (g);

โญ guestfs_pop_error_handler

void guestfs_pop_error_handler (guestfs_h *g);

Restore the previous error handler (see guestfs_push_error_handler).

If you pop the stack too many times, then the default error handler is restored. ๐Ÿ™ˆ

๐Ÿ”ฅ guestfs_set_out_of_memory_handler

typedef void (*guestfs_abort_cb) (void);
void guestfs_set_out_of_memory_handler (guestfs_h *g,
                                        guestfs_abort_cb);

The callback cb will be called if there is an out of memory situation. Note this callback must not return.

The default is to call abort(3).

You cannot set cb to NULL. You can't ignore out of memory situations. fr fr, don't even try.

๐ŸŒˆ guestfs_get_out_of_memory_handler

guestfs_abort_fn guestfs_get_out_of_memory_handler (guestfs_h *g);

This returns the current out of memory handler.


โœจ API CALLS โœจ

๐Ÿ“ guestfs_acl_delete_def_file

int
guestfs_acl_delete_def_file (guestfs_h *g,
                             const char *dir);

This function deletes the default POSIX Access Control List (ACL) attached to directory dir.

This function returns 0 on success or -1 on error.

This function depends on the feature "acl". See also guestfs_feature_available.

(Added in 1.19.63)

๐Ÿงš guestfs_acl_get_file

char *
guestfs_acl_get_file (guestfs_h *g,
                      const char *path,
                      const char *acltype);

This function returns the POSIX Access Control List (ACL) attached to path. The ACL comes back in "long text form" (see acl(5)).

The acltype parameter may be:

  • "access" โ€” Return the ordinary (access) ACL for any file, directory or other filesystem object.
  • "default" โ€” Return the default ACL. Normally this only makes sense if path is a directory.

This function returns a string, or NULL on error. The caller must free the returned string after use. ๐Ÿซถ

This function depends on the feature "acl". See also guestfs_feature_available.

(Added in 1.19.63)

๐Ÿ’– guestfs_acl_set_file

int
guestfs_acl_set_file (guestfs_h *g,
                      const char *path,
                      const char *acltype,
                      const char *acl);

This function sets the POSIX Access Control List (ACL) attached to path.

The acltype parameter may be:

  • "access" โ€” Set the ordinary (access) ACL for any file, directory or other filesystem object.
  • "default" โ€” Set the default ACL. Normally this only makes sense if path is a directory.

The acl parameter is the new ACL in either "long text form" or "short text form" (see acl(5)). The new ACL completely replaces any previous ACL on the file. And the ACL must contain the full Unix permissions (eg. "u::rwx,g::rx,o::rx").

If you're specifying individual users or groups, then the mask field is also required (eg. "m::rwx"), followed by the "u:ID:..." and/or "g:ID:..." field(s). A full ACL string might therefore look like this:

u::rwx,g::rwx,o::rwx,m::rwx,u:500:rwx,g:500:rwx
\ Unix permissions / \mask/ \      ACL        /

You should use numeric UIDs and GIDs. To map usernames and groupnames to the correct numeric ID in the context of the guest, use the Augeas functions (see guestfs_aug_init).

This function returns 0 on success or -1 on error.

This function depends on the feature "acl". See also guestfs_feature_available.

(Added in 1.19.63)

๐Ÿ’€ guestfs_add_cdrom

int
guestfs_add_cdrom (guestfs_h *g,
                   const char *filename);
โš ๏ธ This function is deprecated. In new code, use the guestfs_add_drive_ro call instead.

Deprecated functions will not be removed from the API, but the fact that they're deprecated indicates that there are problems with correct use of these functions. iykyk.

This function adds a virtual CD-ROM disk image to the guest.

The image is added as a read-only drive, so this function is equivalent of guestfs_add_drive_ro.

This function returns 0 on success or -1 on error.

(Added in 0.3)

๐Ÿ‘‘ guestfs_add_domain

int
guestfs_add_domain (guestfs_h *g,
                    const char *dom,
                    ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

GUESTFS_ADD_DOMAIN_LIBVIRTURI, const char *libvirturi,
GUESTFS_ADD_DOMAIN_READONLY, int readonly,
GUESTFS_ADD_DOMAIN_IFACE, const char *iface,
GUESTFS_ADD_DOMAIN_LIVE, int live,
GUESTFS_ADD_DOMAIN_ALLOWUUID, int allowuuid,
GUESTFS_ADD_DOMAIN_READONLYDISK, const char *readonlydisk,
GUESTFS_ADD_DOMAIN_CACHEMODE, const char *cachemode,
GUESTFS_ADD_DOMAIN_DISCARD, const char *discard,
GUESTFS_ADD_DOMAIN_COPYONREAD, int copyonread,

...it works by hitting up libvirt, asking for the domain and the domain XML, parsing that XML for disks, and then calling guestfs_add_drive_opts on each one. Slay, very efficient. โœจ

You get back the number of disks that got added. And bestie, this whole thing is atomic: if an error comes back, then literally zero disks were added. No half-finished mess, we don't do that here. ๐Ÿ’…

It does some minimal checks to make sure the libvirt domain isn't running (unless readonly is true, iykyk). In a future version we'll try to acquire the libvirt lock on each disk โ€” noted, staying tuned. ๐Ÿซถ

Disks must be accessible locally. This often means adding disks from a remote libvirt connection (see https://libvirt.org/remote.html) will fail unless those disks are also accessible via the same device path locally too. Yeah, annoying, but that's the vibe check. ๐Ÿ˜ญ

The optional libvirturi parameter sets the libvirt URI (see https://libvirt.org/uri.html). If it's not set then we connect to the default libvirt URI (or one set through an environment variable โ€” see the libvirt documentation for the full details, they got the lore).

The optional live flag is ignored in libguestfs โ‰ฅ 1.48. Gone, retired, it's giving legacy. ๐Ÿ’€

If the allowuuid flag is true (default is false) then a UUID may be passed instead of the domain name. The dom string is treated as a UUID first and looked up, and if that lookup fails then we treat dom as a name as usual. Flexible queen behaviour. ๐Ÿ‘‘

The optional readonlydisk parameter controls what we do for disks which are marked <readonly/> in the libvirt XML. Possible values are:

  • readonlydisk = "error"
    • If readonly is false: the whole call is aborted with an error if any disk with the <readonly/> flag is found.
    • If readonly is true: disks with the <readonly/> flag are added read-only.
  • readonlydisk = "read"
    • If readonly is false: disks with the <readonly/> flag are added read-only. Other disks are added read/write.
    • If readonly is true: disks with the <readonly/> flag are added read-only.
  • readonlydisk = "write" (default)
    • If readonly is false: disks with the <readonly/> flag are added read/write.
    • If readonly is true: disks with the <readonly/> flag are added read-only.
  • readonlydisk = "ignore"
    • If readonly is true or false: disks with the <readonly/> flag are skipped. Bye bestie, not our problem. ๐Ÿฆ‹

If present, the value of logical_block_size attribute of <blockio/> tag in libvirt XML will be passed as blocksize parameter to guestfs_add_drive_opts.

The other optional parameters are passed directly through to guestfs_add_drive_opts. We're not gatekeeping them, they go straight through. ๐ŸŽ€

On error this function returns -1.

(Added in 1.7.4) โ€” an icon, a legend, born in 1.7.4. โญ

guestfs_add_domain_va

int
guestfs_add_domain_va (guestfs_h *g,
                       const char *dom,
                       va_list args);

This is the "va_list variant" of guestfs_add_domain. Same energy, different plumbing.

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_add_domain_argv

int
guestfs_add_domain_argv (guestfs_h *g,
                         const char *dom,
                         const struct guestfs_add_domain_argv *optargs);

This is the "argv variant" of guestfs_add_domain. Also the same energy, also different plumbing.

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_add_drive

int
guestfs_add_drive (guestfs_h *g,
                   const char *filename);

This one is provided for backwards compatibility with earlier versions of libguestfs. It literally just calls guestfs_add_drive_opts with no optional arguments. A little shortcut king, no cap. ๐Ÿ‘‘

(Added in 0.3)

guestfs_add_drive_opts

int
guestfs_add_drive_opts (guestfs_h *g,
                        const char *filename,
                        ...);

Okay so you may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. (Yes, the lonely -1 is the vibe check that says "we're done here".) See "CALLS WITH OPTIONAL ARGUMENTS".

GUESTFS_ADD_DRIVE_OPTS_READONLY, int readonly,
GUESTFS_ADD_DRIVE_OPTS_FORMAT, const char *format,
GUESTFS_ADD_DRIVE_OPTS_IFACE, const char *iface,
GUESTFS_ADD_DRIVE_OPTS_NAME, const char *name,
GUESTFS_ADD_DRIVE_OPTS_LABEL, const char *label,
GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, const char *protocol,
GUESTFS_ADD_DRIVE_OPTS_SERVER, char *const *server,
GUESTFS_ADD_DRIVE_OPTS_USERNAME, const char *username,
GUESTFS_ADD_DRIVE_OPTS_SECRET, const char *secret,
GUESTFS_ADD_DRIVE_OPTS_CACHEMODE, const char *cachemode,
GUESTFS_ADD_DRIVE_OPTS_DISCARD, const char *discard,
GUESTFS_ADD_DRIVE_OPTS_COPYONREAD, int copyonread,
GUESTFS_ADD_DRIVE_OPTS_BLOCKSIZE, int blocksize,

This function adds a disk image called filename to the handle. filename may be a regular host file or a host device. Either way, it's valid, we love flexibility. ๐Ÿ’–

When this function is called before guestfs_launch (the usual case) then the first time you call this function, the disk appears in the API as /dev/sda, the second time as /dev/sdb, and so on. Cute little counter, main character energy honestly. ๐Ÿ”ฅ

You don't necessarily need to be root when using libguestfs. However you obviously do need sufficient permissions to access the filename for whatever operations you want to perform (ie. read access if you just want to read the image or write access if you want to modify the image). So like, permissions matter, bestie, check them first. ๐Ÿ™ˆ

This call checks that filename exists. No ghost disks around here. ๐Ÿ‘ป

filename may be the special string /dev/null. See "NULL DISKS".

The optional arguments are:

  • readonly โ€” If true then the image is treated as read-only. Writes are still allowed, but they are stored in a temporary snapshot overlay which is discarded at the end. The disk that you add is not modified. So you can scribble all you want, it all vanishes. โœจ
  • format โ€” This forces the image format. If you omit this (or use guestfs_add_drive or guestfs_add_drive_ro) then the format is automatically detected. Possible formats include raw and qcow2.
โš ๏ธ Automatic detection of the format opens you up to a potential security hole when dealing with untrusted raw-format images. See CVE-2010-3851 and RHBZ#642934. Specifying the format closes this security hole. Not me telling you to be careful โ€” okay yes, me telling you to be careful. ๐Ÿ˜ญ
  • iface โ€” This rarely-used option lets you emulate the behaviour of the deprecated guestfs_add_drive_with_if call (q.v.). Nostalgia core. ๐Ÿ’€
  • name โ€” This field used to be passed as a hint for guest inspection, but it is no longer used. Retired. It's giving former icon. ๐ŸŽ€
  • label โ€” Give the disk a label. The label should be a unique, short string using only ASCII characters [a-zA-Z]. As well as its usual name in the API (such as /dev/sda), the drive will also be named /dev/disk/guestfs/label.

See "DISK LABELS".

  • protocol โ€” The optional protocol argument can be used to select an alternate source protocol.

See also: "REMOTE STORAGE".

  • protocol = "file" โ€” filename is interpreted as a local file or device. This is the default if the optional protocol parameter is omitted.
  • protocol = "nbd" โ€” Connect to the Network Block Device server. The server parameter must also be supplied โ€” see below.

See also: "NETWORK BLOCK DEVICE".

  • protocol = "rbd" โ€” Connect to the Ceph (librbd/RBD) server. The server parameter must also be supplied โ€” see below. The username parameter may be supplied. See below. The secret parameter may be supplied. See below.

See also: "CEPH".

  • server โ€” For protocols which require access to a remote server, this is a list of server(s).

Server requirements per protocol, since the original had a whole table and we've got to keep every number:

  • file โ€” List must be empty or param not used at all
  • nbd โ€” Exactly one
  • rbd โ€” Zero or more

Each list element is a string specifying a server. The string must be in one of the following formats:

hostname
hostname:port
tcp:hostname
tcp:hostname:port
unix:/path/to/socket

If the port number is omitted, then the standard port number for the protocol is used (see /etc/services).

  • username โ€” For the rbd protocol, this specifies the remote username.

If not given, then no authentication is attempted for ceph. But note this sometimes may give unexpected results, for example if using the libvirt backend and if the libvirt backend is configured to start the qemu appliance as a special user such as qemu.qemu. If in doubt, specify the remote username you want. Lowkey just specify it, bestie. ๐Ÿซถ

  • secret โ€” For the rbd protocol only, this specifies the โ€˜secretโ€™ to use when connecting to the remote device. It must be base64 encoded. (Yes, encoded. Do not skip that part. ๐Ÿ™ˆ)

If not given, then a secret matching the given username will be looked up in the default keychain locations, or if no username is given, then no authentication will be used.

  • cachemode โ€” Choose whether or not libguestfs will obey sync operations (safe but slow) or not (unsafe but fast). The possible values for this string are:
    • cachemode = "writeback" โ€” This is the default.

Write operations in the API do not return until a write(2) call has completed in the host [but note this does not imply that anything gets written to disk].

Sync operations in the API, including implicit syncs caused by filesystem journalling, will not return until an fdatasync(2) call has completed in the host, indicating that data has been committed to disk.

  • cachemode = "unsafe" โ€” In this mode, there are no guarantees. Libguestfs may cache anything and ignore sync requests. This is suitable only for scratch or temporary disks. Only. Scratch. Or. Temporary. Disks. We're serious. ๐Ÿ˜ค
  • discard โ€” Enable or disable discard (a.k.a. trim or unmap) support on this drive. If enabled, operations such as guestfs_fstrim will be able to discard / make thin / punch holes in the underlying host file or device.

Possible discard settings are:

  • discard = "disable" โ€” Disable discard support. This is the default.
  • discard = "enable" โ€” Enable discard support. Fail if discard is not possible.
  • discard = "besteffort" โ€” Enable discard support if possible, but don't fail if it is not supported.

Since not all backends and not all underlying systems support discard, this is a good choice if you want to use discard if possible, but don't mind if it doesn't work. The try-your-best icon honestly. ๐Ÿ’…

  • copyonread โ€” The boolean parameter copyonread enables copy-on-read support. This only affects disk formats which have backing files, and causes reads to be stored in the overlay layer, speeding up multiple reads of the same area of disk.

The default is false.

  • "blocksize" โ€” this one sets the sector size of the disk, bestie. Possible values are 512 (the default if the parameter is omitted) or 4096. Use 4096 when you're handling an "Advanced Format" disk that uses 4K sector size (https://en.wikipedia.org/wiki/Advanced_Format). Only a subset of the backends support this parameter โ€” currently only the libvirt and direct backends do. ๐ŸŽ€

guestfs_add_drive_opts returns 0 on success or -1 on error. (Added in 0.3)

guestfs_add_drive_opts_va

int
guestfs_add_drive_opts_va (guestfs_h *g,
                           const char *filename,
                           va_list args);

This is the va_list variant of guestfs_add_drive_opts. See CALLS WITH OPTIONAL ARGUMENTS. โœจ

guestfs_add_drive_opts_argv

int
guestfs_add_drive_opts_argv (guestfs_h *g,
                             const char *filename,
                             const struct guestfs_add_drive_opts_argv *optargs);

This is the argv variant of guestfs_add_drive_opts. See CALLS WITH OPTIONAL ARGUMENTS. ๐Ÿซถ

guestfs_add_drive_ro

int
guestfs_add_drive_ro (guestfs_h *g,
                      const char *filename);

This function is the equivalent of calling guestfs_add_drive_opts with the optional parameter GUESTFS_ADD_DRIVE_OPTS_READONLY set to 1, so the disk is added read-only, with the format being detected automatically. No cap, that's the whole vibe. ๐Ÿ’…

This function returns 0 on success or -1 on error. (Added in 1.0.38)

guestfs_add_drive_ro_with_if

int
guestfs_add_drive_ro_with_if (guestfs_h *g,
                              const char *filename,
                              const char *iface);
Deprecated alert ๐Ÿšจ This function is deprecated. In new code, use the guestfs_add_drive call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions. Like, use the new one, bestie. ๐Ÿ˜ญ

This is the same as guestfs_add_drive_ro but it allows you to specify the QEMU interface emulation to use at run time. Both the direct and the libvirt backends ignore iface.

This function returns 0 on success or -1 on error. (Added in 1.0.84)

guestfs_add_drive_scratch

int
guestfs_add_drive_scratch (guestfs_h *g,
                           int64_t size,
                           ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS.

GUESTFS_ADD_DRIVE_SCRATCH_NAME, const char *name,
GUESTFS_ADD_DRIVE_SCRATCH_LABEL, const char *label,
GUESTFS_ADD_DRIVE_SCRATCH_BLOCKSIZE, int blocksize,

This command adds a temporary scratch drive to the handle. The size parameter is the virtual size (in bytes). The scratch drive is blank initially (all reads return zeroes until you start writing to it). The drive is deleted when the handle is closed. Scratch drive, but make it fashion. ๐Ÿฆ‹

The optional arguments name, label and blocksize are passed through to guestfs_add_drive_opts.

This function returns 0 on success or -1 on error. (Added in 1.23.10)

guestfs_add_drive_scratch_va

int
guestfs_add_drive_scratch_va (guestfs_h *g,
                              int64_t size,
                              va_list args);

This is the va_list variant of guestfs_add_drive_scratch. See CALLS WITH OPTIONAL ARGUMENTS. โœจ

guestfs_add_drive_scratch_argv

int
guestfs_add_drive_scratch_argv (guestfs_h *g,
                                int64_t size,
                                const struct guestfs_add_drive_scratch_argv *optargs);

This is the argv variant of guestfs_add_drive_scratch. See CALLS WITH OPTIONAL ARGUMENTS. ๐Ÿซถ

guestfs_add_drive_with_if

int
guestfs_add_drive_with_if (guestfs_h *g,
                           const char *filename,
                           const char *iface);
Deprecated alert ๐Ÿšจ This function is deprecated. In new code, use the guestfs_add_drive call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions. Fr fr, don't start new code with this one. ๐Ÿ’€

This is the same as guestfs_add_drive but it allows you to specify the QEMU interface emulation to use at run time. Both the direct and the libvirt backends ignore iface.

This function returns 0 on success or -1 on error. (Added in 1.0.84)

guestfs_add_libvirt_dom

int
guestfs_add_libvirt_dom (guestfs_h *g,
                         void * /* really virDomainPtr */ dom,
                         ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS.

GUESTFS_ADD_LIBVIRT_DOM_READONLY, int readonly,
GUESTFS_ADD_LIBVIRT_DOM_IFACE, const char *iface,
GUESTFS_ADD_LIBVIRT_DOM_LIVE, int live,
GUESTFS_ADD_LIBVIRT_DOM_READONLYDISK, const char *readonlydisk,
GUESTFS_ADD_LIBVIRT_DOM_CACHEMODE, const char *cachemode,
GUESTFS_ADD_LIBVIRT_DOM_DISCARD, const char *discard,
GUESTFS_ADD_LIBVIRT_DOM_COPYONREAD, int copyonread,

This function adds the disk(s) attached to the libvirt domain dom. It works by requesting the domain XML from libvirt, parsing it for disks, and calling guestfs_add_drive_opts on each one. Iconic libvirt behavior, honestly. ๐Ÿ‘‘

In the C API we declare void *dom, but really it has type virDomainPtr dom. This is so we don't need <libvirt.h>.

The number of disks added is returned. This operation is atomic: if an error is returned, then no disks are added. Bestie, that's the good stuff. โญ

This function does some minimal checks to make sure the libvirt domain is not running (unless readonly is true). In a future version we will try to acquire the libvirt lock on each disk.

Disks must be accessible locally. This often means that adding disks from a remote libvirt connection (see https://libvirt.org/remote.html) will fail unless those disks are accessible via the same device path locally too. Remote libvirt girlies, beware. ๐ŸŒธ

The optional live flag is ignored in libguestfs โ‰ฅ 1.48.

The optional readonlydisk parameter controls what we do for disks which are marked <readonly/> in the libvirt XML. See guestfs_add_domain for possible values.

If present, the value of logical_block_size attribute of <blockio/> tag in libvirt XML will be passed as blocksize parameter to guestfs_add_drive_opts.

The other optional parameters are passed directly through to guestfs_add_drive_opts.

On error this function returns -1. (Added in 1.29.14)

guestfs_add_libvirt_dom_va

int
guestfs_add_libvirt_dom_va (guestfs_h *g,
                            void * /* really virDomainPtr */ dom,
                            va_list args);

This is the va_list variant of guestfs_add_libvirt_dom. See CALLS WITH OPTIONAL ARGUMENTS. โœจ

guestfs_add_libvirt_dom_argv

int
guestfs_add_libvirt_dom_argv (guestfs_h *g,
                              void * /* really virDomainPtr */ dom,
                              const struct guestfs_add_libvirt_dom_argv *optargs);

This is the argv variant of guestfs_add_libvirt_dom. See CALLS WITH OPTIONAL ARGUMENTS. ๐Ÿซถ

guestfs_aug_clear

int
guestfs_aug_clear (guestfs_h *g,
                   const char *augpath);

Set the value associated with path to NULL. This is the same as the augtool(1) clear command. Clean slate energy. ๐Ÿงš

This function returns 0 on success or -1 on error. (Added in 1.3.4)

guestfs_aug_close

int
guestfs_aug_close (guestfs_h *g);

Close the current Augeas handle and free up any resources used by it. After calling this, you have to call guestfs_aug_init again before you can use any other Augeas functions. No handle, no Augeas access. Periodt. ๐Ÿ’œ

This function returns 0 on success or -1 on error. (Added in 0.7)

guestfs_aug_defnode

struct guestfs_int_bool *
guestfs_aug_defnode (guestfs_h *g,
                     const char *name,
                     const char *expr,
                     const char *val);

Defines a variable name whose value is the result of evaluating expr.

If expr evaluates to an empty nodeset, a node is created, equivalent to calling guestfs_aug_set expr, val. name will be the nodeset containing that single node.

On success this returns a pair containing the number of nodes in the nodeset, and a boolean flag if a node was created.

This function returns a struct guestfs_int_bool *, or NULL if there was an error. The caller must call guestfs_free_int_bool after use. Don't forget the cleanup, bestie! ๐ŸŽ€

(Added in 0.7)

guestfs_aug_defvar

int
guestfs_aug_defvar (guestfs_h *g,
                    const char *name,
                    const char *expr);

Defines an Augeas variable name whose value is the result of evaluating expr. If expr is NULL, then name is undefined.

On success this returns the number of nodes in expr, or 0 if expr evaluates to something which is not a nodeset.

On error this function returns -1. (Added in 0.7)

guestfs_aug_get

char *
guestfs_aug_get (guestfs_h *g,
                 const char *augpath);

Look up the value associated with path. If path matches exactly one node, the value is returned. One node only, okay? Not a group chat. ๐Ÿ˜ญ

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 0.7)

guestfs_aug_init

int
guestfs_aug_init (guestfs_h *g,
                  const char *root,
                  int flags);

Create a new Augeas handle for editing configuration files. If there was any previous Augeas handle associated with this guestfs session, then it is closed. New handle, who dis? ๐Ÿ’…

You must call this before using any other guestfs_aug_* commands.

root is the filesystem root. root must not be NULL, use / instead.

The flags are the same as the flags defined in <augeas.h>, the logical or of the following integers:

  • AUG_SAVE_BACKUP = 1 โ€” Keep the original file with a .augsave extension.
  • AUG_SAVE_NEWFILE = 2 โ€” Save changes into a file with extension .augnew, and do not overwrite original. Overrides AUG_SAVE_BACKUP.
  • AUG_TYPE_CHECK = 4 โ€” Typecheck lenses. This option is only useful when debugging Augeas lenses. Use of this option may require additional memory for the libguestfs appliance. You may need to set the LIBGUESTFS_MEMSIZE environment variable or call guestfs_set_memsize.
  • AUG_NO_STDINC = 8 โ€” Do not use standard load path for modules.
  • AUG_SAVE_NOOP = 16 โ€” Make save a no-op, just record what would have been changed.
  • AUG_NO_LOAD = 32 โ€” Do not load the tree in guestfs_aug_init.

To close the handle, you can call guestfs_aug_close. ๐ŸŒˆ

๐Ÿ”— and if you wanna go down the full Augeas rabbit hole, the lore lives at http://augeas.net/ โ€” knock yourself out bestie ๐Ÿ’–

This function returns 0 on success or -1 on error.

Added in 0.7 โœจ


๐ŸŒฟ guestfs_aug_insert

int
guestfs_aug_insert (guestfs_h *g,
                    const char *augpath,
                    const char *label,
                    int before);

Okay so this one makes a brand-new sibling called label for path, and it slots it into the tree before or after path โ€” which one depends on the boolean flag before, bestie, so pick wisely ๐ŸŽ€

Rules of the game: path has to match exactly one existing node in the tree, and label has to actually be a label โ€” meaning no /, no *, and it can't end with a bracketed index like [N]. No cap.

This function returns 0 on success or -1 on error.

Added in 0.7 โœจ


๐Ÿท๏ธ guestfs_aug_label

char *
guestfs_aug_label (guestfs_h *g,
                   const char *augpath);

Gives you back the label โ€” that's the name of the last element โ€” of the Augeas path expression augpath. And augpath has to match exactly one node, or else this function just throws an error at you ๐Ÿ˜ญ

This function returns a string, or NULL on error. And listen โ€” the caller must free the returned string after use. That means you, babe ๐Ÿซถ

Added in 1.23.14 โœจ


๐Ÿ“ฅ guestfs_aug_load

int
guestfs_aug_load (guestfs_h *g);

Loads files into the tree. That's it, that's the vibe.

For the full gory details (their words, not mine, and honestly accurate ๐Ÿ’€), see aug_load in the Augeas documentation.

This function returns 0 on success or -1 on error.

Added in 0.7 โœจ


๐Ÿ“‚ guestfs_aug_ls

char **
guestfs_aug_ls (guestfs_h *g,
                const char *augpath);

This is literally just a shortcut for listing guestfs_aug_match path/* and then sorting all the resulting nodes into alphabetical order. Iconic lazy-girl behaviour, we stan ๐ŸŽ€

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use โ€” both, don't forget the array ๐Ÿ’…

Added in 0.8 โœจ


๐Ÿ” guestfs_aug_match

char **
guestfs_aug_match (guestfs_h *g,
                   const char *augpath);

Returns a list of paths that match the path expression path. And the paths it hands back are sufficiently qualified, so each one matches exactly one node in the current tree. No ambiguity, no duplicates, we love to see it ๐Ÿ‘‘

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

Added in 0.7 โœจ


๐Ÿšš guestfs_aug_mv

int
guestfs_aug_mv (guestfs_h *g,
                const char *src,
                const char *dest);

Moves the node src to dest. And src must match exactly one node, okay? โš ๏ธ Also heads up: dest gets overwritten if it already exists โ€” that's not a drill, your old data is gone-gone ๐Ÿ™ˆ

This function returns 0 on success or -1 on error.

Added in 0.7 โœจ


๐Ÿ—‘๏ธ guestfs_aug_rm

int
guestfs_aug_rm (guestfs_h *g,
                const char *augpath);

Removes path and all of its children. The whole family tree, gone, no survivors ๐Ÿ’€

On success this returns the number of entries which were removed.

On error this function returns -1.

Added in 0.7 โœจ


๐Ÿ’พ guestfs_aug_save

int
guestfs_aug_save (guestfs_h *g);

Writes all your pending changes to disk. Finally, commitment ๐Ÿฅน

Heads up though: the flags you passed to guestfs_aug_init affect exactly how files are saved โ€” so whatever vibe you set up at the start? That's the vibe you're saving with.

This function returns 0 on success or -1 on error.

Added in 0.7 โœจ


โœ๏ธ guestfs_aug_set

int
guestfs_aug_set (guestfs_h *g,
                 const char *augpath,
                 const char *val);

Sets the value associated with augpath to val. Simple, clean, we love her ๐Ÿ’…

But okay โ€” plot twist ๐Ÿ˜ญ In the Augeas API you can clear a node by setting the value to NULL. Due to an oversight in the libguestfs API, you cannot do that with this call. Instead you must use the guestfs_aug_clear call. Sorry babes, that's the rule.

This function returns 0 on success or -1 on error.

Added in 0.7 โœจ


๐ŸŽ›๏ธ guestfs_aug_setm

int
guestfs_aug_setm (guestfs_h *g,
                  const char *base,
                  const char *sub,
                  const char *val);

Changes multiple Augeas nodes in a single operation โ€” efficiency queen โœจ base is an expression matching multiple nodes. sub is a path expression relative to base. All the nodes matching base get found, and then for each one, sub is changed to val. Also sub may be NULL, in which case the base nodes themselves get modified. Versatile!

This returns the number of nodes modified.

On error this function returns -1.

Added in 1.23.14 โœจ


๐Ÿ”„ guestfs_aug_transform

int
guestfs_aug_transform (guestfs_h *g,
                       const char *lens,
                       const char *file,
                       ...);

Okay so this one lets you supply a list of optional arguments ๐Ÿซถ Use zero or more of the following pairs of parameters, and terminate the whole list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

  • GUESTFS_AUG_TRANSFORM_REMOVE, int remove, โ€” adds an Augeas transformation for the specified lens so it can handle file. And if remove is true (false by default), then the transformation is removed instead.

This function returns 0 on success or -1 on error.

Added in 1.35.2 โœจ


๐Ÿงต guestfs_aug_transform_va

int
guestfs_aug_transform_va (guestfs_h *g,
                          const char *lens,
                          const char *file,
                          va_list args);

This is the "va_list variant" of guestfs_aug_transform, periodt.

See "CALLS WITH OPTIONAL ARGUMENTS".


๐Ÿงต guestfs_aug_transform_argv

int
guestfs_aug_transform_argv (guestfs_h *g,
                            const char *lens,
                            const char *file,
                            const struct guestfs_aug_transform_argv *optargs);

And this is the "argv variant" of guestfs_aug_transform. Same energy, different signature ๐Ÿ’ซ

See "CALLS WITH OPTIONAL ARGUMENTS".


โœ… guestfs_available

int
guestfs_available (guestfs_h *g,
                   char *const *groups);

This command is used to check the availability of some groups of functionality in the appliance โ€” because not every build of the libguestfs appliance is gonna be able to provide everything, and we need to know before we start ๐Ÿง

The libguestfs groups, and the functions those groups correspond to, are listed in "AVAILABILITY". You can also fetch that list at runtime by calling guestfs_available_all_groups.

The argument groups is a list of group names, eg: ["inotify", "augeas"] โ€” that one would check for the availability of the Linux inotify functions and the Augeas (configuration file editing) functions.

The command returns no error if all requested groups are available โœจ

It fails with an error if one or more of the requested groups is unavailable in the appliance.

And if an unknown group name is in the list of groups, then an error is always returned. No sneaky made-up groups ๐Ÿ™…โ€โ™€๏ธ

Notes, bestie, listen up:

  • guestfs_feature_available is the same as this call, but with a slightly simpler-to-use API: that call returns a boolean true/false instead of throwing an error. Much more chill.
  • You must call guestfs_launch before calling this function. The reason is because we don't know what groups are supported by the appliance/daemon until it is running and can be queried. Can't ask someone who isn't awake yet ๐Ÿฅฑ
  • If a group of functions is available, that does not necessarily mean they will work. You still have to check for errors when calling individual API functions, even if they're available. Stay vigilant ๐Ÿ’…
  • It is usually the job of distro packagers to build complete functionality into the libguestfs appliance. Upstream libguestfs, if built from source with all requirements satisfied, will support everything. Slay, upstream.
  • This call was added in version 1.0.80. In previous versions of libguestfs, all you could do was speculatively execute a command to find out if the daemon implemented it. See also guestfs_version.

See also guestfs_filesystem_available.

This function returns 0 on success or -1 on error.

Added in 1.0.80 โœจ


๐Ÿ“‹ guestfs_available_all_groups

char **
guestfs_available_all_groups (guestfs_h *g);

This command returns a list of all the optional groups that this daemon knows about. And important detail: this returns both supported and unsupported groups โ€” so it's not a "yes they work" list, it's a "here's everything that exists" list ๐Ÿซ  To find out which ones the daemon can actually support, you have to call guestfs_available / guestfs_feature_available on each member of the returned list. One by one. Yes, really.

See also guestfs_available, guestfs_feature_available and "AVAILABILITY".

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

Added in 1.3.15 โœจ


๐Ÿ” guestfs_base64_in

int
guestfs_base64_in (guestfs_h *g,
                   const char *base64file,
                   const char *filename);

This command uploads base64-encoded data from base64file to filename. Decoding on the way in, we love a conversion moment ๐Ÿ’–

This function returns 0 on success or -1 on error.

Added in 1.3.5 โœจ


๐Ÿ“ค guestfs_base64_out

int
guestfs_base64_out (guestfs_h *g,
                    const char *filename,
                    const char *base64file);

This command downloads the contents of filename, writing it out to the local file base64file encoded as base64. Same trick, opposite direction ๐Ÿฆ‹

This function returns 0 on success or -1 on error.

Added in 1.3.5 โœจ


๐Ÿงน guestfs_blkdiscard

int
guestfs_blkdiscard (guestfs_h *g,
                    const char *device);

This discards all the blocks on the block device device, giving that free space back to the host. Spring cleaning but make it storage ๐Ÿ”ฅ

โš ๏ธ Okay real talk: this operation requires support in libguestfs, the host filesystem, qemu and the host kernel. If that support isn't present, it may give an error โ€” or even appear to run but do nothing. Which is honestly the scariest outcome ๐Ÿ’€ You must also set the discard attribute on the underlying drive (see guestfs_add_drive_opts).

This function returns 0 on success or -1 on error.

This function depends on the feature "blkdiscard". See also guestfs_feature_available.

Added in 1.25.44 โœจ


๐Ÿ•ณ๏ธ guestfs_blkdiscardzeroes

int
guestfs_blkdiscardzeroes (guestfs_h *g,
                          const char *device);

This call returns true if blocks on device that have been discarded by a call to guestfs_blkdiscard come back as blocks of zero bytes when you read them the next time. Clean, predictable, a whole vibe โœจ

If it returns false, then it may be that discarded blocks are read as stale or random data. Which is giving chaos, honestly ๐Ÿ˜ญ

This function returns a C truth value on success or -1 on error.

This function depends on the feature "blkdiscardzeroes". See also guestfs_feature_available.

Added in 1.25.44 โœจ


๐Ÿงฌ guestfs_blkid

char **
guestfs_blkid (guestfs_h *g,
               const char *device);

This command returns block device attributes for device. The following fields are usually present in the returned hash โ€” and heads up, other fields may also be present ๐Ÿ‘€

  • UUID โ€” the uuid of this device.
  • LABEL โ€” the label of this device.
  • VERSION โ€” the version of blkid command.
  • TYPE โ€” the filesystem type or RAID of this device.
  • USAGE โ€” the usage of this device, for example filesystem or raid.

This function hands you back a NULL-terminated array of strings, or NULL if something went sideways ๐Ÿ˜ญ. The array is always exactly length 2n+1 โ€” that's n keys and values alternating, with the trailing NULL at the end, bestie. And the caller has to free the strings and the array after use, no cap.

(Added in 1.15.9)


guestfs_blockdev_flushbufs

int
guestfs_blockdev_flushbufs (guestfs_h *g,
                            const char *device);

Tells the kernel to flush all the internal buffers chillin' on device ๐Ÿ’….

This one uses the blockdev(8) command.

Returns 0 on success or -1 on error.

(Added in 1.9.3)


guestfs_blockdev_getbsz

int
guestfs_blockdev_getbsz (guestfs_h *g,
                         const char *device);

Returns the block size of a device.

Okay so heads up ๐Ÿซถ โ€” this is not the same as the size in blocks, and it's not the filesystem block size either. Also this setting isn't really used by anything?? Should probably not use it for anything, ngl. Filesystems have their own whole opinion about what block size to pick.

This one uses the blockdev(8) command.

On error it returns -1.

(Added in 1.9.3)


guestfs_blockdev_getro

int
guestfs_blockdev_getro (guestfs_h *g,
                        const char *device);

Returns a boolean telling you if the block device is read-only โ€” true if it's read-only, false if it isn't โœจ.

This one uses the blockdev(8) command.

Returns a C truth value on success or -1 on error.

(Added in 1.9.3)


guestfs_blockdev_getsize64

int64_t
guestfs_blockdev_getsize64 (guestfs_h *g,
                            const char *device);

Returns the size of the device in bytes ๐ŸŽ€.

See also guestfs_blockdev_getsz.

This one uses the blockdev(8) command.

On error it returns -1.

(Added in 1.9.3)


guestfs_blockdev_getss

int
guestfs_blockdev_getss (guestfs_h *g,
                        const char *device);

Returns the size of the sectors on a block device. Usually 512, but modern devices can be bigger ๐Ÿ’….

(Okay but like โ€” this is not the size in sectors, bestie. If that's what you want, use guestfs_blockdev_getsz.)

This one uses the blockdev(8) command.

On error it returns -1.

(Added in 1.9.3)


guestfs_blockdev_getsz

int64_t
guestfs_blockdev_getsz (guestfs_h *g,
                        const char *device);

Returns the size of the device in units of 512-byte sectors โ€” even if the sector size isn't actually 512 bytes... weird, I know ๐Ÿ˜ญ.

See also guestfs_blockdev_getss for the real sector size of the device, and guestfs_blockdev_getsize64 for the way more useful size in bytes.

This one uses the blockdev(8) command.

On error it returns -1.

(Added in 1.9.3)


guestfs_blockdev_rereadpt

int
guestfs_blockdev_rereadpt (guestfs_h *g,
                           const char *device);

Rereads the partition table on device ๐Ÿ’ซ.

This one uses the blockdev(8) command.

Returns 0 on success or -1 on error.

(Added in 1.9.3)


guestfs_blockdev_setbsz

int
guestfs_blockdev_setbsz (guestfs_h *g,
                         const char *device,
                         int blocksize);
โš ๏ธ Bestie, this function is deprecated. There is no replacement. Consult the API documentation in guestfs(3) for further information.

Deprecated functions don't get yeeted from the API, but the fact that they're deprecated means there are problems with using them correctly โ€” so like, be careful ๐Ÿ’€.

This call does nothing, and it has actually never done anything because of a bug in blockdev. Do not use it. Periodt.

If you genuinely need to set the filesystem block size, use the blocksize option of guestfs_mkfs ๐ŸŒธ.

Returns 0 on success or -1 on error.

(Added in 1.9.3)


guestfs_blockdev_setra

int
guestfs_blockdev_setra (guestfs_h *g,
                        const char *device,
                        int sectors);

Sets readahead (in 512-byte sectors) for the device ๐Ÿ‘‘.

This one uses the blockdev(8) command.

Returns 0 on success or -1 on error.

(Added in 1.29.10)


guestfs_blockdev_setro

int
guestfs_blockdev_setro (guestfs_h *g,
                        const char *device);

Sets the block device named device to read-only ๐Ÿ”’.

This one uses the blockdev(8) command.

Returns 0 on success or -1 on error.

(Added in 1.9.3)


guestfs_blockdev_setrw

int
guestfs_blockdev_setrw (guestfs_h *g,
                        const char *device);

Sets the block device named device to read-write ๐Ÿ”“.

This one uses the blockdev(8) command.

Returns 0 on success or -1 on error.

(Added in 1.9.3)


guestfs_btrfs_balance_cancel

int
guestfs_btrfs_balance_cancel (guestfs_h *g,
                              const char *path);

Cancels a running balance on a btrfs filesystem ๐Ÿ›‘.

Returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.22)


guestfs_btrfs_balance_pause

int
guestfs_btrfs_balance_pause (guestfs_h *g,
                             const char *path);

Pauses a running balance on a btrfs filesystem โธ๏ธ.

Returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.22)


guestfs_btrfs_balance_resume

int
guestfs_btrfs_balance_resume (guestfs_h *g,
                              const char *path);

Resumes a paused balance on a btrfs filesystem โ–ถ๏ธ.

Returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.22)


guestfs_btrfs_balance_status

struct guestfs_btrfsbalance *
guestfs_btrfs_balance_status (guestfs_h *g,
                              const char *path);

Shows the status of a running or paused balance on a btrfs filesystem ๐Ÿ‘€.

Returns a struct guestfs_btrfsbalance *, or NULL if there was an error. And the caller must call guestfs_free_btrfsbalance after use ๐Ÿซถ.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.26)


guestfs_btrfs_device_add

int
guestfs_btrfs_device_add (guestfs_h *g,
                          char *const *devices,
                          const char *fs);

Adds the list of device(s) in devices to the btrfs filesystem mounted at fs โœจ. If devices is an empty list, this literally does nothing.

Returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.17.35)


guestfs_btrfs_device_delete

int
guestfs_btrfs_device_delete (guestfs_h *g,
                             char *const *devices,
                             const char *fs);

Removes the devices from the btrfs filesystem mounted at fs ๐Ÿ’…. If devices is an empty list, this does nothing.

Returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.17.35)


guestfs_btrfs_filesystem_balance

int
guestfs_btrfs_filesystem_balance (guestfs_h *g,
                                  const char *fs);

Balances the chunks in the btrfs filesystem mounted at fs across the underlying devices โš–๏ธ.

Returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.17.35)


guestfs_btrfs_filesystem_defragment

int
guestfs_btrfs_filesystem_defragment (guestfs_h *g,
                                     const char *path,
                                     ...);

You can pass this call a whole list of optional arguments ๐ŸŽ€. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS.

GUESTFS_BTRFS_FILESYSTEM_DEFRAGMENT_FLUSH, int flush,
GUESTFS_BTRFS_FILESYSTEM_DEFRAGMENT_COMPRESS, const char *compress,

Defragments a file or directory on a btrfs filesystem. compress is one of zlib or lzo โœจ.

Returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.22)


guestfs_btrfs_filesystem_defragment_va

int
guestfs_btrfs_filesystem_defragment_va (guestfs_h *g,
                                        const char *path,
                                        va_list args);

This is the va_list variant of guestfs_btrfs_filesystem_defragment ๐Ÿฆ‹.

See CALLS WITH OPTIONAL ARGUMENTS.


guestfs_btrfs_filesystem_defragment_argv

int
guestfs_btrfs_filesystem_defragment_argv (guestfs_h *g,
                                          const char *path,
                                          const struct guestfs_btrfs_filesystem_defragment_argv *optargs);

This is the argv variant of guestfs_btrfs_filesystem_defragment ๐Ÿฆ‹.

See CALLS WITH OPTIONAL ARGUMENTS.


guestfs_btrfs_filesystem_resize

int
guestfs_btrfs_filesystem_resize (guestfs_h *g,
                                 const char *mountpoint,
                                 ...);

You can pass this call a list of optional arguments ๐Ÿ’–. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS.

GUESTFS_BTRFS_FILESYSTEM_RESIZE_SIZE, int64_t size,

This command resizes a btrfs filesystem.

Okay so unlike other resize calls, the filesystem has to be mounted, and the parameter is the mountpoint, not the device (that's a requirement of btrfs itself, iykyk) ๐ŸŒ€.

The optional parameters are:

  • size โ€” the new size (in bytes) of the filesystem. If you omit it, the filesystem gets resized to the maximum size ๐ŸŒˆ.

See also btrfs(8).

Returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.11.17)


guestfs_btrfs_filesystem_resize_va

int
guestfs_btrfs_filesystem_resize_va (guestfs_h *g,
                                    const char *mountpoint,
                                    va_list args);

This is the va_list variant of guestfs_btrfs_filesystem_resize ๐Ÿ’œ.

See CALLS WITH OPTIONAL ARGUMENTS.


guestfs_btrfs_filesystem_resize_argv

int
guestfs_btrfs_filesystem_resize_argv (guestfs_h *g,
                                      const char *mountpoint,
                                      const struct guestfs_btrfs_filesystem_resize_argv *optargs);

This is the argv variant of guestfs_btrfs_filesystem_resize ๐Ÿ’œ.

See CALLS WITH OPTIONAL ARGUMENTS.

๐Ÿฆ‹ guestfs_btrfs_filesystem_show ๐Ÿฆ‹

char **
guestfs_btrfs_filesystem_show (guestfs_h *g,
                               const char *device);

Okay so this one shows you all the devices that the filesystems in device are spanned over. If not all the devices for the filesystems are present, then this function fails and the errno is set to ENODEV โ€” no cap, that's the vibe check it does. ๐Ÿ˜ญ

It returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use โ€” yes, bestie, cleanup is your moment. ๐Ÿซถ

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.33.29)


๐Ÿ’… guestfs_btrfs_filesystem_sync ๐Ÿ’…

int
guestfs_btrfs_filesystem_sync (guestfs_h *g,
                               const char *fs);

Force sync on the btrfs filesystem mounted at fs. It's giving โ€œflush the vibes to disk,โ€ honestly. โœจ

This function returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.17.35)


๐ŸŽ€ guestfs_btrfs_fsck โ€” deprecated, bestie ๐Ÿ˜ญ ๐ŸŽ€

int
guestfs_btrfs_fsck (guestfs_h *g,
                    const char *device,
                    ...);

This function is deprecated. In new code, use the guestfs_btrfs_scrub_full call instead. Not me being dramatic, it's literally in the manual. ๐Ÿ’€

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions. So likeโ€ฆ use the newer one, fr fr.

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS.

  • GUESTFS_BTRFS_FSCK_SUPERBLOCK, int64_t superblock,
  • GUESTFS_BTRFS_FSCK_REPAIR, int repair,

Used to check a btrfs filesystem, device is the device file where the filesystem is stored.

This function returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.17.43)


๐Ÿงš guestfs_btrfs_fsck_va ๐Ÿงš

int
guestfs_btrfs_fsck_va (guestfs_h *g,
                       const char *device,
                       va_list args);

This is the va_list variant of guestfs_btrfs_fsck.

See CALLS WITH OPTIONAL ARGUMENTS.


๐ŸŒˆ guestfs_btrfs_fsck_argv ๐ŸŒˆ

int
guestfs_btrfs_fsck_argv (guestfs_h *g,
                         const char *device,
                         const struct guestfs_btrfs_fsck_argv *optargs);

This is the argv variant of guestfs_btrfs_fsck.

See CALLS WITH OPTIONAL ARGUMENTS.


๐Ÿ“ guestfs_btrfs_image ๐Ÿ“

int
guestfs_btrfs_image (guestfs_h *g,
                     char *const *source,
                     const char *image,
                     ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS.

  • GUESTFS_BTRFS_IMAGE_COMPRESSLEVEL, int compresslevel,

This is used to create an image of a btrfs filesystem. All data will be zeroed, but metadata and the like is preserved. Iconic behavior: wipe the data, keep the lore. ๐Ÿ‘‘

This function returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.32)


๐Ÿฆ‹ guestfs_btrfs_image_va ๐Ÿฆ‹

int
guestfs_btrfs_image_va (guestfs_h *g,
                        char *const *source,
                        const char *image,
                        va_list args);

This is the va_list variant of guestfs_btrfs_image.

See CALLS WITH OPTIONAL ARGUMENTS.


๐ŸŒธ guestfs_btrfs_image_argv ๐ŸŒธ

int
guestfs_btrfs_image_argv (guestfs_h *g,
                          char *const *source,
                          const char *image,
                          const struct guestfs_btrfs_image_argv *optargs);

This is the argv variant of guestfs_btrfs_image.

See CALLS WITH OPTIONAL ARGUMENTS.


๐Ÿ’œ guestfs_btrfs_qgroup_assign ๐Ÿ’œ

int
guestfs_btrfs_qgroup_assign (guestfs_h *g,
                             const char *src,
                             const char *dst,
                             const char *path);

Add qgroup src to parent qgroup dst. This command can group several qgroups into a parent qgroup to share common limit. It's giving โ€œfound family, but for quota groups.โ€ ๐Ÿซถ

This function returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.17)


โœจ guestfs_btrfs_qgroup_create โœจ

int
guestfs_btrfs_qgroup_create (guestfs_h *g,
                             const char *qgroupid,
                             const char *subvolume);

Create a quota group (qgroup) for subvolume at subvolume. Main character energy for your quota setup, lowkey. ๐Ÿ’…

This function returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.17)


๐Ÿ˜ญ guestfs_btrfs_qgroup_destroy ๐Ÿ˜ญ

int
guestfs_btrfs_qgroup_destroy (guestfs_h *g,
                              const char *qgroupid,
                              const char *subvolume);

Destroy a quota group. Not me ending a quota groupโ€™s whole career. ๐Ÿ’€

This function returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.17)


๐Ÿ”ฅ guestfs_btrfs_qgroup_limit ๐Ÿ”ฅ

int
guestfs_btrfs_qgroup_limit (guestfs_h *g,
                            const char *subvolume,
                            int64_t size);

Limit the size of the subvolume with path subvolume. Setting boundaries, bestie โ€” very healthy of you. โœจ

This function returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.17)


๐ŸŽ€ guestfs_btrfs_qgroup_remove ๐ŸŽ€

int
guestfs_btrfs_qgroup_remove (guestfs_h *g,
                             const char *src,
                             const char *dst,
                             const char *path);

Remove qgroup src from the parent qgroup dst. Un-grouping, but make it quota. ๐Ÿ™ˆ

This function returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.17)


๐Ÿซถ guestfs_btrfs_qgroup_show ๐Ÿซถ

struct guestfs_btrfsqgroup_list *
guestfs_btrfs_qgroup_show (guestfs_h *g,
                           const char *path);

Show all subvolume quota groups in a btrfs filesystem, including their usages. It's the receipts, basically. ๐Ÿงพโœจ

This function returns a struct guestfs_btrfsqgroup_list *, or NULL if there was an error. The caller must call guestfs_free_btrfsqgroup_list after use. Yes, free it after โ€” we don't leave memory just lying around, bestie. ๐Ÿ’–

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.17)


๐ŸŒˆ guestfs_btrfs_quota_enable ๐ŸŒˆ

int
guestfs_btrfs_quota_enable (guestfs_h *g,
                            const char *fs,
                            int enable);

Enable or disable subvolume quota support for filesystem which contains path. (Yes, the signature says fs, and the prose says path โ€” that's just how the page is, no cap.) ๐Ÿ™ˆ

This function returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.17)


๐Ÿ’€ guestfs_btrfs_quota_rescan ๐Ÿ’€

int
guestfs_btrfs_quota_rescan (guestfs_h *g,
                            const char *fs);

Trash all qgroup numbers and scan the metadata again with the current config. It's literally the โ€œdelete and redo the vibeโ€ of quota accounting. ๐Ÿ”ฅ

This function returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.17)


๐Ÿฆ‹ guestfs_btrfs_replace ๐Ÿฆ‹

int
guestfs_btrfs_replace (guestfs_h *g,
                       const char *srcdev,
                       const char *targetdev,
                       const char *mntpoint);

Replace device of a btrfs filesystem. On a live filesystem, duplicate the data to the target device which is currently stored on the source device. After completion of the operation, the source device is wiped out and removed from the filesystem.

The targetdev needs to be same size or larger than the srcdev. Devices which are currently mounted are never allowed to be used as the targetdev. That's a hard no, bestie. ๐Ÿšซ๐Ÿ’…

This function returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.48)


๐Ÿงš guestfs_btrfs_rescue_chunk_recover ๐Ÿงš

int
guestfs_btrfs_rescue_chunk_recover (guestfs_h *g,
                                    const char *device);

Recover the chunk tree of btrfs filesystem by scanning the devices one by one. Detective mode: activated. ๐Ÿ”โœจ

This function returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.22)


๐ŸŒธ guestfs_btrfs_rescue_super_recover ๐ŸŒธ

int
guestfs_btrfs_rescue_super_recover (guestfs_h *g,
                                    const char *device);

Recover bad superblocks from good copies. It's giving โ€œbackup bestie saves the day.โ€ ๐Ÿซถ

This function returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.22)


๐ŸŽ€ guestfs_btrfs_scrub_cancel ๐ŸŽ€

int
guestfs_btrfs_scrub_cancel (guestfs_h *g,
                            const char *path);

Cancel a running scrub on a btrfs filesystem. Stop the scrub, it's not the moment. โœ‹๐Ÿ˜ญ

This function returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.29.22)


โญ guestfs_btrfs_scrub_full โญ

int
guestfs_btrfs_scrub_full (guestfs_h *g,
                          const char *path,
                          ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS.

  • GUESTFS_BTRFS_SCRUB_FULL_READONLY, int readonly,

Run a full scrub on a btrfs filesystem and wait for it to finish. If the filesystem has errors this will return an error. So like, it's thorough and it will tell you if things are not slaying. ๐Ÿ’…

This function returns 0 on success or -1 on error.

This function depends on the feature btrfs. See also guestfs_feature_available.

(Added in 1.55.12)


๐Ÿฆ‹ guestfs_btrfs_scrub_full_va ๐Ÿฆ‹

int
guestfs_btrfs_scrub_full_va (guestfs_h *g,
                             const char *path,
                             va_list args);

This is the va_list variant of guestfs_btrfs_scrub_full.

See CALLS WITH OPTIONAL ARGUMENTS.


๐ŸŒˆ guestfs_btrfs_scrub_full_argv ๐ŸŒˆ

int
guestfs_btrfs_scrub_full_argv (guestfs_h *g,
                               const char *path,
                               const struct guestfs_btrfs_scrub_full_argv *optargs);

This is the argv variant of guestfs_btrfs_scrub_full.

See CALLS WITH OPTIONAL ARGUMENTS.


๐Ÿ’œ guestfs_btrfs_scrub_resume ๐Ÿ’œ

int
guestfs_btrfs_scrub_resume (guestfs_h *g,
                            const char *path);

Resume a previously canceled or interrupted scrub on a btrfs filesystem.

Returns 0 on success, -1 on error.

Depends on the feature "btrfs". See also guestfs_feature_available.

(Added in 1.29.22)


guestfs_btrfs_scrub_start

int
guestfs_btrfs_scrub_start (guestfs_h *g,
                           const char *path);

Reads all the data and metadata on the filesystem, and uses checksums plus the duplicate copies from RAID storage to identify and repair any corrupt data. It's giving very thorough bestie energy โœจ

Returns 0 on success, -1 on error.

Depends on the feature "btrfs". See also guestfs_feature_available.

(Added in 1.29.22)


guestfs_btrfs_scrub_status

struct guestfs_btrfsscrub *
guestfs_btrfs_scrub_status (guestfs_h *g,
                            const char *path);

Shows you the status of a running or finished scrub on a btrfs filesystem.

Returns a struct guestfs_btrfsscrub *, or NULL if something went wrong ๐Ÿ˜ญ. The caller must call guestfs_free_btrfsscrub after use โ€” no leaving it lying around, bestie.

Depends on the feature "btrfs". See also guestfs_feature_available.

(Added in 1.29.26)


guestfs_btrfs_set_seeding

int
guestfs_btrfs_set_seeding (guestfs_h *g,
                           const char *device,
                           int seeding);

Turns the seeding feature on or off for a device that contains a btrfs filesystem.

Returns 0 on success, -1 on error.

Depends on the feature "btrfs". See also guestfs_feature_available.

(Added in 1.17.43)


guestfs_btrfs_subvolume_create

int
guestfs_btrfs_subvolume_create (guestfs_h *g,
                                const char *dest);

This one's here purely for backwards compatibility with earlier versions of libguestfs ๐Ÿซถ โ€” it literally just calls guestfs_btrfs_subvolume_create_opts with no optional arguments. That's it. That's the whole function.

(Added in 1.17.35)


guestfs_btrfs_subvolume_create_opts

int
guestfs_btrfs_subvolume_create_opts (guestfs_h *g,
                                     const char *dest,
                                     ...);

You can pass a list of optional arguments here ๐Ÿ’… Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS.

GUESTFS_BTRFS_SUBVOLUME_CREATE_OPTS_QGROUPID, const char *qgroupid,

Creates a btrfs subvolume. The dest argument is the destination directory and the name of the subvolume, in the form /path/to/dest/name. The optional parameter qgroupid represents the qgroup which the newly created subvolume will be added to.

Returns 0 on success, -1 on error.

Depends on the feature "btrfs". See also guestfs_feature_available.

(Added in 1.17.35)


guestfs_btrfs_subvolume_create_opts_va

int
guestfs_btrfs_subvolume_create_opts_va (guestfs_h *g,
                                        const char *dest,
                                        va_list args);

This is the va_list variant of guestfs_btrfs_subvolume_create_opts ๐ŸŽ€

See CALLS WITH OPTIONAL ARGUMENTS.


guestfs_btrfs_subvolume_create_opts_argv

int
guestfs_btrfs_subvolume_create_opts_argv (guestfs_h *g,
                                          const char *dest,
                                          const struct guestfs_btrfs_subvolume_create_opts_argv *optargs);

This is the argv variant of guestfs_btrfs_subvolume_create_opts ๐ŸŽ€

See CALLS WITH OPTIONAL ARGUMENTS.


guestfs_btrfs_subvolume_delete

int
guestfs_btrfs_subvolume_delete (guestfs_h *g,
                                const char *subvolume);

Deletes the named btrfs subvolume or snapshot. Gone. Poof ๐Ÿ’€

Returns 0 on success, -1 on error.

Depends on the feature "btrfs". See also guestfs_feature_available.

(Added in 1.17.35)


guestfs_btrfs_subvolume_get_default

int64_t
guestfs_btrfs_subvolume_get_default (guestfs_h *g,
                                     const char *fs);

Gets the default subvolume or snapshot of a filesystem mounted at mountpoint ๐Ÿ‘‘

On error this function returns -1.

Depends on the feature "btrfs". See also guestfs_feature_available.

(Added in 1.29.17)


guestfs_btrfs_subvolume_list

struct guestfs_btrfssubvolume_list *
guestfs_btrfs_subvolume_list (guestfs_h *g,
                              const char *fs);

Lists the btrfs snapshots and subvolumes of the btrfs filesystem that's mounted at fs ๐ŸŒธ

Returns a struct guestfs_btrfssubvolume_list *, or NULL if there was an error. The caller must call guestfs_free_btrfssubvolume_list after use โ€” the cleanup is not optional, bestie!

Depends on the feature "btrfs". See also guestfs_feature_available.

(Added in 1.17.35)


guestfs_btrfs_subvolume_set_default

int
guestfs_btrfs_subvolume_set_default (guestfs_h *g,
                                     int64_t id,
                                     const char *fs);

Sets which subvolume of the btrfs filesystem fs gets mounted by default ๐ŸŽ€ Peep guestfs_btrfs_subvolume_list to get yourself a list of subvolumes first.

Returns 0 on success, -1 on error.

Depends on the feature "btrfs". See also guestfs_feature_available.

(Added in 1.17.35)


guestfs_btrfs_subvolume_show

char **
guestfs_btrfs_subvolume_show (guestfs_h *g,
                              const char *subvolume);

Returns detailed info about the subvolume ๐Ÿ“‹

Returns a NULL-terminated array of strings, or NULL if there was an error. The array of strings will always have length 2n+1, where n keys and values alternate, followed by the trailing NULL entry. The caller must free the strings and the array after use โ€” both, bestie, don't do half the job ๐Ÿ’…

Depends on the feature "btrfs". See also guestfs_feature_available.

(Added in 1.29.17)


guestfs_btrfs_subvolume_snapshot

int
guestfs_btrfs_subvolume_snapshot (guestfs_h *g,
                                  const char *source,
                                  const char *dest);

Another backwards-compatibility icon ๐Ÿซถ โ€” this one simply calls guestfs_btrfs_subvolume_snapshot_opts with no optional arguments.

(Added in 1.17.35)


guestfs_btrfs_subvolume_snapshot_opts

int
guestfs_btrfs_subvolume_snapshot_opts (guestfs_h *g,
                                       const char *source,
                                       const char *dest,
                                       ...);

Optional arguments go here โœจ Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS.

GUESTFS_BTRFS_SUBVOLUME_SNAPSHOT_OPTS_RO, int ro,
GUESTFS_BTRFS_SUBVOLUME_SNAPSHOT_OPTS_QGROUPID, const char *qgroupid,

Creates a snapshot of the btrfs subvolume source. The dest argument is the destination directory and the name of the snapshot, in the form /path/to/dest/name. By default the newly created snapshot is writable โ€” but if the value of the optional parameter ro is true, then a readonly snapshot is created. The optional parameter qgroupid represents the qgroup which the newly created snapshot will be added to.

Returns 0 on success, -1 on error.

Depends on the feature "btrfs". See also guestfs_feature_available.

(Added in 1.17.35)


guestfs_btrfs_subvolume_snapshot_opts_va

int
guestfs_btrfs_subvolume_snapshot_opts_va (guestfs_h *g,
                                          const char *source,
                                          const char *dest,
                                          va_list args);

This is the va_list variant of guestfs_btrfs_subvolume_snapshot_opts ๐ŸŽ€

See CALLS WITH OPTIONAL ARGUMENTS.


guestfs_btrfs_subvolume_snapshot_opts_argv

int
guestfs_btrfs_subvolume_snapshot_opts_argv (guestfs_h *g,
                                            const char *source,
                                            const char *dest,
                                            const struct guestfs_btrfs_subvolume_snapshot_opts_argv *optargs);

This is the argv variant of guestfs_btrfs_subvolume_snapshot_opts ๐ŸŽ€

See CALLS WITH OPTIONAL ARGUMENTS.


guestfs_btrfstune_enable_extended_inode_refs

int
guestfs_btrfstune_enable_extended_inode_refs (guestfs_h *g,
                                              const char *device);

This will Enable extended inode refs. Yes, capital E Enable, we're being dramatic about it ๐Ÿ’…

Returns 0 on success, -1 on error.

Depends on the feature "btrfs". See also guestfs_feature_available.

(Added in 1.29.29)


guestfs_btrfstune_enable_skinny_metadata_extent_refs

int
guestfs_btrfstune_enable_skinny_metadata_extent_refs (guestfs_h *g,
                                                      const char *device);

This enable skinny metadata extent refs. (Skinny metadata extent refs! Snatched. No notes โœจ)

Returns 0 on success, -1 on error.

Depends on the feature "btrfs". See also guestfs_feature_available.

(Added in 1.29.29)


guestfs_btrfstune_seeding

int
guestfs_btrfstune_seeding (guestfs_h *g,
                           const char *device,
                           int seeding);

Enables seeding of a btrfs device โ€” this will force the fs readonly so you can use it to build other filesystems ๐Ÿงš

Returns 0 on success, -1 on error.

Depends on the feature "btrfs". See also guestfs_feature_available.

(Added in 1.29.29)


guestfs_c_pointer

int64_t
guestfs_c_pointer (guestfs_h *g);

In non-C language bindings, this lets you grab the underlying C pointer to the handle (ie. guestfs_h *). The whole point is letting other libraries interwork with libguestfs ๐Ÿ”—

On error this function returns -1.

(Added in 1.29.17)


guestfs_canonical_device_name

char *
guestfs_canonical_device_name (guestfs_h *g,
                               const char *device);

This utility function is a whole vibe check for device names ๐Ÿ’– It's what you want when displaying device names to the user โ€” it takes a bunch of irregular device names and hands them back in a consistent format:

  • /dev/hdX
  • /dev/vdX

These are returned as /dev/sdX. Note this works for device names and partition names. This is approximately the reverse of the algorithm described in BLOCK DEVICE NAMING.

  • /dev/mapper/VG-LV
  • /dev/dm-N

Converted to /dev/VG/LV form using guestfs_lvm_canonical_lv_name.

Other strings are returned unmodified. No glow-up needed, they're already fine ๐ŸŒˆ

This function returns a string, or NULL on error. The caller must free the returned string after use โ€” take care of your strings, bestie ๐Ÿซถ

  • guestfs_cap_get_file
char *
guestfs_cap_get_file (guestfs_h *g,
                      const char *path);

Okay so this one hands you back the Linux capabilities that are attached to path. The capability set comes back in text form (peep cap_to_text(3) for the deets). ๐Ÿ’…

If there's literally nothing attached to that file, you get an empty string back โ€” not an error, just vibes of emptiness. ๐Ÿซถ

It returns a string, or NULL on error. And bestie, you gotta free the returned string after you're done with it, that's on you.

This function depends on the feature "linuxcaps". See also "guestfs_feature_available".

(Added in 1.19.63)


  • guestfs_cap_set_file
int
guestfs_cap_set_file (guestfs_h *g,
                      const char *path,
                      const char *cap);

This one sets the Linux capabilities attached to path. The capabilities set cap should be passed in text form (check cap_from_text(3)). โœจ

Returns 0 on success or -1 on error.

This function depends on the feature "linuxcaps". See also "guestfs_feature_available".

(Added in 1.19.63)


  • guestfs_case_sensitive_path
char *
guestfs_case_sensitive_path (guestfs_h *g,
                             const char *path);

So this is the icon that resolves case insensitive paths on a filesystem that is case sensitive. The whole use case? You got paths you read out of Windows configuration files or the Windows Registry, and you need the actual true path. ๐ŸŽ€

It handles a truly peculiar little quirk of the Linux ntfs-3g filesystem driver (and probably others too, ngl): even though the underlying filesystem is case-insensitive, the driver exports the filesystem to Linux as case-sensitive. The duality of man, honestly. ๐Ÿ˜ญ

One consequence of this is that special directories like C:\windows might show up as /WINDOWS or /windows (or literally whatever) depending on the exact details of how they were created. In Windows itself this wouldn't be a problem at all.

Bug or feature? You decide, bestie. See the relevant entry in the ntfs-3g FAQ: https://github.com/tuxera/ntfs-3g/wiki/NTFS-3G-FAQ

guestfs_case_sensitive_path tries to resolve the true case of each element in the path. It'll return a resolved path if either the full path or its parent directory exists. If the parent directory exists but the full path doesn't, the case of the parent directory gets correctly resolved, and the remainder is appended unmodified. So like, if the file /Windows/System32/netkvm.sys exists:

"guestfs_case_sensitive_path" ("/windows/system32/netkvm.sys")
    "Windows/System32/netkvm.sys"

"guestfs_case_sensitive_path" ("/windows/system32/NoSuchFile")
    "Windows/System32/NoSuchFile"

"guestfs_case_sensitive_path" ("/windows/system33/netkvm.sys")
    ERROR
Note: because of the behaviour above, guestfs_case_sensitive_path can not be used to check whether a file exists. Like, don't do that. ๐Ÿ’€
Note: this function does not handle drive names, backslashes etc. It's not that girl.

See also "guestfs_realpath".

It returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.0.75)


  • guestfs_cat
char *
guestfs_cat (guestfs_h *g,
             const char *path);

Returns the contents of the file named path. Simple, iconic, does what it says. ๐Ÿฑ

But here's the catch, bestie โ€” because in C this function returns a char *, there is genuinely no way to tell the difference between a "\0" character in a file and the end of the string. So for binary files, use the "guestfs_read_file" or "guestfs_download" functions instead. Please. ๐Ÿ™ˆ

It returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 0.4)


  • guestfs_checksum
char *
guestfs_checksum (guestfs_h *g,
                  const char *csumtype,
                  const char *path);

This call computes the MD5, SHAx or CRC checksum of the file named path. Get you a function that can do it all. ๐Ÿ’…

The type of checksum is given by the csumtype parameter, which must be one of these beauties:

  • "crc" โ€” computes the cyclic redundancy check (CRC) specified by POSIX for the cksum command.
  • "gost", "gost12" โ€” computes the checksum using GOST R34.11-94 or GOST R34.11-2012 message digest.
  • "md5" โ€” computes the MD5 hash (using the md5sum(1) program).
  • "sha1" โ€” computes the SHA1 hash (using the sha1sum(1) program).
  • "sha224" โ€” computes the SHA224 hash (using the sha224sum(1) program).
  • "sha256" โ€” computes the SHA256 hash (using the sha256sum(1) program).
  • "sha384" โ€” computes the SHA384 hash (using the sha384sum(1) program).
  • "sha512" โ€” computes the SHA512 hash (using the sha512sum(1) program).

The checksum comes back as a printable string. ๐Ÿฆ‹

Wanna get the checksum for a device? Use "guestfs_checksum_device".

Wanna get checksums for many files? Use "guestfs_checksums_out".

It returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.0.2)


  • guestfs_checksum_device
char *
guestfs_checksum_device (guestfs_h *g,
                         const char *csumtype,
                         const char *device);

This call computes the MD5, SHAx or CRC checksum of the contents of the device named device. For all the checksum types supported, go look at the "guestfs_checksum" command โ€” same menu, different target. ๐Ÿ”ฅ

It returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.3.2)


  • guestfs_checksums_out
int
guestfs_checksums_out (guestfs_h *g,
                       const char *csumtype,
                       const char *directory,
                       const char *sumsfile);

This command computes the checksums of all regular files in the directory and then emits a list of those checksums to the local output file sumsfile. Bulk energy, we love to see it. โœจ

This can be used for verifying the integrity of a virtual machine. But to be properly secure, you should really pay attention to the output of the checksum command (it uses the ones from GNU coreutils). Specifically, when the filename isn't printable, coreutils uses a special backslash syntax. For more info, see the GNU coreutils info file. ๐Ÿซถ

Returns 0 on success or -1 on error.

(Added in 1.3.7)


  • guestfs_chmod
int
guestfs_chmod (guestfs_h *g,
               int mode,
               const char *path);

Changes the mode (permissions) of path to mode. Only numeric modes are supported โ€” no rwxr-xr-x shortcuts here, sorry babe. ๐Ÿ’…

Note: when you're using this command from guestfish, mode by default would be decimal โ€” unless you prefix it with 0 to get octal. So use 0700, not 700. This trips everyone up, no cap.

The mode actually set is affected by the umask. ๐Ÿ˜Œ

Returns 0 on success or -1 on error.

(Added in 0.8)


  • guestfs_chown
int
guestfs_chown (guestfs_h *g,
               int owner,
               int group,
               const char *path);

Changes the file owner to owner and group to group. ๐Ÿ‘‘

Only numeric uid and gid are supported. If you wanna use names, you'll need to locate and parse the password file yourself โ€” Augeas support makes this relatively easy, bestie. ๐ŸŽ€

Returns 0 on success or -1 on error.

(Added in 0.8)


  • guestfs_clear_backend_setting
int
guestfs_clear_backend_setting (guestfs_h *g,
                               const char *name);

If there's a backend setting string matching name or beginning with name=, then that string gets yeeted from the backend settings. ๐Ÿ—‘๏ธ

This call returns the number of strings that were removed (which may be 0, 1, or greater than 1). Surprise โ€” it could be multiple, so don't assume. ๐Ÿ™ˆ

See "BACKEND", "BACKEND SETTINGS".

On error this function returns -1.

(Added in 1.27.2)


  • guestfs_clevis_luks_unlock
int
guestfs_clevis_luks_unlock (guestfs_h *g,
                            const char *device,
                            const char *mapname);

This command opens a block device that's been encrypted according to the Linux Unified Key Setup (LUKS) standard, using network-bound disk encryption (NBDE). Fancy stuff. ๐Ÿ”

device is the encrypted block device.

The appliance will connect to the Tang servers noted in the tree of Clevis pins that's bound to a keyslot of the LUKS header. The Clevis pin tree may comprise "sss" (redundancy) pins as internal nodes (optionally), and "tang" pins as leaves. "tpm2" pins are not supported, just so we're clear. The appliance unlocks the encrypted block device by combining responses from the Tang servers with metadata from the LUKS header โ€” so there's no "key" parameter at all, it's giving keyless.

This command will fail if networking hasn't been enabled for the appliance. Refer to "guestfs_set_network". ๐Ÿ“ก

The command creates a new block device called /dev/mapper/mapname. Reads and writes to this block device are decrypted from and encrypted to the underlying device respectively. Close the decrypted block device with "guestfs_cryptsetup_close". ๐Ÿ”ฅ

mapname cannot be "control" โ€” that name is reserved by device-mapper, so hands off. ๐Ÿ’€

If this block device contains LVM volume groups, then calling "guestfs_lvm_scan" with the "activate" parameter "true" will make them visible.

Use "guestfs_list_dm_devices" to list all device mapper devices. ๐ŸŒˆ

Returns 0 on success or -1 on error.

This function depends on the feature "clevisluks". See also "guestfs_feature_available".

(Added in 1.49.3)


  • guestfs_command
char *
guestfs_command (guestfs_h *g,
                 char *const *arguments);

This call runs a command from the guest filesystem. The filesystem has to be mounted, and it must contain a compatible operating system (like, something Linux, with the same or compatible processor architecture). ๐Ÿง

The single parameter is an argv-style list of arguments. The first element is the name of the program to run. Subsequent elements are parameters. The list must be non-empty (so it must contain a program name). And heads up โ€” the command runs directly, it is not invoked via the shell (for that you want "guestfs_sh" โ€” different vibe). ๐Ÿ’…

The return value is whatever the command printed to stdout. ๐Ÿซถ

If the command returns a non-zero exit status, then this function returns an error message. The error message string is the content of stderr from the command. So stderr becomes your error message, iconic behaviour honestly.

The $PATH environment variable will contain at least /usr/bin and /bin. If you need a program from some other location, provide the full path in the first parameter. ๐ŸŽ€

Shared libraries and data files that the program needs must be available on filesystems that are mounted in the correct places. It's the caller's responsibility to make sure all filesystems that are needed are mounted at the right locations, so like, that's on you bestie. ๐ŸŒธ

It returns a string, or NULL on error. The caller must free the returned string after use.

Because of the message protocol, there's a transfer limit of somewhere between 2MB and 4MB. See "PROTOCOL LIMITS". Plan accordingly. ๐Ÿ˜ญ

(Added in 1.9.1)

๐Ÿ’… guestfs_command_lines

char **
guestfs_command_lines (guestfs_h *g,
                       char *const *arguments);

Okay so this is literally guestfs_command but it splits the result into a list of lines. Same energy, different shape. ๐ŸŽ€

See also: guestfs_sh_lines

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use โ€” yes bestie, all of it, don't leave me hanging. ๐Ÿซถ

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See PROTOCOL LIMITS. (It's giving "small but mighty" โ€” respect the boundaries fr fr.)

(Added in 1.9.1)


โœจ guestfs_command_out

int
guestfs_command_out (guestfs_h *g,
                     char *const *arguments,
                     const char *output);

Same as guestfs_command, but this one streams the output back, which handles the case where the output from the command is larger than the protocol limit. No cap, big output energy, we love to see it. ๐Ÿ’–

See also: guestfs_sh_out

This function returns 0 on success or -1 on error.

This long-running command can generate progress notification messages so that the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See GUESTFS_EVENT_PROGRESS. ๐Ÿฆ‹

(Added in 1.55.6)


๐ŸŒธ guestfs_compress_device_out

int
guestfs_compress_device_out (guestfs_h *g,
                             const char *ctype,
                             const char *device,
                             const char *zdevice,
                             ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS. ๐Ÿ“

  • GUESTFS_COMPRESS_DEVICE_OUT_LEVEL, int level,

This command compresses device and writes it out to the local file zdevice. ๐Ÿงš

The ctype and optional level parameters have the same meaning as in guestfs_compress_out.

This function returns 0 on success or -1 on error.

(Added in 1.13.15)


๐Ÿ’œ guestfs_compress_device_out_va

int
guestfs_compress_device_out_va (guestfs_h *g,
                                const char *ctype,
                                const char *device,
                                const char *zdevice,
                                va_list args);

This is the "va_list variant" of guestfs_compress_device_out. Same function, but make it va_list flavor. โœจ

See CALLS WITH OPTIONAL ARGUMENTS.


๐ŸŽ€ guestfs_compress_device_out_argv

int
guestfs_compress_device_out_argv (guestfs_h *g,
                                  const char *ctype,
                                  const char *device,
                                  const char *zdevice,
                                  const struct guestfs_compress_device_out_argv *optargs);

This is the "argv variant" of guestfs_compress_device_out. Same function, struct-shaped. ๐Ÿซถ

See CALLS WITH OPTIONAL ARGUMENTS.


๐Ÿ”ฅ guestfs_compress_out

int
guestfs_compress_out (guestfs_h *g,
                      const char *ctype,
                      const char *file,
                      const char *zfile,
                      ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS. ๐ŸŽฏ

  • GUESTFS_COMPRESS_OUT_LEVEL, int level,

This command compresses file and writes it out to the local file zfile.

The compression program used is controlled by the ctype parameter. Currently this includes: compress, gzip, bzip2, xz or lzop. Some compression types may not be supported by particular builds of libguestfs, in which case you will get an error containing the substring not supported. ๐Ÿ˜ญ (it's giving "unsupported era", not every build has every vibe.)

The optional level parameter controls compression level. The meaning and default for this parameter depends on the compression program being used.

This function returns 0 on success or -1 on error.

(Added in 1.13.15)


๐Ÿฆ‹ guestfs_compress_out_va

int
guestfs_compress_out_va (guestfs_h *g,
                         const char *ctype,
                         const char *file,
                         const char *zfile,
                         va_list args);

This is the "va_list variant" of guestfs_compress_out. ๐Ÿ’…

See CALLS WITH OPTIONAL ARGUMENTS.


๐ŸŒˆ guestfs_compress_out_argv

int
guestfs_compress_out_argv (guestfs_h *g,
                           const char *ctype,
                           const char *file,
                           const char *zfile,
                           const struct guestfs_compress_out_argv *optargs);

This is the "argv variant" of guestfs_compress_out. ๐Ÿ“

See CALLS WITH OPTIONAL ARGUMENTS.


๐Ÿ‘‘ guestfs_config

int
guestfs_config (guestfs_h *g,
                const char *hvparam,
                const char *hvvalue);

This can be used to add arbitrary hypervisor parameters of the form -param value. Actually it's not quite arbitrary โ€” we prevent you from setting some parameters which would interfere with parameters that we use. ๐Ÿšง (protecting the vibe, respectfully.)

The first character of hvparam string must be a - (dash). No dash? No dice.

hvvalue can be NULL.

This function returns 0 on success or -1 on error.

(Added in 0.3)


๐Ÿ’– guestfs_copy_attributes

int
guestfs_copy_attributes (guestfs_h *g,
                         const char *src,
                         const char *dest,
                         ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS. ๐Ÿ“‹

  • GUESTFS_COPY_ATTRIBUTES_ALL, int all,
  • GUESTFS_COPY_ATTRIBUTES_MODE, int mode,
  • GUESTFS_COPY_ATTRIBUTES_XATTRIBUTES, int xattributes,
  • GUESTFS_COPY_ATTRIBUTES_OWNERSHIP, int ownership,

Copy the attributes of a path (which can be a file or a directory) to another path. Iconic behavior, honestly.

By default no attribute is copied, so make sure to specify any (or all to copy everything). ๐Ÿ’€ (default is literally "copy nothing", so be intentional bestie.)

The optional arguments specify which attributes can be copied:

mode : Copy part of the file mode from source to destination. Only the UNIX permissions and the sticky/setuid/setgid bits can be copied. ๐ŸŽฏ

xattributes : Copy the Linux extended attributes (xattrs) from source to destination. This flag does nothing if the linuxxattrs feature is not available (see guestfs_feature_available). ๐Ÿงš

ownership : Copy the owner uid and the group gid of source to destination. ๐Ÿ‘‘

all : Copy all the attributes from source to destination. Enabling it enables all the other flags, if they are not specified already. ๐Ÿ’ฏ

This function returns 0 on success or -1 on error.

(Added in 1.25.21)


๐ŸŒŸ guestfs_copy_attributes_va

int
guestfs_copy_attributes_va (guestfs_h *g,
                            const char *src,
                            const char *dest,
                            va_list args);

This is the "va_list variant" of guestfs_copy_attributes. โœจ

See CALLS WITH OPTIONAL ARGUMENTS.


๐ŸŽ€ guestfs_copy_attributes_argv

int
guestfs_copy_attributes_argv (guestfs_h *g,
                              const char *src,
                              const char *dest,
                              const struct guestfs_copy_attributes_argv *optargs);

This is the "argv variant" of guestfs_copy_attributes. ๐Ÿซถ

See CALLS WITH OPTIONAL ARGUMENTS.


โญ guestfs_copy_device_to_device

int
guestfs_copy_device_to_device (guestfs_h *g,
                               const char *src,
                               const char *dest,
                               ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS. ๐Ÿ’ซ

  • GUESTFS_COPY_DEVICE_TO_DEVICE_SRCOFFSET, int64_t srcoffset,
  • GUESTFS_COPY_DEVICE_TO_DEVICE_DESTOFFSET, int64_t destoffset,
  • GUESTFS_COPY_DEVICE_TO_DEVICE_SIZE, int64_t size,
  • GUESTFS_COPY_DEVICE_TO_DEVICE_SPARSE, int sparse,
  • GUESTFS_COPY_DEVICE_TO_DEVICE_APPEND, int append,

The four calls guestfs_copy_device_to_device, guestfs_copy_device_to_file, guestfs_copy_file_to_device, and guestfs_copy_file_to_file let you copy from a source (device|file) to a destination (device|file). It's a whole little squad, honestly. ๐Ÿ‘ฏโ€โ™€๏ธ

Partial copies can be made since you can specify optionally the source offset, destination offset and size to copy. These values are all specified in bytes. If not given, the offsets both default to zero, and the size defaults to copying as much as possible until we hit the end of the source. ๐Ÿ“

The source and destination may be the same object. However overlapping regions may not be copied correctly. โš ๏ธ (heads up โ€” same object is allowed, overlapping regions is a no-go for correctness.)

If the destination is a file, it is created if required. If the destination file is not large enough, it is extended. ๐ŸŒฑ

If the destination is a file and the append flag is not set, then the destination file is truncated. If the append flag is set, then the copy appends to the destination file. The append flag currently cannot be set for devices. ๐Ÿšซ

If the sparse flag is true then the call avoids writing blocks that contain only zeroes, which can help in some situations where the backing disk is thin-provisioned. Note that unless the target is already zeroed, using this option will result in incorrect copying. ๐Ÿ’€ (for real, this one bites โ€” only use it if the target is already zeroed.)

This function returns 0 on success or -1 on error.

This long-running command can generate progress notification messages so that the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See GUESTFS_EVENT_PROGRESS. ๐Ÿฆ‹

(Added in 1.13.25)


๐ŸŒธ guestfs_copy_device_to_device_va

int
guestfs_copy_device_to_device_va (guestfs_h *g,
                                  const char *src,
                                  const char *dest,
                                  va_list args);

This is the "va_list variant" of guestfs_copy_device_to_device. ๐Ÿ’œ

See CALLS WITH OPTIONAL ARGUMENTS.


๐ŸŽ€ guestfs_copy_device_to_device_argv

int
guestfs_copy_device_to_device_argv (guestfs_h *g,
                                    const char *src,
                                    const char *dest,
                                    const struct guestfs_copy_device_to_device_argv *optargs);

This is the "argv variant" of guestfs_copy_device_to_device. โœจ

See CALLS WITH OPTIONAL ARGUMENTS.


๐Ÿ”ฅ guestfs_copy_device_to_file

int
guestfs_copy_device_to_file (guestfs_h *g,
                             const char *src,
                             const char *dest,
                             ...);

okay bestie, so for guestfs_copy_device_to_file you can hand it a lil list of optional args ๐Ÿ’… โ€” give it zero or more of these pairs, and then wrap the whole thing up with -1 all on its own. The deets live in "CALLS WITH OPTIONAL ARGUMENTS".

 GUESTFS_COPY_DEVICE_TO_FILE_SRCOFFSET, int64_t srcoffset,
 GUESTFS_COPY_DEVICE_TO_FILE_DESTOFFSET, int64_t destoffset,
 GUESTFS_COPY_DEVICE_TO_FILE_SIZE, int64_t size,
 GUESTFS_COPY_DEVICE_TO_FILE_SPARSE, int sparse,
 GUESTFS_COPY_DEVICE_TO_FILE_APPEND, int append,

For the big-picture vibe of what this call even does, go read guestfs_copy_device_to_device.

Returns 0 when it slays, -1 when it doesn't. Simple as that โœจ

Oh and heads up โ€” this is a long-running command, so it can spit out progress notification messages while it works so your caller can show a cute lil progress bar or indicator. To actually receive those, the caller has to register a progress event callback. See "GUESTFS_EVENT_PROGRESS" ๐Ÿซถ

(Added in 1.13.25)


guestfs_copy_device_to_file_va

 int
 guestfs_copy_device_to_file_va (guestfs_h *g,
                                 const char *src,
                                 const char *dest,
                                 va_list args);

This is the va_list variant of guestfs_copy_device_to_file, no cap ๐Ÿงš

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_copy_device_to_file_argv

 int
 guestfs_copy_device_to_file_argv (guestfs_h *g,
                                   const char *src,
                                   const char *dest,
                                   const struct guestfs_copy_device_to_file_argv *optargs);

This is the argv variant of guestfs_copy_device_to_file ๐Ÿ’–

See "CALLS WITH OPTIONAL ARGUMENTS".


guestfs_copy_file_to_device

 int
 guestfs_copy_file_to_device (guestfs_h *g,
                              const char *src,
                              const char *dest,
                              ...);

Optional args time again ๐ŸŒธ โ€” zero or more of these pairs, then a lonely -1 to close the list. "CALLS WITH OPTIONAL ARGUMENTS" has the full story.

 GUESTFS_COPY_FILE_TO_DEVICE_SRCOFFSET, int64_t srcoffset,
 GUESTFS_COPY_FILE_TO_DEVICE_DESTOFFSET, int64_t destoffset,
 GUESTFS_COPY_FILE_TO_DEVICE_SIZE, int64_t size,
 GUESTFS_COPY_FILE_TO_DEVICE_SPARSE, int sparse,
 GUESTFS_COPY_FILE_TO_DEVICE_APPEND, int append,

Again, guestfs_copy_device_to_device is where the general overview of this call lives.

Returns 0 on success, -1 on error.

Long-running command alert ๐Ÿ”ฅ โ€” it can generate progress notification messages so the caller can draw a progress bar or indicator. You gotta register a progress event callback to get them, though. See "GUESTFS_EVENT_PROGRESS".

(Added in 1.13.25)

guestfs_copy_file_to_device_va

 int
 guestfs_copy_file_to_device_va (guestfs_h *g,
                                 const char *src,
                                 const char *dest,
                                 va_list args);

The va_list variant of guestfs_copy_file_to_device โœจ

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_copy_file_to_device_argv

 int
 guestfs_copy_file_to_device_argv (guestfs_h *g,
                                   const char *src,
                                   const char *dest,
                                   const struct guestfs_copy_file_to_device_argv *optargs);

The argv variant of guestfs_copy_file_to_device ๐ŸŽ€

See "CALLS WITH OPTIONAL ARGUMENTS".


guestfs_copy_file_to_file

 int
 guestfs_copy_file_to_file (guestfs_h *g,
                            const char *src,
                            const char *dest,
                            ...);

You guessed it โ€” optional args ๐Ÿ’œ. Zero or more of these pairs, terminated by -1 on its own. Peep "CALLS WITH OPTIONAL ARGUMENTS".

 GUESTFS_COPY_FILE_TO_FILE_SRCOFFSET, int64_t srcoffset,
 GUESTFS_COPY_FILE_TO_FILE_DESTOFFSET, int64_t destoffset,
 GUESTFS_COPY_FILE_TO_FILE_SIZE, int64_t size,
 GUESTFS_COPY_FILE_TO_FILE_SPARSE, int sparse,
 GUESTFS_COPY_FILE_TO_FILE_APPEND, int append,

General overview of this call? That's guestfs_copy_device_to_device, bestie.

๐Ÿšจ real talk: this is not the function you want for copying files. Like, at all. This one copies blocks within existing files. For actual general file copying and moving, go use guestfs_cp, guestfs_cp_a, and guestfs_mv. Not me being dramatic โ€” the manpage literally says it. ๐Ÿ˜ญ

Returns 0 on success, -1 on error.

Long-running command, so yeah โ€” progress notification messages are a thing, and the caller can display a progress bar or indicator if they register a progress event callback. See "GUESTFS_EVENT_PROGRESS".

(Added in 1.13.25)

guestfs_copy_file_to_file_va

 int
 guestfs_copy_file_to_file_va (guestfs_h *g,
                               const char *src,
                               const char *dest,
                               va_list args);

The va_list variant of guestfs_copy_file_to_file ๐Ÿฆ‹

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_copy_file_to_file_argv

 int
 guestfs_copy_file_to_file_argv (guestfs_h *g,
                                 const char *src,
                                 const char *dest,
                                 const struct guestfs_copy_file_to_file_argv *optargs);

The argv variant of guestfs_copy_file_to_file โญ

See "CALLS WITH OPTIONAL ARGUMENTS".


guestfs_copy_in

 int
 guestfs_copy_in (guestfs_h *g,
                  const char *localpath,
                  const char *remotedir);

guestfs_copy_in copies local files or directories โ€” recursively, periodt โ€” into the disk image, dropping them into the directory called remotedir, which must exist already okay ๐Ÿ‘‘

Wildcards? Nope. Cannot be used. ๐Ÿ™ˆ

Returns 0 on success, -1 on error.

(Added in 1.29.24)


guestfs_copy_out

 int
 guestfs_copy_out (guestfs_h *g,
                   const char *remotepath,
                   const char *localdir);

guestfs_copy_out is the reverse girly ๐Ÿ’ซ โ€” copies remote files or directories recursively out of the disk image, landing them on the host disk in a local directory called localdir (which must exist).

Wanna download straight into the current directory? Use . like this:

"guestfs_copy_out" /home .

Wildcards cannot be used here either ๐Ÿšซ

Returns 0 on success, -1 on error.

(Added in 1.29.24)


guestfs_copy_size

 int
 guestfs_copy_size (guestfs_h *g,
                    const char *src,
                    const char *dest,
                    int64_t size);
๐Ÿ’€ This function is deprecated. In new code, use the guestfs_copy_device_to_device call instead. Like, for real for real.

And bestie, deprecated doesn't mean deleted โ€” deprecated functions will not be removed from the API. But the fact that they're deprecated is a giant neon sign saying there are problems with using these functions correctly. Soโ€ฆ heed the sign ๐ŸŒˆ

Anyway, this command copies exactly size bytes from one source device or file src to another destination device or file dest.

Important caveat: it will fail if the source is too short, or if the destination isn't large enough. No cap, it just gives up.

Returns 0 on success, -1 on error.

Long-running command โ€” progress notification messages possible, caller displays a progress bar or indicator, must register a progress event callback. See "GUESTFS_EVENT_PROGRESS".

(Added in 1.0.87)


guestfs_cp

 int
 guestfs_cp (guestfs_h *g,
             const char *src,
             const char *dest);

Copies a file from src to dest, and dest can be either a destination filename or a destination directory โ€” flexible icon behavior ๐Ÿ’…

Returns 0 on success, -1 on error.

(Added in 1.0.18)


guestfs_cp_a

 int
 guestfs_cp_a (guestfs_h *g,
               const char *src,
               const char *dest);

Copies a file or directory from src to dest recursively, using the cp -a command. Preserves the vibes (and the metadata) โœจ

Returns 0 on success, -1 on error.

(Added in 1.0.18)


guestfs_cp_r

 int
 guestfs_cp_r (guestfs_h *g,
               const char *src,
               const char *dest);

Copies a file or directory from src to dest recursively, but with cp -rP this time ๐ŸŒ€

Most users should use guestfs_cp_a instead, ngl. This one is the move when you don't want to preserve permissions โ€” like when the target filesystem just can't handle them (primarily when writing to DOS FAT filesystems).

Returns 0 on success, -1 on error.

(Added in 1.21.38)


guestfs_cpio_out

 int
 guestfs_cpio_out (guestfs_h *g,
                   const char *directory,
                   const char *cpiofile,
                   ...);

Optional args, yes queen ๐Ÿ‘‘ โ€” zero or more of the following pairs, then -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

 GUESTFS_CPIO_OUT_FORMAT, const char *format,

This command packs up the contents of directory and downloads it to the local file cpiofile ๐Ÿ“ฆ

The optional format parameter picks the format. Only these are currently permitted:

  • "newc" โ€” the New (SVR4) portable format. Fun fact: this format happens to be compatible with the cpio-like format the Linux kernel uses for initramfs. This is the default format. โญ
  • "crc" โ€” the New (SVR4) portable format with a checksum ๐Ÿงฎ

Returns 0 on success, -1 on error.

(Added in 1.27.9)

guestfs_cpio_out_va

 int
 guestfs_cpio_out_va (guestfs_h *g,
                      const char *directory,
                      const char *cpiofile,
                      va_list args);

The va_list variant of guestfs_cpio_out ๐ŸŒธ

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_cpio_out_argv

 int
 guestfs_cpio_out_argv (guestfs_h *g,
                        const char *directory,
                        const char *cpiofile,
                        const struct guestfs_cpio_out_argv *optargs);

The argv variant of guestfs_cpio_out ๐Ÿซถ

See "CALLS WITH OPTIONAL ARGUMENTS".


guestfs_cryptsetup_close

 int
 guestfs_cryptsetup_close (guestfs_h *g,
                           const char *device);

Closes an encrypted device that was created earlier by guestfs_cryptsetup_open ๐Ÿ”

Heads up though โ€” the device parameter must be the name of the mapping device (ie. /dev/mapper/mapname), not the name of the underlying block device. Get that wrong and it's giving chaos ๐Ÿ˜ญ

Returns 0 on success, -1 on error.

This function depends on the feature "luks". See also guestfs_feature_available ๐Ÿ‘€

(Added in 1.43.2)

๐Ÿ’– guestfs_cryptsetup_open

int
guestfs_cryptsetup_open (guestfs_h *g,
                         const char *device,
                         const char *key,
                         const char *mapname,
                         ...);

okay bestie, this one takes optional args, and you already know the drill: you can pass a list of them, zero or more of these pairs, and then you terminate the whole thing with -1 on its own. like, โ€œthatโ€™s all, bye.โ€ see "CALLS WITH OPTIONAL ARGUMENTS".

here are the exact pairs:

GUESTFS_CRYPTSETUP_OPEN_READONLY, int readonly,
GUESTFS_CRYPTSETUP_OPEN_CRYPTTYPE, const char *crypttype,
GUESTFS_CRYPTSETUP_OPEN_CIPHER, const char *cipher,

So what does it do? It opens a block device thatโ€™s been encrypted according to the Linux Unified Key Setup (LUKS) standard, Windows BitLocker, or some other types. very main character of it.

device is the encrypted block device or partition.

The caller must supply one of the keys associated with the encrypted block device, in the key parameter.

This creates a new block device called /dev/mapper/mapname. Reads and writes to this block device are decrypted from and encrypted to the underlying device respectively. literally the glow-up pipeline.

mapname cannot be control because that name is reserved by device-mapper. so donโ€™t even try it, bestie.

If the optional crypttype parameter is not present then libguestfs tries to guess the correct type (for example LUKS or BitLocker). However you can override this by specifying one of the following types:

  • "luks" โ€” a Linux LUKS device.
  • "bitlk" โ€” a Windows BitLocker device.

The optional readonly flag, if set to true, creates a read-only mapping.

The optional cipher parameter allows specifying which cipher to use.

If this block device contains LVM volume groups, then calling "guestfs_lvm_scan" with the "activate" parameter "true" will make them visible.

Use "guestfs_list_dm_devices" to list all device mapper devices.

This function returns 0 on success or -1 on error.

๐Ÿซถ This function takes a key or passphrase parameter which could contain sensitive material. Read the section "KEYS AND PASSPHRASES" for more information.

This function depends on the feature "luks". See also "guestfs_feature_available".

(Added in 1.43.2)


๐ŸŒธ guestfs_cryptsetup_open_va

int
guestfs_cryptsetup_open_va (guestfs_h *g,
                            const char *device,
                            const char *key,
                            const char *mapname,
                            va_list args);

This is the "va_list variant" of "guestfs_cryptsetup_open".

See "CALLS WITH OPTIONAL ARGUMENTS".


๐Ÿฆ‹ guestfs_cryptsetup_open_argv

int
guestfs_cryptsetup_open_argv (guestfs_h *g,
                              const char *device,
                              const char *key,
                              const char *mapname,
                              const struct guestfs_cryptsetup_open_argv *optargs);

This is the "argv variant" of "guestfs_cryptsetup_open".

See "CALLS WITH OPTIONAL ARGUMENTS".


๐Ÿ’€ guestfs_dd

int
guestfs_dd (guestfs_h *g,
            const char *src,
            const char *dest);

okay so this function is deprecated. in new code, use the "guestfs_copy_device_to_device" call instead. no cap.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions. so like, it still exists, but itโ€™s giving โ€œuse me at your own risk.โ€

This command copies from one source device or file src to another destination device or file dest. Normally you would use this to copy to or from a device or partition, for example to duplicate a filesystem.

If the destination is a device, it must be as large or larger than the source file or device, otherwise the copy will fail. This command cannot do partial copies (see "guestfs_copy_device_to_device"). so donโ€™t ask it for a little half-copy, it simply wonโ€™t.

This function returns 0 on success or -1 on error.

(Added in 1.0.80)


โœจ guestfs_device_index

int
guestfs_device_index (guestfs_h *g,
                      const char *device);

This function takes a device name (eg. "/dev/sdb") and returns the index of the device in the list of devices.

Index numbers start from 0. The named device must exist, for example as a string returned from "guestfs_list_devices".

See also "guestfs_list_devices", "guestfs_part_to_dev", "guestfs_device_name".

On error this function returns -1.

(Added in 1.19.7)


๐ŸŽ€ guestfs_device_name

char *
guestfs_device_name (guestfs_h *g,
                     int index);

This function takes a device index and returns the device name. For example index 0 will return the string "/dev/sda".

The drive index must have been added to the handle.

See also "guestfs_list_devices", "guestfs_part_to_dev", "guestfs_device_index".

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.49.1)


๐ŸŒˆ guestfs_df

char *
guestfs_df (guestfs_h *g);

This command runs the df(1) command to report disk space used.

This command is mostly useful for interactive sessions. It is not intended that you try to parse the output string. Use "guestfs_statvfs" from programs.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.0.54)


๐Ÿ“ guestfs_df_h

char *
guestfs_df_h (guestfs_h *g);

This command runs the "df -h" command to report disk space used in human-readable format.

This command is mostly useful for interactive sessions. It is not intended that you try to parse the output string. Use "guestfs_statvfs" from programs.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.0.54)


๐Ÿ‘‘ guestfs_disk_create

int
guestfs_disk_create (guestfs_h *g,
                     const char *filename,
                     const char *format,
                     int64_t size,
                     ...);

optional args time again, bestie. you may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

GUESTFS_DISK_CREATE_BACKINGFILE, const char *backingfile,
GUESTFS_DISK_CREATE_BACKINGFORMAT, const char *backingformat,
GUESTFS_DISK_CREATE_PREALLOCATION, const char *preallocation,
GUESTFS_DISK_CREATE_COMPAT, const char *compat,
GUESTFS_DISK_CREATE_CLUSTERSIZE, int clustersize,

Create a blank disk image called filename (a host file) with format "format" (usually "raw" or "qcow2"). The size is "size" bytes.

If used with the optional "backingfile" parameter, then a snapshot is created on top of the backing file. In this case, "size" must be passed as -1. The size of the snapshot is the same as the size of the backing file, which is discovered automatically. You are encouraged to also pass "backingformat" to describe the format of "backingfile".

If filename refers to a block device, then the device is formatted. The "size" is ignored since block devices have an intrinsic size.

The other optional parameters are:

  • "preallocation" โ€” if format is "raw", then this can be either "off" (or "sparse") or "full" to create a sparse or fully allocated file respectively. The default is "off".

If format is "qcow2", then this can be "off" (or "sparse"), "metadata" or "full". Preallocating metadata can be faster when doing lots of writes, but uses more space. The default is "off".

  • "compat" โ€” "qcow2" only: Pass the string 1.1 to use the advanced qcow2 format supported by qemu โ‰ฅ 1.1.
  • "clustersize" โ€” "qcow2" only: Change the qcow2 cluster size. The default is 65536 (bytes) and this setting may be any power of two between 512 and 2097152.

Note that this call does not add the new disk to the handle. You may need to call "guestfs_add_drive_opts" separately.

This function returns 0 on success or -1 on error.

(Added in 1.25.31)


๐Ÿงš guestfs_disk_create_va

int
guestfs_disk_create_va (guestfs_h *g,
                        const char *filename,
                        const char *format,
                        int64_t size,
                        va_list args);

This is the "va_list variant" of "guestfs_disk_create".

See "CALLS WITH OPTIONAL ARGUMENTS".


๐Ÿ’œ guestfs_disk_create_argv

int
guestfs_disk_create_argv (guestfs_h *g,
                          const char *filename,
                          const char *format,
                          int64_t size,
                          const struct guestfs_disk_create_argv *optargs);

This is the "argv variant" of "guestfs_disk_create".

See "CALLS WITH OPTIONAL ARGUMENTS".


๐Ÿ”ฅ guestfs_disk_format

char *
guestfs_disk_format (guestfs_h *g,
                     const char *filename);

Detect and return the format of the disk image called filename. filename can also be a host device, etc. If the format of the image could not be detected, then "unknown" is returned.

๐Ÿ’… Note that detecting the disk format can be insecure under some circumstances. See "CVE-2010-3851".

See also: "DISK IMAGE FORMATS"

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.19.38)


๐ŸŒŸ guestfs_disk_has_backing_file

int
guestfs_disk_has_backing_file (guestfs_h *g,
                               const char *filename);

Detect and return whether the disk image filename has a backing file.

๐Ÿ™ˆ Note that detecting disk features can be insecure under some circumstances. See "CVE-2010-3851".

This function returns a C truth value on success or -1 on error.

(Added in 1.19.39)


๐Ÿฆ„ guestfs_disk_virtual_size

int64_t
guestfs_disk_virtual_size (guestfs_h *g,
                           const char *filename);

Detect and return the virtual size in bytes of the disk image called filename.

๐Ÿ˜ญ Note that detecting disk features can be insecure under some circumstances. See "CVE-2010-3851".

On error this function returns -1.

(Added in 1.19.39)


๐Ÿ’ซ guestfs_dmesg

char *
guestfs_dmesg (guestfs_h *g);

This returns the kernel messages (dmesg(1) output) from the guest kernel. This is sometimes useful for extended debugging of problems. like a little peek into the group chat between kernel and hardware, honestly.

Another way to get the same information is to enable verbose messages with "guestfs_set_verbose" or by setting the environment variable "LIBGUESTFS_DEBUG=1" before running the program.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.0.18)


๐ŸŽง guestfs_download

int
guestfs_download (guestfs_h *g,
                  const char *remotefilename,
                  const char *filename);

Okay so wrapping up guestfs_download real quick since we were mid-sentence โ€” it pulls down remotefilename and saves it as filename on your local machine (yes bestie, the local one, not inside the guest, that's literally the whole point ๐Ÿ’…).

Cute detail: filename can also be a named pipe ๐ŸŽ€ (iykyk, super handy for streaming).

Besties to check out: guestfs_upload and guestfs_cat.

It returns 0 when everything slays, or -1 if it doesn't. And heads up โ€” this is a long-running command, so it can generate progress notification messages so your caller can show a progress bar or indicator. To actually receive them you gotta register a progress event callback โ€” see GUESTFS_EVENT_PROGRESS โœจ

(Added in 1.0.2)


guestfs_download_blocks ๐Ÿ’พ

int
guestfs_download_blocks (guestfs_h *g,
                         const char *device,
                         int64_t start,
                         int64_t stop,
                         const char *filename,
                         ...);

So you can hand this call a whole list of optional arguments โ€” just pass zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS.

GUESTFS_DOWNLOAD_BLOCKS_UNALLOCATED, int unallocated,

What it does: downloads the data units from start address to stop from the disk partition (eg. /dev/sda1) and saves them as filename on the local machine ๐ŸŒธ

Heads up: using this API on sparse disk image formats such as QCOW may result in large zero-filled files downloaded on the host. Lowkey not ideal, just so you know ๐Ÿ˜ญ

Fun fact: the size of a data unit varies across filesystem implementations. On NTFS filesystems data units are referred as clusters, while on ExtX ones they are referred as fragments ๐Ÿงš

And here's the tea on the optional unallocated flag: if it's true (default is false), only the unallocated blocks get extracted. That's super useful to detect hidden data or to retrieve deleted files whose data units haven't been overwritten yet ๐Ÿ‘‘

Returns 0 on success or -1 on error.

This long-running command can generate progress notification messages so the caller can display a progress bar or indicator โ€” to receive them, register a progress event callback. See GUESTFS_EVENT_PROGRESS.

This function depends on the feature sleuthkit. See also guestfs_feature_available.

(Added in 1.33.45)


guestfs_download_blocks_va ๐Ÿฆ‹

int
guestfs_download_blocks_va (guestfs_h *g,
                            const char *device,
                            int64_t start,
                            int64_t stop,
                            const char *filename,
                            va_list args);

This is the va_list variant of guestfs_download_blocks ๐Ÿ’œ

See CALLS WITH OPTIONAL ARGUMENTS.


guestfs_download_blocks_argv ๐ŸŒˆ

int
guestfs_download_blocks_argv (guestfs_h *g,
                              const char *device,
                              int64_t start,
                              int64_t stop,
                              const char *filename,
                              const struct guestfs_download_blocks_argv *optargs);

This is the argv variant of guestfs_download_blocks ๐Ÿ’œ

See CALLS WITH OPTIONAL ARGUMENTS.


guestfs_download_inode ๐Ÿ‘‘

int
guestfs_download_inode (guestfs_h *g,
                        const char *device,
                        int64_t inode,
                        const char *filename);

Downloads a file given its inode from the disk partition (eg. /dev/sda1) and saves it as filename on the local machine โœจ

Good news: it is not required to mount the disk to run this command ๐Ÿ™Œ

And the iconique part โ€” this command is capable of downloading deleted or inaccessible files. Main character energy fr fr ๐Ÿ”ฅ

Returns 0 on success or -1 on error.

This long-running command can generate progress notification messages so the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See GUESTFS_EVENT_PROGRESS.

This function depends on the feature sleuthkit. See also guestfs_feature_available.

(Added in 1.33.14)


guestfs_download_offset ๐ŸŽ€

int
guestfs_download_offset (guestfs_h *g,
                         const char *remotefilename,
                         const char *filename,
                         int64_t offset,
                         int64_t size);

Downloads file remotefilename and saves it as filename on the local machine ๐Ÿ’–

remotefilename is read for size bytes starting at offset โ€” and this region must be within the file or device, no exceptions bestie โญ

Note that there is no limit on the amount of data that can be downloaded with this call, unlike with guestfs_pread, and this call always reads the full amount unless an error occurs. The way it just commits to the bit, obsessed ๐Ÿ˜ญ

See also guestfs_download, guestfs_pread.

Returns 0 on success or -1 on error.

This long-running command can generate progress notification messages so the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See GUESTFS_EVENT_PROGRESS.

(Added in 1.5.17)


guestfs_drop_caches ๐Ÿ“

int
guestfs_drop_caches (guestfs_h *g,
                     int whattodrop);

This instructs the guest kernel to drop its page cache, and/or dentries and inode caches ๐Ÿงน The parameter whattodrop tells the kernel what precisely to drop โ€” more deets over at https://linux-mm.org/Drop_Caches.

Setting whattodrop to 3 should drop everything. (Yes, just 3. Iconic lil magic number ๐Ÿ’€)

Also it automatically calls sync(2) before the operation, so that the maximum guest memory is freed ๐ŸŒˆ

Returns 0 on success or -1 on error.

(Added in 1.0.18)


guestfs_du ๐ŸŒธ

int64_t
guestfs_du (guestfs_h *g,
            const char *path);

This command runs the du -s command to estimate file space usage for path ๐Ÿ’…

path can be a file or a directory. If path is a directory then the estimate includes the contents of the directory and all subdirectories (recursively). It goes all the way down, no cap ๐Ÿซถ

The result is the estimated size in kilobytes (ie. units of 1024 bytes).

On error this function returns -1.

This long-running command can generate progress notification messages so the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See GUESTFS_EVENT_PROGRESS.

(Added in 1.0.54)


guestfs_e2fsck ๐Ÿ”ง

int
guestfs_e2fsck (guestfs_h *g,
                const char *device,
                ...);

You may supply a list of optional arguments to this call โ€” use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS.

GUESTFS_E2FSCK_CORRECT, int correct,
GUESTFS_E2FSCK_FORCEALL, int forceall,
GUESTFS_E2FSCK_FORCENO, int forceno,

This runs the ext2/ext3 filesystem checker on device. It can take these optional arguments:

  • correct โ€” Automatically repair the file system. This option will cause e2fsck to automatically fix any filesystem problems that can be safely fixed without human intervention. > Careful bestie: this option may not be specified at the same time as the forceall or forceno options โš ๏ธ
  • forceall โ€” Assume an answer of โ€˜yesโ€™ to all questions; allows e2fsck to be used non-interactively. > This option may not be specified at the same time as the correct or forceno options โš ๏ธ
  • forceno โ€” Open the filesystem readonly and assume an answer of โ€˜noโ€™ to all questions; allows e2fsck to be used non-interactively. > This option may not be specified at the same time as the correct or forceall options โš ๏ธ

Returns 0 on success or -1 on error.

(Added in 1.15.17)


guestfs_e2fsck_va ๐Ÿฆ‹

int
guestfs_e2fsck_va (guestfs_h *g,
                   const char *device,
                   va_list args);

This is the va_list variant of guestfs_e2fsck ๐Ÿ’œ

See CALLS WITH OPTIONAL ARGUMENTS.


guestfs_e2fsck_argv ๐ŸŒˆ

int
guestfs_e2fsck_argv (guestfs_h *g,
                     const char *device,
                     const struct guestfs_e2fsck_argv *optargs);

This is the argv variant of guestfs_e2fsck ๐Ÿ’œ

See CALLS WITH OPTIONAL ARGUMENTS.


guestfs_e2fsck_f โš ๏ธ

int
guestfs_e2fsck_f (guestfs_h *g,
                  const char *device);

Okay so this function is deprecated. In new code, use the guestfs_e2fsck call instead ๐Ÿ™ˆ

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions. So like, it works, but maybe don't ๐Ÿ‘€

This runs e2fsck -p -f device, ie. runs the ext2/ext3 filesystem checker on device, noninteractively (-p), even if the filesystem appears to be clean (-f).

Returns 0 on success or -1 on error.

(Added in 1.0.29)


guestfs_echo_daemon ๐Ÿ“ก

char *
guestfs_echo_daemon (guestfs_h *g,
                     char *const *words);

This command concatenates the list of words passed with single spaces between them and returns the resulting string ๐Ÿซถ

You can use this command to test the connection through to the daemon, which is lowkey a vibe check for your whole setup โœจ

See also guestfs_ping_daemon.

This function returns a string, or NULL on error. The caller must free the returned string after use ๐Ÿ’…

(Added in 1.0.69)


guestfs_egrep ๐Ÿซง

char **
guestfs_egrep (guestfs_h *g,
               const char *regex,
               const char *path);

This function is deprecated. In new code, use the guestfs_grep call instead ๐Ÿ™ˆ

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This calls the external egrep(1) program and returns the matching lines ๐Ÿ’–

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See PROTOCOL LIMITS ๐Ÿ˜ญ

(Added in 1.0.66)


guestfs_egrepi ๐Ÿซง

char **
guestfs_egrepi (guestfs_h *g,
                const char *regex,
                const char *path);

This function is deprecated. In new code, use the guestfs_grep call instead ๐Ÿ™ˆ

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This calls the external egrep -i program and returns the matching lines โœจ (case-insensitive besties, iykyk)

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See PROTOCOL LIMITS ๐Ÿ˜ญ

(Added in 1.0.66)

๐ŸŒธ guestfs_equal

int
guestfs_equal (guestfs_h *g,
               const char *file1,
               const char *file2);

Okay so bestie, this one does exactly what it says on the tin ๐Ÿ’… โ€” it compares file1 and file2 and returns true if their content is exactly equal, false otherwise. No cap, that's the whole vibe.

It's lowkey cheating though, because under the hood it just runs the external cmp(1) program to do the comparison. Iconic delegation honestly.

Returns a C truth value on success, or -1 on error. ๐Ÿซถ

(Added in 1.0.18)


๐Ÿฆ‹ guestfs_exists

int
guestfs_exists (guestfs_h *g,
                const char *path);

Returns "true" if and only if there's a file, directory, or literally anything at all with the given path name. Like, anything. It exists, therefore it is โœจ

See also "guestfs_is_file", "guestfs_is_dir", "guestfs_stat" for the more specific glow-ups.

Returns a C truth value on success, or -1 on error.

(Added in 0.8)


๐ŸŽ€ guestfs_extlinux

int
guestfs_extlinux (guestfs_h *g,
                  const char *directory);

Installs the SYSLINUX bootloader on the device mounted at directory. The whole point of this one vs "guestfs_syslinux" is that "guestfs_syslinux" requires a FAT filesystem, but this baby can go on ext2/3/4 or btrfs. Main character energy fr fr ๐Ÿ‘‘

The directory parameter can be either a mountpoint, or a directory within the mountpoint. Versatile queen.

Okay but listen โ€” you also have to mark the partition as "active" (that's "guestfs_part_set_bootable"), and a Master Boot Record must be installed (eg. using "guestfs_pwrite_device") on the first sector of the whole disk. The SYSLINUX package comes with some suitable Master Boot Records, so like, don't panic. See the extlinux(1) man page for further info.

You can supply extra config to SYSLINUX by dropping a file called extlinux.conf on the filesystem under directory. For what goes inside that file, see extlinux(1) again.

See also "guestfs_syslinux".

Returns 0 on success or -1 on error.

Heads up: this function depends on the feature "extlinux". See also "guestfs_feature_available" to vibe check that first.

(Added in 1.21.27)


๐Ÿงš guestfs_f2fs_expand

int
guestfs_f2fs_expand (guestfs_h *g,
                     const char *device);

Expands an f2fs filesystem so it matches the size of the underlying device. Grow, bestie, grow ๐ŸŒฑ

Returns 0 on success or -1 on error.

Depends on the feature "f2fs". See also "guestfs_feature_available".

(Added in 1.39.3)


๐Ÿ’€ guestfs_fallocate

int
guestfs_fallocate (guestfs_h *g,
                   const char *path,
                   int len);

Okay so this one is deprecated ๐Ÿ™ˆ โ€” in new code, use the "guestfs_fallocate64" call instead. Deprecated functions will not be removed from the API, but the fact that they're deprecated is a little flag saying "hey, there are problems with correct use of these functions". So like, noted.

What it does: preallocates a file (containing zero bytes) named path of size len bytes. If the file already exists, it gets overwritten. Bold.

โš ๏ธ Do not confuse this with the guestfish-specific alloc command, which allocates a file in the host and attaches it as a device. Different thing entirely, iykyk.

Returns 0 on success or -1 on error.

(Added in 1.0.66)


๐Ÿ”ฅ guestfs_fallocate64

int
guestfs_fallocate64 (guestfs_h *g,
                     const char *path,
                     int64_t len);

Preallocates a file (containing zero bytes) named path of size len bytes. If the file already exists, it gets overwritten. Same energy, bigger numbers ๐Ÿ’…

Quick note: this call allocates disk blocks for the file. So if you actually wanted a sparse file, use "guestfs_truncate_size" instead โ€” that's the move.

The deprecated call "guestfs_fallocate" does the same, except owing to an oversight it only allowed 30 bit lengths to be specified, which effectively limited the max file size created through that call to 1GB. Oops ๐Ÿ˜ญ

And again โ€” don't confuse this with the guestfish-specific alloc and sparse commands, which create a file in the host and attach it as a device. Not the same thing bestie.

Returns 0 on success or -1 on error.

(Added in 1.3.17)


โญ guestfs_feature_available

int
guestfs_feature_available (guestfs_h *g,
                           char *const *groups);

This is the same as "guestfs_available", except it returns a simple true/false boolean result instead of throwing an exception when a feature isn't found. So it's the chill, non-dramatic version ๐ŸŒˆ For other documentation see "guestfs_available".

Returns a C truth value on success, or -1 on error.

(Added in 1.21.26)


๐Ÿ“ guestfs_fgrep

char **
guestfs_fgrep (guestfs_h *g,
               const char *pattern,
               const char *path);

Deprecated alert ๐Ÿšจ โ€” in new code, use the "guestfs_grep" call instead. Deprecated functions won't be removed from the API, but the deprecation is a hint that there are problems with correct use of these functions.

This one calls the external fgrep(1) program and returns the matching lines. Simple as that.

Returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use. Clean up after yourself bestie ๐Ÿงน

Because of the message protocol, there's a transfer limit of somewhere between 2MB and 4MB. See "PROTOCOL LIMITS".

(Added in 1.0.66)


๐Ÿ’œ guestfs_fgrepi

char **
guestfs_fgrepi (guestfs_h *g,
                const char *pattern,
                const char *path);

Also deprecated ๐Ÿ˜ญ โ€” in new code, use "guestfs_grep" instead. Same disclaimer: deprecated functions will not be removed from the API, but the fact that they're deprecated indicates there are problems with correct use of these functions.

This calls the external "fgrep -i" program and returns the matching lines. Case-insensitive edition, cute.

Returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

Same protocol tea: there's a transfer limit of somewhere between 2MB and 4MB. See "PROTOCOL LIMITS".

(Added in 1.0.66)


๐ŸŒธ guestfs_file

char *
guestfs_file (guestfs_h *g,
              const char *path);

This call uses the standard file(1) command to figure out the type or contents of the file. Detective mode ๐Ÿ”

It will also transparently look inside various types of compressed file. Sneaky and efficient, we love her.

The filename is not prepended to the output (like the file command's -b option).

Real talk: the output depends on the output of the underlying file(1) command, and it can change in future in ways beyond our control. In other words, the output is not guaranteed by the ABI. It's giving "we can't promise anything" ๐Ÿ’€

See also: file(1), "guestfs_vfs_type", "guestfs_lstat", "guestfs_is_file", "guestfs_is_blockdev" (etc), "guestfs_is_zero".

Returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.9.1)


๐Ÿฆ‹ guestfs_file_architecture

char *
guestfs_file_architecture (guestfs_h *g,
                           const char *filename);

This detects the architecture of the binary filename and returns it if known. Like a little x-ray for binaries ๐Ÿฉปโœจ

Currently defined architectures are:

  • "aarch64" โ€” 64 bit ARM.
  • "arm" โ€” 32 bit ARM.
  • "i386" โ€” This string is returned for all 32 bit i386, i486, i586, i686 binaries irrespective of the precise processor requirements of the binary.
  • "ia64" โ€” Intel Itanium.
  • "ppc" โ€” 32 bit Power PC.
  • "ppc64" โ€” 64 bit Power PC (big endian).
  • "ppc64le" โ€” 64 bit Power PC (little endian).
  • "loongarch64" โ€” 64 bit LoongArch64 (little endian).
  • "riscv32", "riscv64", "riscv128" โ€” RISC-V 32-, 64- or 128-bit variants.
  • "s390" โ€” 31 bit IBM S/390.
  • "s390x" โ€” 64 bit IBM S/390.
  • "sparc" โ€” 32 bit SPARC.
  • "sparc64" โ€” 64 bit SPARC V9 and above.
  • "x86_64" โ€” 64 bit x86-64.

Libguestfs may return other architecture strings in future, so like, stay flexible ๐Ÿ’ซ

The function works on at least the following types of files:

  • many types of Un*x and Linux binary
  • many types of Un*x and Linux shared library
  • Windows Win32 and Win64 binaries
  • Windows Win32 and Win64 DLLs
    • Win32 binaries and DLLs return "i386".
    • Win64 binaries and DLLs return "x86_64".
  • Linux kernel modules
  • Linux new-style initrd images
  • some non-x86 Linux vmlinuz kernels

What it can't do currently (rip):

  • static libraries (libfoo.a)
  • Linux old-style initrd as compressed ext2 filesystem (RHEL 3)
  • x86 Linux vmlinuz kernels
So about those x86 Linux vmlinuz kernels: x86 vmlinuz images (bzImage format) consist of a mix of 16-, 32- and compressed code, and are horribly hard to unpack. If you want to find the architecture of a kernel, use the architecture of the associated initrd or kernel module(s) instead. Workaround queen ๐Ÿ‘‘

Returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.5.3)


๐ŸŽ€ guestfs_filesize

int64_t
guestfs_filesize (guestfs_h *g,
                  const char *file);

Returns the size of file in bytes. Just the number, no drama ๐Ÿ’…

Want other stats about a file? Use "guestfs_stat", "guestfs_lstat", "guestfs_is_dir", "guestfs_is_file" etc. Want the size of block devices? That's "guestfs_blockdev_getsize64" โ€” different function, different vibe.

On error this function returns -1.

(Added in 1.0.82)


๐ŸŒˆ guestfs_filesystem_available

int
guestfs_filesystem_available (guestfs_h *g,
                              const char *filesystem);

Checks whether libguestfs supports the named filesystem. The filesystem argument is a filesystem name, such as "ext3". Iconic little check-in โœจ

โš ๏ธ You must call "guestfs_launch" before using this command. No launch, no answers.

This is mainly useful as a negative test. Like, if this returns true, it does not mean that a particular filesystem can be created or mounted, because filesystems can fail for other reasons โ€” such as it being a later version of the filesystem, or having incompatible features, or lacking the right mkfs.<fs> tool. So true is more like "not ruled out" than "guaranteed" ๐Ÿ˜ญ

See also "guestfs_available", "guestfs_feature_available", "AVAILABILITY".

Returns a C truth value on success, or -1 on error.

(Added in 1.19.5)


๐Ÿซถ guestfs_filesystem_walk

struct guestfs_tsk_dirent_list *
guestfs_filesystem_walk (guestfs_h *g,
                         const char *device);

Walks through the internal structures of a disk partition (eg. /dev/sda1) to return a list of all the files and directories stored within. It's literally spelunking in the filesystem ๐Ÿ•ต๏ธโ€โ™€๏ธ

The best part: it is not necessary to mount the disk partition to run this command. No mounting required, we go straight to the source.

All entries in the filesystem are returned. This function can list deleted or unaccessible files. And heads up โ€” the entries are not sorted. So don't come for her about ordering ๐Ÿ’€

The "tsk_dirent" structure contains the following fields.

  • "tsk_inode" โ€” Filesystem reference number of the node. It might be 0 if the node has been deleted.
  • "tsk_type" โ€” Basic file type information. See below for a detailed list of values.
  • tsk_size โ€” file size in bytes. It might be -1 if the node has been deleted. ๐Ÿ‘€
  • tsk_name โ€” the file path relative to its directory.
  • tsk_flags โ€” bitfield containing extra information regarding the entry. It contains the logical OR of the following values:
    • 0x0001 โ€” if set to 1, the file is allocated and visible within the filesystem. Otherwise, the file has been deleted. Under certain circumstances, the function download_inode can be used to recover deleted files. ๐Ÿ•ต๏ธ
    • 0x0002 โ€” filesystems such as NTFS and Ext2 or greater separate the file name from the metadata structure. The bit is set to 1 when the file name is in an unallocated state and the metadata structure is in an allocated one. This generally implies the metadata has been reallocated to a new file. Therefore, information such as file type, file size, timestamps, number of links and symlink target might not correspond with the ones of the original deleted entry. ๐Ÿ˜ญ
    • 0x0004 โ€” the bit is set to 1 when the file is compressed using filesystem native compression support (NTFS). The API is not able to detect application level compression.
  • tsk_atime_sec, tsk_atime_nsec, tsk_mtime_sec, tsk_mtime_nsec, tsk_ctime_sec, tsk_ctime_nsec, tsk_crtime_sec, tsk_crtime_nsec โ€” respectively, access, modification, last status change and creation time in Unix format in seconds and nanoseconds. โฐ
  • tsk_nlink โ€” number of file names pointing to this entry.
  • tsk_link โ€” if the entry is a symbolic link, this field will contain the path to the target file.

The tsk_type field will contain one of the following characters:

  • 'b' โ€” Block special
  • 'c' โ€” Char special
  • 'd' โ€” Directory
  • 'f' โ€” FIFO (named pipe)
  • 'l' โ€” Symbolic link
  • 'r' โ€” Regular file
  • 's' โ€” Socket
  • 'h' โ€” Shadow inode (Solaris)
  • 'w' โ€” Whiteout inode (BSD)
  • 'u' โ€” Unknown file type

This function returns a struct guestfs_tsk_dirent_list *, or NULL if there was an error. The caller must call guestfs_free_tsk_dirent_list after use. ๐Ÿ’…

This long-running command can generate progress notification messages so that the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See GUESTFS_EVENT_PROGRESS.

This function depends on the feature libtsk. See also guestfs_feature_available.

(Added in 1.33.39)

guestfs_fill ๐Ÿงš

int
guestfs_fill (guestfs_h *g,
              int c,
              int len,
              const char *path);

This command creates a new file called path. The initial content of the file is len octets of c, where c must be a number in the range [0..255]. โœจ

To fill a file with zero bytes (sparsely), it is much more efficient to use guestfs_truncate_size. To create a file with a pattern of repeating bytes use guestfs_fill_pattern.

This function returns 0 on success or -1 on error.

This long-running command can generate progress notification messages so that the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See GUESTFS_EVENT_PROGRESS.

(Added in 1.0.79)

guestfs_fill_dir ๐ŸŽ€

int
guestfs_fill_dir (guestfs_h *g,
                  const char *dir,
                  int nr);

This function, useful for testing filesystems, creates nr empty files in the directory dir with names 00000000 through nr-1 (ie. each file name is 8 digits long padded with zeroes).

This function returns 0 on success or -1 on error.

(Added in 1.19.32)

guestfs_fill_pattern ๐ŸŒธ

int
guestfs_fill_pattern (guestfs_h *g,
                      const char *pattern,
                      int len,
                      const char *path);

This function is like guestfs_fill except that it creates a new file of length len containing the repeating pattern of bytes in pattern. The pattern is truncated if necessary to ensure the length of the file is exactly len bytes.

This function returns 0 on success or -1 on error.

This long-running command can generate progress notification messages so that the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See GUESTFS_EVENT_PROGRESS.

(Added in 1.3.12)

guestfs_find ๐Ÿฆ‹

char **
guestfs_find (guestfs_h *g,
              const char *directory);

This command lists out all files and directories, recursively, starting at directory. It is essentially equivalent to running the shell command find directory -print but some post-processing happens on the output, described below.

This returns a list of strings without any prefix. Thus if the directory structure was:

/tmp/a
/tmp/b
/tmp/c/d

then the returned list from guestfs_find /tmp would be 4 elements:

a
b
c
c/d

If directory is not a directory, then this command returns an error.

The returned list is sorted.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

(Added in 1.0.27)

guestfs_find0 ๐ŸŒˆ

int
guestfs_find0 (guestfs_h *g,
               const char *directory,
               const char *files);

This command lists out all files and directories, recursively, starting at directory, placing the resulting list in the external file called files.

This command works the same way as guestfs_find with the following exceptions:

  • The resulting list is written to an external file.
  • Items (filenames) in the result are separated by "\0" characters. See find(1) option -print0.
  • The result list is not sorted.

This function returns 0 on success or -1 on error.

(Added in 1.0.74)

guestfs_find_inode ๐Ÿ”ฅ

struct guestfs_tsk_dirent_list *
guestfs_find_inode (guestfs_h *g,
                    const char *device,
                    int64_t inode);

Searches all the entries associated with the given inode.

For each entry, a tsk_dirent structure is returned. See filesystem_walk for more information about tsk_dirent structures.

This function returns a struct guestfs_tsk_dirent_list *, or NULL if there was an error. The caller must call guestfs_free_tsk_dirent_list after use.

This long-running command can generate progress notification messages so that the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See GUESTFS_EVENT_PROGRESS.

This function depends on the feature libtsk. See also guestfs_feature_available.

(Added in 1.35.6)

guestfs_findfs_label ๐Ÿ‘‘

char *
guestfs_findfs_label (guestfs_h *g,
                      const char *label);

This command searches the filesystems and returns the one which has the given label. An error is returned if no such filesystem can be found.

To find the label of a filesystem, use guestfs_vfs_label.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.5.3)

guestfs_findfs_partlabel ๐Ÿซถ

char *
guestfs_findfs_partlabel (guestfs_h *g,
                          const char *label);

This command searches the partitions and returns the one which has the given label. An error is returned if no such partition can be found.

To find the label of a partition, use guestfs_blkid (PART_ENTRY_NAME).

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.53.5)

guestfs_findfs_partuuid โญ

char *
guestfs_findfs_partuuid (guestfs_h *g,
                         const char *uuid);

This command searches the partitions and returns the one which has the given partition UUID. An error is returned if no such partition can be found.

To find the UUID of a partition, use guestfs_blkid (PART_ENTRY_UUID).

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.53.5)

guestfs_findfs_uuid ๐Ÿ’œ

char *
guestfs_findfs_uuid (guestfs_h *g,
                     const char *uuid);

This command searches the filesystems and returns the one which has the given UUID. An error is returned if no such filesystem can be found.

To find the UUID of a filesystem, use guestfs_vfs_uuid.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.5.3)

guestfs_fsck ๐Ÿ’€

int
guestfs_fsck (guestfs_h *g,
              const char *fstype,
              const char *device);

This runs the filesystem checker (fsck) on device which should have filesystem type fstype.

The returned integer is the status. See fsck(8) for the list of status codes from fsck.

Notes:

  • Multiple status codes can be summed together.
  • A non-zero return code can mean "success", for example if errors have been corrected on the filesystem.
  • Checking or repairing NTFS volumes is not supported (by linux-ntfs).

This command is entirely equivalent to running fsck -a -t fstype device.

On error this function returns -1.

(Added in 1.0.16)

guestfs_fstrim ๐Ÿ“

int
guestfs_fstrim (guestfs_h *g,
                const char *mountpoint,
                ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS.

GUESTFS_FSTRIM_OFFSET, int64_t offset,
GUESTFS_FSTRIM_LENGTH, int64_t length,
GUESTFS_FSTRIM_MINIMUMFREEEXTENT, int64_t minimumfreeextent,

Trim the free space in the filesystem mounted on mountpoint. The filesystem must be mounted read-write.

bestie, read that again: read-write. not read-only. no cap. ๐Ÿ’…

The filesystem contents are not affected, but any free space in the filesystem is "trimmed", that is, given back to the host device, thus making disk images more sparse, allowing unused space in qcow2 files to be reused, etc.

This operation requires support in libguestfs, the mounted filesystem, the host filesystem, qemu and the host kernel. If this support isn't present it may give an error or even appear to run but do nothing. ๐Ÿ™ˆ

In the case where the kernel vfs driver does not support trimming, this call will fail with errno set to ENOTSUP. Currently this happens when trying to trim FAT filesystems. ๐Ÿซ 

Also peep guestfs_zero_free_space โ€” that's a slightly different op that turns the free space inside the filesystem into zeroes. And yes bestie, it is 100% valid to call guestfs_fstrim either instead of, or after calling guestfs_zero_free_space. Your call, no drama. ๐Ÿ’…

This function returns 0 on success or -1 on error.

This function depends on the feature "fstrim". See also guestfs_feature_available.

(Added in 1.19.6)


๐Ÿงต guestfs_fstrim_va

int
guestfs_fstrim_va (guestfs_h *g,
                   const char *mountpoint,
                   va_list args);

This is the "va_list variant" of guestfs_fstrim.

See "CALLS WITH OPTIONAL ARGUMENTS".


๐Ÿงต guestfs_fstrim_argv

int
guestfs_fstrim_argv (guestfs_h *g,
                     const char *mountpoint,
                     const struct guestfs_fstrim_argv *optargs);

This is the "argv variant" of guestfs_fstrim.

See "CALLS WITH OPTIONAL ARGUMENTS".


๐ŸŒŸ guestfs_get_append

const char *
guestfs_get_append (guestfs_h *g);

Returns the extra kernel options that get tacked onto the libguestfs appliance's kernel command line. Like, the little add-ons. ๐ŸŽ€

If it's "NULL" then literally no options are being added, nothing, zero, empty.

This function returns a string which may be NULL. There is no way to return an error from this function. The string is owned by the guest handle and must not be freed โ€” so do not go freeing it, bestie, that's not your string to free. ๐Ÿ™ˆ

(Added in 1.0.26)


โš ๏ธ guestfs_get_attach_method

char *
guestfs_get_attach_method (guestfs_h *g);

This function is deprecated. In new code, use the guestfs_get_backend call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions. So it still works, it's just giving "we keep it around for the plot" energy.

Return the current backend.

See guestfs_set_backend and "BACKEND".

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.9.8)


๐Ÿšฆ guestfs_get_autosync

int
guestfs_get_autosync (guestfs_h *g);

Get the autosync flag. That's it, that's the whole vibe check. โญ

This function returns a C truth value on success or -1 on error.

(Added in 0.3)


๐ŸŒ€ guestfs_get_backend

char *
guestfs_get_backend (guestfs_h *g);

Return the current backend.

Fun lore drop: this handle property was previously called the "attach method". So if you see that name floating around, it's the same thing, they just rebranded. ๐Ÿ‘‘

See guestfs_set_backend and "BACKEND".

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.21.26)


๐Ÿ” guestfs_get_backend_setting

char *
guestfs_get_backend_setting (guestfs_h *g,
                             const char *name);

Finds a backend setting string that's either exactly "name", or starts with "name=". Here's the tea on what you get back:

  • If it's just "name", this returns the string "1".
  • If it's "name=", this returns whatever comes after the equals sign (which may be an empty string, and yes, empty is a valid answer, don't @ me).

If no such setting is found, this function throws an error. The errno (see guestfs_last_errno) will be "ESRCH" in this case. ๐Ÿ’€

See "BACKEND", "BACKEND SETTINGS".

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.27.2)


๐Ÿ“š guestfs_get_backend_settings

char **
guestfs_get_backend_settings (guestfs_h *g);

Return the current backend settings.

This call returns all backend settings strings, the whole collection, the full set. ๐Ÿฆ‹ If you only want to find one single backend setting, go see guestfs_get_backend_setting instead.

See "BACKEND", "BACKEND SETTINGS".

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use. Yes โ€” the strings and the array. Both. Don't be lazy about it.

(Added in 1.25.24)


๐Ÿ—„๏ธ guestfs_get_cachedir

char *
guestfs_get_cachedir (guestfs_h *g);

Get the directory that the handle uses to store the appliance cache. That's where the appliance is keeping its stuff. ๐ŸŽ€

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.19.58)


โš ๏ธ guestfs_get_direct

int
guestfs_get_direct (guestfs_h *g);

This function is deprecated. In new code, use the guestfs_internal_get_console_socket call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions. Same speech as before, no cap.

Return the direct appliance mode flag.

This function returns a C truth value on success or -1 on error.

(Added in 1.0.72)


๐Ÿท๏ธ guestfs_get_e2attrs

char *
guestfs_get_e2attrs (guestfs_h *g,
                     const char *file);

This returns the file attributes associated with file.

Okay so the attributes are a set of bits attached to each inode, and they affect how the file behaves. You get them back as a string of letters (the full alphabet of chaos is below ๐ŸŒˆ). The string may be empty, which means no file attributes are set for this file at all.

These attributes are only present when the file is located on an ext2/3/4 filesystem. Using this call on other filesystem types will result in an error. Big "wrong neighbourhood" energy. ๐Ÿ’€

The characters (file attributes) in the returned string are currently:

  • 'A' โ€” When the file is accessed, its atime is not modified.
  • 'a' โ€” The file is append-only.
  • 'c' โ€” The file is compressed on-disk.
  • 'D' โ€” (Directories only.) Changes to this directory are written synchronously to disk.
  • 'd' โ€” The file is not a candidate for backup (see dump(8)).
  • 'E' โ€” The file has compression errors.
  • 'e' โ€” The file is using extents.
  • 'h' โ€” The file is storing its blocks in units of the filesystem blocksize instead of sectors.
  • 'I' โ€” (Directories only.) The directory is using hashed trees.
  • 'i' โ€” The file is immutable. It cannot be modified, deleted or renamed. No link can be created to this file. โœจ Iconic, honestly. Untouchable.
  • 'j' โ€” The file is data-journaled.
  • 's' โ€” When the file is deleted, all its blocks will be zeroed.
  • 'S' โ€” Changes to this file are written synchronously to disk.
  • 'T' โ€” (Directories only.) This is a hint to the block allocator that subdirectories contained in this directory should be spread across blocks. If not present, the block allocator will try to group subdirectories together.
  • 't' โ€” For a file, this disables tail-merging. (Not used by upstream implementations of ext2.)
  • 'u' โ€” When the file is deleted, its blocks will be saved, allowing the file to be undeleted.
  • 'X' โ€” The raw contents of the compressed file may be accessed.
  • 'Z' โ€” The compressed file is dirty.

More file attributes may be added to this list later. ๐Ÿ‘€ Not all file attributes may be set for all kinds of files. For the detailed lore, consult the chattr(1) man page.

See also guestfs_set_e2attrs.

๐Ÿšจ PSA: don't confuse these attributes with extended attributes (see guestfs_getxattr). Two completely different things, bestie. Don't mix them up.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.17.31)


๐Ÿ”ข guestfs_get_e2generation

int64_t
guestfs_get_e2generation (guestfs_h *g,
                          const char *file);

This returns the ext2 file generation of a file. The generation (which used to be called the "version", the glow-up is real) is a number associated with an inode. It's most commonly used by NFS servers, of all things. ๐Ÿงš

The generation is only present when the file is located on an ext2/3/4 filesystem. Using this call on other filesystem types will result in an error.

See guestfs_set_e2generation.

On error this function returns -1.

(Added in 1.17.31)


โš ๏ธ guestfs_get_e2label

char *
guestfs_get_e2label (guestfs_h *g,
                     const char *device);

This function is deprecated. In new code, use the guestfs_vfs_label call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This returns the ext2/3/4 filesystem label of the filesystem on "device".

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.0.15)


โš ๏ธ guestfs_get_e2uuid

char *
guestfs_get_e2uuid (guestfs_h *g,
                    const char *device);

This function is deprecated. In new code, use the guestfs_vfs_uuid call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This returns the ext2/3/4 filesystem UUID of the filesystem on "device".

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.0.15)


๐Ÿ–ฅ๏ธ guestfs_get_hv

char *
guestfs_get_hv (guestfs_h *g);

Return the current hypervisor binary. The main character of the virtualization story. ๐Ÿ‘‘

If it wasn't set already, then this will return the default qemu binary name.

For some backends this may return an error if called before launch, since it may not be possible to get the default hypervisor before the appliance is launched. So like, timing matters, bestie.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.23.17)


๐Ÿ†” guestfs_get_identifier

const char *
guestfs_get_identifier (guestfs_h *g);

Get the handle identifier. See guestfs_set_identifier.

This function returns a string, or NULL on error. The string is owned by the guest handle and must not be freed โ€” again, not yours, hands off. ๐Ÿซถ

(Added in 1.31.14)


๐Ÿ” guestfs_get_libvirt_requested_credential_challenge

char *
guestfs_get_libvirt_requested_credential_challenge (guestfs_h *g,
                                                    int index);

Get the challenge (provided by libvirt) for the "index"'th requested credential. If libvirt did not provide a challenge, this returns the empty string "". Cute and empty, love that for you. ๐ŸŽ€

See "LIBVIRT AUTHENTICATION" for documentation and example code.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.19.52)


๐Ÿ” guestfs_get_libvirt_requested_credential_defresult

char *
guestfs_get_libvirt_requested_credential_defresult (guestfs_h *g,
                                                    int index);

Get the default result (provided by libvirt) for the "index"'th requested credential. If libvirt did not provide a default result, this returns the empty string "".

See "LIBVIRT AUTHENTICATION" for documentation and example code.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.19.52)


๐Ÿ” guestfs_get_libvirt_requested_credential_prompt

char *
guestfs_get_libvirt_requested_credential_prompt (guestfs_h *g,
                                                 int index);

Get the prompt (provided by libvirt) for the "index"'th requested credential. If libvirt did not provide a prompt, this returns the empty string "".

See "LIBVIRT AUTHENTICATION" for documentation and example code.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.19.52)

Okay so this one returns a string ๐Ÿ’– (or NULL if it goes sideways), and bestie you must free that string after use. <small>(Added in 1.19.52)</small>


๐ŸŒŸ guestfs_get_libvirt_requested_credentials ๐ŸŒŸ

char **
guestfs_get_libvirt_requested_credentials (guestfs_h *g);

Okay so this one should ONLY be called during the event callback for events of type "GUESTFS_EVENT_LIBVIRT_AUTH" โ€” like, that's the vibe check, no cap.

It returns the list of credentials requested by libvirt. Possible values are a subset of the strings you provided when you called "guestfs_set_libvirt_supported_credentials".

See "LIBVIRT AUTHENTICATION" for documentation and example code, bestie.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use. Periodt.

<small>(Added in 1.19.52)</small>


๐Ÿ’– guestfs_get_memsize ๐Ÿ’–

int
guestfs_get_memsize (guestfs_h *g);

This gets the memory size in megabytes allocated to the hypervisor. Slay.

If "guestfs_set_memsize" was not called on this handle, and if "LIBGUESTFS_MEMSIZE" was not set, then this returns the compiled-in default value for memsize. Iconic default behavior, honestly.

For more information on the architecture of libguestfs, see guestfs(3).

On error this function returns -1 ๐Ÿ˜ญ.

<small>(Added in 1.0.55)</small>


๐Ÿฆ‹ guestfs_get_network ๐Ÿฆ‹

int
guestfs_get_network (guestfs_h *g);

This returns the enable network flag. That's it, that's the whole vibe.

This function returns a C truth value on success or -1 on error.

<small>(Added in 1.5.4)</small>


๐ŸŽ€ guestfs_get_path ๐ŸŽ€

const char *
guestfs_get_path (guestfs_h *g);

Return the current search path. Lowkey important.

This is always non-NULL. If it wasn't set already, then this will return the default path.

This function returns a string, or NULL on error. The string is owned by the guest handle and must not be freed โ€” so don't touch it with free(), bestie.

<small>(Added in 0.3)</small>


๐ŸŒธ guestfs_get_pgroup ๐ŸŒธ

int
guestfs_get_pgroup (guestfs_h *g);

This returns the process group flag. Short and sweet.

This function returns a C truth value on success or -1 on error.

<small>(Added in 1.11.18)</small>


โœจ guestfs_get_pid โœจ

int
guestfs_get_pid (guestfs_h *g);

Return the process ID of the hypervisor. If there is no hypervisor running, then this will return an error โ€” like, it's giving "not found" energy.

This is an internal call used for debugging and testing. Iykyk.

On error this function returns -1.

<small>(Added in 1.0.56)</small>


๐Ÿ’… guestfs_get_program ๐Ÿ’…

const char *
guestfs_get_program (guestfs_h *g);

Get the program name. See "guestfs_set_program".

This function returns a string, or NULL on error. The string is owned by the guest handle and must not be freed.

<small>(Added in 1.21.29)</small>


๐Ÿ’€ guestfs_get_qemu ๐Ÿ’€

const char *
guestfs_get_qemu (guestfs_h *g);

This function is deprecated. In new code, use the "guestfs_get_hv" call instead. Not me still using the deprecated one... ๐Ÿ™ˆ

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions. So, like, be aware.

Return the current hypervisor binary (usually qemu).

This is always non-NULL. If it wasn't set already, then this will return the default qemu binary name.

This function returns a string, or NULL on error. The string is owned by the guest handle and must not be freed.

<small>(Added in 1.0.6)</small>


๐Ÿ“ guestfs_get_recovery_proc ๐Ÿ“

int
guestfs_get_recovery_proc (guestfs_h *g);

Return the recovery process enabled flag. Cute.

This function returns a C truth value on success or -1 on error.

<small>(Added in 1.0.77)</small>


๐Ÿงš guestfs_get_selinux ๐Ÿงš

int
guestfs_get_selinux (guestfs_h *g);

This function is deprecated. In new code, use the "guestfs_setfiles" call instead. The way that deprecated functions keep hanging around... ๐Ÿ’€

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This returns the current setting of the selinux flag which is passed to the appliance at boot time. See "guestfs_set_selinux".

For more information on the architecture of libguestfs, see guestfs(3).

This function returns a C truth value on success or -1 on error.

<small>(Added in 1.0.67)</small>


๐Ÿ”ฅ guestfs_get_smp ๐Ÿ”ฅ

int
guestfs_get_smp (guestfs_h *g);

This returns the number of virtual CPUs assigned to the appliance. Main character energy for your VM.

On error this function returns -1.

<small>(Added in 1.13.15)</small>


๐Ÿ’œ guestfs_get_sockdir ๐Ÿ’œ

char *
guestfs_get_sockdir (guestfs_h *g);

Get the directory used by the handle to store temporary socket and PID files. Very specific, very important.

This is different from "guestfs_get_tmpdir", as we need shorter paths for sockets (due to the limited buffers of filenames for UNIX sockets), and "guestfs_get_tmpdir" may be too long for them. Furthermore, sockets and PID files must be accessible to such background services started by libguestfs that may not have permission to access the temporary directory returned by "guestfs_get_tmpdir".

The environment variable "XDG_RUNTIME_DIR" controls the default value: If "XDG_RUNTIME_DIR" is set, then that is the default. Else /tmp is the default.

This function returns a string, or NULL on error. The caller must free the returned string after use.

<small>(Added in 1.33.8)</small>


๐ŸŒˆ guestfs_get_state ๐ŸŒˆ

int
guestfs_get_state (guestfs_h *g);

This returns the current state as an opaque integer. This is only useful for printing debug and internal error messages. Like, don't try to interpret it for fun, bestie.

For more information on states, see guestfs(3).

On error this function returns -1.

<small>(Added in 1.0.2)</small>


๐Ÿซถ guestfs_get_tmpdir ๐Ÿซถ

char *
guestfs_get_tmpdir (guestfs_h *g);

Get the directory used by the handle to store temporary files. Simple as that.

This function returns a string, or NULL on error. The caller must free the returned string after use.

<small>(Added in 1.19.58)</small>


โญ guestfs_get_trace โญ

int
guestfs_get_trace (guestfs_h *g);

Return the command trace flag. Spill the tea, trace everything.

This function returns a C truth value on success or -1 on error.

<small>(Added in 1.0.69)</small>


๐ŸŽ€ guestfs_get_umask ๐ŸŽ€

int
guestfs_get_umask (guestfs_h *g);

Return the current umask. By default the umask is 022 unless it has been set by calling "guestfs_umask".

On error this function returns -1.

<small>(Added in 1.3.4)</small>


๐ŸŒธ guestfs_get_verbose ๐ŸŒธ

int
guestfs_get_verbose (guestfs_h *g);

This returns the verbose messages flag. Turn it up.

This function returns a C truth value on success or -1 on error.

<small>(Added in 0.3)</small>


๐Ÿ’– guestfs_getcon ๐Ÿ’–

char *
guestfs_getcon (guestfs_h *g);

This function is deprecated. In new code, use the "guestfs_setfiles" call instead. Deprecated but still iconic, I guess.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This gets the SELinux security context of the daemon.

See the documentation about SELINUX in guestfs(3), and "guestfs_setcon"

This function returns a string, or NULL on error. The caller must free the returned string after use.

This function depends on the feature "selinux". See also "guestfs_feature_available".

<small>(Added in 1.0.67)</small>


๐Ÿฆ‹ guestfs_getxattr ๐Ÿฆ‹

char *
guestfs_getxattr (guestfs_h *g,
                  const char *path,
                  const char *name,
                  size_t *size_r);

Get a single extended attribute from file path named name. This call follows symlinks. If you want to lookup an extended attribute for the symlink itself, use "guestfs_lgetxattr". Important distinction, bestie.

Normally it is better to get all extended attributes from a file in one go by calling "guestfs_getxattrs". However some Linux filesystem implementations are buggy and do not provide a way to list out attributes. For these filesystems (notably ntfs-3g) you have to know the names of the extended attributes you want in advance and call this function. Annoying but true.

Extended attribute values are blobs of binary data. If there is no extended attribute named name, this returns an error.

See also: "guestfs_getxattrs", "guestfs_lgetxattr", attr(5).

This function returns a buffer, or NULL on error. The size of the returned buffer is written to *size_r. The caller must free the returned buffer after use.

This function depends on the feature "linuxxattrs". See also "guestfs_feature_available".

<small>(Added in 1.7.24)</small>


โœจ guestfs_getxattrs โœจ

struct guestfs_xattr_list *
guestfs_getxattrs (guestfs_h *g,
                   const char *path);

This call lists the extended attributes of the file or directory path. Get that metadata, queen.

At the system call level, this is a combination of the listxattr(2) and getxattr(2) calls.

See also: "guestfs_lgetxattrs", attr(5).

This function returns a "struct guestfs_xattr_list *", or NULL if there was an error. The caller must call "guestfs_free_xattr_list" after use.

This function depends on the feature "linuxxattrs". See also "guestfs_feature_available".

<small>(Added in 1.0.59)</small>


๐ŸŽ€ guestfs_glob_expand ๐ŸŽ€

char **
guestfs_glob_expand (guestfs_h *g,
                     const char *pattern);

This function is provided for backwards compatibility with earlier versions of libguestfs. It simply calls "guestfs_glob_expand_opts" with no optional arguments. Old but gold, I guess.

<small>(Added in 1.0.50)</small>


๐Ÿ’… guestfs_glob_expand_opts ๐Ÿ’…

char **
guestfs_glob_expand_opts (guestfs_h *g,
                          const char *pattern,
                          ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

GUESTFS_GLOB_EXPAND_OPTS_DIRECTORYSLASH, int directoryslash,

This command searches for all the pathnames matching pattern according to the wildcard expansion rules used by the shell. Globbing, but make it libguestfs.

If no paths match, then this returns an empty list (note: not an error). Empty list is still valid, bestie.

It is just a wrapper around the C glob(3) function with flags "GLOB_MARK|GLOB_BRACE". See that manual page for more details.

directoryslash controls whether use the "GLOB_MARK" flag for glob(3), and it defaults to true. It can be explicitly set as off to return no trailing slashes in filenames of directories.

Notice that there is no equivalent command for expanding a device name (eg. /dev/sd*). Use "guestfs_list_devices", "guestfs_list_partitions" etc functions instead.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

<small>(Added in 1.0.50)</small>


๐Ÿซถ guestfs_glob_expand_opts_va ๐Ÿซถ

char **
guestfs_glob_expand_opts_va (guestfs_h *g,
                             const char *pattern,
                             va_list args);

This is the "va_list variant" of "guestfs_glob_expand_opts". Same energy, different argument style.

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_glob_expand_opts_argv ๐ŸŽ€

char **
guestfs_glob_expand_opts_argv (guestfs_h *g,
                               const char *pattern,
                               const struct guestfs_glob_expand_opts_argv *optargs);

Okay so this is the "argv variant" of guestfs_glob_expand_opts, bestie ๐Ÿ’…

Go read "CALLS WITH OPTIONAL ARGUMENTS" for the whole lore on variants, iykyk.


guestfs_grep ๐Ÿ”

char **
guestfs_grep (guestfs_h *g,
              const char *regex,
              const char *path);

This one is literally just here for backwards compatibility with earlier versions of libguestfs ๐Ÿซถ It straight up just calls guestfs_grep_opts with zero optional arguments. That's it. That's the whole function.

(Added in 1.0.66) โญ


guestfs_grep_opts ๐Ÿ”โœจ

char **
guestfs_grep_opts (guestfs_h *g,
                   const char *regex,
                   const char *path,
                   ...);

Bestie you can pass a whole list of optional arguments to this one ๐Ÿ’– Use zero or more of these pairs of parameters, and then close it out with -1 on its own, okay? (See "CALLS WITH OPTIONAL ARGUMENTS" for the deets.)

GUESTFS_GREP_OPTS_EXTENDED, int extended,
GUESTFS_GREP_OPTS_FIXED, int fixed,
GUESTFS_GREP_OPTS_INSENSITIVE, int insensitive,
GUESTFS_GREP_OPTS_COMPRESSED, int compressed,

So what it does: it calls the external grep(1) program and hands you back the matching lines. No cap ๐Ÿ™Œ

The optional flags, queen by queen ๐Ÿ‘‘:

  • "extended" โ€” use extended regular expressions. Literally the same as passing the -E flag.
  • "fixed" โ€” match fixed (so, don't use regular expressions at all). Same as the -F flag.
  • "insensitive" โ€” match case-insensitive. Same as the -i flag.
  • "compressed" โ€” use zgrep(1) instead of grep(1). This lets the input be compress- or gzip-compressed ๐Ÿ—œ๏ธ

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use, don't forget ๐Ÿซถ

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See "PROTOCOL LIMITS". โš ๏ธ

(Added in 1.0.66) โญ


guestfs_grep_opts_va ๐Ÿ”

char **
guestfs_grep_opts_va (guestfs_h *g,
                      const char *regex,
                      const char *path,
                      va_list args);

The "va_list variant" of guestfs_grep_opts, naturally โœจ

Again โ€” "CALLS WITH OPTIONAL ARGUMENTS" has the full explanation ๐Ÿฆ‹


guestfs_grep_opts_argv ๐Ÿ”

char **
guestfs_grep_opts_argv (guestfs_h *g,
                        const char *regex,
                        const char *path,
                        const struct guestfs_grep_opts_argv *optargs);

And this is the "argv variant" of guestfs_grep_opts ๐Ÿ’…

Yep, "CALLS WITH OPTIONAL ARGUMENTS" again, go look ๐ŸŒธ


guestfs_grepi ๐Ÿ”๐Ÿ’€

char **
guestfs_grepi (guestfs_h *g,
               const char *regex,
               const char *path);
โš ๏ธ This function is deprecated. In new code, use the guestfs_grep call instead, bestie.

So like, deprecated functions will not be removed from the API โ€” but the fact that they're deprecated is a whole signal that there are problems with using them correctly. Read the room ๐Ÿ˜ญ

What it actually does: calls the external grep -i program and returns the matching lines.

Returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use ๐Ÿซถ

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See "PROTOCOL LIMITS".

(Added in 1.0.66) โญ


guestfs_grub_install ๐Ÿ‘ข๐Ÿ”ฅ

int
guestfs_grub_install (guestfs_h *g,
                      const char *root,
                      const char *device);

Okay so this command installs GRUB 1 (the Grand Unified Bootloader, iconic) on device, with the root directory being root. Slay ๐ŸŽ€

Notes, and these are important so pay attention ๐Ÿ™ˆ:

  • There is currently no way in the API to install grub2, which is what most modern Linux guests use. You can run the grub2 command from the guest, but go check the caveats in "RUNNING COMMANDS" first.
  • This uses grub-install(8) from the host. Unfortunately grub is not always compatible with itself ๐Ÿ˜ญ so this only works in rather narrow circumstances. Careful testing with each guest version is advisable โ€” fr fr, test it.
  • If grub-install reports the error "No suitable drive was found in the generated device map." it may be that you need to create a /boot/grub/device.map file first, containing the mapping between grub device names and Linux device names. Usually it's enough to create a file containing:
(hd0) /dev/vda

โ€ฆreplacing /dev/vda with the name of the installation device ๐Ÿ’œ

Returns 0 on success or -1 on error.

This function depends on the feature "grub". See also guestfs_feature_available ๐Ÿฆ‹

(Added in 1.0.17) โญ


guestfs_head ๐Ÿ“„

char **
guestfs_head (guestfs_h *g,
              const char *path);

This command returns up to the first 10 lines of a file, as a list of strings. Classic head behaviour, we love her ๐Ÿ’–

Returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use ๐Ÿซถ

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See "PROTOCOL LIMITS".

(Added in 1.0.54) โญ


guestfs_head_n ๐Ÿ“„โœจ

char **
guestfs_head_n (guestfs_h *g,
                int nrlines,
                const char *path);

This one's got range, bestie ๐Ÿฆ‹ Depends entirely on what nrlines is:

  • If nrlines is a positive number, it returns the first nrlines lines of the file path.
  • If nrlines is a negative number, it returns lines from the file path, excluding the last nrlines lines.
  • If nrlines is zero, it returns an empty list. Nothing. Nada. ๐Ÿ’€

Returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use ๐Ÿซถ

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See "PROTOCOL LIMITS".

(Added in 1.0.54) โญ


guestfs_hexdump ๐Ÿงšโ€โ™€๏ธ

char *
guestfs_hexdump (guestfs_h *g,
                 const char *path);

This runs hexdump -C on the given path, and the result is the human-readable, canonical hex dump of the file. It's giving hacker movie energy ๐Ÿ”ฅ

Returns a string, or NULL on error. The caller must free the returned string after use ๐Ÿซถ

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See "PROTOCOL LIMITS".

(Added in 1.0.22) โญ


๐Ÿ Hivex era ๐Ÿ

Okay we're entering the hivex section and honestly? It's a whole vibe. Every single one of these is a wrapper around the hivex(3) call of the same name โ€” that's the pattern, bestie, they're all just vibing on top of hivex ๐Ÿ“


guestfs_hivex_close ๐Ÿ

int
guestfs_hivex_close (guestfs_h *g);

Close the current hivex handle. Bye bestie ๐Ÿ‘‹

This is a wrapper around the hivex(3) call of the same name โœจ

Returns 0 on success or -1 on error.

This function depends on the feature "hivex". See also guestfs_feature_available ๐Ÿฆ‹

(Added in 1.19.35) โญ


guestfs_hivex_commit ๐Ÿ๐Ÿ’พ

int
guestfs_hivex_commit (guestfs_h *g,
                      const char *filename);

Commit (write) changes to the hive. Locking it in, periodt ๐Ÿ’…

If the optional filename parameter is null, then the changes are written back to the same hive that was opened. If it's not null, then they're written to the alternate filename given and the original hive is left untouched. Iconic, non-destructive behaviour โœจ

This is a wrapper around the hivex(3) call of the same name ๐Ÿ

Returns 0 on success or -1 on error.

This function depends on the feature "hivex". See also guestfs_feature_available ๐Ÿฆ‹

(Added in 1.19.35) โญ


guestfs_hivex_node_add_child ๐Ÿ๐Ÿ‘ถ

int64_t
guestfs_hivex_node_add_child (guestfs_h *g,
                              int64_t parent,
                              const char *name);

Add a child node to parent named name. New node just dropped ๐ŸŒˆ

This is a wrapper around the hivex(3) call of the same name ๐Ÿ

On error this function returns -1.

This function depends on the feature "hivex". See also guestfs_feature_available ๐Ÿฆ‹

(Added in 1.19.35) โญ


guestfs_hivex_node_children ๐Ÿ๐Ÿ‘‘

struct guestfs_hivex_node_list *
guestfs_hivex_node_children (guestfs_h *g,
                             int64_t nodeh);

Return the list of nodes which are subkeys of nodeh โ€” all the little subkeys, gathered together ๐Ÿ’–

This is a wrapper around the hivex(3) call of the same name ๐Ÿ

This function returns a struct guestfs_hivex_node_list *, or NULL if there was an error. The caller must call guestfs_free_hivex_node_list after use ๐Ÿซถ

This function depends on the feature "hivex". See also guestfs_feature_available ๐Ÿฆ‹

(Added in 1.19.35) โญ


guestfs_hivex_node_delete_child ๐Ÿ๐Ÿ’€

int
guestfs_hivex_node_delete_child (guestfs_h *g,
                                 int64_t nodeh);

Delete nodeh, recursively if necessary. Gone, reduced to atoms ๐Ÿ˜ญ

This is a wrapper around the hivex(3) call of the same name ๐Ÿ

Returns 0 on success or -1 on error.

This function depends on the feature "hivex". See also guestfs_feature_available ๐Ÿฆ‹

(Added in 1.19.35) โญ


guestfs_hivex_node_get_child ๐Ÿ๐Ÿ”Ž

int64_t
guestfs_hivex_node_get_child (guestfs_h *g,
                              int64_t nodeh,
                              const char *name);

Return the child of nodeh with the name name, if it exists ๐Ÿ’œ This can return 0 meaning the name was not found โ€” so like, 0 is the "no bestie here" answer, don't get it twisted ๐Ÿ™ˆ

This is a wrapper around the hivex(3) call of the same name ๐Ÿ

On error this function returns -1.

This function depends on the feature "hivex". See also guestfs_feature_available ๐Ÿฆ‹

(Added in 1.19.35) โญ


guestfs_hivex_node_get_value ๐Ÿ๐Ÿ”‘

int64_t
guestfs_hivex_node_get_value (guestfs_h *g,
                              int64_t nodeh,
                              const char *key);

Return the value attached to nodeh which has the name key, if it exists ๐ŸŒธ This can return 0 meaning the key was not found โ€” same deal as above, 0 means "nope, not here" โœจ

This is a wrapper around the hivex(3) call of the same name ๐Ÿ

On error this function returns -1.

This function depends on the feature "hivex". See also guestfs_feature_available ๐Ÿฆ‹

(Added in 1.19.35) โญ


guestfs_hivex_node_name ๐Ÿ๐Ÿท๏ธ

char *
guestfs_hivex_node_name (guestfs_h *g,
                         int64_t nodeh);

Return the name of nodeh. Simple as that, main character behaviour ๐Ÿ‘‘

This is a wrapper around the hivex(3) call of the same name ๐Ÿ

This function returns a string, or NULL on error. The caller must free the returned string after use ๐Ÿซถ

This function depends on the feature "hivex". See also guestfs_feature_available ๐Ÿฆ‹

(Added in 1.19.35) โญ


guestfs_hivex_node_parent ๐Ÿ๐Ÿ‘†

int64_t
guestfs_hivex_node_parent (guestfs_h *g,
                           int64_t nodeh);

Return the parent node of nodeh. Everyone's got a parent, even your registry nodes ๐Ÿ’–

This is a wrapper around the hivex(3) call of the same name ๐Ÿ

On error this function returns -1.

This function depends on the feature "hivex". See also guestfs_feature_available ๐Ÿฆ‹

(Added in 1.19.35) โญ

guestfs_hivex_node_set_value ๐Ÿ’…

int
guestfs_hivex_node_set_value (guestfs_h *g,
                              int64_t nodeh,
                              const char *key,
                              int64_t t,
                              const char *val,
                              size_t val_size);

okay so this one sets or replaces a single value under the node nodeh. The key is the name, t is the type, and val is the data. Slay.

This is a wrapper around the hivex(3) call of the same name.

This function returns 0 on success or -1 on error.

This function depends on the feature hivex. See also guestfs_feature_available.

(Added in 1.19.35)


guestfs_hivex_node_values ๐ŸŽ€

struct guestfs_hivex_value_list *
guestfs_hivex_node_values (guestfs_h *g,
                           int64_t nodeh);

Return the array of (key, datatype, data) tuples attached to nodeh. It's giving registry-tuple realness.

This is a wrapper around the hivex(3) call of the same name.

This function returns a struct guestfs_hivex_value_list *, or NULL if there was an error. The caller must call guestfs_free_hivex_value_list after use.

This function depends on the feature hivex. See also guestfs_feature_available.

(Added in 1.19.35)


guestfs_hivex_open ๐Ÿฆ‹

int
guestfs_hivex_open (guestfs_h *g,
                    const char *filename,
                    ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS.

GUESTFS_HIVEX_OPEN_VERBOSE, int verbose,
GUESTFS_HIVEX_OPEN_DEBUG, int debug,
GUESTFS_HIVEX_OPEN_WRITE, int write,
GUESTFS_HIVEX_OPEN_UNSAFE, int unsafe,

Open the Windows Registry hive file named filename. If there was any previous hivex handle associated with this guestfs session, then it is closed. Bye bestie to the old handle ๐Ÿ˜ญ

This is a wrapper around the hivex(3) call of the same name.

This function returns 0 on success or -1 on error.

This function depends on the feature hivex. See also guestfs_feature_available.

(Added in 1.19.35)


guestfs_hivex_open_va ๐ŸŒธ

int
guestfs_hivex_open_va (guestfs_h *g,
                       const char *filename,
                       va_list args);

This is the va_list variant of guestfs_hivex_open.

See CALLS WITH OPTIONAL ARGUMENTS.


guestfs_hivex_open_argv ๐ŸŒˆ

int
guestfs_hivex_open_argv (guestfs_h *g,
                         const char *filename,
                         const struct guestfs_hivex_open_argv *optargs);

This is the argv variant of guestfs_hivex_open.

See CALLS WITH OPTIONAL ARGUMENTS.


guestfs_hivex_root ๐Ÿ‘‘

int64_t
guestfs_hivex_root (guestfs_h *g);

Return the root node of the hive. Main character node energy, honestly.

This is a wrapper around the hivex(3) call of the same name.

On error this function returns -1.

This function depends on the feature hivex. See also guestfs_feature_available.

(Added in 1.19.35)


guestfs_hivex_value_key ๐Ÿ’–

char *
guestfs_hivex_value_key (guestfs_h *g,
                         int64_t valueh);

Return the key (name) field of a (key, datatype, data) tuple.

This is a wrapper around the hivex(3) call of the same name.

This function returns a string, or NULL on error. The caller must free the returned string after use.

This function depends on the feature hivex. See also guestfs_feature_available.

(Added in 1.19.35)


guestfs_hivex_value_string โœจ

char *
guestfs_hivex_value_string (guestfs_h *g,
                            int64_t valueh);

This calls guestfs_hivex_value_value (which returns the data field from a hivex value tuple). It then assumes that the field is a UTF-16LE string and converts the result to UTF-8 (or if this is not possible, it returns an error). Literally the encoding glow-up.

This is useful for reading strings out of the Windows registry. However it is not foolproof because the registry is not strongly-typed and fields can contain arbitrary or unexpected data. Vibe check: the registry can be messy, bestie.

This function returns a string, or NULL on error. The caller must free the returned string after use.

This function depends on the feature hivex. See also guestfs_feature_available.

(Added in 1.37.22)


guestfs_hivex_value_type ๐Ÿ“

int64_t
guestfs_hivex_value_type (guestfs_h *g,
                          int64_t valueh);

Return the data type field from a (key, datatype, data) tuple.

This is a wrapper around the hivex(3) call of the same name.

On error this function returns -1.

This function depends on the feature hivex. See also guestfs_feature_available.

(Added in 1.19.35)


guestfs_hivex_value_utf8 ๐Ÿ’€

char *
guestfs_hivex_value_utf8 (guestfs_h *g,
                          int64_t valueh);

This function is deprecated. In new code, use the guestfs_hivex_value_string call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions. No cap, use the shiny one instead.

This calls guestfs_hivex_value_value (which returns the data field from a hivex value tuple). It then assumes that the field is a UTF-16LE string and converts the result to UTF-8 (or if this is not possible, it returns an error).

This is useful for reading strings out of the Windows registry. However it is not foolproof because the registry is not strongly-typed and fields can contain arbitrary or unexpected data.

This function returns a string, or NULL on error. The caller must free the returned string after use.

This function depends on the feature hivex. See also guestfs_feature_available.

(Added in 1.19.35)


guestfs_hivex_value_value ๐Ÿซถ

char *
guestfs_hivex_value_value (guestfs_h *g,
                           int64_t valueh,
                           size_t *size_r);

Return the data field of a (key, datatype, data) tuple.

This is a wrapper around the hivex(3) call of the same name.

See also: guestfs_hivex_value_utf8.

This function returns a buffer, or NULL on error. The size of the returned buffer is written to *size_r. The caller must free the returned buffer after use.

This function depends on the feature hivex. See also guestfs_feature_available.

(Added in 1.19.35)


guestfs_initrd_cat ๐Ÿงš

char *
guestfs_initrd_cat (guestfs_h *g,
                    const char *initrdpath,
                    const char *filename,
                    size_t *size_r);

This command unpacks the file filename from the initrd file called initrdpath. The filename must be given without the initial / character.

For example, in guestfish you could use the following command to examine the boot script (usually called /init) contained in a Linux initrd or initramfs image:

initrd-cat /boot/initrd-<version>.img init

See also guestfs_initrd_list.

This function returns a buffer, or NULL on error. The size of the returned buffer is written to *size_r. The caller must free the returned buffer after use.

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See PROTOCOL LIMITS.

(Added in 1.0.84)


guestfs_initrd_list ๐ŸŒŸ

char **
guestfs_initrd_list (guestfs_h *g,
                     const char *path);

This command lists out files contained in an initrd.

The files are listed without any initial / character. The files are listed in the order they appear (not necessarily alphabetical). Directory names are listed as separate items. Order as they appear, not alphabet soup.

Old Linux kernels (2.4 and earlier) used a compressed ext2 filesystem as initrd. We only support the newer initramfs format (compressed cpio files). So if you're on ancient kernel vibes, this is not the one.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

(Added in 1.0.54)


guestfs_inotify_add_watch ๐Ÿ’œ

int64_t
guestfs_inotify_add_watch (guestfs_h *g,
                           const char *path,
                           int mask);

Watch path for the events listed in mask.

Note that if path is a directory then events within that directory are watched, but this does not happen recursively (in subdirectories). So don't assume it's stalking the whole tree, bestie.

Note for non-C or non-Linux callers: the inotify events are defined by the Linux kernel ABI and are listed in /usr/include/sys/inotify.h.

On error this function returns -1.

This function depends on the feature inotify. See also guestfs_feature_available.

(Added in 1.0.66)


guestfs_inotify_close ๐ŸŽ€

int
guestfs_inotify_close (guestfs_h *g);

This closes the inotify handle which was previously opened by inotify_init. It removes all watches, throws away any pending events, and deallocates all resources. Cleanup era.

This function returns 0 on success or -1 on error.

This function depends on the feature inotify. See also guestfs_feature_available.

(Added in 1.0.66)


guestfs_inotify_files ๐ŸŒธ

char **
guestfs_inotify_files (guestfs_h *g);

This function is a helpful wrapper around guestfs_inotify_read which just returns a list of pathnames of objects that were touched. The returned pathnames are sorted and deduplicated. Sorted, deduped, cute.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

This function depends on the feature inotify. See also guestfs_feature_available.

(Added in 1.0.66)


guestfs_inotify_init ๐Ÿ”ฅ

int
guestfs_inotify_init (guestfs_h *g,
                      int maxevents);

This command creates a new inotify handle. The inotify subsystem can be used to notify events which happen to objects in the guest filesystem.

maxevents is the maximum number of events which will be queued up between calls to guestfs_inotify_read or guestfs_inotify_files. If this is passed as 0, then the kernel (or previously set) default is used. For Linux 2.6.29 the default was 16384 events. Beyond this limit, the kernel throws away events, but records the fact that it threw them away by setting a flag IN_Q_OVERFLOW in the returned structure list (see guestfs_inotify_read). So yeah, overflow is a real thing.

Before any events are generated, you have to add some watches to the internal watch list. See: guestfs_inotify_add_watch and guestfs_inotify_rm_watch.

Queued up events should be read periodically by calling guestfs_inotify_read (or guestfs_inotify_files which is just a helpful wrapper around guestfs_inotify_read). If you don't read the events out often enough then you risk the internal queue overflowing. Keep up with the queue, bestie, or it's giving overflow.

...and honestly the way to close it out is just calling guestfs_inotify_close when you're done with it, bestie. That's the whole vibe โ€” it also yeets all the watches automatically, so no leftover mess, we love a clean exit ๐Ÿ’…

Also go peek at inotify(7) if you want the lore on the inotify interface the way the Linux kernel exposes it, because that's roughly the same thing we're handing you through libguestfs. One (1) tiny detail to remember: there is one global inotify handle per libguestfs instance โ€” that's it, that's the whole handle budget, don't go looking for more โœจ

This function returns 0 on success or -1 on error.

This function depends on the feature "inotify". See also "guestfs_feature_available".

(Added in 1.0.66)

guestfs_inotify_read ๐Ÿฆ‹

struct guestfs_inotify_event_list *
guestfs_inotify_read (guestfs_h *g);

Okay so this one hands you back the complete queue of events that have happened since your previous read call. Full drop, no crumbs.

And if literally nothing has happened? You get an empty list. Peaceful. Quiet. Iconic.

Note, and this part matters so read it twice: to make sure you've actually read all the events, you have to call this function again and again until it returns an empty list. Why? Because the call only reads events up to the maximum appliance-to-host message size and then leaves the rest just chilling in the queue. So one call is not the whole story, ever.

This function returns a struct guestfs_inotify_event_list *, or NULL if there was an error. The caller must call guestfs_free_inotify_event_list after use.

This function depends on the feature "inotify". See also "guestfs_feature_available".

(Added in 1.0.66)

guestfs_inotify_rm_watch ๐ŸŽ€

int
guestfs_inotify_rm_watch (guestfs_h *g,
                          int wd);

Removes an inotify watch you set up earlier. Check "guestfs_inotify_add_watch" if you need a refresher on where it came from ๐Ÿ’–

This function returns 0 on success or -1 on error.

This function depends on the feature "inotify". See also "guestfs_feature_available".

(Added in 1.0.66)

guestfs_inspect_get_arch ๐ŸŒธ

char *
guestfs_inspect_get_arch (guestfs_h *g,
                          const char *root);

Returns the architecture of the inspected operating system โ€” all the possible return values are listed over at "guestfs_file_architecture", go look, they ate.

And if we genuinely can't figure out the architecture? You get the string "unknown". It happens, we don't judge ๐Ÿ™ˆ

Please read "INSPECTION" for more details.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.5.3)

guestfs_inspect_get_build_id ๐ŸŒŸ

char *
guestfs_inspect_get_build_id (guestfs_h *g,
                              const char *root);

This gives you the build ID of the system, or the string "unknown" if the system simply doesn't have one. No build ID? Not a problem, just "unknown".

For Windows, this gets the build number. And even though it comes back as a string, it is (so far) always a number โ€” so like, don't come for me about the type. Check https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions for some possible values if you're curious ๐Ÿ‘‘

For Linux, this returns the "BUILD_ID" string from /etc/os-release, though ngl this is not often used.

Please read "INSPECTION" for more details.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.49.8)

guestfs_inspect_get_distro ๐Ÿ”ฅ

char *
guestfs_inspect_get_distro (guestfs_h *g,
                            const char *root);

Returns the distro (distribution) of the inspected operating system. Currently defined distros are, in all their glory:

  • "alpinelinux" โ€” Alpine Linux.
  • "altlinux" โ€” ALT Linux.
  • "archlinux" โ€” Arch Linux.
  • "buildroot" โ€” Buildroot-derived distro, but not one we specifically recognize.
  • "centos" โ€” CentOS.
  • "circle" โ€” Circle Linux.
  • "cirros" โ€” Cirros.
  • "coreos" โ€” CoreOS.
  • "debian" โ€” Debian.
  • "fedora" โ€” Fedora.
  • "freebsd" โ€” FreeBSD.
  • "freedos" โ€” FreeDOS.
  • "frugalware" โ€” Frugalware.
  • "gentoo" โ€” Gentoo.
  • "kalilinux" โ€” Kali Linux.
  • "kylin" โ€” Kylin.
  • "linuxmint" โ€” Linux Mint.
  • "mageia" โ€” Mageia.
  • "mandriva" โ€” Mandriva.
  • "meego" โ€” MeeGo.
  • "msdos" โ€” Microsoft DOS.
  • "neokylin" โ€” NeoKylin.
  • "netbsd" โ€” NetBSD.
  • "openbsd" โ€” OpenBSD.
  • "openeuler" โ€” openEuler.
  • "openmandriva" โ€” OpenMandriva Lx.
  • "opensuse" โ€” OpenSUSE.
  • "oraclelinux" โ€” Oracle Linux.
  • "pardus" โ€” Pardus.
  • "pldlinux" โ€” PLD Linux.
  • "redhat-based" โ€” Some Red Hat-derived distro.
  • "rhel" โ€” Red Hat Enterprise Linux.
  • "rocky" โ€” Rocky Linux.
  • "scientificlinux" โ€” Scientific Linux.
  • "slackware" โ€” Slackware.
  • "sles" โ€” SuSE Linux Enterprise Server or Desktop.
  • "suse-based" โ€” Some openSuSE-derived distro.
  • "ttylinux" โ€” ttylinux.
  • "ubuntu" โ€” Ubuntu.
  • "unknown" โ€” The distro could not be determined.
  • "voidlinux" โ€” Void Linux.
  • "windows" โ€” Windows does not have distributions. This string is returned if the OS type is Windows.

Future versions of libguestfs may return other strings here, so your caller better be prepared to handle any string, no assumptions, that's the rule ๐Ÿ’€

Please read "INSPECTION" for more details.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.5.3)

guestfs_inspect_get_drive_mappings ๐Ÿซถ

char **
guestfs_inspect_get_drive_mappings (guestfs_h *g,
                                    const char *root);

This call is genuinely useful for Windows, which uses a very primitive little system of assigning drive letters (like C:\) to partitions. This inspection API goes through the Windows Registry to find out how disks/partitions are mapped to drive letters, and returns a hash table, like so:

 C      =>     /dev/vda2
 E      =>     /dev/vdb1
 F      =>     /dev/vdc1

Note that keys are drive letters. For Windows, the key is case insensitive and just contains the drive letter, without the customary colon separator character. So no colon, bestie.

In future we may support other operating systems that also used drive letters, but the keys for those might not be case insensitive and might be longer than 1 character. For example in OS-9, hard drives were named "h0", "h1" etc. So like, don't hardcode your assumptions.

For Windows guests, currently only hard drive mappings are returned. Removable disks (eg. DVD-ROMs) are ignored, sorry to them.

For guests that don't use drive mappings, or if the drive mappings could not be determined, this returns an empty hash table. Empty but valid, we still show up ๐Ÿ’œ

Please read "INSPECTION" for more details. See also "guestfs_inspect_get_mountpoints", "guestfs_inspect_get_filesystems".

This function returns a NULL-terminated array of strings, or NULL if there was an error. The array of strings will always have length "2n+1", where "n" keys and values alternate, followed by the trailing NULL entry. The caller must free the strings and the array after use.

(Added in 1.9.17)

guestfs_inspect_get_filesystems โญ

char **
guestfs_inspect_get_filesystems (guestfs_h *g,
                                 const char *root);

Returns a list of all the filesystems we think are associated with this operating system. That includes the root filesystem, other ordinary filesystems, and non-mounted devices like swap partitions. Everybody gets an invite to this list ๐ŸŒˆ

And in the case of a multi-boot virtual machine, it's totally possible for a filesystem to be shared between operating systems. Sharing is caring.

Please read "INSPECTION" for more details. See also "guestfs_inspect_get_mountpoints".

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

(Added in 1.5.3)

guestfs_inspect_get_format ๐Ÿ’€

char *
guestfs_inspect_get_format (guestfs_h *g,
                            const char *root);

Okay so, this function is deprecated. There is no replacement. Consult the API documentation in guestfs(3) for further information.

Deprecated functions will not be removed from the API, but the fact that they're deprecated indicates there are problems with correct use of these functions. So like, read the room.

Before libguestfs 1.38, there was some unreliable support for detecting installer CDs. This API would return:

  • "installed" โ€” This is an installed operating system.
  • "installer" โ€” The disk image being inspected is not an installed operating system, but a bootable install disk, live CD, or similar.
  • "unknown" โ€” The format of this disk image is not known.

In libguestfs โ‰ฅ 1.38, this only returns "installed". Use libosinfo directly to detect installer CDs โ€” that's the move now.

Please read "INSPECTION" for more details.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.9.4)

guestfs_inspect_get_hostname ๐Ÿงš

char *
guestfs_inspect_get_hostname (guestfs_h *g,
                              const char *root);

Returns the hostname of the operating system, as found by inspection of the guest's configuration files. Detective work, but make it filesystem.

If the hostname could not be determined, then the string "unknown" is returned. Again with the "unknown", it's giving consistent.

Please read "INSPECTION" for more details.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.7.9)

guestfs_inspect_get_icon ๐Ÿ‘‘

char *
guestfs_inspect_get_icon (guestfs_h *g,
                          const char *root,
                          size_t *size_r,
                          ...);

You may supply a list of optional arguments to this call โ€” zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS" if you need the full breakdown.

 GUESTFS_INSPECT_GET_ICON_FAVICON, int favicon,
 GUESTFS_INSPECT_GET_ICON_HIGHQUALITY, int highquality,

This function returns an icon corresponding to the inspected operating system. The icon comes back as a buffer containing a PNG image (re-encoded to PNG if necessary). Cute little visual, we love her ๐ŸŽ€

If it was not possible to get an icon, this function returns a zero-length (non-NULL) buffer. Callers must check for this case โ€” non-NULL does not mean "oh yay we got a picture", bestie, check the length.

Libguestfs will start by looking for a file called /etc/favicon.png or C:\etc\favicon.png and, if it has the correct format, the contents of this file will be returned. You can disable favicons by passing the optional "favicon" boolean as false (default is true).

If finding the favicon fails, then we look in other places in the guest for a suitable icon. We persist โœจ

If the optional "highquality" boolean is true then only high quality icons are returned, which means only icons of high resolution with an alpha channel. The default (false) is to return any icon we can, even if it is of substandard quality. Low standards, but honest ones.

Notes:

  • lowkey different from every other inspection call โ€” the guest's disks have to be mounted up before you call this, because it literally needs to read stuff off the guest filesystem while it's running. no mounted disks, no icon, periodt.
  • security bestie, listen ๐Ÿซถ โ€” that icon data is coming straight from an untrusted guest and you should treat it with caution. PNG files have been known to contain exploits. make sure libpng (or whatever relevant libraries) are fully up to date before you even think about processing or displaying that icon.
  • size is not it โ€” the PNG that comes back can be any size, and it might not even be square. Libguestfs tries to return the largest, highest quality icon it can find, but your app is the one that has to scale it to whatever size you actually need.
  • extracting icons from Windows guests needs extra help โ€” it requires the external wrestool(1) program from the "icoutils" package, plus several programs (bmptopnm(1), pnmtopng(1), pamcut(1)) from the "netpbm" package. these have to be installed separately, so don't come for libguestfs when they're missing.
  • legal tea โ˜• โ€” operating system icons are usually trademarks. seek legal advice before using trademarks in your applications, fr.

This function returns a buffer, or NULL on error. The size of the returned buffer is written to *size_r. The caller must free the returned buffer after use.

(Added in 1.11.12)

guestfs_inspect_get_icon_va

char *
guestfs_inspect_get_icon_va (guestfs_h *g,
                             const char *root,
                             size_t *size_r,
                             va_list args);

This is the "va_list variant" of "guestfs_inspect_get_icon".

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_inspect_get_icon_argv

char *
guestfs_inspect_get_icon_argv (guestfs_h *g,
                               const char *root,
                               size_t *size_r,
                               const struct guestfs_inspect_get_icon_argv *optargs);

This is the "argv variant" of "guestfs_inspect_get_icon".

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_inspect_get_major_version

int
guestfs_inspect_get_major_version (guestfs_h *g,
                                   const char *root);

This hands you the major version number of the inspected operating system. ๐Ÿ”ข

okay so Windows has this whole consistent versioning scheme that does not match the popular public names the OS actually uses. the big example: the thing everyone calls "Windows 7" is really version 6.1 (so major = 6, minor = 1). if you wanna know the real versions that correspond to Windows releases, go check Wikipedia or MSDN.

If the version couldn't be figured out, then 0 is returned.

Please read "INSPECTION" for more details.

On error this function returns -1.

(Added in 1.5.3)

guestfs_inspect_get_minor_version

int
guestfs_inspect_get_minor_version (guestfs_h *g,
                                   const char *root);

This one returns the minor version number of the inspected operating system.

If the version couldn't be figured out, then 0 is returned.

Please read "INSPECTION" for more details. See also "guestfs_inspect_get_major_version".

On error this function returns -1.

(Added in 1.5.3)

guestfs_inspect_get_mountpoints

char **
guestfs_inspect_get_mountpoints (guestfs_h *g,
                                 const char *root);

This returns a hash of where we think the filesystems belonging to this operating system should be mounted. ๐Ÿ“ and bestie, key word is think โ€” this is at best an educated guess made by reading config files like /etc/fstab. in particular, note that this may hand you filesystems that are non-existent or just plain not mountable, so callers should be ready to handle or ignore failures if they try to mount them.

Each element in the returned hashtable has a key that's the path of the mountpoint (eg. /boot) and a value that's the filesystem that would be mounted there (eg. /dev/sda1).

Non-mounted devices like swap devices are not returned in this list.

For operating systems like Windows that still use drive letters, this call only returns an entry for the first drive "mounted on" /. for the mapping of drive letters to partitions, see "guestfs_inspect_get_drive_mappings".

Please read "INSPECTION" for more details. See also "guestfs_inspect_get_filesystems".

This function returns a NULL-terminated array of strings, or NULL if there was an error. The array of strings will always have length "2n+1", where "n" keys and values alternate, followed by the trailing NULL entry. The caller must free the strings and the array after use.

(Added in 1.5.3)

guestfs_inspect_get_osinfo

char *
guestfs_inspect_get_osinfo (guestfs_h *g,
                            const char *root);

This gives you a possible short ID for libosinfo that corresponds to the guest. ๐Ÿท๏ธ

Note: the returned ID is only a guess by libguestfs, and nothing guarantees it actually exists in osinfo-db. so like, don't be shocked if it's not there.

If no ID could be determined (yes the original says "could not"โ€”we see you, typo, we're keeping the meaning), then the string "unknown" is returned.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.39.1)

guestfs_inspect_get_package_format

char *
guestfs_inspect_get_package_format (guestfs_h *g,
                                    const char *root);

This function and "guestfs_inspect_get_package_management" return the package format and the package management tool used by the inspected operating system. for example, for Fedora these functions would return "rpm" (package format), and "yum" or "dnf" (package management).

This returns the string "unknown" if we couldn't determine the package format, or if the operating system doesn't have a real packaging system (eg. Windows).

Possible strings include: "rpm", "deb", "ebuild", "pisi", "pacman", "pkgsrc", "apk", "xbps". future versions of libguestfs may return other strings, so stay ready. โœจ

Please read "INSPECTION" for more details.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.7.5)

guestfs_inspect_get_package_management

char *
guestfs_inspect_get_package_management (guestfs_h *g,
                                        const char *root);

"guestfs_inspect_get_package_format" and this function return the package format and the package management tool used by the inspected operating system. same example: for Fedora these would return "rpm" (package format), and "yum" or "dnf" (package management).

This returns the string "unknown" if we couldn't determine the package management tool, or if the OS doesn't have a real packaging system (eg. Windows).

Possible strings include: "yum", "dnf", "up2date", "apt" (for all Debian derivatives), "portage", "pisi", "pacman", "urpmi", "zypper", "apk", "xbps". future versions of libguestfs may return other strings.

Please read "INSPECTION" for more details.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.7.5)

guestfs_inspect_get_product_name

char *
guestfs_inspect_get_product_name (guestfs_h *g,
                                  const char *root);

This returns the product name of the inspected operating system. ๐Ÿ’– the product name is generally some freeform string that can be shown to the user, but it should not be parsed by programs โ€” it's giving "display only," iykyk.

If the product name couldn't be determined, then the string "unknown" is returned.

Please read "INSPECTION" for more details.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.5.3)

guestfs_inspect_get_product_variant

char *
guestfs_inspect_get_product_variant (guestfs_h *g,
                                     const char *root);

This returns the product variant of the inspected operating system.

For Windows guests, this returns the contents of the Registry key "HKLM\Software\Microsoft\Windows NT\CurrentVersion" "InstallationType", which is usually a string like "Client" or "Server" (other values are possible). this is how you tell apart consumer and enterprise versions of Windows that share the same version number โ€” for example, Windows 7 and Windows 2008 Server are both version 6.1, but the former is "Client" and the latter is "Server". slay, now you can tell them apart. ๐Ÿ‘‘

For enterprise Linux guests, in the future we intend this to return the product variant like "Desktop", "Server" and so on. but ngl, that's not implemented at the moment.

If the product variant couldn't be determined, then the string "unknown" is returned.

Please read "INSPECTION" for more details. See also "guestfs_inspect_get_product_name", "guestfs_inspect_get_major_version".

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.9.13)

guestfs_inspect_get_roots

char **
guestfs_inspect_get_roots (guestfs_h *g);

This function is a convenient little shortcut to get the list of root devices, as returned from a previous call to "guestfs_inspect_os", but without redoing the whole inspection process. ๐ŸŽ€

This returns an empty list if either no root devices were found, or the caller hasn't called "guestfs_inspect_os".

Please read "INSPECTION" for more details.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

(Added in 1.7.3)

guestfs_inspect_get_type

char *
guestfs_inspect_get_type (guestfs_h *g,
                          const char *root);

This returns the type of the inspected operating system. right now the defined types are:

  • "linux" โ€” any Linux-based operating system.
  • "windows" โ€” any Microsoft Windows operating system.
  • "freebsd" โ€” FreeBSD.
  • "netbsd" โ€” NetBSD.
  • "openbsd" โ€” OpenBSD.
  • "hurd" โ€” GNU/Hurd.
  • "dos" โ€” MS-DOS, FreeDOS and others.
  • "minix" โ€” MINIX.
  • "unknown" โ€” the operating system type couldn't be determined.

Future versions of libguestfs may return other strings here, so the caller should be prepared to handle any string. like, be flexible bestie. ๐ŸŒˆ

Please read "INSPECTION" for more details.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.5.3)

guestfs_inspect_get_windows_current_control_set

char *
guestfs_inspect_get_windows_current_control_set (guestfs_h *g,
                                                 const char *root);

This returns the Windows CurrentControlSet of the inspected guest. the CurrentControlSet is a registry key name like "ControlSet001". ๐Ÿ—๏ธ

okay so this call literally assumes the guest is Windows and that the Registry could be examined by inspection ๐Ÿ‘€. if that's not the case, it throws an error, no cap.

go read INSPECTION for the full tea โ˜•.

it returns a string, or NULL on error ๐Ÿ˜ญ. the caller has to free that returned string after use โ€” don't leave it hanging, bestie ๐Ÿ’….

(added in 1.9.17 โœจ)


guestfs_inspect_get_windows_group_policy

int
guestfs_inspect_get_windows_group_policy (guestfs_h *g,
                                          const char *root);

this returns true if the Windows guest has group policy ๐Ÿ‘‘. group policy can interfere with device driver installation, which lowkey blocks libguestfs features like driver injection from working ๐Ÿ˜ฌ.

note that the presence of group policy is only an indication that there may be a problem with driver installation. group policy is extremely complex and covers so many different aspects of Windows configuration, and we make no attempt to parse it, so presence of group policy should only raise a warning โš ๏ธ.

this call assumes the guest is Windows and that the Registry could be examined by inspection. if not, error time ๐Ÿšจ.

go read INSPECTION for more details.

it returns a C truth value on success or -1 on error.

(added in 1.57.6 ๐ŸŒธ)

guestfs_inspect_get_windows_software_hive

char *
guestfs_inspect_get_windows_software_hive (guestfs_h *g,
                                           const char *root);

this returns the path to the hive (that's the binary Windows Registry file, iykyk) corresponding to HKLM\SOFTWARE ๐Ÿ—‚๏ธ.

this call assumes the guest is Windows and that the guest has a software hive file with the right name. if that's not the case, it errors out. also important: this call does not check that the hive is a valid Windows Registry hive ๐Ÿšซ.

you can use guestfs_hivex_open to read or write to the hive ๐Ÿ’–.

go read INSPECTION for more details.

it returns a string, or NULL on error. the caller must free the returned string after use.

(added in 1.35.26 ๐Ÿฆ‹)

guestfs_inspect_get_windows_system_hive

char *
guestfs_inspect_get_windows_system_hive (guestfs_h *g,
                                         const char *root);

this returns the path to the hive (binary Windows Registry file) corresponding to HKLM\SYSTEM ๐Ÿ—‚๏ธ.

this call assumes the guest is Windows and that the guest has a system hive file with the right name. if not, error. and again, this call does not check that the hive is a valid Windows Registry hive ๐Ÿšซ.

you can use guestfs_hivex_open to read or write to the hive ๐Ÿ’–.

go read INSPECTION for more details.

it returns a string, or NULL on error. the caller must free the returned string after use.

(added in 1.35.26 ๐Ÿฆ‹)

guestfs_inspect_get_windows_systemroot

char *
guestfs_inspect_get_windows_systemroot (guestfs_h *g,
                                        const char *root);

this returns the Windows systemroot of the inspected guest ๐ŸŒˆ. the systemroot is a directory path such as /WINDOWS ๐Ÿ“.

this call assumes the guest is Windows and that the systemroot could be determined by inspection. if not, it throws an error ๐Ÿ˜ญ.

go read INSPECTION for more details.

it returns a string, or NULL on error. the caller must free the returned string after use.

(added in 1.5.25 โญ)

guestfs_inspect_is_live

int
guestfs_inspect_is_live (guestfs_h *g,
                         const char *root);

bestie this function is deprecated ๐Ÿ˜ฌ. there is no replacement. consult the API documentation in guestfs(3) for further information.

deprecated functions will not be removed from the API, but the fact that they're deprecated means there are legit problems with using them correctly ๐Ÿšฉ.

this is deprecated and always returns false โ€” like, it's not even trying ๐Ÿ’€.

go read INSPECTION for more details.

it returns a C truth value on success or -1 on error.

(added in 1.9.4 ๐Ÿ“)

guestfs_inspect_is_multipart

int
guestfs_inspect_is_multipart (guestfs_h *g,
                              const char *root);

okay so same deal: this function is deprecated ๐Ÿ˜ฌ. there is no replacement. consult the API documentation in guestfs(3) for further information.

deprecated functions will not be removed from the API, but the label means there are problems with correct use ๐Ÿšฉ.

this is deprecated and always returns false ๐Ÿ’€.

go read INSPECTION for more details.

it returns a C truth value on success or -1 on error.

(added in 1.9.4 ๐Ÿ“)

guestfs_inspect_is_netinst

int
guestfs_inspect_is_netinst (guestfs_h *g,
                            const char *root);

yep, also deprecated ๐Ÿ˜ฌ. no replacement. consult the API documentation in guestfs(3) for more info.

deprecated functions will not be removed from the API, but the fact that they're deprecated indicates there are problems with correct use ๐Ÿšฉ.

this is deprecated and always returns false ๐Ÿ’€.

go read INSPECTION for more details.

it returns a C truth value on success or -1 on error.

(added in 1.9.4 ๐Ÿ“)

guestfs_inspect_list_applications

struct guestfs_application_list *
guestfs_inspect_list_applications (guestfs_h *g,
                                   const char *root);

this function is deprecated ๐Ÿ˜ฌ. in new code, use the guestfs_inspect_list_applications2 call instead, periodt ๐Ÿ’….

deprecated functions will not be removed from the API, but the fact that they're deprecated indicates there are problems with correct use ๐Ÿšฉ.

it returns the list of applications installed in the operating system ๐Ÿ“ฆ.

note: this call works differently from other parts of the inspection API ๐Ÿ‘€. you have to call guestfs_inspect_os, then guestfs_inspect_get_mountpoints, then mount up the disks, before calling this. listing applications is a significantly more difficult operation which requires access to the full filesystem. also note that unlike the other guestfs_inspect_get_* calls which are just returning data cached in the libguestfs handle, this call actually reads parts of the mounted filesystems during the call ๐Ÿซถ.

this returns an empty list if the inspection code was not able to determine the list of applications.

the application structure contains these fields:

  • app_name โ€” the name of the application. for Linux guests, this is the package name.
  • app_display_name โ€” the display name of the application, sometimes localized to the install language of the guest operating system. if unavailable this is returned as an empty string "". callers needing to display something can use app_name instead.
  • app_epoch โ€” for package managers which use epochs, this contains the epoch of the package (an integer). if unavailable, this is returned as 0.
  • app_version โ€” the version string of the application or package. if unavailable this is returned as an empty string "".
  • app_release โ€” the release string of the application or package, for package managers that use this. if unavailable this is returned as an empty string "".
  • app_install_path โ€” the installation path of the application (on operating systems such as Windows which use installation paths). this path is in the format used by the guest operating system, it is not a libguestfs path. if unavailable this is returned as an empty string "".
  • app_trans_path โ€” the install path translated into a libguestfs path. if unavailable this is returned as an empty string "".
  • app_publisher โ€” the name of the publisher of the application, for package managers that use this. if unavailable this is returned as an empty string "".
  • app_url โ€” the URL (eg. upstream URL) of the application. if unavailable this is returned as an empty string "".
  • app_source_package โ€” for packaging systems which support this, the name of the source package. if unavailable this is returned as an empty string "".
  • app_summary โ€” a short (usually one line) description of the application or package. if unavailable this is returned as an empty string "".
  • app_description โ€” a longer description of the application or package. if unavailable this is returned as an empty string "".

go read INSPECTION for more details.

it returns a struct guestfs_application_list *, or NULL if there was an error. the caller must call guestfs_free_application_list after use ๐Ÿ’–.

(added in 1.7.8 ๐ŸŽ€)

guestfs_inspect_list_applications2

struct guestfs_application2_list *
guestfs_inspect_list_applications2 (guestfs_h *g,
                                    const char *root);

this returns the list of applications installed in the operating system ๐Ÿ“ฆ. (this is the non-deprecated one, slay โœจ.)

note: this call works differently from other parts of the inspection API ๐Ÿ‘€. you have to call guestfs_inspect_os, then guestfs_inspect_get_mountpoints, then mount up the disks, before calling this. listing applications is a significantly more difficult operation which requires access to the full filesystem. also note that unlike the other guestfs_inspect_get_* calls which are just returning data cached in the libguestfs handle, this call actually reads parts of the mounted filesystems during the call ๐Ÿซถ.

this returns an empty list if the inspection code was not able to determine the list of applications.

the application structure contains these fields:

  • app2_name โ€” the name of the application. for Linux guests, this is the package name.
  • app2_display_name โ€” the display name of the application, sometimes localized to the install language of the guest operating system. if unavailable this is returned as an empty string "". callers needing to display something can use app2_name instead.
  • app2_epoch โ€” for package managers which use epochs, this contains the epoch of the package (an integer). if unavailable, this is returned as 0.
  • app2_version โ€” the version string of the application or package. if unavailable this is returned as an empty string "".
  • app2_release โ€” the release string of the application or package, for package managers that use this. if unavailable this is returned as an empty string "".
  • app2_arch โ€” the architecture string of the application or package, for package managers that use this. if unavailable this is returned as an empty string "".
  • app2_install_path โ€” the installation path of the application (on operating systems like Windows that actually use installation paths, iykyk). Heads up bestie: this path is in the format used by the guest operating system, it is not a libguestfs path ๐Ÿ”ฅ

If it's unavailable you get back the empty string "", no drama.

  • app2_trans_path โ€” that same install path, but translated into a libguestfs path ๐Ÿฆ‹ If it's unavailable, once again: empty string "".
  • app2_publisher โ€” the name of the publisher of the application, for the package managers that keep track of that kind of thing ๐Ÿ’… If it's unavailable, empty string "".
  • app2_url โ€” the URL of the application (like, the upstream URL). If it's unavailable, empty string "" ๐ŸŒˆ
  • app2_source_package โ€” for the packaging systems that support this, the name of the source package ๐Ÿ“ฆ If it's unavailable, empty string "".
  • app2_summary โ€” a short (usually one line) description of the application or package. Literally the elevator pitch. If it's unavailable, empty string "" โœจ
  • app2_description โ€” the longer, more rambling description of the application or package. The full lore. If it's unavailable, empty string "" ๐Ÿ“–
  • app2_class โ€” classification, aka the primary use of this application. Currently the only defined classification is "antivirus" for Windows antivirus software. If it's unknown, empty string "" ๐Ÿงš

Please read INSPECTION for more details ๐Ÿ‘€

This function returns a struct guestfs_application2_list *, or NULL if there was an error. The caller must call guestfs_free_application2_list after use โ€” yes, that's on you, don't ghost it ๐Ÿ™ˆ

(Added in 1.19.56)


๐ŸŒธ guestfs_inspect_os

char **
guestfs_inspect_os (guestfs_h *g);

This function pulls in a bunch of other libguestfs functions plus some heuristics and goes snooping through the disk(s) (usually the disks of a virtual machine) looking for operating systems ๐Ÿ”โœจ

The list it returns is empty if no operating systems were found. Sad but valid ๐Ÿ’€

If one operating system was found, it returns a list with a single element, which is the name of the root filesystem of that operating system ๐ŸŽ€ And plot twist: it's also totally possible for this function to return a list with more than one element โ€” that means a dual-boot or multi-boot virtual machine, and each element is the root filesystem of one of the operating systems ๐Ÿ‘‘

You can pass the root string(s) it gives you into other guestfs_inspect_get_* functions to query even more info about each operating system, like the name and version, bestie ๐ŸŒˆ

This function uses other libguestfs features such as guestfs_mount_ro and guestfs_umount_all to mount and unmount filesystems and peek at the contents. It should be called with no disks currently mounted โ€” that part is not optional, fr fr. It may also use Augeas, so any existing Augeas handle will be closed ๐Ÿ˜ญ

This function cannot decrypt encrypted disks. If the disk is encrypted, the caller has to do that first (supplying the necessary keys). No shortcuts, sorry.

Please read INSPECTION for more details ๐Ÿ’–

See also guestfs_list_filesystems ๐Ÿ‘€

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use ๐Ÿซถ

(Added in 1.5.3)


๐Ÿฆ‹ guestfs_is_blockdev

int
guestfs_is_blockdev (guestfs_h *g,
                     const char *path);

This one's here for backwards compatibility with earlier versions of libguestfs โ€” it's basically a vibe-preserving rerun. It simply calls guestfs_is_blockdev_opts with no optional arguments ๐Ÿ’ซ

(Added in 1.5.10)

๐Ÿ’… guestfs_is_blockdev_opts

int
guestfs_is_blockdev_opts (guestfs_h *g,
                          const char *path,
                          ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS โœจ

  • GUESTFS_IS_BLOCKDEV_OPTS_FOLLOWSYMLINKS, int followsymlinks,

This returns true if and only if there is a block device with the given path name ๐Ÿ’พ

If the optional flag followsymlinks is true, then a symlink (or a whole chain of symlinks) that ends with a block device also makes the function return true ๐Ÿ”—

This call only looks at files within the guest filesystem. Libguestfs partitions and block devices (eg. /dev/sda) cannot be used as the path parameter of this call. Not up for debate ๐Ÿ˜ค

See also guestfs_stat ๐Ÿ‘‘

Returns a C truth value on success, or -1 on error ๐Ÿ’€

(Added in 1.5.10)

๐ŸŽ€ guestfs_is_blockdev_opts_va

int
guestfs_is_blockdev_opts_va (guestfs_h *g,
                             const char *path,
                             va_list args);

This is the va_list variant of guestfs_is_blockdev_opts ๐ŸŒŸ

See CALLS WITH OPTIONAL ARGUMENTS.

๐Ÿงš guestfs_is_blockdev_opts_argv

int
guestfs_is_blockdev_opts_argv (guestfs_h *g,
                               const char *path,
                               const struct guestfs_is_blockdev_opts_argv *optargs);

This is the argv variant of guestfs_is_blockdev_opts ๐ŸŒŸ

See CALLS WITH OPTIONAL ARGUMENTS.


๐Ÿ’€ guestfs_is_busy

int
guestfs_is_busy (guestfs_h *g);

This always returns false. This function is deprecated with no replacement. Do not use this function ๐Ÿ™ˆ Likeโ€ฆ genuinely, don't.

For more information on states, see guestfs(3).

Returns a C truth value on success, or -1 on error.

(Added in 1.0.2)


๐ŸŒธ guestfs_is_chardev

int
guestfs_is_chardev (guestfs_h *g,
                    const char *path);

Provided for backwards compatibility with earlier versions of libguestfs. It simply calls guestfs_is_chardev_opts with no optional arguments ๐Ÿซถ

(Added in 1.5.10)

โญ guestfs_is_chardev_opts

int
guestfs_is_chardev_opts (guestfs_h *g,
                         const char *path,
                         ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS โœจ

  • GUESTFS_IS_CHARDEV_OPTS_FOLLOWSYMLINKS, int followsymlinks,

This returns true if and only if there is a character device with the given path name ๐ŸŽ›๏ธ

If the optional flag followsymlinks is true, then a symlink (or chain of symlinks) that ends with a chardev also causes the function to return true ๐Ÿ”—

See also guestfs_stat ๐Ÿ‘‘

Returns a C truth value on success, or -1 on error ๐Ÿ˜ญ

(Added in 1.5.10)

๐Ÿฆ‹ guestfs_is_chardev_opts_va

int
guestfs_is_chardev_opts_va (guestfs_h *g,
                            const char *path,
                            va_list args);

This is the va_list variant of guestfs_is_chardev_opts ๐ŸŒŸ

See CALLS WITH OPTIONAL ARGUMENTS.

๐ŸŽ€ guestfs_is_chardev_opts_argv

int
guestfs_is_chardev_opts_argv (guestfs_h *g,
                              const char *path,
                              const struct guestfs_is_chardev_opts_argv *optargs);

This is the argv variant of guestfs_is_chardev_opts ๐ŸŒŸ

See CALLS WITH OPTIONAL ARGUMENTS.


๐Ÿ‘‘ guestfs_is_config

int
guestfs_is_config (guestfs_h *g);

This returns true iff this handle is being configured (aka it's sitting in the CONFIG state) ๐Ÿ”ง

For more information on states, see guestfs(3).

Returns a C truth value on success, or -1 on error ๐Ÿ’€

(Added in 1.0.2)


๐Ÿ“ guestfs_is_dir

int
guestfs_is_dir (guestfs_h *g,
                const char *path);

Backwards-compatibility babe โ€” it simply calls guestfs_is_dir_opts with no optional arguments ๐Ÿซถ

(Added in 0.8)

๐ŸŒˆ guestfs_is_dir_opts

int
guestfs_is_dir_opts (guestfs_h *g,
                     const char *path,
                     ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS โœจ

  • GUESTFS_IS_DIR_OPTS_FOLLOWSYMLINKS, int followsymlinks,

This returns true if and only if there is a directory with the given path name. And like, note that it returns false for other objects like files โ€” a file is not a directory, shocking, I know ๐Ÿ’…

If the optional flag followsymlinks is true, then a symlink (or chain of symlinks) that ends with a directory also causes the function to return true ๐Ÿ”—

See also guestfs_stat ๐Ÿ‘‘

Returns a C truth value on success, or -1 on error ๐Ÿ˜ญ

(Added in 0.8)

๐Ÿ’œ guestfs_is_dir_opts_va

int
guestfs_is_dir_opts_va (guestfs_h *g,
                        const char *path,
                        va_list args);

This is the va_list variant of guestfs_is_dir_opts ๐ŸŒŸ

See CALLS WITH OPTIONAL ARGUMENTS.

๐Ÿงš guestfs_is_dir_opts_argv

int
guestfs_is_dir_opts_argv (guestfs_h *g,
                          const char *path,
                          const struct guestfs_is_dir_opts_argv *optargs);

This is the argv variant of guestfs_is_dir_opts ๐ŸŒŸ

See CALLS WITH OPTIONAL ARGUMENTS.


๐ŸŽ€ guestfs_is_fifo

int
guestfs_is_fifo (guestfs_h *g,
                 const char *path);

Provided for backwards compatibility with earlier versions of libguestfs. It simply calls guestfs_is_fifo_opts with no optional arguments ๐Ÿ’ซ

(Added in 1.5.10)

๐ŸŒธ guestfs_is_fifo_opts

int
guestfs_is_fifo_opts (guestfs_h *g,
                      const char *path,
                      ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS โœจ

  • GUESTFS_IS_FIFO_OPTS_FOLLOWSYMLINKS, int followsymlinks,

This returns true if and only if there is a FIFO (named pipe) with the given path name ๐Ÿšฐ

If the optional flag followsymlinks is true, then a symlink (or chain of symlinks) that ends with a FIFO also causes the function to return true ๐Ÿ”—

See also guestfs_stat ๐Ÿ‘‘

Returns a C truth value on success, or -1 on error ๐Ÿ˜ญ

(Added in 1.5.10)

๐Ÿฆ‹ guestfs_is_fifo_opts_va

int
guestfs_is_fifo_opts_va (guestfs_h *g,
                         const char *path,
                         va_list args);

This is the va_list variant of guestfs_is_fifo_opts ๐ŸŒŸ

See CALLS WITH OPTIONAL ARGUMENTS.

โญ guestfs_is_fifo_opts_argv

int
guestfs_is_fifo_opts_argv (guestfs_h *g,
                           const char *path,
                           const struct guestfs_is_fifo_opts_argv *optargs);

This is the argv variant of guestfs_is_fifo_opts ๐ŸŒŸ

See CALLS WITH OPTIONAL ARGUMENTS.

๐ŸŽ€ guestfs_is_file

int
guestfs_is_file (guestfs_h *g,
                 const char *path);

Okay so this one is literally just here for backwards compatibility with earlier versions of libguestfs โ€” it's the OG, the elder. It simply calls guestfs_is_file_opts with no optional arguments. That's it. That's the whole vibe.

(Added in 0.8)


โœจ guestfs_is_file_opts

int
guestfs_is_file_opts (guestfs_h *g,
                      const char *path,
                      ...);

Bestie, you can hand this one a whole list of optional arguments. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

  • GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, int followsymlinks โ€” the one optional flag, and yes it does what it says on the tin.

So this returns true if and only if there's a regular file with the given path name. Heads up: it returns false for other objects like directories. No cap.

If the optional flag followsymlinks is true, then a symlink (or chain of symlinks) that ends with a file also causes the function to return true. Slay.

See also guestfs_stat.

This function returns a C truth value on success or -1 on error.

(Added in 0.8)


๐Ÿ’ซ guestfs_is_file_opts_va

int
guestfs_is_file_opts_va (guestfs_h *g,
                         const char *path,
                         va_list args);

This is the "va_list variant" of guestfs_is_file_opts. Same energy, different plumbing.

See "CALLS WITH OPTIONAL ARGUMENTS".


๐ŸŒธ guestfs_is_file_opts_argv

int
guestfs_is_file_opts_argv (guestfs_h *g,
                           const char *path,
                           const struct guestfs_is_file_opts_argv *optargs);

This is the "argv variant" of guestfs_is_file_opts. Also same energy, also different plumbing.

See "CALLS WITH OPTIONAL ARGUMENTS".


๐Ÿฆ‹ guestfs_is_launching

int
guestfs_is_launching (guestfs_h *g);

This returns true iff this handle is launching the subprocess (in the LAUNCHING state). It's giving "hold on, I'm booting up" main character energy.

For more information on states, see guestfs(3).

This function returns a C truth value on success or -1 on error.

(Added in 1.0.2)


๐Ÿ’… guestfs_is_lv

int
guestfs_is_lv (guestfs_h *g,
               const char *mountable);

This command tests whether mountable is a logical volume, and returns true iff this is the case. Lowkey a vibe check for LVs.

This function returns a C truth value on success or -1 on error.

(Added in 1.5.3)


๐ŸŒˆ guestfs_is_ready

int
guestfs_is_ready (guestfs_h *g);

This returns true iff this handle is ready to accept commands (in the READY state). She's ready, she's booked, she's available. ๐Ÿ’–

For more information on states, see guestfs(3).

This function returns a C truth value on success or -1 on error.

(Added in 1.0.2)


๐Ÿ”ฅ guestfs_is_socket

int
guestfs_is_socket (guestfs_h *g,
                   const char *path);

Provided for backwards compatibility with earlier versions of libguestfs โ€” the vintage icon. It simply calls guestfs_is_socket_opts with no optional arguments.

(Added in 1.5.10)


โญ guestfs_is_socket_opts

int
guestfs_is_socket_opts (guestfs_h *g,
                        const char *path,
                        ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

  • GUESTFS_IS_SOCKET_OPTS_FOLLOWSYMLINKS, int followsymlinks โ€” the single optional flag, doing exactly what its name promises.

This returns true if and only if there is a Unix domain socket with the given path name. Periodt.

If the optional flag followsymlinks is true, then a symlink (or chain of symlinks) that ends with a socket also causes the function to return true.

See also guestfs_stat.

This function returns a C truth value on success or -1 on error.

(Added in 1.5.10)


๐Ÿงš guestfs_is_socket_opts_va

int
guestfs_is_socket_opts_va (guestfs_h *g,
                           const char *path,
                           va_list args);

This is the "va_list variant" of guestfs_is_socket_opts.

See "CALLS WITH OPTIONAL ARGUMENTS".


๐Ÿ“ guestfs_is_socket_opts_argv

int
guestfs_is_socket_opts_argv (guestfs_h *g,
                             const char *path,
                             const struct guestfs_is_socket_opts_argv *optargs);

This is the "argv variant" of guestfs_is_socket_opts.

See "CALLS WITH OPTIONAL ARGUMENTS".


int
guestfs_is_symlink (guestfs_h *g,
                    const char *path);

This returns true if and only if there is a symbolic link with the given path name. It's basically the "does this point somewhere else" detector.

See also guestfs_stat.

This function returns a C truth value on success or -1 on error.

(Added in 1.5.10)


๐Ÿ‘‘ guestfs_is_whole_device

int
guestfs_is_whole_device (guestfs_h *g,
                         const char *device);

This returns true if and only if device refers to a whole block device. That is, not a partition or a logical device. Think "the whole entire thing," not a slice. ๐Ÿซถ

This function returns a C truth value on success or -1 on error.

(Added in 1.21.9)


๐Ÿ’œ guestfs_is_zero

int
guestfs_is_zero (guestfs_h *g,
                 const char *path);

This returns true iff the file exists and the file is empty or it contains all zero bytes. Zeros only, bestie โ€” nothing else allowed.

This function returns a C truth value on success or -1 on error.

(Added in 1.11.8)


๐Ÿ’€ guestfs_is_zero_device

int
guestfs_is_zero_device (guestfs_h *g,
                        const char *device);

This returns true iff the device exists and contains all zero bytes.

Heads up: for large devices this can take a long time to run. Like, go make a snack. ๐Ÿ˜ญ

This function returns a C truth value on success or -1 on error.

(Added in 1.11.8)


๐ŸŒŸ guestfs_isoinfo

struct guestfs_isoinfo *
guestfs_isoinfo (guestfs_h *g,
                 const char *isofile);

This is the same as guestfs_isoinfo_device except that it works for an ISO file located inside some other mounted filesystem. Note that in the common case where you've added an ISO file as a libguestfs device, you would not call this โ€” instead you'd call guestfs_isoinfo_device. Pick the right one, iykyk.

This function returns a struct guestfs_isoinfo *, or NULL if there was an error. The caller must call guestfs_free_isoinfo after use.

(Added in 1.17.19)


๐Ÿฆ‹ guestfs_isoinfo_device

struct guestfs_isoinfo *
guestfs_isoinfo_device (guestfs_h *g,
                        const char *device);

device is an ISO device. This returns a struct of information read from the primary volume descriptor (the ISO equivalent of the superblock) of the device. Iconic little metadata bundle.

Usually it's more efficient to use the isoinfo(1) command with the -d option on the host to analyze ISO files, instead of going through libguestfs. Just saying. โœจ

For information on the primary volume descriptor fields, see https://wiki.osdev.org/ISO_9660#The_Primary_Volume_Descriptor

This function returns a struct guestfs_isoinfo *, or NULL if there was an error. The caller must call guestfs_free_isoinfo after use.

(Added in 1.17.19)


๐ŸŒธ guestfs_journal_close

int
guestfs_journal_close (guestfs_h *g);

Close the journal handle. Cleanup era, we love to see it.

This function returns 0 on success or -1 on error.

This function depends on the feature "journal". See also guestfs_feature_available.

(Added in 1.23.11)


๐ŸŽ€ guestfs_journal_get

struct guestfs_xattr_list *
guestfs_journal_get (guestfs_h *g);

Read the current journal entry. This returns all the fields in the journal as a set of (attrname, attrval) pairs. The attrname is the field name (a string).

The attrval is the field value (a binary blob, often but not always a string). Please note that attrval is a byte array, not a \0-terminated C string. Do not come for it with string functions, bestie, it will not end well. ๐Ÿ™ˆ

The length of data may be truncated to the data threshold (see: guestfs_journal_set_data_threshold, guestfs_journal_get_data_threshold).

If you set the data threshold to unlimited (0) then this call can read a journal entry of any size, ie. it is not limited by the libguestfs protocol. Big reader energy.

This function returns a struct guestfs_xattr_list *, or NULL if there was an error. The caller must call guestfs_free_xattr_list after use.

This function depends on the feature "journal". See also guestfs_feature_available.

(Added in 1.23.11)


โญ guestfs_journal_get_data_threshold

int64_t
guestfs_journal_get_data_threshold (guestfs_h *g);

Get the current data threshold for reading journal entries. This is a hint to the journal that it may truncate data fields to this size when reading them (note also that it may not truncate them โ€” it's a hint, not a promise, fr fr). If this returns 0, then the threshold is unlimited.

See also guestfs_journal_set_data_threshold.

On error this function returns -1.

This function depends on the feature "journal". See also guestfs_feature_available.

(Added in 1.23.11)


๐Ÿ”ฅ guestfs_journal_get_realtime_usec

int64_t
guestfs_journal_get_realtime_usec (guestfs_h *g);

Get the realtime (wallclock) timestamp of the current journal entry. Literally "when did this happen" energy.

On error this function returns -1.

This function depends on the feature "journal". See also guestfs_feature_available.

(Added in 1.27.18)


๐Ÿ’ซ guestfs_journal_next

int
guestfs_journal_next (guestfs_h *g);

Move to the next journal entry. You have to call this at least once after opening the handle before you are able to read data. Like, you gotta scroll first, bestie.

The returned boolean tells you if there are any more journal records to read. true means you can read the next record (eg. using guestfs_journal_get), and false means you have reached the end of the journal. That's a wrap. ๐ŸŽฌ

This function returns a C truth value on success or -1 on error.

This function depends on the feature "journal". See also guestfs_feature_available.

(Added in 1.23.11)


๐Ÿฆ‹ guestfs_journal_open

int
guestfs_journal_open (guestfs_h *g,
                      const char *directory);

Open the systemd journal located in directory. Any previously opened journal handle is closed. Out with the old, in with the new. ๐Ÿ’…

The contents of the journal can be read using guestfs_journal_next and guestfs_journal_get.

After you have finished using the journal, you should close the handle by calling guestfs_journal_close. Clean up after yourself, we stan.

This function returns 0 on success or -1 on error.

This function depends on the feature "journal". See also guestfs_feature_available.

(Added in 1.23.11)


๐ŸŒˆ guestfs_journal_set_data_threshold

int
guestfs_journal_set_data_threshold (guestfs_h *g,
                                    int64_t threshold);

Set the data threshold for reading journal entries. This is a hint to the journal that it may truncate data fields to this size when reading them (note also that it may not truncate them โ€” again, hint, not contract). If you set this to 0, then the threshold is unlimited. Go big.

See also guestfs_journal_get_data_threshold.

This function returns 0 on success or -1 on error.

...and yeah, it's the journal feature again bestie โ€” see also "guestfs_feature_available". ๐Ÿซถ

(Added in 1.23.11)

guestfs_journal_skip

int64_t
guestfs_journal_skip (guestfs_h *g,
                      int64_t skip);

Okay so this one skips through the journal โ€” forwards when skip โ‰ฅ 0, backwards when skip < 0. โœจ Literally just vibes-based time travel through log entries.

The number of entries it actually skipped gets returned (and heads up: rskip โ‰ฅ 0, always non-negative). So if that number is not the same as the absolute value of the skip parameter you passed in (|skip|), that's your sign you hit the end or the start of the journal. ๐ŸŽ€

On error this function returns -1.

This function depends on the feature "journal". See also "guestfs_feature_available".

(Added in 1.23.11)


guestfs_kill_subprocess

int
guestfs_kill_subprocess (guestfs_h *g);
โš ๏ธ This function is deprecated. In new code, use the guestfs_shutdown call instead, bestie. fr fr.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions. ๐Ÿ’€

This kills the hypervisor.

Do not call this. See: guestfs_shutdown instead. like, that's the whole message ๐Ÿ˜ญ

This function returns 0 on success or -1 on error.

(Added in 0.3)


guestfs_launch

int
guestfs_launch (guestfs_h *g);

You should call this after configuring the handle (eg. adding drives) but before performing any actions. It's giving "get ready, then go" energy. ๐Ÿ’…

Do not call guestfs_launch twice on the same handle. Even though it will not give an error (for historical reasons), the precise behaviour when you do this is not well defined. ๐Ÿ’€ Handles are very cheap to create, so create a new one for each launch. No cap.

This function returns 0 on success or -1 on error.

โœจ Progress notification moment โœจ This long-running command can generate progress notification messages so that the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See "GUESTFS_EVENT_PROGRESS". ๐Ÿฆ‹

(Added in 0.3)


guestfs_lchown

int
guestfs_lchown (guestfs_h *g,
                int owner,
                int group,
                const char *path);

Change the file owner to owner and group to group. This is like guestfs_chown but if path is a symlink then the link itself is changed, not the target. ๐ŸŽ€ (iconic symlink behaviour tbh)

Only numeric uid and gid are supported. If you want to use names, you will need to locate and parse the password file yourself (Augeas support makes this relatively easy). ngl that's a little homework assignment for you ๐Ÿ“š

This function returns 0 on success or -1 on error.

(Added in 1.0.77)


guestfs_ldmtool_create_all

int
guestfs_ldmtool_create_all (guestfs_h *g);

This function scans all block devices looking for Windows dynamic disk volumes and partitions, and creates devices for any that were found. ๐Ÿ’–

Call guestfs_list_ldm_volumes and guestfs_list_ldm_partitions to return all devices.

Note that you don't normally need to call this explicitly, since it is done automatically at guestfs_launch time. so like... it's already handled, bestie ๐Ÿซถ

This function returns 0 on success or -1 on error.

This function depends on the feature "ldm". See also "guestfs_feature_available".

(Added in 1.20.0)


guestfs_ldmtool_diskgroup_disks

char **
guestfs_ldmtool_diskgroup_disks (guestfs_h *g,
                                 const char *diskgroup);

Return the disks in a Windows dynamic disk group. ๐ŸŒˆ The diskgroup parameter should be the GUID of a disk group, one element from the list returned by guestfs_ldmtool_scan.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use. ๐Ÿ’… (yes, you, free them)

This function depends on the feature "ldm". See also "guestfs_feature_available".

(Added in 1.20.0)


guestfs_ldmtool_diskgroup_name

char *
guestfs_ldmtool_diskgroup_name (guestfs_h *g,
                                const char *diskgroup);

Return the name of a Windows dynamic disk group. The diskgroup parameter should be the GUID of a disk group, one element from the list returned by guestfs_ldmtool_scan. ๐Ÿ’–

This function returns a string, or NULL on error. The caller must free the returned string after use.

This function depends on the feature "ldm". See also "guestfs_feature_available".

(Added in 1.20.0)


guestfs_ldmtool_diskgroup_volumes

char **
guestfs_ldmtool_diskgroup_volumes (guestfs_h *g,
                                   const char *diskgroup);

Return the volumes in a Windows dynamic disk group. The diskgroup parameter should be the GUID of a disk group, one element from the list returned by guestfs_ldmtool_scan. ๐ŸŒธ

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

This function depends on the feature "ldm". See also "guestfs_feature_available".

(Added in 1.20.0)


guestfs_ldmtool_remove_all

int
guestfs_ldmtool_remove_all (guestfs_h *g);

This is essentially the opposite of guestfs_ldmtool_create_all. ๐Ÿฆ‹ It removes the device mapper mappings for all Windows dynamic disk volumes

This function returns 0 on success or -1 on error.

This function depends on the feature "ldm". See also "guestfs_feature_available".

(Added in 1.20.0)


guestfs_ldmtool_scan

char **
guestfs_ldmtool_scan (guestfs_h *g);

This function scans for Windows dynamic disks. It returns a list of identifiers (GUIDs) for all disk groups that were found. ๐Ÿ‘‘ These identifiers can be passed to other guestfs_ldmtool_* functions. iykyk

This function scans all block devices. To scan a subset of block devices, call guestfs_ldmtool_scan_devices instead.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use. ๐Ÿ’…

This function depends on the feature "ldm". See also "guestfs_feature_available".

(Added in 1.20.0)


guestfs_ldmtool_scan_devices

char **
guestfs_ldmtool_scan_devices (guestfs_h *g,
                              char *const *devices);

This function scans for Windows dynamic disks. It returns a list of identifiers (GUIDs) for all disk groups that were found. โœจ These identifiers can be passed to other guestfs_ldmtool_* functions.

The parameter devices is a list of block devices which are scanned. If this list is empty, all block devices are scanned. ๐ŸŽ€ (empty list = scan everything, cute)

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

This function depends on the feature "ldm". See also "guestfs_feature_available".

(Added in 1.20.0)


guestfs_ldmtool_volume_hint

char *
guestfs_ldmtool_volume_hint (guestfs_h *g,
                             const char *diskgroup,
                             const char *volume);

Return the hint field of the volume named volume in the disk group with GUID diskgroup. ๐Ÿฆ‹ This may not be defined, in which case the empty string is returned. The hint field is often, though not always, the name of a Windows drive, eg. E:.

This function returns a string, or NULL on error. The caller must free the returned string after use.

This function depends on the feature "ldm". See also "guestfs_feature_available".

(Added in 1.20.0)


guestfs_ldmtool_volume_partitions

char **
guestfs_ldmtool_volume_partitions (guestfs_h *g,
                                   const char *diskgroup,
                                   const char *volume);

Return the list of partitions in the volume named volume in the disk group with GUID diskgroup. ๐Ÿ’–

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

This function depends on the feature "ldm". See also "guestfs_feature_available".

(Added in 1.20.0)


guestfs_ldmtool_volume_type

char *
guestfs_ldmtool_volume_type (guestfs_h *g,
                             const char *diskgroup,
                             const char *volume);

Return the type of the volume named volume in the disk group with GUID diskgroup. ๐ŸŒˆ

Possible volume types that can be returned here include: simple, spanned, striped, mirrored, raid5. Other types may also be returned. ๐Ÿ‘€ (so don't hardcode the list, bestie)

This function returns a string, or NULL on error. The caller must free the returned string after use.

This function depends on the feature "ldm". See also "guestfs_feature_available".

(Added in 1.20.0)


guestfs_lgetxattr

char *
guestfs_lgetxattr (guestfs_h *g,
                   const char *path,
                   const char *name,
                   size_t *size_r);

Get a single extended attribute from file path named name. If path is a symlink, then this call returns an extended attribute from the symlink. ๐ŸŽ€

Normally it is better to get all extended attributes from a file in one go by calling guestfs_getxattrs. However some Linux filesystem implementations are buggy and do not provide a way to list out attributes. For these filesystems (notably ntfs-3g) you have to know the names of the extended attributes you want in advance and call this function. ๐Ÿ˜ญ (buggy fs behaviour is NOT the vibe but we cope)

Extended attribute values are blobs of binary data. If there is no extended attribute named name, this returns an error.

See also: guestfs_lgetxattrs, guestfs_getxattr, attr(5).

This function returns a buffer, or NULL on error. The size of the returned buffer is written to *size_r. The caller must free the returned buffer after use. ๐Ÿ’…

This function depends on the feature "linuxxattrs". See also "guestfs_feature_available".

(Added in 1.7.24)


guestfs_lgetxattrs

struct guestfs_xattr_list *
guestfs_lgetxattrs (guestfs_h *g,
                    const char *path);

This is the same as guestfs_getxattrs, but if path is a symbolic link, then it returns the extended attributes of the link itself. ๐Ÿฆ‹ (l-prefix stays undefeated tbh)

This function returns a struct guestfs_xattr_list *, or NULL if there was an error. The caller must call guestfs_free_xattr_list after use. ๐Ÿ‘‘

This function depends on the feature "linuxxattrs". See also "guestfs_feature_available".

(Added in 1.0.59)


guestfs_list_9p

char **
guestfs_list_9p (guestfs_h *g);
โš ๏ธ This function is deprecated. There is no replacement. Consult the API documentation in guestfs(3) for further information. ๐Ÿ’€

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This call does nothing and returns an error. ๐Ÿ˜ญ literally nothing. it just fails. that's it. that's the function.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use, bestie. ๐Ÿ’…

(Added in 1.11.12)

guestfs_list_devices

char **
guestfs_list_devices (guestfs_h *g);

List all the block devices, periodt. The full block device names are returned, eg. /dev/sda. โœจ

See also guestfs_list_filesystems.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

(Added in 0.4)

guestfs_list_disk_labels

char **
guestfs_list_disk_labels (guestfs_h *g);

If you add drives using the optional "label" parameter of guestfs_add_drive_opts, you can use this call to map between disk labels, and raw block device and partition names (like /dev/sda and /dev/sda1). ๐ŸŽ€

This returns a hashtable, where keys are the disk labels (without the /dev/disk/guestfs prefix), and the values are the full raw block device and partition names (eg. /dev/sda and /dev/sda1).

This function returns a NULL-terminated array of strings, or NULL if there was an error. The array of strings will always have length 2n+1, where n keys and values alternate, followed by the trailing NULL entry. The caller must free the strings and the array after use.

(Added in 1.19.49)

guestfs_list_dm_devices

char **
guestfs_list_dm_devices (guestfs_h *g);

List all device mapper devices. ๐Ÿ‘‘

The returned list contains /dev/mapper/* devices, eg. ones created by a previous call to guestfs_luks_open.

Device mapper devices which correspond to logical volumes are not returned in this list. Call guestfs_lvs if you want to list logical volumes.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

(Added in 1.11.15)

guestfs_list_filesystems

char **
guestfs_list_filesystems (guestfs_h *g);

This inspection command looks for filesystems on partitions, block devices and logical volumes, returning a list of "mountables" containing filesystems and their type. ๐Ÿฆ‹

The return value is a hash, where the keys are the devices containing filesystems, and the values are the filesystem types. For example:

"/dev/sda1" => "ntfs"
"/dev/sda2" => "ext2"
"/dev/vg_guest/lv_root" => "ext4"
"/dev/vg_guest/lv_swap" => "swap"

The key is not necessarily a block device. It may also be an opaque โ€˜mountableโ€™ string which can be passed to guestfs_mount.

The value can have the special value unknown, meaning the content of the device is undetermined or empty. swap means a Linux swap partition.

In libguestfs โ‰ค 1.36 this command ran other libguestfs commands, which might have included guestfs_mount and guestfs_umount, and therefore you had to use this soon after launch and only when nothing else was mounted. This restriction is removed in libguestfs โ‰ฅ 1.38.

Not all of the filesystems returned will be mountable. In particular, swap partitions are returned in the list. Also this command does not check that each filesystem found is valid and mountable, and some filesystems might be mountable but require special options. Filesystems may not all belong to a single logical operating system (use guestfs_inspect_os to look for OSes).

This function returns a NULL-terminated array of strings, or NULL if there was an error. The array of strings will always have length 2n+1, where n keys and values alternate, followed by the trailing NULL entry. The caller must free the strings and the array after use.

(Added in 1.5.15)

guestfs_list_ldm_partitions

char **
guestfs_list_ldm_partitions (guestfs_h *g);

This function returns all Windows dynamic disk partitions that were found at launch time. It returns a list of device names. ๐ŸŒธ

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

This function depends on the feature "ldm". See also guestfs_feature_available.

(Added in 1.20.0)

guestfs_list_ldm_volumes

char **
guestfs_list_ldm_volumes (guestfs_h *g);

This function returns all Windows dynamic disk volumes that were found at launch time. It returns a list of device names. ๐Ÿ’–

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

This function depends on the feature "ldm". See also guestfs_feature_available.

(Added in 1.20.0)

guestfs_list_md_devices

char **
guestfs_list_md_devices (guestfs_h *g);

List all Linux md devices. ๐Ÿซถ

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

(Added in 1.15.4)

guestfs_list_partitions

char **
guestfs_list_partitions (guestfs_h *g);

List all the partitions detected on all block devices. โญ

The full partition device names are returned, eg. /dev/sda1

This does not return logical volumes. For that you will need to call guestfs_lvs.

See also guestfs_list_filesystems.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

(Added in 0.4)

guestfs_ll

char *
guestfs_ll (guestfs_h *g,
            const char *directory);

List the files in directory (relative to the root directory, there is no cwd) in the format of ls -la. ๐Ÿ˜ญ

This command is mostly useful for interactive sessions. It is not intended that you try to parse the output string.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 0.4)

guestfs_llz

char *
guestfs_llz (guestfs_h *g,
             const char *directory);
โš ๏ธ Deprecated, bestie: This function is deprecated. In new code, use the guestfs_lgetxattrs call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

List the files in directory in the format of ls -laZ. ๐Ÿ”ฅ

This command is mostly useful for interactive sessions. It is not intended that you try to parse the output string.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.17.6)

guestfs_ln

int
guestfs_ln (guestfs_h *g,
            const char *target,
            const char *linkname);

This command creates a hard link. ๐Ÿ”—

This function returns 0 on success or -1 on error.

(Added in 1.0.66)

guestfs_ln_f

int
guestfs_ln_f (guestfs_h *g,
              const char *target,
              const char *linkname);

This command creates a hard link, removing the link linkname if it exists already. ๐Ÿ’€

This function returns 0 on success or -1 on error.

(Added in 1.0.66)

guestfs_ln_s

int
guestfs_ln_s (guestfs_h *g,
              const char *target,
              const char *linkname);

This command creates a symbolic link using the ln -s command. ๐ŸŽ€

This function returns 0 on success or -1 on error.

(Added in 1.0.66)

guestfs_ln_sf

int
guestfs_ln_sf (guestfs_h *g,
               const char *target,
               const char *linkname);

This command creates a symbolic link using the ln -sf command, The -f option removes the link (linkname) if it exists already. โœจ

This function returns 0 on success or -1 on error.

(Added in 1.0.66)

guestfs_lremovexattr

int
guestfs_lremovexattr (guestfs_h *g,
                      const char *xattr,
                      const char *path);

This is the same as guestfs_removexattr, but if path is a symbolic link, then it removes an extended attribute of the link itself. ๐Ÿฆ‹

This function returns 0 on success or -1 on error.

This function depends on the feature "linuxxattrs". See also guestfs_feature_available.

(Added in 1.0.59)

guestfs_ls

char **
guestfs_ls (guestfs_h *g,
            const char *directory);

List the files in directory (relative to the root directory, there is no cwd). The . and .. entries are not returned, but hidden files are shown. ๐Ÿ‘€

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

(Added in 0.4)

guestfs_ls0

int
guestfs_ls0 (guestfs_h *g,
             const char *dir,
             const char *filenames);

This specialized command is used to get a listing of the filenames in the directory dir. The list of filenames is written to the local file filenames (on the host). ๐Ÿ“

In the output file, the filenames are separated by "\0" characters.

. and .. are not returned. The filenames are not sorted.

This function returns 0 on success or -1 on error.

(Added in 1.19.32)

guestfs_lsetxattr

int
guestfs_lsetxattr (guestfs_h *g,
                   const char *xattr,
                   const char *val,
                   int vallen,
                   const char *path);

This is the same as guestfs_setxattr, but if path is a symbolic link, then it sets an extended attribute of the link itself. ๐Ÿงš

This function returns 0 on success or -1 on error.

This function depends on the feature "linuxxattrs". See also guestfs_feature_available.

(Added in 1.0.59)

guestfs_lstat

struct guestfs_stat *
guestfs_lstat (guestfs_h *g,
               const char *path);
โš ๏ธ Deprecated, bestie: This function is deprecated. In new code, use the guestfs_lstatns call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

Returns file information for the given path. ๐Ÿ”

This is the same as guestfs_stat except that if path is a symbolic link, then the link is stat-ed, not the file it refers to.

This is the same as the lstat(2) system call.

This function returns a struct guestfs_stat *, or NULL if there was an error. The caller must call guestfs_free_stat after use.

(Added in 1.9.2)

guestfs_lstatlist

struct guestfs_stat_list *
guestfs_lstatlist (guestfs_h *g,
                   const char *path,
                   char *const *names);
โš ๏ธ Deprecated, bestie: This function is deprecated. In new code, use the guestfs_lstatnslist call instead.

Deprecated functions will not be removed from the API, bestie โ€” they stay forever. But the fact that they're deprecated is lowkey a red flag ๐Ÿšฉ that there are problems with correct use of these functions. So likeโ€ฆ use them, just know the vibes are off.


guestfs_lstatlist

Ok so this one lets you do the whole guestfs_lstat operation on multiple files at once, where all the files live in the directory path. And names is literally just the list of files from that directory โœจ

On return you get a list of stat structs, with a one-to-one correspondence to the names list. If any name did not exist or could not be lstat'd, then the st_ino field of that structure is set to -1. (so you can tell which ones ghosted you ๐Ÿ’€)

This call is intended for programs that want to efficiently list a directory contents without making many round-trips. See also guestfs_lxattrlist for a similarly efficient call for getting extended attributes.

This function returns a struct guestfs_stat_list *, or NULL if there was an error. The caller must call guestfs_free_stat_list after use ๐Ÿซถ

(Added in 1.0.77)


guestfs_lstatns

     struct guestfs_statns *
     guestfs_lstatns (guestfs_h *g,
                      const char *path);

Returns file information for the given path ๐Ÿ“

This is the same as guestfs_statns except that if path is a symbolic link, then the link is stat-ed, not the file it refers to. So it's giving "look at me, not who I'm pointing at" ๐Ÿ’…

This is the same as the lstat(2) system call.

This function returns a struct guestfs_statns *, or NULL if there was an error. The caller must call guestfs_free_statns after use.

(Added in 1.27.53)


guestfs_lstatnslist

     struct guestfs_statns_list *
     guestfs_lstatnslist (guestfs_h *g,
                          const char *path,
                          char *const *names);

This call allows you to perform the guestfs_lstatns operation on multiple files, where all files are in the directory path. names is the list of files from this directory ๐ŸŒธ

On return you get a list of stat structs, with a one-to-one correspondence to the names list. If any name did not exist or could not be lstat'd, then the st_ino field of that structure is set to -1.

This call is intended for programs that want to efficiently list a directory contents without making many round-trips. See also guestfs_lxattrlist for a similarly efficient call for getting extended attributes.

This function returns a struct guestfs_statns_list *, or NULL if there was an error. The caller must call guestfs_free_statns_list after use.

(Added in 1.27.53)


guestfs_luks_add_key

     int
     guestfs_luks_add_key (guestfs_h *g,
                           const char *device,
                           const char *key,
                           const char *newkey,
                           int keyslot);

This command adds a new key on LUKS device device ๐Ÿ” key is any existing key, and is used to access the device. newkey is the new key to add. keyslot is the key slot that will be replaced.

Heads up bestie: if keyslot already contains a key, then this command will fail. You have to use guestfs_luks_kill_slot first to remove that key. No sneaky overwrites!! ๐Ÿ˜ค

This function returns 0 on success or -1 on error.

This function takes a key or passphrase parameter which could contain sensitive material. Read the section KEYS AND PASSPHRASES for more information. ๐Ÿซฃ

This function depends on the feature luks. See also guestfs_feature_available.

(Added in 1.5.2)


guestfs_luks_close

     int
     guestfs_luks_close (guestfs_h *g,
                         const char *device);

This function is deprecated. In new code, use the guestfs_cryptsetup_close call instead โœจ

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This closes a LUKS device that was created earlier by guestfs_luks_open or guestfs_luks_open_ro ๐Ÿ”’ The device parameter must be the name of the LUKS mapping device (ie. /dev/mapper/mapname) and not the name of the underlying block device. Read that again, it matters!! ๐Ÿ™ˆ

This function returns 0 on success or -1 on error.

This function depends on the feature luks. See also guestfs_feature_available.

(Added in 1.5.1)


guestfs_luks_format

     int
     guestfs_luks_format (guestfs_h *g,
                          const char *device,
                          const char *key,
                          int keyslot);
โš ๏ธ This one erases existing data on device, periodt. Say bye to whatever was there ๐Ÿ‘‹

This command erases existing data on device and formats the device as a LUKS encrypted device. key is the initial key, which is added to key slot keyslot. (LUKS supports 8 key slots, numbered 0-7.) ๐Ÿ”ข

This function returns 0 on success or -1 on error.

This function takes a key or passphrase parameter which could contain sensitive material. Read the section KEYS AND PASSPHRASES for more information.

This function depends on the feature luks. See also guestfs_feature_available.

(Added in 1.5.2)


guestfs_luks_format_cipher

     int
     guestfs_luks_format_cipher (guestfs_h *g,
                                 const char *device,
                                 const char *key,
                                 int keyslot,
                                 const char *cipher);

This command is the same as guestfs_luks_format but it also allows you to set the cipher used ๐Ÿ” So it's the glow-up version: same energy, extra customization.

This function returns 0 on success or -1 on error.

This function takes a key or passphrase parameter which could contain sensitive material. Read the section KEYS AND PASSPHRASES for more information.

This function depends on the feature luks. See also guestfs_feature_available.

(Added in 1.5.2)


guestfs_luks_kill_slot

     int
     guestfs_luks_kill_slot (guestfs_h *g,
                             const char *device,
                             const char *key,
                             int keyslot);

This command deletes the key in key slot keyslot from the encrypted LUKS device device ๐Ÿ”ช key must be one of the other keys. (you can't use the key you're deleting to delete it, that's not how any of this works ๐Ÿ’€)

This function returns 0 on success or -1 on error.

This function takes a key or passphrase parameter which could contain sensitive material. Read the section KEYS AND PASSPHRASES for more information.

This function depends on the feature luks. See also guestfs_feature_available.

(Added in 1.5.2)


guestfs_luks_open

     int
     guestfs_luks_open (guestfs_h *g,
                        const char *device,
                        const char *key,
                        const char *mapname);

This function is deprecated. In new code, use the guestfs_cryptsetup_open call instead โœจ

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This command opens a block device which has been encrypted according to the Linux Unified Key Setup (LUKS) standard ๐Ÿ”“

device is the encrypted block device or partition.

The caller must supply one of the keys associated with the LUKS block device, in the key parameter.

This creates a new block device called /dev/mapper/mapname. Reads and writes to this block device are decrypted from and encrypted to the underlying device respectively. It's literally the main character of block devices ๐Ÿ’…

If this block device contains LVM volume groups, then calling guestfs_lvm_scan with the activate parameter true will make them visible โœจ

Use guestfs_list_dm_devices to list all device mapper devices.

This function returns 0 on success or -1 on error.

This function takes a key or passphrase parameter which could contain sensitive material. Read the section KEYS AND PASSPHRASES for more information.

This function depends on the feature luks. See also guestfs_feature_available.

(Added in 1.5.1)


guestfs_luks_open_ro

     int
     guestfs_luks_open_ro (guestfs_h *g,
                           const char *device,
                           const char *key,
                           const char *mapname);

This function is deprecated. In new code, use the guestfs_cryptsetup_open call instead โœจ

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This is the same as guestfs_luks_open except that a read-only mapping is created ๐Ÿ‘€ no writing, no touching, look-don't-touch rules apply.

This function returns 0 on success or -1 on error.

This function takes a key or passphrase parameter which could contain sensitive material. Read the section KEYS AND PASSPHRASES for more information.

This function depends on the feature luks. See also guestfs_feature_available.

(Added in 1.5.1)


guestfs_luks_uuid

     char *
     guestfs_luks_uuid (guestfs_h *g,
                        const char *device);

This returns the UUID of the LUKS device device ๐Ÿ†” (yes, devices have IDs too, everyone's got an identity ok)

This function returns a string, or NULL on error. The caller must free the returned string after use.

This function depends on the feature luks. See also guestfs_feature_available.

(Added in 1.41.9)


guestfs_lvcreate

     int
     guestfs_lvcreate (guestfs_h *g,
                       const char *logvol,
                       const char *volgroup,
                       int mbytes);

This creates an LVM logical volume called logvol on the volume group volgroup, with size megabytes ๐Ÿ“ฆ building LVs like it's nothing honestly.

This function returns 0 on success or -1 on error.

This function depends on the feature lvm2. See also guestfs_feature_available.

(Added in 0.8)


guestfs_lvcreate_free

     int
     guestfs_lvcreate_free (guestfs_h *g,
                            const char *logvol,
                            const char *volgroup,
                            int percent);

Create an LVM logical volume called /dev/volgroup/logvol, using approximately percent % of the free space remaining in the volume group โœจ Most usefully, when percent is 100 this will create the largest possible LV. Go big or go home fr fr ๐Ÿ”ฅ

This function returns 0 on success or -1 on error.

This function depends on the feature lvm2. See also guestfs_feature_available.

(Added in 1.17.18)


guestfs_lvm_canonical_lv_name

     char *
     guestfs_lvm_canonical_lv_name (guestfs_h *g,
                                    const char *lvname);

This converts alternative naming schemes for LVs that you might find to the canonical name ๐ŸŽ€ For example, /dev/mapper/VG-LV is converted to /dev/VG/LV. Glow-up of a name, honestly.

Careful bestie: this command returns an error if the lvname parameter does not refer to a logical volume. In this case errno will be set to EINVAL ๐Ÿ’€

See also guestfs_is_lv, guestfs_canonical_device_name.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.5.24)


guestfs_lvm_clear_filter

     int
     guestfs_lvm_clear_filter (guestfs_h *g);

This undoes the effect of guestfs_lvm_set_filter ๐Ÿงน LVM will be able to see every block device. Like, all of them. No filter, no boundaries, full access ๐Ÿ˜ญ

This command also clears the LVM cache and performs a volume group scan. ๐Ÿงนโœจ

Returns 0 when it slays, -1 when it doesn't. ๐Ÿ˜ญ

(Added in 1.5.1)


๐Ÿ’ฅ guestfs_lvm_remove_all

int
guestfs_lvm_remove_all (guestfs_h *g);

Okay so this one is the nuclear option, bestie โ€” it removes all the LVM logical volumes, volume groups and physical volumes. Like, all of them. Gone. ๐Ÿซถ

Returns 0 on success or -1 on error.

This function depends on the feature "lvm2". See also guestfs_feature_available. ๐ŸŒธ

(Added in 0.8)


๐Ÿ” guestfs_lvm_scan

int
guestfs_lvm_scan (guestfs_h *g,
                  int activate);

This one scans all your block devices and rebuilds the list of LVM physical volumes, volume groups and logical volumes. Fresh inventory, no cap. ๐Ÿ“‹

If the activate parameter is true then the newly found volume groups and logical volumes get activated, which literally means the LV /dev/VG/LV devices become visible. ๐Ÿ‘€โœจ

When a libguestfs handle is launched it already scans for existing devices, so you don't normally need to use this API. But it is useful when you've added a new device or deleted an existing one (such as when the guestfs_luks_open API is used). iykyk ๐Ÿ’…

Returns 0 on success or -1 on error.

(Added in 1.39.8)


๐ŸŽ€ guestfs_lvm_set_filter

int
guestfs_lvm_set_filter (guestfs_h *g,
                        char *const *devices);

This sets the LVM device filter so that LVM will only be able to "see" the block devices in the list devices, and will ignore all other attached block devices. Selective vision, but make it intentional. ๐Ÿ™ˆ

Where disk image(s) contain duplicate PVs or VGs, this command is genuinely useful to get LVM to ignore the duplicates โ€” otherwise LVM can get confused. ๐Ÿ˜ตโ€๐Ÿ’ซ Note also there are two types of duplication possible: either cloned PVs/VGs which have identical UUIDs; or VGs that are not cloned but just happen to have the same name. In normal operation you cannot create this situation, but you can do it outside LVM, eg. by cloning disk images or by bit twiddling inside the LVM metadata. ๐Ÿคฏ

This command also clears the LVM cache and performs a volume group scan. ๐Ÿงน

You can filter whole block devices or individual partitions โ€” your call, bestie. โœจ

โš ๏ธ You cannot use this if any VG is currently in use (eg. contains a mounted filesystem), even if you are not filtering out that VG. Like, the vibes will not be immaculate, it'll just fail. ๐Ÿ’€

Returns 0 on success or -1 on error.

This function depends on the feature "lvm2". See also guestfs_feature_available. ๐ŸŒธ

(Added in 1.5.1)


๐Ÿ—‘๏ธ guestfs_lvremove

int
guestfs_lvremove (guestfs_h *g,
                  const char *device);

Remove an LVM logical volume device, where device is the path to the LV, such as /dev/VG/LV. Bye bestie ๐Ÿ‘‹

You can also remove all the LVs in a volume group by specifying the VG name, /dev/VG. Efficient. ๐Ÿ”ฅ

Returns 0 on success or -1 on error.

This function depends on the feature "lvm2". See also guestfs_feature_available. ๐ŸŒธ

(Added in 1.0.13)


โœ๏ธ guestfs_lvrename

int
guestfs_lvrename (guestfs_h *g,
                  const char *logvol,
                  const char *newlogvol);

Rename a logical volume logvol with the new name newlogvol. Glow-up for your LV name, honestly. ๐Ÿ’…โœจ

Returns 0 on success or -1 on error.

(Added in 1.0.83)


๐Ÿ“ guestfs_lvresize

int
guestfs_lvresize (guestfs_h *g,
                  const char *device,
                  int mbytes);

This resizes (expands or shrinks) an existing LVM logical volume to mbytes. ๐Ÿ“

๐Ÿšจ When reducing, data in the reduced part is lost. Not "moved somewhere safe", not "recoverable", lost. So maybe double-check those numbers, bestie. ๐Ÿ˜ญ๐Ÿ’€

Returns 0 on success or -1 on error.

This function depends on the feature "lvm2". See also guestfs_feature_available. ๐ŸŒธ

(Added in 1.0.27)


๐ŸŒฑ guestfs_lvresize_free

int
guestfs_lvresize_free (guestfs_h *g,
                       const char *lv,
                       int percent);

This expands an existing logical volume lv so that it fills pc % of the remaining free space in the volume group. Commonly you would call this with pc = 100 which expands the logical volume as much as possible, using all remaining free space in the volume group. Eat up the leftovers, icon behaviour. ๐Ÿ“

Returns 0 on success or -1 on error.

This function depends on the feature "lvm2". See also guestfs_feature_available. ๐ŸŒธ

(Added in 1.3.3)


๐Ÿ“ƒ guestfs_lvs

char **
guestfs_lvs (guestfs_h *g);

List all the logical volumes detected. This is the equivalent of the lvs(8) command. ๐Ÿงพ

This returns a list of the logical volume device names (eg. /dev/VolGroup00/LogVol00).

See also guestfs_lvs_full, guestfs_list_filesystems.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use. Don't forget, or that's a leak and we don't leak. ๐Ÿ’…

This function depends on the feature "lvm2". See also guestfs_feature_available. ๐ŸŒธ

(Added in 0.4)


๐Ÿ“š guestfs_lvs_full

struct guestfs_lvm_lv_list *
guestfs_lvs_full (guestfs_h *g);

List all the logical volumes detected โ€” same energy as lvs(8), except the "full" version includes all the fields. Every single one. ๐Ÿ‘‘

This function returns a struct guestfs_lvm_lv_list *, or NULL if there was an error. The caller must call guestfs_free_lvm_lv_list after use. ๐Ÿซถ

This function depends on the feature "lvm2". See also guestfs_feature_available. ๐ŸŒธ

(Added in 0.4)


๐Ÿ†” guestfs_lvuuid

char *
guestfs_lvuuid (guestfs_h *g,
                const char *device);

This command returns the UUID of the LVM LV device. It's giving social security number but for a logical volume. ๐Ÿชชโœจ

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.0.87)


๐Ÿ—‚๏ธ guestfs_lxattrlist

struct guestfs_xattr_list *
guestfs_lxattrlist (guestfs_h *g,
                    const char *path,
                    char *const *names);

This call allows you to get the extended attributes of multiple files, where all files are in the directory path. names is the list of files from this directory. Bulk xattr energy, obsessed. ๐Ÿ’–

On return you get a flat list of xattr structs which must be interpreted sequentially. The first xattr struct always has a zero-length attrname. attrval in this struct is zero-length to indicate there was an error doing guestfs_lgetxattr for this file, or is a C string which is a decimal number (the number of following attributes for this file, which could be 0). Then after the first xattr struct are the zero or more attributes for the first named file. This repeats for the second and subsequent files. ๐ŸŒ€

This call is intended for programs that want to efficiently list a directory contents without making many round-trips. See also guestfs_lstatlist for a similarly efficient call for getting standard stats. Efficiency is the whole vibe. โšก

This function returns a struct guestfs_xattr_list *, or NULL if there was an error. The caller must call guestfs_free_xattr_list after use.

This function depends on the feature "linuxxattrs". See also guestfs_feature_available. ๐ŸŒธ

(Added in 1.0.77)


๐Ÿ’พ guestfs_max_disks

int
guestfs_max_disks (guestfs_h *g);

Return the maximum number of disks that may be added to a handle (eg. by guestfs_add_drive_opts and similar calls). Like a capacity check but for your handle. ๐ŸŽ’

This function was added in libguestfs 1.19.7. In previous versions of libguestfs the limit was 25. Historic lore, iykyk. ๐Ÿ“œ

See "MAXIMUM NUMBER OF DISKS" for additional information on this topic.

On error this function returns -1.

(Added in 1.19.7)


๐Ÿ›ก๏ธ guestfs_md_create

int
guestfs_md_create (guestfs_h *g,
                   const char *name,
                   char *const *devices,
                   ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS". ๐ŸŽ›๏ธ

GUESTFS_MD_CREATE_MISSINGBITMAP, int64_t missingbitmap,
GUESTFS_MD_CREATE_NRDEVICES, int nrdevices,
GUESTFS_MD_CREATE_SPARE, int spare,
GUESTFS_MD_CREATE_CHUNK, int64_t chunk,
GUESTFS_MD_CREATE_LEVEL, const char *level,

Create a Linux md (RAID) device named name on the devices in the list devices. RAID era, let's go. ๐Ÿ”ฅ

The optional parameters are:

  • "missingbitmap" โ€” A bitmap of missing devices. If a bit is set it means that a missing device is added to the array. The least significant bit corresponds to the first device in the array.

As examples:

If devices = ["/dev/sda"] and missingbitmap = 0x1 then the resulting array would be [<missing>, "/dev/sda"].

If devices = ["/dev/sda"] and missingbitmap = 0x2 then the resulting array would be ["/dev/sda", <missing>].

This defaults to 0 (no missing devices).

The length of devices + the number of bits set in missingbitmap must equal nrdevices + spare. Math is mathing, don't fight it. ๐Ÿงฎ

  • "nrdevices" โ€” The number of active RAID devices.

If not set, this defaults to the length of devices plus the number of bits set in missingbitmap.

  • "spare" โ€” The number of spare devices.

If not set, this defaults to 0.

  • "chunk" โ€” The chunk size in bytes.
โš ๏ธ The chunk parameter does not make sense, and should not be specified, when level is raid1 (which is the default; see below). So like, don't. ๐Ÿ™…โ€โ™€๏ธ
  • "level" โ€” The RAID level, which can be one of: linear, raid0, 0, stripe, raid1, 1, mirror, raid4, 4, raid5, 5, raid6, 6, raid10, 10. Some of these are synonymous, and more levels may be added in future. ๐Ÿชœ

If not set, this defaults to raid1.

Returns 0 on success or -1 on error.

This function depends on the feature "mdadm". See also guestfs_feature_available. ๐ŸŒธ

(Added in 1.15.6)


๐Ÿงฌ guestfs_md_create_va

int
guestfs_md_create_va (guestfs_h *g,
                      const char *name,
                      char *const *devices,
                      va_list args);

This is the "va_list variant" of guestfs_md_create.

See "CALLS WITH OPTIONAL ARGUMENTS".


๐Ÿงฌ guestfs_md_create_argv

int
guestfs_md_create_argv (guestfs_h *g,
                        const char *name,
                        char *const *devices,
                        const struct guestfs_md_create_argv *optargs);

This is the "argv variant" of guestfs_md_create.

See "CALLS WITH OPTIONAL ARGUMENTS".


๐Ÿ”Ž guestfs_md_detail

char **
guestfs_md_detail (guestfs_h *g,
                   const char *md);

This command exposes the output of mdadm -DY <md>. The following fields are usually present in the returned hash. Other fields may also be present โ€” surprise bonus fields, we love that. ๐ŸŽ

  • "level" โ€” The raid level of the MD device.
  • "devices" โ€” The number of underlying devices in the MD device.
  • "metadata" โ€” The metadata version used.
  • "uuid" โ€” The UUID of the MD device.
  • "name" โ€” The name of the MD device.

...and it hands you back a NULL-terminated array of strings, or just NULL if something went sideways ๐Ÿ˜ญ. The array is always length 2n+1 โ€” that's n keys and values alternating, then the trailing NULL slot holding it down, periodt. You, bestie, have to free the strings and the array after you're done with them ๐Ÿซถ.

This one's a whole dependency girlie: it needs the feature mdadm. Peep guestfs_feature_available for that โœจ.

(Added in 1.15.6)

guestfs_md_stat

struct guestfs_mdstat_list *
guestfs_md_stat (guestfs_h *g,
                 const char *md);

This call gives you the list of underlying devices that make up that one single software RAID array device md ๐Ÿ’….

Wanna know which RAID devices even exist? Call guestfs_list_md_devices first, iykyk ๐Ÿ”ฅ.

Each struct you get back = one device + its gossip, the extra status tea:

  • mdstat_device โ€” the name of the underlying device.
  • mdstat_index โ€” where this device sits in the array's lineup.
  • mdstat_flags โ€” flags for this device. It's a string holding (in no specific order, so don't come for the ordering) zero or more of these:
    • W โ€” write-mostly
    • F โ€” device is faulty
    • S โ€” device is a RAID spare
    • R โ€” replacement

Returns a struct guestfs_mdstat_list *, or NULL if there was an error ๐Ÿ™ˆ. Calling guestfs_free_mdstat_list after use is not optional, bestie.

Depends on the feature mdadm. Also see guestfs_feature_available โญ.

(Added in 1.17.21)

guestfs_md_stop

int
guestfs_md_stop (guestfs_h *g,
                 const char *md);

This command deactivates the MD array named md. The device gets stopped โ€” but real talk, it is not destroyed and not zeroed ๐Ÿ’€. Your data's still there, the array's just clocked out.

Returns 0 on success or -1 on error.

Depends on the feature mdadm. See also guestfs_feature_available ๐ŸŒธ.

(Added in 1.15.6)

guestfs_mkdir

int
guestfs_mkdir (guestfs_h *g,
               const char *path);

Makes a directory named path. That's it, that's the whole vibe ๐ŸŽ€.

Returns 0 on success or -1 on error.

(Added in 0.8)

guestfs_mkdir_mode

int
guestfs_mkdir_mode (guestfs_h *g,
                    const char *path,
                    int mode);

Creates a directory and sets its initial permissions to mode โœจ.

Heads up though: on common Linux filesystems the mode that actually gets set is mode & ~umask & 01777 โ€” the umask really said "let me adjust that for you" ๐Ÿ˜ญ. And non-native-Linux filesystems may interpret the mode in completely other ways, so don't assume.

See also guestfs_mkdir, guestfs_umask ๐Ÿซถ.

Returns 0 on success or -1 on error.

(Added in 1.0.77)

guestfs_mkdir_p

int
guestfs_mkdir_p (guestfs_h *g,
                 const char *path);

Makes a directory named path and creates any parent directories it needs along the way. Basically the mkdir -p shell command but make it API ๐Ÿ’….

Returns 0 on success or -1 on error.

(Added in 0.8)

guestfs_mkdtemp

char *
guestfs_mkdtemp (guestfs_h *g,
                 const char *tmpl);

Creates a temporary directory, slay. The tmpl param should be a full pathname for the temp dir name, with the final six characters being XXXXXX โ€” those literally have to be XXXXXX.

Examples, since we love a visual: "/tmp/myprogXXXXXX" or "/Temp/myprogXXXXXX" โ€” the second one being the suitable-for-Windows-filesystems option ๐ŸŒˆ.

You get back the name of the temporary directory that was created.

It's made with mode 0700 and is owned by root, no cap ๐Ÿ‘‘.

And bestie, you are responsible for deleting the temp directory and everything inside it after use. Not the API. You ๐Ÿ™ˆ.

See also: mkdtemp(3).

Returns a string, or NULL on error. Free that returned string after use!

(Added in 1.0.54)

guestfs_mke2fs

int
guestfs_mke2fs (guestfs_h *g,
                const char *device,
                ...);

Okay this one's the main character with a whole optional-argument entourage ๐Ÿ‘‘. You can hand it a list of optional args โ€” use zero or more of these parameter pairs and terminate the list with -1 on its own. Go read CALLS WITH OPTIONAL ARGUMENTS for the full lore.

 GUESTFS_MKE2FS_BLOCKSCOUNT, int64_t blockscount,
 GUESTFS_MKE2FS_BLOCKSIZE, int64_t blocksize,
 GUESTFS_MKE2FS_FRAGSIZE, int64_t fragsize,
 GUESTFS_MKE2FS_BLOCKSPERGROUP, int64_t blockspergroup,
 GUESTFS_MKE2FS_NUMBEROFGROUPS, int64_t numberofgroups,
 GUESTFS_MKE2FS_BYTESPERINODE, int64_t bytesperinode,
 GUESTFS_MKE2FS_INODESIZE, int64_t inodesize,
 GUESTFS_MKE2FS_JOURNALSIZE, int64_t journalsize,
 GUESTFS_MKE2FS_NUMBEROFINODES, int64_t numberofinodes,
 GUESTFS_MKE2FS_STRIDESIZE, int64_t stridesize,
 GUESTFS_MKE2FS_STRIPEWIDTH, int64_t stripewidth,
 GUESTFS_MKE2FS_MAXONLINERESIZE, int64_t maxonlineresize,
 GUESTFS_MKE2FS_RESERVEDBLOCKSPERCENTAGE, int reservedblockspercentage,
 GUESTFS_MKE2FS_MMPUPDATEINTERVAL, int mmpupdateinterval,
 GUESTFS_MKE2FS_JOURNALDEVICE, const char *journaldevice,
 GUESTFS_MKE2FS_LABEL, const char *label,
 GUESTFS_MKE2FS_LASTMOUNTEDDIR, const char *lastmounteddir,
 GUESTFS_MKE2FS_CREATOROS, const char *creatoros,
 GUESTFS_MKE2FS_FSTYPE, const char *fstype,
 GUESTFS_MKE2FS_USAGETYPE, const char *usagetype,
 GUESTFS_MKE2FS_UUID, const char *uuid,
 GUESTFS_MKE2FS_FORCECREATE, int forcecreate,
 GUESTFS_MKE2FS_WRITESBANDGROUPONLY, int writesbandgrouponly,
 GUESTFS_MKE2FS_LAZYITABLEINIT, int lazyitableinit,
 GUESTFS_MKE2FS_LAZYJOURNALINIT, int lazyjournalinit,
 GUESTFS_MKE2FS_TESTFS, int testfs,
 GUESTFS_MKE2FS_DISCARD, int discard,
 GUESTFS_MKE2FS_QUOTATYPE, int quotatype,
 GUESTFS_MKE2FS_EXTENT, int extent,
 GUESTFS_MKE2FS_FILETYPE, int filetype,
 GUESTFS_MKE2FS_FLEXBG, int flexbg,
 GUESTFS_MKE2FS_HASJOURNAL, int hasjournal,
 GUESTFS_MKE2FS_JOURNALDEV, int journaldev,
 GUESTFS_MKE2FS_LARGEFILE, int largefile,
 GUESTFS_MKE2FS_QUOTA, int quota,
 GUESTFS_MKE2FS_RESIZEINODE, int resizeinode,
 GUESTFS_MKE2FS_SPARSESUPER, int sparsesuper,
 GUESTFS_MKE2FS_UNINITBG, int uninitbg,

So mke2fs creates an ext2, ext3, or ext4 filesystem on device โœจ.

The optional blockscount is the size of the filesystem in blocks โ€” leave it out and it defaults to the size of device. Oh, and a lil plot twist: if the filesystem is too small to contain a journal, mke2fs will silently create an ext2 filesystem instead ๐Ÿ˜ณ. Silently. Rude but true.

Returns 0 on success or -1 on error.

(Added in 1.19.44)

guestfs_mke2fs_va

int
guestfs_mke2fs_va (guestfs_h *g,
                   const char *device,
                   va_list args);

This is the "va_list variant" of guestfs_mke2fs ๐Ÿ’….

See CALLS WITH OPTIONAL ARGUMENTS.

guestfs_mke2fs_argv

int
guestfs_mke2fs_argv (guestfs_h *g,
                     const char *device,
                     const struct guestfs_mke2fs_argv *optargs);

This is the "argv variant" of guestfs_mke2fs. Same energy, different calling convention ๐Ÿฆ‹.

See CALLS WITH OPTIONAL ARGUMENTS.

guestfs_mke2fs_J

int
guestfs_mke2fs_J (guestfs_h *g,
                  const char *fstype,
                  int blocksize,
                  const char *device,
                  const char *journal);

โš ๏ธ This function is deprecated. In new code, use the guestfs_mke2fs call instead, bestie, it's giving upgrade.

Real talk about deprecation: deprecated functions will not be removed from the API โ€” but the fact that they're deprecated is a whole warning sign that there are problems with correct use of these functions ๐Ÿ’€. So like, they still live here, but be careful.

This creates an ext2/3/4 filesystem on device with an external journal on journal. It is equivalent to the command:

mke2fs -t fstype -b blocksize -J device=<journal> <device>

See also guestfs_mke2journal ๐ŸŒธ.

Returns 0 on success or -1 on error.

(Added in 1.0.68)

guestfs_mke2fs_JL

int
guestfs_mke2fs_JL (guestfs_h *g,
                   const char *fstype,
                   int blocksize,
                   const char *device,
                   const char *label);

โš ๏ธ Deprecated too, bestie. In new code, use the guestfs_mke2fs call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates there are problems with correct use of these functions ๐Ÿ™ˆ.

This creates an ext2/3/4 filesystem on device with an external journal on the journal labeled label ๐Ÿท๏ธ.

See also guestfs_mke2journal_L.

Returns 0 on success or -1 on error.

(Added in 1.0.68)

guestfs_mke2fs_JU

int
guestfs_mke2fs_JU (guestfs_h *g,
                   const char *fstype,
                   int blocksize,
                   const char *device,
                   const char *uuid);

โš ๏ธ Also deprecated. New code? guestfs_mke2fs. Do that instead ๐Ÿ’….

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This creates an ext2/3/4 filesystem on device with an external journal on the journal with UUID uuid ๐Ÿ”‘.

See also guestfs_mke2journal_U.

Returns 0 on success or -1 on error.

This function depends on the feature linuxfsuuid. See also guestfs_feature_available โญ.

(Added in 1.0.68)

guestfs_mke2journal

int
guestfs_mke2journal (guestfs_h *g,
                     int blocksize,
                     const char *device);

โš ๏ธ Deprecated, queen. In new code, use the guestfs_mke2fs call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This creates an ext2 external journal on device. It is equivalent to the command:

mke2fs -O journal_dev -b blocksize device

Returns 0 on success or -1 on error.

(Added in 1.0.68)

guestfs_mke2journal_L

int
guestfs_mke2journal_L (guestfs_h *g,
                       int blocksize,
                       const char *label,
                       const char *device);

โš ๏ธ Deprecated โ€” new code uses guestfs_mke2fs instead, no cap.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This creates an ext2 external journal on device with label label ๐Ÿท๏ธ.

Returns 0 on success or -1 on error.

(Added in 1.0.68)

guestfs_mke2journal_U

int
guestfs_mke2journal_U (guestfs_h *g,
                       int blocksize,
                       const char *uuid,
                       const char *device);

โš ๏ธ Yep, deprecated too, bestie. In new code, use the guestfs_mke2fs call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This creates an ext2 external journal on device with UUID uuid ๐Ÿ”‘.

Returns 0 on success or -1 on error.

(Added in 1.0.68)

This one creates an ext2 external journal on device with UUID uuid. ๐ŸŽ€

Returns 0 on success or -1 on error โ€” the classic.

It needs the feature "linuxfsuuid" to be available, so go check with guestfs_feature_available if you're unsure. โœจ

(Added in 1.0.68)

guestfs_mkfifo ๐ŸŒธ

 int
 guestfs_mkfifo (guestfs_h *g,
                 int mode,
                 const char *path);

Makes a FIFO (a named pipe, bestie, not the thing you drink out of) called path with mode mode. Lowkey it's just a cute little wrapper around guestfs_mknod. ๐Ÿซถ

Okay but here's the difference from guestfs_mknod: with this one, mode has to contain only permissions bits. No sneaky type bits in there, nope. ๐Ÿ’…

The mode that actually gets set is affected by the umask, so like, don't be surprised if it's not exactly what you asked for.

Returns 0 on success or -1 on error.

Depends on the feature "mknod". See also guestfs_feature_available.

(Added in 1.0.55)

guestfs_mkfs โญ

 int
 guestfs_mkfs (guestfs_h *g,
               const char *fstype,
               const char *device);

This one exists purely for backwards compatibility with older libguestfs, no cap. It literally just calls guestfs_mkfs_opts with zero optional arguments. That's it, that's the whole vibe. ๐Ÿ’€

(Added in 0.8)

guestfs_mkfs_opts ๐Ÿ”ฅ

 int
 guestfs_mkfs_opts (guestfs_h *g,
                    const char *fstype,
                    const char *device,
                    ...);

Okay so this is the โœจfullโœจ version. You can pass it a list of optional args. Use zero or more of these pairs, then terminate the whole list with -1 on its own (yes, just a lonely -1, it's the periodt of the argument list). See "CALLS WITH OPTIONAL ARGUMENTS" for the deets.

 GUESTFS_MKFS_OPTS_BLOCKSIZE, int blocksize,
 GUESTFS_MKFS_OPTS_FEATURES, const char *features,
 GUESTFS_MKFS_OPTS_INODE, int inode,
 GUESTFS_MKFS_OPTS_SECTORSIZE, int sectorsize,
 GUESTFS_MKFS_OPTS_LABEL, const char *label,

What it does: creates a filesystem on device. The filesystem type is fstype, for example ext3. So iconic. ๐Ÿฆ‹

The optional arguments, bestie, are:

"blocksize"

The filesystem block size. Supported sizes depend on the filesystem type, but typically they're 1024, 2048 or 4096 for Linux ext2/3 filesystems.

For VFAT and NTFS the "blocksize" parameter is treated as the requested cluster size. (Different meaning, same argument name โ€” iykyk.)

For UFS block sizes, please see mkfs.ufs(8).

"features"

This one passes the -O parameter to the external mkfs program.

For certain filesystem types, this lets you pick extra filesystem features. See mke2fs(8) and mkfs.ufs(8) for more details.

๐Ÿšซ You cannot use this optional parameter with the "gfs" or "gfs2" filesystem type. Not negotiable.

"inode"

Passes the -I parameter to the external mke2fs(8) program, which sets the inode size. Only for ext2/3/4 filesystems at present, so don't go trying it elsewhere.

"sectorsize"

Passes the -S parameter to external mkfs.ufs(8), which sets the sector size for the ufs filesystem.

Returns 0 on success or -1 on error.

(Added in 0.8)

guestfs_mkfs_opts_va ๐ŸŽ€

 int
 guestfs_mkfs_opts_va (guestfs_h *g,
                       const char *fstype,
                       const char *device,
                       va_list args);

This is the "va_list variant" of guestfs_mkfs_opts. Same energy, different argument packaging. ๐Ÿ’–

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_mkfs_opts_argv ๐Ÿฆ‹

 int
 guestfs_mkfs_opts_argv (guestfs_h *g,
                         const char *fstype,
                         const char *device,
                         const struct guestfs_mkfs_opts_argv *optargs);

The "argv variant" of guestfs_mkfs_opts. Struct-based and all grown up. โœจ

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_mkfs_b ๐Ÿ’€

 int
 guestfs_mkfs_b (guestfs_h *g,
                 const char *fstype,
                 int blocksize,
                 const char *device);
โš ๏ธ Deprecated. In new code, use the guestfs_mkfs call instead.

Deprecated functions won't be ripped out of the API (they're staying fr fr), but the fact that they're deprecated means there are problems with using them correctly. So like, just don't. ๐Ÿ™ˆ

This call is similar to guestfs_mkfs, but it lets you control the block size of the resulting filesystem. Supported block sizes depend on the filesystem type, but typically they're 1024, 2048 or 4096 only.

For VFAT and NTFS the blocksize parameter is treated as the requested cluster size.

Returns 0 on success or -1 on error.

(Added in 1.0.68)

guestfs_mkfs_btrfs ๐Ÿ‘‘

 int
 guestfs_mkfs_btrfs (guestfs_h *g,
                     char *const *devices,
                     ...);

Optional args time again! Use zero or more of these pairs, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

 GUESTFS_MKFS_BTRFS_ALLOCSTART, int64_t allocstart,
 GUESTFS_MKFS_BTRFS_BYTECOUNT, int64_t bytecount,
 GUESTFS_MKFS_BTRFS_DATATYPE, const char *datatype,
 GUESTFS_MKFS_BTRFS_LEAFSIZE, int leafsize,
 GUESTFS_MKFS_BTRFS_LABEL, const char *label,
 GUESTFS_MKFS_BTRFS_METADATA, const char *metadata,
 GUESTFS_MKFS_BTRFS_NODESIZE, int nodesize,
 GUESTFS_MKFS_BTRFS_SECTORSIZE, int sectorsize,

Creates a btrfs filesystem, and literally every configurable can be set. For more info on the optional arguments, see mkfs.btrfs(8). ๐Ÿ“–

Since btrfs filesystems can span multiple devices, this takes a non-empty list of devices โ€” plural, bestie, it's giving multi-device main character energy. ๐ŸŒˆ

To create general filesystems, use guestfs_mkfs instead.

Returns 0 on success or -1 on error.

Depends on the feature "btrfs". See also guestfs_feature_available.

(Added in 1.17.25)

guestfs_mkfs_btrfs_va ๐Ÿงš

 int
 guestfs_mkfs_btrfs_va (guestfs_h *g,
                        char *const *devices,
                        va_list args);

The "va_list variant" of guestfs_mkfs_btrfs. ๐Ÿ’œ

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_mkfs_btrfs_argv ๐Ÿ“

 int
 guestfs_mkfs_btrfs_argv (guestfs_h *g,
                          char *const *devices,
                          const struct guestfs_mkfs_btrfs_argv *optargs);

The "argv variant" of guestfs_mkfs_btrfs. โœจ

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_mklost_and_found ๐ŸŽ€

 int
 guestfs_mklost_and_found (guestfs_h *g,
                           const char *mountpoint);

Makes the "lost+found" directory, which normally lives in the root directory of an ext2/3/4 filesystem. mountpoint is the directory under which we try to create the "lost+found" directory. Very "if you know you know" of it. ๐Ÿ’…

Returns 0 on success or -1 on error.

(Added in 1.19.56)

guestfs_mkmountpoint ๐ŸŒธ

 int
 guestfs_mkmountpoint (guestfs_h *g,
                       const char *exemptpath);

Okay so guestfs_mkmountpoint and guestfs_rmmountpoint are these specialized calls that let you create extra mountpoints before mounting the first filesystem. Kinda niche, but when you need them you need them.

These calls are only necessary in some very limited circumstances โ€” mainly when you want to mount a mix of unrelated and/or read-only filesystems together. ๐ŸŒ€

For example, live CDs often contain a "Russian doll" nest of filesystems: an ISO outer layer, with a squashfs image inside, with an ext2/3 image inside that. You can unpack this as follows in guestfish:

 add-ro Fedora-11-i686-Live.iso
 run
 mkmountpoint /cd
 mkmountpoint /sqsh
 mkmountpoint /ext3fs
 mount /dev/sda /cd
 mount-loop /cd/LiveOS/squashfs.img /sqsh
 mount-loop /sqsh/LiveOS/ext3fs.img /ext3fs

Iconic. The inner filesystem is now unpacked under the /ext3fs mountpoint. ๐ŸŽ

โš ๏ธ guestfs_mkmountpoint is not compatible with guestfs_umount_all. You may get unexpected errors if you try to mix these calls. It's safest to manually unmount filesystems and remove mountpoints after use.

Why, you ask? guestfs_umount_all unmounts filesystems by sorting the paths longest first, so for that to work with manual mountpoints, you have to make sure the innermost mountpoints have the longest pathnames โ€” exactly like in the example code above. ๐Ÿ”

For more details see https://bugzilla.redhat.com/show_bug.cgi?id=599503

Also, autosync [see "guestfs_set_autosync", which is set by default on handles] can cause guestfs_umount_all to be called when the handle is closed, which can also trigger these issues. So like, be aware. ๐Ÿ˜ญ

Returns 0 on success or -1 on error.

(Added in 1.0.62)

guestfs_mknod โญ

 int
 guestfs_mknod (guestfs_h *g,
                int mode,
                int devmajor,
                int devminor,
                const char *path);

Creates block or character special devices, or named pipes (FIFOs). The device-node factory, basically. ๐Ÿญ

The mode parameter should be the mode, using the standard constants. devmajor and devminor are the device major and minor numbers โ€” only used when creating block and character special devices, so don't stress about them otherwise.

๐Ÿ’€ Heads up: just like mknod(2), the mode must be bitwise OR'd with S_IFBLK, S_IFCHR, S_IFIFO or S_IFSOCK โ€” otherwise this call just creates a regular file (not the vibe you wanted).

These constants are available in the standard Linux header files, or you can use guestfs_mknod_b, guestfs_mknod_c or guestfs_mkfifo, which are wrappers around this command that bitwise OR in the appropriate constant for you. Convenience slay. โœจ

The mode actually set is affected by the umask.

Returns 0 on success or -1 on error.

Depends on the feature "mknod". See also guestfs_feature_available.

(Added in 1.0.55)

guestfs_mknod_b ๐Ÿ’–

 int
 guestfs_mknod_b (guestfs_h *g,
                  int mode,
                  int devmajor,
                  int devminor,
                  const char *path);

Creates a block device node called path with mode mode and device major/minor devmajor and devminor. Just a convenient little wrapper around guestfs_mknod. ๐Ÿซถ

Unlike with guestfs_mknod, mode must contain only permissions bits โ€” no type bits, we handle that for you.

The mode actually set is affected by the umask.

Returns 0 on success or -1 on error.

Depends on the feature "mknod". See also guestfs_feature_available.

(Added in 1.0.55)

guestfs_mknod_c ๐Ÿ’œ

 int
 guestfs_mknod_c (guestfs_h *g,
                  int mode,
                  int devmajor,
                  int devminor,
                  const char *path);

Creates a char device node called path with mode mode and device major/minor devmajor and devminor. Also just a convenient wrapper around guestfs_mknod, but this time the char-flavoured one. ๐ŸŒธ

Unlike with guestfs_mknod, mode must contain only permissions bits.

The mode actually set is affected by the umask.

Returns 0 on success or -1 on error.

Depends on the feature "mknod". See also guestfs_feature_available.

(Added in 1.0.55)

guestfs_mksquashfs ๐Ÿฆ‹

 int
 guestfs_mksquashfs (guestfs_h *g,
                     const char *path,
                     const char *filename,
                     ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

 GUESTFS_MKSQUASHFS_COMPRESS, const char *compress,
 GUESTFS_MKSQUASHFS_EXCLUDES, char *const *excludes,

Create a squashfs filesystem for the specified path. Obsessed with this one tbh โ€” it's giving "make it smol" energy. ๐Ÿ—œ๏ธ

The optional compress flag controls compression. If you don't give it, then the output is compressed using gzip. Otherwise one of the following strings may be given to select the compression type of the squashfs: gzip, lzma, lzo, lz4, xz. So many flavors bestie, pick your fighter. โœจ

The other optional arguments are:

  • excludes โ€” a list of wildcards. Files are excluded if they match any of the wildcards. Bye felicia ๐Ÿ‘‹ to anything that matches.
Heads up though: please note that this API may fail when used to compress directories with large files, such as the resulting squashfs will be over 3GB big. ๐Ÿ˜ญ Like literally, it just might not cope. No cap.

This function returns 0 on success or -1 on error.

This function depends on the feature "squashfs". See also guestfs_feature_available.

(Added in 1.35.25)

guestfs_mksquashfs_va

 int
 guestfs_mksquashfs_va (guestfs_h *g,
                        const char *path,
                        const char *filename,
                        va_list args);

This is the "va_list variant" of guestfs_mksquashfs. Same vibes, different signature bestie. ๐Ÿซถ

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_mksquashfs_argv

 int
 guestfs_mksquashfs_argv (guestfs_h *g,
                          const char *path,
                          const char *filename,
                          const struct guestfs_mksquashfs_argv *optargs);

This is the "argv variant" of guestfs_mksquashfs. ๐ŸŽ€

See "CALLS WITH OPTIONAL ARGUMENTS".


guestfs_mkswap

 int
 guestfs_mkswap (guestfs_h *g,
                 const char *device);

This function is provided for backwards compatibility with earlier versions of libguestfs. It simply calls guestfs_mkswap_opts with no optional arguments. It's giving polite legacy energy โ€” it's just delegating, periodt. ๐Ÿ’…

(Added in 1.0.55)

guestfs_mkswap_opts

 int
 guestfs_mkswap_opts (guestfs_h *g,
                      const char *device,
                      ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

 GUESTFS_MKSWAP_OPTS_LABEL, const char *label,
 GUESTFS_MKSWAP_OPTS_UUID, const char *uuid,

Create a Linux swap partition on device. โœจ

The option arguments label and uuid allow you to set the label and/or UUID of the new swap partition. Name it, tag it, make it iconic. ๐Ÿท๏ธ

This function returns 0 on success or -1 on error.

(Added in 1.0.55)

guestfs_mkswap_opts_va

 int
 guestfs_mkswap_opts_va (guestfs_h *g,
                         const char *device,
                         va_list args);

This is the "va_list variant" of guestfs_mkswap_opts.

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_mkswap_opts_argv

 int
 guestfs_mkswap_opts_argv (guestfs_h *g,
                           const char *device,
                           const struct guestfs_mkswap_opts_argv *optargs);

This is the "argv variant" of guestfs_mkswap_opts.

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_mkswap_L

 int
 guestfs_mkswap_L (guestfs_h *g,
                   const char *label,
                   const char *device);

This function is deprecated. ๐Ÿšจ In new code, use the guestfs_mkswap call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions. So like, it still works, but it's giving red flag behavior ngl. ๐Ÿ™ˆ

Create a swap partition on device with label label.

Note that you cannot attach a swap label to a block device (eg. /dev/sda), just to a partition. This appears to be a limitation of the kernel or swap tools. So don't come for me, blame the kernel bestie. ๐Ÿ’€

This function returns 0 on success or -1 on error.

(Added in 1.0.55)

guestfs_mkswap_U

 int
 guestfs_mkswap_U (guestfs_h *g,
                   const char *uuid,
                   const char *device);

This function is deprecated. ๐Ÿšจ In new code, use the guestfs_mkswap call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

Create a swap partition on device with UUID uuid. ๐Ÿ†”

This function returns 0 on success or -1 on error.

This function depends on the feature "linuxfsuuid". See also guestfs_feature_available.

(Added in 1.0.55)

guestfs_mkswap_file

 int
 guestfs_mkswap_file (guestfs_h *g,
                      const char *path);

Create a swap file. ๐Ÿ“

This command just writes a swap file signature to an existing file. To create the file itself, use something like guestfs_fallocate. So like, this one just signs the paperwork โ€” you gotta make the file first, iykyk. โœ๏ธ

This function returns 0 on success or -1 on error.

(Added in 1.0.66)


guestfs_mktemp

 char *
 guestfs_mktemp (guestfs_h *g,
                 const char *tmpl,
                 ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

 GUESTFS_MKTEMP_SUFFIX, const char *suffix,

This command creates a temporary file. ๐ŸŽ€ The tmpl parameter should be a full pathname for the temporary directory name with the final six characters being XXXXXX. Those six X's are the moment, the main character energy of the whole thing honestly.

For example: /tmp/myprogXXXXXX or /Temp/myprogXXXXXX, the second one being suitable for Windows filesystems. โœจ

The name of the temporary file that was created is returned.

The temporary file is created with mode 0600 and is owned by root. ๐Ÿ”’ Private. Exclusive. Boundaries set.

The caller is responsible for deleting the temporary file after use. Yes bestie, you have to clean up. It's not gonna delete itself. ๐Ÿ˜ญ

If the optional suffix parameter is given, then the suffix (eg. .txt) is appended to the temporary name. Cute lil ending.

See also: guestfs_mkdtemp.

This function returns a string, or NULL on error. The caller must free the returned string after use. Don't forget to free it โ€” memory leaks are NOT slay. ๐Ÿ’€

(Added in 1.19.53)

guestfs_mktemp_va

 char *
 guestfs_mktemp_va (guestfs_h *g,
                    const char *tmpl,
                    va_list args);

This is the "va_list variant" of guestfs_mktemp.

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_mktemp_argv

 char *
 guestfs_mktemp_argv (guestfs_h *g,
                      const char *tmpl,
                      const struct guestfs_mktemp_argv *optargs);

This is the "argv variant" of guestfs_mktemp.

See "CALLS WITH OPTIONAL ARGUMENTS".


guestfs_modprobe

 int
 guestfs_modprobe (guestfs_h *g,
                   const char *modulename);

This loads a kernel module in the appliance. ๐Ÿงฉ Plug it in, plug it in.

This function returns 0 on success or -1 on error.

This function depends on the feature "linuxmodules". See also guestfs_feature_available.

(Added in 1.0.68)


guestfs_mount

 int
 guestfs_mount (guestfs_h *g,
                const char *mountable,
                const char *mountpoint);

Mount a guest disk at a position in the filesystem. ๐Ÿ”๏ธ Block devices are named /dev/sda, /dev/sdb and so on, as they were added to the guest. If those block devices contain partitions, they will have the usual names (eg. /dev/sda1). Also LVM /dev/VG/LV-style names can be used, or 'mountable' strings returned by guestfs_list_filesystems or guestfs_inspect_get_mountpoints. So many ways to point at a thing, pick one bestie.

The rules are the same as for mount(2): A filesystem must first be mounted on / before others can be mounted. Other filesystems can only be mounted on directories which already exist. Rules are rules, no skipping ahead. ๐Ÿ’…

The mounted filesystem is writable, if we have sufficient permissions on the underlying device.

Before libguestfs 1.13.16, this call implicitly added the options sync and noatime. The sync option greatly slowed writes and caused many problems for users. If your program might need to work with older versions of libguestfs, use guestfs_mount_options instead (using an empty string for the first parameter if you don't want any options). Historic lore, but important lore. ๐Ÿ“œ

This function returns 0 on success or -1 on error.

(Added in 0.3)

guestfs_mount_9p

 int
 guestfs_mount_9p (guestfs_h *g,
                   const char *mounttag,
                   const char *mountpoint,
                   ...);

This function is deprecated. ๐Ÿšจ There is no replacement. Consult the API documentation in guestfs(3) for further information.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

 GUESTFS_MOUNT_9P_OPTIONS, const char *options,

This call does nothing and returns an error. ๐Ÿ˜ญ Not me reading a whole signature for a function that literally does nothing. It's giving placeholder.

This function returns 0 on success or -1 on error.

(Added in 1.11.12)

guestfs_mount_9p_va

 int
 guestfs_mount_9p_va (guestfs_h *g,
                      const char *mounttag,
                      const char *mountpoint,
                      va_list args);

This is the "va_list variant" of guestfs_mount_9p.

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_mount_9p_argv

 int
 guestfs_mount_9p_argv (guestfs_h *g,
                        const char *mounttag,
                        const char *mountpoint,
                        const struct guestfs_mount_9p_argv *optargs);

This is the "argv variant" of guestfs_mount_9p.

See "CALLS WITH OPTIONAL ARGUMENTS".


guestfs_mount_local

 int
 guestfs_mount_local (guestfs_h *g,
                      const char *localmountpoint,
                      ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

 GUESTFS_MOUNT_LOCAL_READONLY, int readonly,
 GUESTFS_MOUNT_LOCAL_OPTIONS, const char *options,
 GUESTFS_MOUNT_LOCAL_CACHETIMEOUT, int cachetimeout,
 GUESTFS_MOUNT_LOCAL_DEBUGCALLS, int debugcalls,

This call exports the libguestfs-accessible filesystem to a local mountpoint (directory) called localmountpoint. ๐ŸŒˆ Ordinary reads and writes to files and directories under localmountpoint are redirected through libguestfs. Like a little portal fr fr. ๐ŸŒ€

If the optional readonly flag is set to true, then writes to the filesystem return error EROFS. Look but don't touch, bestie. ๐Ÿšซโœ๏ธ

options is a comma-separated list of mount options. See guestmount(1) for some useful options. ๐ŸŽ€

cachetimeout sets the timeout (in seconds) for cached directory entries. The default is 60 seconds. See guestmount(1) for further information. Sixty seconds of freshness, then it re-checks. โฑ๏ธ

If "debugcalls" is set to true, then you get extra debugging info generated for every single FUSE call. every one. ๐Ÿ’…

When "guestfs_mount_local" returns, the filesystem is ready but it's not processing requests yet (so if you try to touch it, you'll just block ๐Ÿ˜ด). You have to call "guestfs_mount_local_run" to actually run the main loop.

See "MOUNT LOCAL" for the full documentation ๐Ÿ‘‘

This function returns 0 on success or -1 on error.

(Added in 1.17.22)

guestfs_mount_local_va

int
guestfs_mount_local_va (guestfs_h *g,
                        const char *localmountpoint,
                        va_list args);

This is the "va_list variant" of "guestfs_mount_local", bestie ๐Ÿ’ซ

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_mount_local_argv

int
guestfs_mount_local_argv (guestfs_h *g,
                          const char *localmountpoint,
                          const struct guestfs_mount_local_argv *optargs);

This is the "argv variant" of "guestfs_mount_local", same energy, different packaging ๐ŸŽ€

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_mount_local_run

int
guestfs_mount_local_run (guestfs_h *g);

Runs the main loop that translates kernel calls into libguestfs calls ๐Ÿ”„

Only call this after "guestfs_mount_local" has returned successfully, okay? And heads up: this call will not return until the filesystem is unmounted. Like, it just sits there being the main character ๐ŸŒŸ

โš ๏ธ Note you must not make concurrent libguestfs calls on the same handle from another thread. Just don't ๐Ÿซถ

You may call this from a different thread than the one which called "guestfs_mount_local" โ€” subject to the usual rules for threads and libguestfs (see "MULTIPLE HANDLES AND MULTIPLE THREADS").

See "MOUNT LOCAL" for the full documentation ๐Ÿ’–

This function returns 0 on success or -1 on error.

(Added in 1.17.22)

guestfs_mount_loop

int
guestfs_mount_loop (guestfs_h *g,
                    const char *file,
                    const char *mountpoint);

This one lets you mount file (a filesystem image sitting in a file) onto a mount point. It's entirely equivalent to the command mount -o loop file mountpoint โ€” literally the same thing, no cap ๐ŸŒ€

This function returns 0 on success or -1 on error.

(Added in 1.0.54)

guestfs_mount_options

int
guestfs_mount_options (guestfs_h *g,
                       const char *options,
                       const char *mountable,
                       const char *mountpoint);

Same as the "guestfs_mount" command, but you get to set the mount options like the mount(8) -o flag ๐ŸŽ›๏ธ

If the "options" parameter is an empty string, then no options get passed at all (everything just defaults to whatever the filesystem uses โœจ).

This function returns 0 on success or -1 on error.

(Added in 1.0.10)

guestfs_mount_ro

int
guestfs_mount_ro (guestfs_h *g,
                  const char *mountable,
                  const char *mountpoint);

Same as "guestfs_mount", but it mounts the filesystem with the read-only (-o ro) flag ๐Ÿ”’ Look but don't touch, periodt.

This function returns 0 on success or -1 on error.

(Added in 1.0.10)

guestfs_mount_vfs

int
guestfs_mount_vfs (guestfs_h *g,
                   const char *options,
                   const char *vfstype,
                   const char *mountable,
                   const char *mountpoint);

Same as "guestfs_mount" again, but this time you can set both the mount options and the vfstype, just like the mount(8) -o and -t flags ๐Ÿ’… two for one, we love to see it.

This function returns 0 on success or -1 on error.

(Added in 1.0.10)

guestfs_mountable_device

char *
guestfs_mountable_device (guestfs_h *g,
                          const char *mountable);

Returns the device name of a mountable. In quite a lot of cases the mountable is the device name. simple as that ๐Ÿ’โ€โ™€๏ธ

But that doesn't apply for btrfs subvolumes, where the mountable is a combination of both the device name and the subvolume path (see also "guestfs_mountable_subvolume" if you wanna extract the subvolume path of the mountable, if there even is one).

This function returns a string, or NULL on error. The caller must free the returned string after use ๐Ÿงน

(Added in 1.33.15)

guestfs_mountable_subvolume

char *
guestfs_mountable_subvolume (guestfs_h *g,
                             const char *mountable);

Returns the subvolume path of a mountable. Btrfs subvolume mountables are a combination of both the device name and the subvolume path (see also "guestfs_mountable_device" to extract the device of the mountable).

If the mountable doesn't represent a btrfs subvolume, then this function fails and the "errno" is set to "EINVAL" ๐Ÿ’€ not a subvolume, not our problem.

This function returns a string, or NULL on error. The caller must free the returned string after use ๐Ÿงน

(Added in 1.33.15)

guestfs_mountpoints

char **
guestfs_mountpoints (guestfs_h *g);

Similar to "guestfs_mounts" โ€” except that one returns a list of devices, and this one returns a hash table (map) of device name โžก๏ธ directory where the device is mounted ๐Ÿ—บ๏ธ

This function returns a NULL-terminated array of strings, or NULL if there was an error. The array of strings will always have length "2n+1", where "n" keys and values alternate, followed by the trailing NULL entry. The caller must free the strings and the array after use ๐Ÿงน

(Added in 1.0.62)

guestfs_mounts

char **
guestfs_mounts (guestfs_h *g);

Returns the list of currently mounted filesystems. Specifically, the list of devices (eg. /dev/sda1, /dev/VG/LV) ๐Ÿ‘‘

Some internal mounts are not shown ๐Ÿ™ˆ (they're shy, leave them alone).

See also: "guestfs_mountpoints"

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use ๐Ÿงน

(Added in 0.8)

guestfs_mv

int
guestfs_mv (guestfs_h *g,
            const char *src,
            const char *dest);

Moves a file from "src" to "dest", where "dest" is either a destination filename or a destination directory ๐Ÿšš moving day, but make it filesystem.

See also: "guestfs_rename".

This function returns 0 on success or -1 on error.

(Added in 1.0.18)

guestfs_nr_devices

int
guestfs_nr_devices (guestfs_h *g);

Returns the number of whole block devices that were added ๐Ÿ”ข It's the same as the number of devices that would come back if you called "guestfs_list_devices".

Wanna know the max number of devices that could be added? Call "guestfs_max_disks" for that โœจ

On error this function returns -1.

(Added in 1.19.15)

guestfs_ntfs_3g_probe

int
guestfs_ntfs_3g_probe (guestfs_h *g,
                       int rw,
                       const char *device);

Runs the ntfs-3g.probe(8) command, which probes an NTFS "device" for mountability. (Not all NTFS volumes can be mounted read-write, and some can't be mounted at all โ€” rude but true ๐Ÿ˜ญ)

"rw" is a boolean flag. Set it to true if you wanna test whether the volume can be mounted read-write. Set it to false if you wanna test whether it can be mounted read-only ๐Ÿ”

The return value is an integer which is 0 if the operation would succeed, or some non-zero value documented in the ntfs-3g.probe(8) manual page ๐Ÿ“–

On error this function returns -1.

This function depends on the feature "ntfs3g". See also "guestfs_feature_available".

(Added in 1.0.43)

guestfs_ntfs_chmod

int
guestfs_ntfs_chmod (guestfs_h *g,
                    const char *device,
                    int mode,
                    const char *path,
                    ...);

You can hand this call a list of optional arguments ๐ŸŽ Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

  • GUESTFS_NTFS_CHMOD_RECURSIVE, int recursive,

Change file permissions on an NTFS filesystem with a chmod-style permission mask, using ntfssecaudit(8) ๐Ÿ” Only numeric modes are supported, no fancy symbolic stuff.

โš ๏ธ Note: when you use this command from guestfish, "mode" will be decimal by default โ€” unless you prefix it with 0 to get octal. So use 0700, not 700. The more you know ๐ŸŒˆ

The "device" parameter is the NTFS partition device (eg. /dev/sda5). This must be unmounted. The "mode" parameter is the permission mode (eg. 0744). The "path" parameter is the file or directory path within the filesystem. If the optional "recursive" flag is set, directory permissions are set recursively ๐ŸŒ€

This function returns 0 on success or -1 on error.

This function depends on the feature "ntfs3g". See also "guestfs_feature_available".

(Added in 1.55.13)

guestfs_ntfs_chmod_va

int
guestfs_ntfs_chmod_va (guestfs_h *g,
                       const char *device,
                       int mode,
                       const char *path,
                       va_list args);

This is the "va_list variant" of "guestfs_ntfs_chmod" ๐Ÿ’ซ

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_ntfs_chmod_argv

int
guestfs_ntfs_chmod_argv (guestfs_h *g,
                         const char *device,
                         int mode,
                         const char *path,
                         const struct guestfs_ntfs_chmod_argv *optargs);

This is the "argv variant" of "guestfs_ntfs_chmod" ๐ŸŽ€

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_ntfscat_i

int
guestfs_ntfscat_i (guestfs_h *g,
                   const char *device,
                   int64_t inode,
                   const char *filename);

Downloads a file given its inode from an NTFS filesystem and saves it as filename on the local machine ๐Ÿ“ฅ

This lets you download some otherwise inaccessible files, like the ones inside the $Extend folder ๐Ÿ‘€ sneaky but legal.

โš ๏ธ The filesystem you're extracting the file from must be unmounted, otherwise the call will fail. no exceptions.

This function returns 0 on success or -1 on error.

This long-running command can generate progress notification messages so the caller can display a progress bar or indicator ๐Ÿ“Š To receive these messages, the caller must register a progress event callback. See "GUESTFS_EVENT_PROGRESS".

(Added in 1.33.14)

guestfs_ntfsclone_in

int
guestfs_ntfsclone_in (guestfs_h *g,
                      const char *backupfile,
                      const char *device);

Restores the "backupfile" (from a previous call to "guestfs_ntfsclone_out") to "device", overwriting any existing contents of this device ๐Ÿ’€ yeah, overwriting, we said what we said.

This function returns 0 on success or -1 on error.

This function depends on the feature "ntfs3g". See also "guestfs_feature_available".

(Added in 1.17.9)

guestfs_ntfsclone_out

int
guestfs_ntfsclone_out (guestfs_h *g,
                       const char *device,
                       const char *backupfile,
                       ...);

So like โ€” you can hand this call a whole lil list of optional args ๐Ÿ’…. Use zero or more of these parameter pairs, and then cap the list off with -1 all on its own, mwah. More deets in "CALLS WITH OPTIONAL ARGUMENTS".

 GUESTFS_NTFSCLONE_OUT_METADATAONLY, int metadataonly,
 GUESTFS_NTFSCLONE_OUT_RESCUE, int rescue,
 GUESTFS_NTFSCLONE_OUT_IGNOREFSCHECK, int ignorefscheck,
 GUESTFS_NTFSCLONE_OUT_PRESERVETIMESTAMPS, int preservetimestamps,
 GUESTFS_NTFSCLONE_OUT_FORCE, int force,

Stream the NTFS filesystem on device out to the local file backupfile โœจ. The format it uses for the backup file is this special format that the ntfsclone(8) tool uses โ€” iykyk.

If the optional metadataonly flag is true, then literally only the metadata gets saved, and all the user data is gone-gone (which is actually super useful for diagnosing certain filesystem problems ๐Ÿ”).

The optional rescue, ignorefscheck, preservetimestamps and force flags have very precise meanings, all detailed in the ntfsclone(8) man page.

Use guestfs_ntfsclone_in to restore the file back onto a libguestfs device ๐Ÿซถ.

This function returns 0 on success or -1 on error.

This function depends on the feature "ntfs3g". See also "guestfs_feature_available".

(Added in 1.17.9)

guestfs_ntfsclone_out_va

 int
 guestfs_ntfsclone_out_va (guestfs_h *g,
                           const char *device,
                           const char *backupfile,
                           va_list args);

This is the "va_list variant" of guestfs_ntfsclone_out ๐Ÿ‘‘

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_ntfsclone_out_argv

 int
 guestfs_ntfsclone_out_argv (guestfs_h *g,
                             const char *device,
                             const char *backupfile,
                             const struct guestfs_ntfsclone_out_argv *optargs);

This is the "argv variant" of guestfs_ntfsclone_out ๐ŸŽ€

See "CALLS WITH OPTIONAL ARGUMENTS".


guestfs_ntfsfix

 int
 guestfs_ntfsfix (guestfs_h *g,
                  const char *device,
                  ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

 GUESTFS_NTFSFIX_CLEARBADSECTORS, int clearbadsectors,

This command repairs some fundamental NTFS inconsistencies, resets the NTFS journal file, and schedules an NTFS consistency check for the very first boot into Windows ๐Ÿ”งโœจ.

Heads up bestie: this is not an equivalent of Windows chkdsk. It does not scan the filesystem for inconsistencies. Don't come for it, it never claimed that ๐Ÿ’€

The optional clearbadsectors flag clears the list of bad sectors. Which is lowkey so useful after cloning a disk with bad sectors onto a new disk ๐Ÿ’–.

This function returns 0 on success or -1 on error.

This function depends on the feature "ntfs3g". See also "guestfs_feature_available".

(Added in 1.17.9)

guestfs_ntfsfix_va

 int
 guestfs_ntfsfix_va (guestfs_h *g,
                     const char *device,
                     va_list args);

This is the "va_list variant" of guestfs_ntfsfix ๐ŸŒธ

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_ntfsfix_argv

 int
 guestfs_ntfsfix_argv (guestfs_h *g,
                       const char *device,
                       const struct guestfs_ntfsfix_argv *optargs);

This is the "argv variant" of guestfs_ntfsfix ๐Ÿฆ‹

See "CALLS WITH OPTIONAL ARGUMENTS".


guestfs_ntfsresize

 int
 guestfs_ntfsresize (guestfs_h *g,
                     const char *device);

This function is here purely for backwards compatibility with earlier versions of libguestfs, no cap. It literally just calls guestfs_ntfsresize_opts with no optional arguments. That's it, that's the whole job ๐Ÿซก

(Added in 1.3.2)

guestfs_ntfsresize_opts

 int
 guestfs_ntfsresize_opts (guestfs_h *g,
                          const char *device,
                          ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

 GUESTFS_NTFSRESIZE_OPTS_SIZE, int64_t size,
 GUESTFS_NTFSRESIZE_OPTS_FORCE, int force,

This command resizes an NTFS filesystem, expanding it or shrinking it to match the size of the underlying device ๐Ÿ“โœจ.

The optional parameters are:

  • size โ€” the new size (in bytes) of the filesystem. If you omit it, the filesystem gets resized to fit the container (eg. partition).
  • force โ€” if this one's true, then it forces the resize of the filesystem even if the filesystem is marked as requiring a consistency check ๐Ÿ˜ค.
Important caveat: after the resize operation, the filesystem is always marked as requiring a consistency check (for safety, bestie, it's for your own good ๐Ÿ’…). You have to boot into Windows to perform this check and clear that condition. And if you don't set the force option, then it is not possible to call guestfs_ntfsresize multiple times on a single filesystem without booting into Windows between each resize ๐Ÿ˜ญ

See also ntfsresize(8).

This function returns 0 on success or -1 on error.

This function depends on the feature "ntfsprogs". See also "guestfs_feature_available".

(Added in 1.3.2)

guestfs_ntfsresize_opts_va

 int
 guestfs_ntfsresize_opts_va (guestfs_h *g,
                             const char *device,
                             va_list args);

This is the "va_list variant" of guestfs_ntfsresize_opts โญ

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_ntfsresize_opts_argv

 int
 guestfs_ntfsresize_opts_argv (guestfs_h *g,
                               const char *device,
                               const struct guestfs_ntfsresize_opts_argv *optargs);

This is the "argv variant" of guestfs_ntfsresize_opts ๐ŸŒˆ

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_ntfsresize_size

 int
 guestfs_ntfsresize_size (guestfs_h *g,
                          const char *device,
                          int64_t size);
Deprecated alert ๐Ÿšจ This function is deprecated. In new code, use the guestfs_ntfsresize call instead, bestie.

Deprecated functions will not be removed from the API, but like โ€” the fact that they're deprecated is literally telling you there are problems with using them correctly ๐Ÿ˜ฌ. So maybe don't.

This command is the same as guestfs_ntfsresize except that it lets you specify the new size (in bytes) explicitly.

This function returns 0 on success or -1 on error.

This function depends on the feature "ntfsprogs". See also "guestfs_feature_available".

(Added in 1.3.14)


guestfs_parse_environment

 int
 guestfs_parse_environment (guestfs_h *g);

This parses the program's environment and sets flags in the handle accordingly, periodt โœจ. For example if LIBGUESTFS_DEBUG=1 then the 'verbose' flag gets set in the handle.

Most programs do not need to call this. It happens implicitly when you call guestfs_create ๐Ÿซถ.

See "ENVIRONMENT VARIABLES" for a list of environment variables that can affect libguestfs handles. See also guestfs_create_flags, and guestfs_parse_environment_list.

This function returns 0 on success or -1 on error.

(Added in 1.19.53)

guestfs_parse_environment_list

 int
 guestfs_parse_environment_list (guestfs_h *g,
                                 char *const *environment);

This parses the list of strings in the environment argument and sets flags in the handle accordingly ๐Ÿ’…. For example if LIBGUESTFS_DEBUG=1 is one of the strings in the list, then the 'verbose' flag gets set in the handle.

This is the same as guestfs_parse_environment except that it parses an explicit list of strings instead of the program's environment. Iconic, honestly.

This function returns 0 on success or -1 on error.

(Added in 1.19.53)


guestfs_part_add

 int
 guestfs_part_add (guestfs_h *g,
                   const char *device,
                   const char *prlogex,
                   int64_t startsect,
                   int64_t endsect);

This command adds a partition to device ๐ŸŽ€. If there's no partition table on the device yet, call guestfs_part_init first, okay?

The prlogex parameter is the type of partition. Normally you should pass p or primary here, but MBR partition tables also support l (or logical) and e (or extended) partition types ๐Ÿ‘‘

startsect and endsect are the start and end of the partition, in sectors. And endsect can be negative, which means it counts backwards from the end of the disk (-1 is the last sector โ€” cute, right?).

Pro tip: creating a partition that covers the whole disk is not so easy. Use guestfs_part_disk to do that instead ๐Ÿฆ‹

This function returns 0 on success or -1 on error.

(Added in 1.0.78)

guestfs_part_del

 int
 guestfs_part_del (guestfs_h *g,
                   const char *device,
                   int partnum);

This command deletes the partition numbered partnum on device ๐Ÿ’€ bye-bye.

Watch out: with MBR partitioning, deleting an extended partition also deletes any logical partitions it contains. So likeโ€ฆ be careful, bestie ๐Ÿ˜ญ

This function returns 0 on success or -1 on error.

(Added in 1.3.2)

guestfs_part_disk

 int
 guestfs_part_disk (guestfs_h *g,
                    const char *device,
                    const char *parttype);

This command is simply a combination of guestfs_part_init followed by guestfs_part_add, to create a single primary partition covering the whole disk โœจ. One-stop shop, we love efficiency.

parttype is the partition table type, usually mbr or gpt, but other possible values are described in guestfs_part_init.

This function returns 0 on success or -1 on error.

(Added in 1.0.78)

guestfs_part_expand_gpt

 int
 guestfs_part_expand_gpt (guestfs_h *g,
                          const char *device);

This moves the backup GPT data structures to the end of the disk ๐ŸŽ€. It's useful in the case of an in-place image expand, since the disk space after the backup GPT header is not usable otherwise. This is equivalent to sgdisk -e ๐Ÿ’…

See also sgdisk(8).

This function returns 0 on success or -1 on error.

This function depends on the feature "gdisk". See also "guestfs_feature_available".

(Added in 1.33.2)

guestfs_part_get_bootable

 int
 guestfs_part_get_bootable (guestfs_h *g,
                            const char *device,
                            int partnum);

This command returns true if the partition partnum on device has the bootable flag set ๐Ÿ‘‘โœจ

See also guestfs_part_set_bootable.

This function returns a C truth value on success or -1 on error.

(Added in 1.3.2)

guestfs_part_get_disk_guid

 char *
 guestfs_part_get_disk_guid (guestfs_h *g,
                             const char *device);

Returns the disk identifier (GUID) of a GPT-partitioned device ๐Ÿฆ‹

Careful: behaviour is undefined for other partition types. Like, we literally don't know what happens, so don't ๐Ÿ™ˆ

This function returns a string, or NULL on error. The caller must free the returned string after use, bestie, don't forget ๐Ÿ’–

(Added in 1.33.2)

๐Ÿ’… guestfs_part_get_gpt_attributes

int64_t
guestfs_part_get_gpt_attributes (guestfs_h *g,
                                 const char *device,
                                 int partnum);

Okay so this one hands you back the attribute flags of the numbered GPT partition partnum โœจ Like, the actual flags. And heads up bestie โ€” if that partition is an MBR partition? Error. It's GPT-only, no cap.

If something goes wrong this function returns -1.

<span>๐ŸŒธ (Added in 1.21.1)</span>


๐Ÿฆ‹ guestfs_part_get_gpt_guid

char *
guestfs_part_get_gpt_guid (guestfs_h *g,
                           const char *device,
                           int partnum);

Returns the GUID of numbered GPT partition partnum ๐ŸŽ€ That's it, that's the whole vibe.

This function returns a string, or NULL on error. The caller must free the returned string after use โ€” like, actually free it, bestie, don't just leave it there ๐Ÿ˜ญ

<span>๐ŸŒธ (Added in 1.29.25)</span>


โญ guestfs_part_get_gpt_type

char *
guestfs_part_get_gpt_type (guestfs_h *g,
                           const char *device,
                           int partnum);

Same energy but for the type GUID of numbered GPT partition partnum ๐Ÿ’–

This function returns a string, or NULL on error. The caller must free the returned string after use.

<span>๐ŸŒธ (Added in 1.21.1)</span>


๐Ÿ‘‘ guestfs_part_get_mbr_id

int
guestfs_part_get_mbr_id (guestfs_h *g,
                         const char *device,
                         int partnum);

Returns the MBR type byte (aka the ID byte, iykyk) from the numbered partition partnum.

โš ๏ธ Real talk: only MBR (old DOS-style) partitions have type bytes. You will get undefined results for other partition table types โ€” see guestfs_part_get_parttype. So don't come for me when it goes weird on a GPT disk ๐Ÿ’€

On error this function returns -1.

<span>๐ŸŒธ (Added in 1.3.2)</span>


๐Ÿ“ guestfs_part_get_mbr_part_type

char *
guestfs_part_get_mbr_part_type (guestfs_h *g,
                                const char *device,
                                int partnum);

This returns the partition type of an MBR partition numbered partnum on device device ๐ŸŒˆ

It returns primary, logical, or extended.

This function returns a string, or NULL on error. The caller must free the returned string after use.

<span>๐ŸŒธ (Added in 1.29.32)</span>


๐Ÿงš guestfs_part_get_name

char *
guestfs_part_get_name (guestfs_h *g,
                       const char *device,
                       int partnum);

This gets the partition name on partition numbered partnum on device device โœจ And yes, partitions are numbered from 1 โ€” not 0, don't embarrass yourself ๐Ÿ™ˆ

Partition names can only be read on certain types of partition table. This works on gpt but not on mbr partitions. MBR said no ๐Ÿ’€

This function returns a string, or NULL on error. The caller must free the returned string after use.

<span>๐ŸŒธ (Added in 1.25.33)</span>


๐Ÿฆ‹ guestfs_part_get_parttype

char *
guestfs_part_get_parttype (guestfs_h *g,
                           const char *device);

This command examines the partition table on device and returns the partition table type (format) being used ๐Ÿ”

Common return values include: msdos (a DOS/Windows style MBR partition table), gpt (a GPT/EFI-style partition table). Other values are possible, although unusual. See guestfs_part_init for a full list ๐Ÿ‘‘

This function returns a string, or NULL on error. The caller must free the returned string after use.

<span>๐ŸŒธ (Added in 1.0.78)</span>


๐ŸŽ€ guestfs_part_init

int
guestfs_part_init (guestfs_h *g,
                   const char *device,
                   const char *parttype);

This creates an empty partition table on device of one of the partition types listed below ๐Ÿ’… Usually parttype should be either msdos or gpt (for large disks).

Initially there are no partitions. Following this, you should call guestfs_part_add for each partition required โ€” one at a time, bestie, we're building this from scratch โœจ

Possible values for parttype are:

  • efi, gpt โ€” Intel EFI / GPT partition table. This is recommended for >= 2 TB partitions that will be accessed from Linux and Intel-based Mac OS X. It also has limited backwards compatibility with the mbr format ๐Ÿ‘‘
  • mbr, msdos โ€” The standard PC "Master Boot Record" (MBR) format used by MS-DOS and Windows. This partition type will only work for device sizes up to 2 TB. For large disks we recommend using gpt. Like, 2 TB is the ceiling, no cap ๐Ÿ˜ญ

Other partition table types that may work but are not supported include:

  • aix โ€” AIX disk labels.
  • amiga, rdb โ€” Amiga "Rigid Disk Block" format.
  • bsd โ€” BSD disk labels.
  • dasd โ€” DASD, used on IBM mainframes.
  • dvh โ€” MIPS/SGI volumes.
  • mac โ€” Old Mac partition format. Modern Macs use gpt.
  • pc98 โ€” NEC PC-98 format, common in Japan apparently ๐Ÿ‡ฏ๐Ÿ‡ต
  • sun โ€” Sun disk labels.

This function returns 0 on success or -1 on error.

<span>๐ŸŒธ (Added in 1.0.78)</span>


๐ŸŒธ guestfs_part_list

struct guestfs_partition_list *
guestfs_part_list (guestfs_h *g,
                   const char *device);

This command parses the partition table on device and returns the list of partitions found ๐Ÿ•ต๏ธโ€โ™€๏ธ It's giving detective work, honestly.

The fields in the returned structure are:

  • part_num โ€” Partition number, counting from 1.
  • part_start โ€” Start of the partition in bytes. To get sectors you have to divide by the deviceโ€™s sector size, see guestfs_blockdev_getss. Math time bestie ๐Ÿงฎ
  • part_end โ€” End of the partition in bytes.
  • part_size โ€” Size of the partition in bytes.

This function returns a struct guestfs_partition_list *, or NULL if there was an error. The caller must call guestfs_free_partition_list after use โ€” don't ghost it, free it ๐Ÿซถ

<span>๐ŸŒธ (Added in 1.0.78)</span>


๐Ÿ’œ guestfs_part_resize

int
guestfs_part_resize (guestfs_h *g,
                     const char *device,
                     int partnum,
                     int64_t endsect);

This command resizes the partition numbered partnum on device by moving the end position ๐ŸŽฏ

โš ๏ธ Important: this does not modify any filesystem present in the partition. If you wish to do this, you will need to use filesystem resizing commands like guestfs_resize2fs. The partition and the filesystem inside it are two separate main characters, okay? ๐Ÿ’…

When growing a partition you will want to grow the filesystem afterwards, but when shrinking, you need to shrink the filesystem before the partition. Order matters, bestie โ€” get it backwards and it's not cute ๐Ÿ˜ญ

This function returns 0 on success or -1 on error.

<span>๐ŸŒธ (Added in 1.37.20)</span>


๐Ÿ”ฅ guestfs_part_set_bootable

int
guestfs_part_set_bootable (guestfs_h *g,
                           const char *device,
                           int partnum,
                           int bootable);

This sets the bootable flag on partition numbered partnum on device device ๐Ÿ‘ขโœจ Note that partitions are numbered from 1.

The bootable flag is used by some operating systems (notably Windows) to determine which partition to boot from. It is by no means universally recognized โ€” so it's giving "suggestions, not demands" energy ๐Ÿ™ˆ

This function returns 0 on success or -1 on error.

<span>๐ŸŒธ (Added in 1.0.78)</span>


๐ŸŒˆ guestfs_part_set_disk_guid

int
guestfs_part_set_disk_guid (guestfs_h *g,
                            const char *device,
                            const char *guid);

Set the disk identifier (GUID) of a GPT-partitioned device to guid ๐Ÿ’ซ Return an error if the partition table of device isn't GPT, or if guid is not a valid GUID. So like, actually give it a real GUID, okay? ๐ŸŽ€

This function returns 0 on success or -1 on error.

<span>๐ŸŒธ (Added in 1.33.2)</span>


๐Ÿฆ‹ guestfs_part_set_disk_guid_random

int
guestfs_part_set_disk_guid_random (guestfs_h *g,
                                   const char *device);

Set the disk identifier (GUID) of a GPT-partitioned device to a randomly generated value ๐ŸŽฒ Return an error if the partition table of device isn't GPT.

Like, it just picks one for you. Iconic, low-effort, slay โœจ

This function returns 0 on success or -1 on error.

<span>๐ŸŒธ (Added in 1.33.2)</span>


โญ guestfs_part_set_gpt_attributes

int
guestfs_part_set_gpt_attributes (guestfs_h *g,
                                 const char *device,
                                 int partnum,
                                 int64_t attributes);

Set the attribute flags of numbered GPT partition partnum to attributes ๐Ÿšฉ Return an error if the partition table of device isn't GPT.

See https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_entries for a useful list of partition attributes ๐Ÿ‘€

This function returns 0 on success or -1 on error.

<span>๐ŸŒธ (Added in 1.21.1)</span>


๐Ÿงš guestfs_part_set_gpt_guid

int
guestfs_part_set_gpt_guid (guestfs_h *g,
                           const char *device,
                           int partnum,
                           const char *guid);

Set the GUID of numbered GPT partition partnum to guid ๐Ÿ’– Return an error if the partition table of device isn't GPT, or if guid is not a valid GUID.

This function returns 0 on success or -1 on error.

<span>๐ŸŒธ (Added in 1.29.25)</span>


๐Ÿ‘‘ guestfs_part_set_gpt_type

int
guestfs_part_set_gpt_type (guestfs_h *g,
                           const char *device,
                           int partnum,
                           const char *guid);

Set the type GUID of numbered GPT partition partnum to guid ๐ŸŒŸ Return an error if the partition table of device isn't GPT, or if guid is not a valid GUID.

See https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs for a useful list of type GUIDs ๐Ÿ‘‘

This function returns 0 on success or -1 on error.

<span>๐ŸŒธ (Added in 1.21.1)</span>


๐Ÿ“ guestfs_part_set_mbr_id

int
guestfs_part_set_mbr_id (guestfs_h *g,
                         const char *device,
                         int partnum,
                         int idbyte);

Sets the MBR type byte (also known as the ID byte) of the numbered partition partnum to idbyte ๐Ÿ’… Note that the type bytes quoted in most documentation are in fact hexadecimal numbers, but usually documented without any leading 0x which might be confusing. So like, 83 is actually 0x83. Yes this is a trap, no I don't make the rules ๐Ÿ˜ญ

โš ๏ธ Again: only MBR (old DOS-style) partitions have type bytes. You will get undefined results for other partition table types (see guestfs_part_get_parttype). Don't say I didn't warn you ๐Ÿ’€

This function returns 0 on success or -1 on error.

<span>๐ŸŒธ (Added in 1.3.2)</span>


๐ŸŽ€ guestfs_part_set_name

int
guestfs_part_set_name (guestfs_h *g,
                       const char *device,
                       int partnum,
                       const char *name);

This sets the partition name on partition numbered partnum on device device โœจ Note that partitions are numbered from 1. It's literally just giving your partition a little name tag ๐Ÿท๏ธ

The partition name can only be set on certain types of partition table. This works on gpt but not on mbr partitions.

This function returns 0 on success or -1 on error.

<span>๐ŸŒธ (Added in 1.0.78)</span>


๐Ÿ’ซ guestfs_part_to_dev

char *
guestfs_part_to_dev (guestfs_h *g,
                     const char *partition);

This function takes a partition name (eg. /dev/sdb1) and removes the partition number, returning the device name (eg. /dev/sdb) โœ‚๏ธ Like a little glow-up where the number just... leaves. Iconic.

Anyway, back to the partition tea โ˜• โ€” the named partition has got to actually exist, bestie. Like, fr fr. It's gotta be a real string that came back from guestfs_list_partitions, not something you manifested in your head ๐Ÿ’€

Also peep See also guestfs_part_to_partnum, guestfs_device_index.

This one hands you back a string, or NULL if it went sideways ๐Ÿ˜ญ. And the caller โ€” that's you, babe โ€” must free the returned string after use. No leaks on my watch ๐Ÿซถ

(Added in 1.5.15) โ€” vintage โœจ


๐ŸŽ€ guestfs_part_to_partnum

int
guestfs_part_to_partnum (guestfs_h *g,
                         const char *partition);

Okay so this is the glow-up reversal: hand it a partition name (eg. /dev/sdb1) and it gives you back the partition number (eg. 1) ๐Ÿ”ขโœจ

Same rule as before: the named partition has to exist, for example as a string returned from guestfs_list_partitions. Don't come at it with fake names ๐Ÿ™ˆ

See also guestfs_part_to_dev.

On error this function returns -1. Iconic fail behavior, but at least it's honest ๐Ÿ’…

(Added in 1.13.25)


๐Ÿฆ‹ guestfs_ping_daemon

int
guestfs_ping_daemon (guestfs_h *g);

This is literally just a test probe into the guestfs daemon running inside the libguestfs appliance ๐Ÿ‘‘ Calling it checks that the daemon responds to the ping message โ€” and that's it. It doesn't touch the daemon or any attached block device(s) in any other way. Zero side effects, main character energy that respects boundaries ๐ŸŒธ

Returns 0 on success or -1 on error.

(Added in 1.0.18)


โญ guestfs_pread

char *
guestfs_pread (guestfs_h *g,
               const char *path,
               int count,
               int64_t offset,
               size_t *size_r);

This command lets you read part of a file ๐ŸŽฏ It reads count bytes of the file, starting at offset, from file path.

Heads up though: this may read fewer bytes than requested ๐Ÿ˜ณ For further details see the pread(2) system call.

See also guestfs_pwrite, guestfs_pread_device.

This function returns a buffer, or NULL on error. The size of the returned buffer is written to *size_r. The caller must free the returned buffer after use ๐Ÿ’–

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See PROTOCOL LIMITS. So like... don't try to yeet a whole DVD through it, k? ๐Ÿ’€

(Added in 1.0.77)


๐Ÿงš guestfs_pread_device

char *
guestfs_pread_device (guestfs_h *g,
                      const char *device,
                      int count,
                      int64_t offset,
                      size_t *size_r);

Same vibe, but for a block device ๐Ÿซถ This one lets you read part of a block device โ€” it reads count bytes of device, starting at offset.

And again: it may read fewer bytes than requested. For further details see the pread(2) system call.

See also guestfs_pread.

Returns a buffer, or NULL on error. The size of the returned buffer is written to *size_r. The caller must free the returned buffer after use โœจ

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See PROTOCOL LIMITS. Same ceiling, bestie ๐ŸŽ€

(Added in 1.5.21)


๐Ÿ’œ guestfs_pvchange_uuid

int
guestfs_pvchange_uuid (guestfs_h *g,
                       const char *device);

Generates a brand new random UUID for the physical volume device ๐ŸŽฒโœจ Fresh identity, who dis.

Returns 0 on success or -1 on error.

This function depends on the feature lvm2. See also guestfs_feature_available.

(Added in 1.19.26)


๐ŸŒˆ guestfs_pvchange_uuid_all

int
guestfs_pvchange_uuid_all (guestfs_h *g);

Generates new random UUIDs for all physical volumes. Every single one gets a glow-up ๐Ÿ’…โœจ

Returns 0 on success or -1 on error.

This function depends on the feature lvm2. See also guestfs_feature_available.

(Added in 1.19.26)


๐Ÿ“ guestfs_pvcreate

int
guestfs_pvcreate (guestfs_h *g,
                  const char *device);

This creates an LVM physical volume on the named device, where device should usually be a partition name such as /dev/sda1 ๐Ÿ‘‘

Returns 0 on success or -1 on error.

This function depends on the feature lvm2. See also guestfs_feature_available.

(Added in 0.8) โ€” ancient, a true elder icon โœจ


๐Ÿ’€ guestfs_pvremove

int
guestfs_pvremove (guestfs_h *g,
                  const char *device);

This wipes a physical volume device so that LVM will no longer recognise it ๐Ÿ˜ญ Poof. Gone. It's giving memory hole.

The implementation uses the pvremove(8) command, which refuses to wipe physical volumes that contain any volume groups โ€” so you have to remove those first. No skipping steps, babe, the tool will literally not let you ๐Ÿ™ˆ

Returns 0 on success or -1 on error.

This function depends on the feature lvm2. See also guestfs_feature_available.

(Added in 1.0.13)


๐Ÿ”ฅ guestfs_pvresize

int
guestfs_pvresize (guestfs_h *g,
                  const char *device);

This resizes (expands or shrinks) an existing LVM physical volume to match the new size of the underlying device ๐Ÿ“ So if the device changed size, this is how the PV catches up.

Returns 0 on success or -1 on error.

This function depends on the feature lvm2. See also guestfs_feature_available.

(Added in 1.0.26)


๐ŸŒธ guestfs_pvresize_size

int
guestfs_pvresize_size (guestfs_h *g,
                       const char *device,
                       int64_t size);

This command is the same as guestfs_pvresize except that it lets you specify the new size (in bytes) explicitly, instead of just matching the device ๐ŸŽฏ Manual control, we love to see it.

Returns 0 on success or -1 on error.

This function depends on the feature lvm2. See also guestfs_feature_available.

(Added in 1.3.14)


๐Ÿ‘‘ guestfs_pvs

char **
guestfs_pvs (guestfs_h *g);

Lists all the physical volumes detected ๐Ÿ‘€ This is the equivalent of the pvs(8) command.

This returns a list of just the device names that contain PVs (eg. /dev/sda2). Names only, no extras, minimalism slay.

See also guestfs_pvs_full โ€” that's the deluxe version, keep reading ๐Ÿ’…

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use. Both!! Don't forget the array!! ๐Ÿ˜ค

This function depends on the feature lvm2. See also guestfs_feature_available.

(Added in 0.4)


โœจ guestfs_pvs_full

struct guestfs_lvm_pv_list *
guestfs_pvs_full (guestfs_h *g);

Lists all the physical volumes detected โ€” same as the pvs(8) command โ€” but the "full" version includes all fields ๐ŸŒˆ It's giving director's cut, all the bonus content, nothing cut for time.

This function returns a struct guestfs_lvm_pv_list *, or NULL if there was an error. The caller must call guestfs_free_lvm_pv_list after use ๐Ÿซถ

This function depends on the feature lvm2. See also guestfs_feature_available.

(Added in 0.4)


๐ŸŽ€ guestfs_pvuuid

char *
guestfs_pvuuid (guestfs_h *g,
                const char *device);

This command returns the UUID of the LVM PV device ๐Ÿ”‘ Just hands you the string, no drama.

This function returns a string, or NULL on error. The caller must free the returned string after use ๐Ÿ’–

(Added in 1.0.87)


๐Ÿฆ‹ guestfs_pwrite

int
guestfs_pwrite (guestfs_h *g,
                const char *path,
                const char *content,
                size_t content_size,
                int64_t offset);

This command writes to part of a file โœ๏ธ It writes the data buffer content to the file path starting at offset offset.

Okay important: this command implements the pwrite(2) system call, and like that system call it may not write the full data requested ๐Ÿ˜ณ The return value is the number of bytes that were actually written to the file. This could even be 0, although short writes are unlikely for regular files in ordinary circumstances. So like, check the return value, bestie, don't just assume ๐Ÿ™

See also guestfs_pread, guestfs_pwrite_device.

On error this function returns -1.

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See PROTOCOL LIMITS. Yes, the same limit. It haunts us all ๐Ÿ’€

(Added in 1.3.14)


๐ŸŒŸ guestfs_pwrite_device

int
guestfs_pwrite_device (guestfs_h *g,
                       const char *device,
                       const char *content,
                       size_t content_size,
                       int64_t offset);

This command writes to part of a device ๐Ÿ”ง It writes the data buffer content to device starting at offset offset.

This command implements the pwrite(2) system call, and like that system call it may not write the full data requested (although short writes to disk devices and partitions are probably impossible with standard Linux kernels) ๐Ÿค“ Nerd note but like, genuinely useful, iykyk.

See also guestfs_pwrite.

On error this function returns -1.

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See PROTOCOL LIMITS. The 2โ€“4MB wall again ๐Ÿงฑ

(Added in 1.5.20)


๐Ÿซถ guestfs_read_file

char *
guestfs_read_file (guestfs_h *g,
                   const char *path,
                   size_t *size_r);

This call returns the contents of the file path as a buffer ๐Ÿ“„

And here's the flex: unlike guestfs_cat, this function can correctly handle files that contain embedded ASCII NUL characters ๐Ÿ˜คโœจ Binary-safe, we stan.

This function returns a buffer, or NULL on error. The size of the returned buffer is written to *size_r. The caller must free the returned buffer after use ๐ŸŒธ

(Added in 1.0.63)


๐Ÿ’– guestfs_read_lines

char **
guestfs_read_lines (guestfs_h *g,
                    const char *path);

Returns the contents of the file named path ๐Ÿ“–

The file contents come back as a list of lines. Trailing LF and CRLF character sequences are not returned โ€” they get left at the door ๐Ÿšช

Note that this function cannot correctly handle binary files (specifically, files containing \0 character which is treated as end of string). For those you need to use the guestfs_read_file function and split the buffer into lines yourself. Do it manually, babe, it's the only way ๐Ÿ˜ญ

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use ๐Ÿซถ

(Added in 0.7)


๐Ÿงš guestfs_readdir

struct guestfs_dirent_list *
guestfs_readdir (guestfs_h *g,
                 const char *dir);

This returns the list of directory entries in directory dir ๐Ÿ“‚

All entries are returned, including . and ... Yes, the dots come too, they're part of the family ๐Ÿฅน The entries are not sorted โ€” they come back in the same order as the underlying filesystem. So don't expect alphabetical, expect chaotic-but-authentic ๐Ÿ’…

Also this call returns basic file type information about each file. The ftyp field will contain one of the following characters:

  • 'b' โ€” Block special
  • 'c' โ€” Char special
  • 'd' โ€” Directory
  • 'f' โ€” FIFO (named pipe)
  • 'l' โ€” Symbolic link
  • 'r' โ€” Regular file
  • 's' โ€” Socket
  • 'u' โ€” Unknown file type
  • '?' โ€” The readdir(3) call returned a d_type field with an unexpected value ๐Ÿ™ˆ (not me getting a mystery value)

This function is primarily intended for use by programs ๐Ÿค–. To get a simple list of names, use guestfs_ls. To get a printable directory for human consumption, use guestfs_ll. Pick the right tool for the job, bestie โœจ

This function returns a struct guestfs_dirent_list *, or NULL if there was an error. The caller must call guestfs_free_dirent_list after use ๐ŸŽ€

This long-running command can generate progress notification messages so that the caller can display a progress bar or indicator ๐Ÿ“Š To receive these messages, the caller must register a progress event callback. See GUESTFS_EVENT_PROGRESS. Progress bar moment, we love a loading animation ๐Ÿ”ฅ

(Added in 1.0.55)


Signature drop ๐Ÿ’…

char *
guestfs_readlink (guestfs_h *g,
                  const char *path);

okay so this command reads the target of a symbolic link ๐ŸŽ€. It hands you back a string, or NULL if thereโ€™s an error ๐Ÿ˜ญ โ€” and bestie, the caller has to free that returned string after use, no skipping cleanup era. (Added in 1.0.66) โœจ

char **
guestfs_readlinklist (guestfs_h *g,
                      const char *path,
                      char *const *names);

This call lets you do a readlink operation on multiple files at once, where all the files live in the directory path ๐ŸŒธ. names is the list of files from that directory.

On return you get a list of strings, with a one-to-one correspondence to the names list. Each string is the value of the symbolic link.

If the readlink(2) operation fails on any name, then the corresponding result string is the empty string "" ๐Ÿ™ˆ. However the whole operation is completed even if there were readlink(2) errors, so you can call this function with names where you donโ€™t know if they are symbolic links already (albeit slightly less efficient). iykyk.

This call is intended for programs that want to efficiently list directory contents without making many round-trips โœจ.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use. (Added in 1.0.77) ๐Ÿ’–


guestfs_realpath ๐Ÿฆ‹

char *
guestfs_realpath (guestfs_h *g,
                  const char *path);

Return the canonicalized absolute pathname of path โœจ. The returned path has no ., .. or symbolic link path elements โ€” itโ€™s clean-clean, no chaos.

This function returns a string, or NULL on error. The caller must free the returned string after use. (Added in 1.0.66) ๐ŸŽ€


guestfs_remount ๐Ÿ”

int
guestfs_remount (guestfs_h *g,
                 const char *mountpoint,
                 ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

  • GUESTFS_REMOUNT_RW, int rw, โ€” this changes the rw (readonly/read-write) flag on an already mounted filesystem at mountpoint, converting a readonly filesystem to be read-write, or vice-versa ๐Ÿ’….
Note: at the moment you must supply the โ€œoptionalโ€ rw parameter. In future we may allow other flags to be adjusted. ๐Ÿ‘‘

This function returns 0 on success or -1 on error. (Added in 1.23.2) ๐ŸŒŸ

guestfs_remount_va ๐Ÿงš

int
guestfs_remount_va (guestfs_h *g,
                    const char *mountpoint,
                    va_list args);

This is the "va_list variant" of guestfs_remount.

See "CALLS WITH OPTIONAL ARGUMENTS". ๐Ÿซถ

guestfs_remount_argv ๐ŸŒˆ

int
guestfs_remount_argv (guestfs_h *g,
                      const char *mountpoint,
                      const struct guestfs_remount_argv *optargs);

This is the "argv variant" of guestfs_remount.

See "CALLS WITH OPTIONAL ARGUMENTS". โญ


guestfs_remove_drive ๐Ÿ’€

int
guestfs_remove_drive (guestfs_h *g,
                      const char *label);
This function is deprecated. There is no replacement. Consult the API documentation in guestfs(3) for further information. ๐Ÿ˜ญ

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This call does nothing and returns an error. fr fr, thatโ€™s the deprecated life.

This function returns 0 on success or -1 on error. (Added in 1.19.49) ๐Ÿ“


guestfs_removexattr ๐ŸŽ€

int
guestfs_removexattr (guestfs_h *g,
                     const char *xattr,
                     const char *path);

This call removes the extended attribute named xattr of the file path โœจ.

See also: guestfs_lremovexattr, attr(5).

This function returns 0 on success or -1 on error.

This function depends on the feature linuxxattrs. See also guestfs_feature_available. (Added in 1.0.59) ๐Ÿ’–


guestfs_rename ๐Ÿฆ‹

int
guestfs_rename (guestfs_h *g,
                const char *oldpath,
                const char *newpath);

Rename a file to a new place on the same filesystem. This is the same as the Linux rename(2) system call. In most cases you are better to use guestfs_mv instead ๐Ÿ‘€.

This function returns 0 on success or -1 on error. (Added in 1.21.5) โญ


guestfs_resize2fs ๐ŸŒธ

int
guestfs_resize2fs (guestfs_h *g,
                   const char *device);

This resizes an ext2, ext3 or ext4 filesystem to match the size of the underlying device ๐Ÿ’….

See also RESIZE2FS ERRORS.

This function returns 0 on success or -1 on error. (Added in 1.0.27) โœจ

guestfs_resize2fs_M ๐Ÿงš

int
guestfs_resize2fs_M (guestfs_h *g,
                     const char *device);

This command is the same as guestfs_resize2fs, but the filesystem is resized to its minimum size. This works like the -M option to the resize2fs(8) command ๐Ÿ”ฅ.

To get the resulting size of the filesystem you should call guestfs_tune2fs_l and read the Block size and Block count values. These two numbers, multiplied together, give the resulting size of the minimal filesystem in bytes.

See also RESIZE2FS ERRORS.

This function returns 0 on success or -1 on error. (Added in 1.9.4) ๐ŸŒŸ

guestfs_resize2fs_size ๐ŸŽ€

int
guestfs_resize2fs_size (guestfs_h *g,
                        const char *device,
                        int64_t size);

This command is the same as guestfs_resize2fs except that it allows you to specify the new size (in bytes) explicitly ๐Ÿ‘‘.

See also RESIZE2FS ERRORS.

This function returns 0 on success or -1 on error. (Added in 1.3.14) ๐Ÿ’–


guestfs_rm ๐Ÿ“

int
guestfs_rm (guestfs_h *g,
            const char *path);

Remove the single file path.

This function returns 0 on success or -1 on error. (Added in 0.8) โœจ

guestfs_rm_f ๐Ÿ’…

int
guestfs_rm_f (guestfs_h *g,
              const char *path);

Remove the file path.

If the file doesnโ€™t exist, that error is ignored. (Other errors, eg. I/O errors or bad paths, are not ignored ๐Ÿ˜ค.)

This call cannot remove directories. Use guestfs_rmdir to remove an empty directory, or guestfs_rm_rf to remove directories recursively.

This function returns 0 on success or -1 on error. (Added in 1.19.42) ๐Ÿซถ

guestfs_rm_rf ๐Ÿ”ฅ

int
guestfs_rm_rf (guestfs_h *g,
               const char *path);

Remove the file or directory path, recursively removing the contents if itโ€™s a directory. This is like the rm -rf shell command ๐Ÿ’€.

This function returns 0 on success or -1 on error. (Added in 0.8) ๐ŸŒˆ

guestfs_rmdir ๐ŸŒธ

int
guestfs_rmdir (guestfs_h *g,
               const char *path);

Remove the single directory path.

This function returns 0 on success or -1 on error. (Added in 0.8) โœจ

guestfs_rmmountpoint ๐Ÿงš

int
guestfs_rmmountpoint (guestfs_h *g,
                      const char *exemptpath);

This call removes a mountpoint that was previously created with guestfs_mkmountpoint. See guestfs_mkmountpoint for full details ๐Ÿ‘‘.

This function returns 0 on success or -1 on error. (Added in 1.0.62) ๐Ÿ’–


guestfs_rsync ๐Ÿฆ‹

int
guestfs_rsync (guestfs_h *g,
               const char *src,
               const char *dest,
               ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

 GUESTFS_RSYNC_ARCHIVE, int archive,
 GUESTFS_RSYNC_DELETEDEST, int deletedest,

This call may be used to copy or synchronize two directories under the same libguestfs handle. This uses the rsync(1) program which uses a fast algorithm that avoids copying files unnecessarily โšก.

src and dest are the source and destination directories. Files are copied from src to dest.

The optional arguments are:

  • archive โ€” Turns on archive mode. This is the same as passing the --archive flag to rsync.
  • deletedest โ€” Delete files at the destination that do not exist at the source.

This function returns 0 on success or -1 on error.

This function depends on the feature rsync. See also guestfs_feature_available. (Added in 1.19.29) ๐ŸŒŸ

guestfs_rsync_va ๐ŸŽ€

int
guestfs_rsync_va (guestfs_h *g,
                  const char *src,
                  const char *dest,
                  va_list args);

This is the "va_list variant" of guestfs_rsync.

See "CALLS WITH OPTIONAL ARGUMENTS". ๐Ÿซถ

guestfs_rsync_argv ๐ŸŒˆ

int
guestfs_rsync_argv (guestfs_h *g,
                    const char *src,
                    const char *dest,
                    const struct guestfs_rsync_argv *optargs);

This is the "argv variant" of guestfs_rsync.

See "CALLS WITH OPTIONAL ARGUMENTS". โญ


guestfs_rsync_in ๐Ÿ’–

int
guestfs_rsync_in (guestfs_h *g,
                  const char *remote,
                  const char *dest,
                  ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

 GUESTFS_RSYNC_IN_ARCHIVE, int archive,
 GUESTFS_RSYNC_IN_DELETEDEST, int deletedest,

This call may be used to copy or synchronize the filesystem on the host or on a remote computer with the filesystem within libguestfs. This uses the rsync(1) program which uses a fast algorithm that avoids copying files unnecessarily โšก.

This call only works if the network is enabled. See guestfs_set_network or the --network option to various tools like guestfish(1).

Files are copied from the remote server and directory specified by remote to the destination directory dest.

The format of the remote server string is defined by rsync(1). Note that there is no way to supply a password or passphrase so the target must be set up not to require one ๐Ÿ”.

The optional arguments are the same as those of guestfs_rsync.

This function returns 0 on success or -1 on error.

This function depends on the feature rsync. See also guestfs_feature_available. (Added in 1.19.29) โœจ

guestfs_rsync_in_va ๐Ÿงš

int
guestfs_rsync_in_va (guestfs_h *g,
                     const char *remote,
                     const char *dest,
                     va_list args);

This is the "va_list variant" of guestfs_rsync_in.

See "CALLS WITH OPTIONAL ARGUMENTS". ๐Ÿซถ

guestfs_rsync_in_argv ๐ŸŒˆ

int
guestfs_rsync_in_argv (guestfs_h *g,
                       const char *remote,
                       const char *dest,
                       const struct guestfs_rsync_in_argv *optargs);

This is the "argv variant" of guestfs_rsync_in. ๐Ÿ’…

See "CALLS WITH OPTIONAL ARGUMENTS" โ€” that's where the whole optargs situation gets explained, bestie.


guestfs_rsync_out

int
guestfs_rsync_out (guestfs_h *g,
                   const char *src,
                   const char *remote,
                   ...);

Okay so you can hand this call a whole list of optional args ๐ŸŽ€ Use zero or more of the parameter pairs below, and then close the whole thing out with -1 sitting there on its own. See "CALLS WITH OPTIONAL ARGUMENTS" for the deets.

  • GUESTFS_RSYNC_OUT_ARCHIVE, int archive,
  • GUESTFS_RSYNC_OUT_DELETEDEST, int deletedest,

This one is your go-to for copying or syncing a filesystem inside libguestfs with a filesystem living on the host or on some remote computer โœจ It's powered by the rsync(1) program, which uses a fast algorithm that avoids copying files it doesn't need to. Efficiency queen behavior, honestly.

Heads up bestie: this call only works if the network is enabled ๐Ÿซถ See "guestfs_set_network" or the --network option to tools like guestfish(1).

Files get copied from the source directory src over to the remote server and directory you name in remote.

The format of that remote server string? That's defined by rsync(1), not by us ๐ŸŒธ And ngl there is literally no way to supply a password or passphrase here, so the target has to be set up so it doesn't need one. No sneaky creds, periodt.

The optional arguments are the same as the ones on guestfs_rsync.

Globbing does not happen on the src parameter ๐Ÿ˜ญ In programs that use the API directly, you've gotta expand wildcards yourself (peep guestfs_glob_expand). In guestfish though, you can use the glob command (see "glob" in guestfish(1)), like this:

><fs> glob rsync-out /* rsync://remote/

This function returns 0 on success or -1 on error ๐Ÿ’–

This function depends on the feature "rsync". See also guestfs_feature_available.

(Added in 1.19.29) โญ


guestfs_rsync_out_va

int
guestfs_rsync_out_va (guestfs_h *g,
                      const char *src,
                      const char *remote,
                      va_list args);

This is the "va_list variant" of guestfs_rsync_out ๐Ÿฆ‹

See "CALLS WITH OPTIONAL ARGUMENTS".


guestfs_rsync_out_argv

int
guestfs_rsync_out_argv (guestfs_h *g,
                        const char *src,
                        const char *remote,
                        const struct guestfs_rsync_out_argv *optargs);

This is the "argv variant" of guestfs_rsync_out ๐Ÿฆ‹

See "CALLS WITH OPTIONAL ARGUMENTS".


guestfs_scrub_device

int
guestfs_scrub_device (guestfs_h *g,
                      const char *device);

This command writes patterns all over device so that data retrieval becomes way more difficult ๐Ÿ”ฅ Basically: make the old data unrecoverable. Iconic security move.

It's an interface to the scrub(1) program, so go read that manual page for the full tea โ˜•

This function returns 0 on success or -1 on error ๐Ÿ’–

This function depends on the feature "scrub". See also guestfs_feature_available.

(Added in 1.0.52) โญ


guestfs_scrub_file

int
guestfs_scrub_file (guestfs_h *g,
                    const char *file);

Same energy, but for a single file: writes patterns over the file so retrieving the data afterward is harder ๐Ÿ™ˆ

The file is removed after scrubbing. Like, gone gone. Not me warning you twice, but... it's gone.

It's an interface to the scrub(1) program โ€” that manual page has more details.

This function returns 0 on success or -1 on error ๐Ÿ’–

This function depends on the feature "scrub". See also guestfs_feature_available.

(Added in 1.0.52) โญ


guestfs_scrub_freespace

int
guestfs_scrub_freespace (guestfs_h *g,
                         const char *dir);

This one is a whole lil ritual ๐Ÿ•ฏ๏ธ It creates the directory dir, then fills that directory with files until the filesystem is completely full, scrubs those files exactly like guestfs_scrub_file does, and then deletes them. The whole point? Scrubbing any free space on the partition that contains dir โœจ

It's an interface to the scrub(1) program. See that manual page for more details.

This function returns 0 on success or -1 on error ๐Ÿ’–

This function depends on the feature "scrub". See also guestfs_feature_available.

(Added in 1.0.52) โญ


guestfs_selinux_relabel

int
guestfs_selinux_relabel (guestfs_h *g,
                         const char *specfile,
                         const char *path,
                         ...);
โš ๏ธ This function is deprecated. In new code, use the guestfs_setfiles call instead, bestie.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions ๐Ÿ‘€ So like... use the new one.

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

  • GUESTFS_SELINUX_RELABEL_FORCE, int force,

SELinux relabel parts of the filesystem ๐Ÿ‘‘

The specfile parameter controls which policy spec file gets used. You have to parse /etc/selinux/config to find the correct SELinux policy, and then pass the spec file โ€” usually: /etc/selinux/ + selinuxtype + /contexts/files/file_contexts ๐ŸŒธ

The required path parameter is the top level directory where the relabelling starts. Normally you'd pass path as / to relabel the entire guest filesystem ๐ŸŽ€

The optional force boolean controls whether the context gets reset for customizable files, and also whether the user, role and range parts of the file context get changed.

This function returns 0 on success or -1 on error ๐Ÿ’–

This function depends on the feature "selinuxrelabel". See also guestfs_feature_available.

(Added in 1.33.43) โญ


guestfs_selinux_relabel_va

int
guestfs_selinux_relabel_va (guestfs_h *g,
                            const char *specfile,
                            const char *path,
                            va_list args);

This is the "va_list variant" of guestfs_selinux_relabel ๐Ÿฆ‹

See "CALLS WITH OPTIONAL ARGUMENTS".


guestfs_selinux_relabel_argv

int
guestfs_selinux_relabel_argv (guestfs_h *g,
                              const char *specfile,
                              const char *path,
                              const struct guestfs_selinux_relabel_argv *optargs);

This is the "argv variant" of guestfs_selinux_relabel ๐Ÿฆ‹

See "CALLS WITH OPTIONAL ARGUMENTS".


guestfs_set_append

int
guestfs_set_append (guestfs_h *g,
                    const char *append);

This function is how you add extra options onto the libguestfs appliance kernel command line ๐ŸŽ€

The default is NULL, unless it's overridden by setting the LIBGUESTFS_APPEND environment variable.

Setting append to NULL means no additional options get passed (libguestfs always adds a few of its own โ€” it's not like it goes fully blank, iykyk) ๐Ÿ’…

This function returns 0 on success or -1 on error ๐Ÿ’–

(Added in 1.0.26) โญ


guestfs_set_attach_method

int
guestfs_set_attach_method (guestfs_h *g,
                           const char *backend);
โš ๏ธ This function is deprecated. In new code, use the guestfs_set_backend call instead ๐Ÿซถ

Deprecated functions will not be removed from the API, but the fact that they're deprecated indicates there are problems with correct use of these functions.

Set the method libguestfs uses to connect to the backend guestfsd daemon ๐Ÿ’€

See "BACKEND".

This function returns 0 on success or -1 on error ๐Ÿ’–

(Added in 1.9.8) โญ


guestfs_set_autosync

int
guestfs_set_autosync (guestfs_h *g,
                      int autosync);

If autosync is true, this enables autosync โœจ Libguestfs will make a best effort attempt to make filesystems consistent and synchronized when the handle is closed (and yes, also if the program exits without closing handles โ€” she tries her best even when you're messy).

This is enabled by default (since libguestfs 1.5.24; before that it was disabled by default).

This function returns 0 on success or -1 on error ๐Ÿ’–

(Added in 0.3) โญ


guestfs_set_backend

int
guestfs_set_backend (guestfs_h *g,
                     const char *backend);

Set the method that libguestfs uses to connect to the backend guestfsd daemon ๐Ÿ‘‘

Fun fact: this handle property was previously called the "attach method" โ€” so if you saw that name floating around anywhere, that's her old username ๐Ÿ˜ญ

See "BACKEND".

This function returns 0 on success or -1 on error ๐Ÿ’–

(Added in 1.21.26) โญ


guestfs_set_backend_setting

int
guestfs_set_backend_setting (guestfs_h *g,
                             const char *name,
                             const char *val);

Appends name=value onto the backend settings string list ๐ŸŽ€ But! If a string already exists that matches name, or that begins with name=, then that setting gets replaced instead. No duplicates, we don't do that here.

See "BACKEND", "BACKEND SETTINGS".

This function returns 0 on success or -1 on error ๐Ÿ’–

(Added in 1.27.2) โญ


guestfs_set_backend_settings

int
guestfs_set_backend_settings (guestfs_h *g,
                              char *const *settings);

Sets a list of zero or more settings that get passed straight through to the current backend ๐ŸŒธ Each setting is a string interpreted in a backend-specific way โ€” or just ignored if the backend doesn't understand it. Not personal, just business.

The default value is an empty list, unless the environment variable LIBGUESTFS_BACKEND_SETTINGS was set when the handle was created. That env var contains a colon-separated list of settings ๐Ÿ’…

Important: this call replaces all backend settings. If you only wanna replace a single one, see guestfs_set_backend_setting. If you wanna clear a single backend setting, see guestfs_clear_backend_setting.

See "BACKEND", "BACKEND SETTINGS".

This function returns 0 on success or -1 on error ๐Ÿ’–

(Added in 1.25.24) โญ


guestfs_set_cachedir

int
guestfs_set_cachedir (guestfs_h *g,
                      const char *cachedir);

Sets the directory the handle uses to store the appliance cache โ€” this is a thing when you're using a supermin appliance ๐Ÿงš The appliance is cached and shared between all handles that have the same effective user ID โœจ sharing is caring, but like, securely.

The environment variables LIBGUESTFS_CACHEDIR and TMPDIR control the default value ๐ŸŽ€ Here's the whole priority situation:

  • If LIBGUESTFS_CACHEDIR is set, then that's the default.
  • Else if TMPDIR is set, then that's the default.
  • Else /var/tmp is the default.

This function returns 0 on success or -1 on error ๐Ÿ’–

(Added in 1.19.58) โญ


guestfs_set_direct

int
guestfs_set_direct (guestfs_h *g,
                    int direct);
โš ๏ธ This function is deprecated. In new code, use the guestfs_internal_get_console_socket call instead ๐Ÿซถ

Deprecated functions will not be removed from the API, but the fact that they're deprecated indicates that there are problems with correct use of these functions.

If the direct appliance mode flag is enabled, then stdin and stdout get passed directly straight through to the appliance once it's launched ๐Ÿ‘€

One consequence of this (and it's kind of a big one) is that log messages aren't caught by the library and handled by guestfs_set_log_message_callback โ€” instead they go straight to stdout ๐Ÿ’€ so like, know that before you flip this switch, bestie.

You probably don't want to use this unless you know what you are doing. fr fr, it's giving "expert mode, handle with care" ๐Ÿ’…

The default is disabled.

This function returns 0 on success or -1 on error.

(Added in 1.0.72)


๐ŸŒธ guestfs_set_e2attrs ๐ŸŒธ

int
guestfs_set_e2attrs (guestfs_h *g,
                     const char *file,
                     const char *attrs,
                     ...);

okay so bestie, this one takes optional args โœจ You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

  • GUESTFS_SET_E2ATTRS_CLEAR, int clear, โ€” the optional boolean that flips this whole thing from "set" mode to "clear" mode ๐ŸŽ€

So what it actually does: this sets or clears the file attributes attrs associated with the inode file.

attrs is a string of characters representing file attributes. See "guestfs_get_e2attrs" for a list of possible attributes. Not all attributes can be changed โ€” ngl, some are just built different and won't budge ๐Ÿ˜ญ

If optional boolean clear is not present or false, then the attrs listed are set in the inode.

If clear is true, then the attrs listed are cleared in the inode.

In both cases, other attributes not present in the attrs string are left unchanged. no collateral damage, we love to see it ๐Ÿซถ

These attributes are only present when the file is located on an ext2/3/4 filesystem. Using this call on other filesystem types will result in an error. ๐Ÿ’€

This function returns 0 on success or -1 on error.

(Added in 1.17.31)


๐Ÿฆ‹ guestfs_set_e2attrs_va ๐Ÿฆ‹

int
guestfs_set_e2attrs_va (guestfs_h *g,
                        const char *file,
                        const char *attrs,
                        va_list args);

This is the "va_list variant" of "guestfs_set_e2attrs". same energy, different argument delivery system ๐Ÿ’…

See "CALLS WITH OPTIONAL ARGUMENTS".


๐ŸŽ€ guestfs_set_e2attrs_argv ๐ŸŽ€

int
guestfs_set_e2attrs_argv (guestfs_h *g,
                          const char *file,
                          const char *attrs,
                          const struct guestfs_set_e2attrs_argv *optargs);

This is the "argv variant" of "guestfs_set_e2attrs". iconic struct-based behavior โœจ

See "CALLS WITH OPTIONAL ARGUMENTS".


๐Ÿ”ฅ guestfs_set_e2generation ๐Ÿ”ฅ

int
guestfs_set_e2generation (guestfs_h *g,
                          const char *file,
                          int64_t generation);

This sets the ext2 file generation of a file.

See "guestfs_get_e2generation" โ€” that's the reader, this is the writer, they're a matched set ๐Ÿซถ

This function returns 0 on success or -1 on error.

(Added in 1.17.31)


๐Ÿ’€ guestfs_set_e2label ๐Ÿ’€

int
guestfs_set_e2label (guestfs_h *g,
                     const char *device,
                     const char *label);
This function is deprecated. In new code, use the "guestfs_set_label" call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions. so like, it still works, it's just not the moment anymore ๐Ÿ™ˆ

This sets the ext2/3/4 filesystem label of the filesystem on device to label. Filesystem labels are limited to 16 characters โ€” short and sweet, the character limit is real.

You can use either "guestfs_tune2fs_l" or "guestfs_get_e2label" to return the existing label on a filesystem.

This function returns 0 on success or -1 on error.

(Added in 1.0.15)


๐ŸŒˆ guestfs_set_e2uuid ๐ŸŒˆ

int
guestfs_set_e2uuid (guestfs_h *g,
                    const char *device,
                    const char *uuid);
This function is deprecated. In new code, use the "guestfs_set_uuid" call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions. ๐Ÿ˜ญ same disclaimer, same vibes

This sets the ext2/3/4 filesystem UUID of the filesystem on device to uuid. The format of the UUID and alternatives such as clear, random and time are described in the tune2fs(8) manpage โ€” go read that one for the deets โœจ

You can use "guestfs_vfs_uuid" to return the existing UUID of a filesystem.

This function returns 0 on success or -1 on error.

(Added in 1.0.15)


๐Ÿ‘‘ guestfs_set_hv ๐Ÿ‘‘

int
guestfs_set_hv (guestfs_h *g,
                const char *hv);

Set the hypervisor binary that we will use. The hypervisor depends on the backend, but is usually the location of the qemu/KVM hypervisor.

You can also override this by setting the LIBGUESTFS_HV environment variable.

Note that you should call this function as early as possible after creating the handle. This is because some pre-launch operations depend on testing qemu features (by running qemu -help). If the qemu binary changes, we don't retest features, and so you might see inconsistent results. Using the environment variable LIBGUESTFS_HV is safest of all since that picks the qemu binary at the same time as the handle is created. ๐Ÿ”ฅ

This function returns 0 on success or -1 on error.

(Added in 1.23.17)


โญ guestfs_set_identifier โญ

int
guestfs_set_identifier (guestfs_h *g,
                        const char *identifier);

This is an informative string which the caller may optionally set in the handle. It is printed in various places, allowing the current handle to be identified in debugging output. basically a little name tag for your handle ๐ŸŽ€

One important place is when tracing is enabled. If the identifier string is not an empty string, then trace messages change from this:

libguestfs: trace: get_tmpdir
libguestfs: trace: get_tmpdir = "/tmp"

to this:

libguestfs: trace: ID: get_tmpdir
libguestfs: trace: ID: get_tmpdir = "/tmp"

where ID is the identifier string set by this call. the way that little ID: just shows up and announces itself, we stan ๐Ÿซถ

The identifier must only contain alphanumeric ASCII characters, underscore and minus sign. The default is the empty string.

See also "guestfs_set_program", "guestfs_set_trace", "guestfs_get_identifier".

This function returns 0 on success or -1 on error.

(Added in 1.31.14)


๐Ÿ“ guestfs_set_label ๐Ÿ“

int
guestfs_set_label (guestfs_h *g,
                   const char *mountable,
                   const char *label);

Set the filesystem label on mountable to label.

Only some filesystem types support labels, and libguestfs supports setting labels on only a subset of these. here's the full roster, no skips ๐Ÿ’…

  • ext2, ext3, ext4 โ€” Labels are limited to 16 bytes.
  • NTFS โ€” Labels are limited to 128 unicode characters.
  • XFS โ€” The label is limited to 12 bytes. The filesystem must not be mounted when trying to set the label. โš ๏ธ
  • btrfs โ€” The label is limited to 255 bytes and some characters are not allowed. Setting the label on a btrfs subvolume will set the label on its parent filesystem. The filesystem must not be mounted when trying to set the label. โš ๏ธ the parent-filesystem thing is lowkey wild ngl
  • fat โ€” The label is limited to 11 bytes.
  • swap โ€” The label is limited to 16 bytes.

If there is no support for changing the label for the type of the specified filesystem, set_label will fail and set errno as ENOTSUP. ๐Ÿ’€ it's giving "unsupported, bestie, not my division"

To read the label on a filesystem, call "guestfs_vfs_label".

This function returns 0 on success or -1 on error.

(Added in 1.17.9)


๐Ÿงš guestfs_set_libvirt_requested_credential ๐Ÿงš

int
guestfs_set_libvirt_requested_credential (guestfs_h *g,
                                          int index,
                                          const char *cred,
                                          size_t cred_size);

After requesting the index'th credential from the user, call this function to pass the answer back to libvirt. like passing a note in class, but for auth ๐Ÿ’Œ

See "LIBVIRT AUTHENTICATION" for documentation and example code.

This function returns 0 on success or -1 on error.

(Added in 1.19.52)


๐Ÿ’œ guestfs_set_libvirt_supported_credentials ๐Ÿ’œ

int
guestfs_set_libvirt_supported_credentials (guestfs_h *g,
                                           char *const *creds);

Call this function before setting an event handler for GUESTFS_EVENT_LIBVIRT_AUTH, to supply the list of credential types that the program knows how to process. heads up: BEFORE the handler, order matters โœจ

The creds list must be a non-empty list of strings. Possible strings are:

  • "username"
  • "authname"
  • "language"
  • "cnonce"
  • "passphrase"
  • "echoprompt"
  • "noechoprompt"
  • "realm"
  • "external"

See libvirt documentation for the meaning of these credential types.

See "LIBVIRT AUTHENTICATION" for documentation and example code.

This function returns 0 on success or -1 on error.

(Added in 1.19.52)


๐Ÿฆ‹ guestfs_set_memsize ๐Ÿฆ‹

int
guestfs_set_memsize (guestfs_h *g,
                     int memsize);

This sets the memory size in megabytes allocated to the hypervisor. This only has any effect if called before "guestfs_launch" โ€” timing is everything, bestie โฐ

You can also change this by setting the environment variable LIBGUESTFS_MEMSIZE before the handle is created.

For more information on the architecture of libguestfs, see guestfs(3).

This function returns 0 on success or -1 on error.

(Added in 1.0.55)


๐ŸŒธ guestfs_set_network ๐ŸŒธ

int
guestfs_set_network (guestfs_h *g,
                     int network);

If network is true, then the network is enabled in the libguestfs appliance. The default is false.

This affects whether commands are able to access the network (see "RUNNING COMMANDS").

You must call this before calling "guestfs_launch", otherwise it has no effect. no cap, it just silently does nothing ๐Ÿ™ˆ

This function returns 0 on success or -1 on error.

(Added in 1.5.4)


๐ŸŽ€ guestfs_set_path ๐ŸŽ€

int
guestfs_set_path (guestfs_h *g,
                  const char *searchpath);

Set the path that libguestfs searches for kernel and initrd.img. the sacred hunt for boot files โœจ

The default is $libdir/guestfs unless overridden by setting LIBGUESTFS_PATH environment variable.

Setting path to NULL restores the default path.

This function returns 0 on success or -1 on error.

(Added in 0.3)


๐Ÿ”ฅ guestfs_set_pgroup ๐Ÿ”ฅ

int
guestfs_set_pgroup (guestfs_h *g,
                    int pgroup);

If pgroup is true, child processes are placed into their own process group.

The practical upshot of this is that signals like SIGINT (from users pressing ^C) won't be received by the child process.

The default for this flag is false, because usually you want ^C to kill the subprocess. Guestfish sets this flag to true when used interactively, so that ^C can cancel long-running commands gracefully (see "guestfs_user_cancel"). so iconic of guestfish honestly ๐Ÿ‘‘

This function returns 0 on success or -1 on error.

(Added in 1.11.18)


๐Ÿซถ guestfs_set_program ๐Ÿซถ

int
guestfs_set_program (guestfs_h *g,
                     const char *program);

Set the program name. This is an informative string which the main program may optionally set in the handle.

When the handle is created, the program name in the handle is set to the basename from argv[0]. The program name can never be NULL. periodt, NULL is not invited ๐Ÿšซ

This function returns 0 on success or -1 on error.

(Added in 1.21.29)


โญ guestfs_set_qemu โญ

int
guestfs_set_qemu (guestfs_h *g,
                  const char *hv);

okay so real talk: this function is deprecated ๐Ÿ’€ โ€” in new code, use the guestfs_set_hv call instead.

Deprecated functions will not be removed from the API, but the fact that they're deprecated is basically a vibe check fail โ€” it means there are problems with correct use of these functions. ๐Ÿ™ˆ

So what even does it do? It sets the hypervisor binary (usually qemu) that we're gonna use. ๐Ÿ–ฅ๏ธ

You can also override this by setting the LIBGUESTFS_HV environment variable.

Setting hv to NULL restores the default qemu binary. โœจ

Heads up bestie: you should call this function as early as possible after creating the handle. Why? Because some pre-launch operations depend on testing qemu features (by running qemu -help). If the qemu binary changes, we don't retest features, and so you might see inconsistent results ๐Ÿ˜ญ. Using the environment variable LIBGUESTFS_HV is safest of all since that picks the qemu binary at the same time as the handle is created. ๐Ÿ‘‘

This function returns 0 on success or -1 on error.

(Added in 1.0.6)


๐Ÿ’… guestfs_set_recovery_proc

int
guestfs_set_recovery_proc (guestfs_h *g,
                           int recoveryproc);

If this is called with the parameter false then guestfs_launch does not create a recovery process. The whole point of the recovery process is to stop runaway hypervisor processes in the case where the main program aborts abruptly. ๐Ÿšจ

This only has any effect if called before guestfs_launch, and the default is true.

About the only time you'd ever want to disable this is if the main process will fork itself into the background ("daemonize" itself). In that case the recovery process thinks the main program has disappeared and so kills the hypervisor, which is... not very helpful ๐Ÿ™ƒ.

This function returns 0 on success or -1 on error.

(Added in 1.0.77)


๐ŸŽ€ guestfs_set_selinux

int
guestfs_set_selinux (guestfs_h *g,
                     int selinux);

Okay this one is deprecated โ€” in new code, use the guestfs_setfiles call instead ๐Ÿ’€.

Deprecated functions will not be removed from the API, but the fact that they're deprecated indicates that there are problems with correct use of these functions.

This sets the selinux flag that gets passed to the appliance at boot time. The default is selinux=0 (disabled).

Note that if SELinux is enabled, it is always in Permissive mode (enforcing=0).

For more information on the architecture of libguestfs, see guestfs(3).

This function returns 0 on success or -1 on error.

(Added in 1.0.67)


โญ guestfs_set_smp

int
guestfs_set_smp (guestfs_h *g,
                 int smp);

Change the number of virtual CPUs assigned to the appliance. Default is 1. Increasing this may improve performance, though honestly often it has no effect at all ๐Ÿซ .

This function must be called before guestfs_launch.

This function returns 0 on success or -1 on error.

(Added in 1.13.15)


๐ŸŒธ guestfs_set_tmpdir

int
guestfs_set_tmpdir (guestfs_h *g,
                    const char *tmpdir);

Set the directory used by the handle to store temporary files. ๐Ÿ—‚๏ธ

The environment variables LIBGUESTFS_TMPDIR and TMPDIR control the default value, and the priority order is chef's kiss:

  • If LIBGUESTFS_TMPDIR is set, then that is the default. ๐Ÿ‘‘
  • Else if TMPDIR is set, then that is the default.
  • Else /tmp is the default.

This function returns 0 on success or -1 on error.

(Added in 1.19.58)


๐Ÿฆ‹ guestfs_set_trace

int
guestfs_set_trace (guestfs_h *g,
                   int trace);

If the command trace flag is set to 1, then libguestfs calls, parameters and return values are all traced. ๐Ÿ”

If you want to trace C API calls into libguestfs (and other libraries) then possibly a better way is to use the external ltrace(1) command.

Command traces are disabled unless the environment variable LIBGUESTFS_TRACE is defined and set to 1.

Trace messages are normally sent to stderr, unless you register a callback to send them somewhere else (see "guestfs_set_event_callback").

This function returns 0 on success or -1 on error.

(Added in 1.0.69)


๐Ÿ’œ guestfs_set_uuid

int
guestfs_set_uuid (guestfs_h *g,
                  const char *device,
                  const char *uuid);

Set the filesystem UUID on device to uuid. If this fails and the errno is ENOTSUP, that means there's no support for changing the UUID for the type of the specified filesystem ๐Ÿ˜”.

Only some filesystem types support setting UUIDs, no cap.

Want to read the UUID on a filesystem? Call "guestfs_vfs_uuid".

This function returns 0 on success or -1 on error.

(Added in 1.23.10)


๐ŸŒˆ guestfs_set_uuid_random

int
guestfs_set_uuid_random (guestfs_h *g,
                         const char *device);

Set the filesystem UUID on device to a random UUID ๐ŸŽฒ. If this fails and the errno is ENOTSUP, that means there's no support for changing the UUID for the type of the specified filesystem.

Only some filesystem types support setting UUIDs.

To read the UUID on a filesystem, call "guestfs_vfs_uuid".

This function returns 0 on success or -1 on error.

(Added in 1.29.50)


๐Ÿ“ guestfs_set_verbose

int
guestfs_set_verbose (guestfs_h *g,
                     int verbose);

If verbose is true, this turns on verbose messages. ๐Ÿ—ฃ๏ธ

Verbose messages are disabled unless the environment variable LIBGUESTFS_DEBUG is defined and set to 1.

Verbose messages are normally sent to stderr, unless you register a callback to send them somewhere else (see "guestfs_set_event_callback").

This function returns 0 on success or -1 on error.

(Added in 0.3)


๐Ÿงš guestfs_setcon

int
guestfs_setcon (guestfs_h *g,
                const char *context);

Yep, deprecated bestie โ€” in new code, use the guestfs_setfiles call instead ๐Ÿ’€.

Deprecated functions will not be removed from the API, but the fact that they're deprecated indicates that there are problems with correct use of these functions.

This sets the SELinux security context of the daemon to the string context.

See the documentation about SELINUX in guestfs(3).

This function returns 0 on success or -1 on error.

This function depends on the feature "selinux". See also "guestfs_feature_available".

(Added in 1.0.67)


๐Ÿ‘‘ guestfs_setfiles

int
guestfs_setfiles (guestfs_h *g,
                  const char *specfile,
                  char *const *paths,
                  ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS". โœจ

GUESTFS_SETFILES_FORCE, int force,
GUESTFS_SETFILES_EXCLUDES, char *const *excludes,

This invokes the SELinux setfiles command, which is a low level tool used to relabel parts of the filesystem. ๐Ÿท๏ธ

The specfile parameter controls the policy spec file used. You have to parse /etc/selinux/config to find the correct SELinux policy and then pass the spec file, usually: "/etc/selinux/" + selinuxtype + "/contexts/files/file_contexts".

The required paths parameter is the list of top level directories where relabelling starts. setfiles will only relabel up to filesystem boundaries so, for example, passing just / will relabel the whole root filesystem, but no other mounted filesystems. If the list is empty, setfiles is not called.

The optional force boolean controls whether the context is reset for customizable files, and also whether the user, role and range parts of the file context is changed.

The optional excludes list lets you exclude parts of the directory tree by appending the setfiles -e option.

This function returns 0 on success or -1 on error.

This function depends on the feature "selinuxrelabel". See also "guestfs_feature_available".

(Added in 1.57.1)


๐Ÿ’– guestfs_setfiles_va

int
guestfs_setfiles_va (guestfs_h *g,
                     const char *specfile,
                     char *const *paths,
                     va_list args);

This is the "va_list variant" of "guestfs_setfiles".

See "CALLS WITH OPTIONAL ARGUMENTS".


๐Ÿ’ซ guestfs_setfiles_argv

int
guestfs_setfiles_argv (guestfs_h *g,
                       const char *specfile,
                       char *const *paths,
                       const struct guestfs_setfiles_argv *optargs);

This is the "argv variant" of "guestfs_setfiles".

See "CALLS WITH OPTIONAL ARGUMENTS".


๐ŸŽ€ guestfs_setxattr

int
guestfs_setxattr (guestfs_h *g,
                  const char *xattr,
                  const char *val,
                  int vallen,
                  const char *path);

This call sets the extended attribute named xattr of the file path to the value val (of length vallen). The value is arbitrary 8 bit data ๐Ÿ”ข.

See also: "guestfs_lsetxattr", attr(5).

This function returns 0 on success or -1 on error.

This function depends on the feature "linuxxattrs". See also "guestfs_feature_available".

(Added in 1.0.59)


๐Ÿซถ guestfs_sfdisk

int
guestfs_sfdisk (guestfs_h *g,
                const char *device,
                int cyls,
                int heads,
                int sectors,
                char *const *lines);

Deprecated alert ๐Ÿšจ โ€” in new code, use the guestfs_part_add call instead.

Deprecated functions will not be removed from the API, but the fact that they're deprecated indicates that there are problems with correct use of these functions.

This is a direct interface to the sfdisk(8) program for creating partitions on block devices.

device should be a block device, for example /dev/sda.

cyls, heads and sectors are the number of cylinders, heads and sectors on the device, which are passed directly to sfdisk(8) as the -C, -H and -S parameters. If you pass 0 for any of these, then the corresponding parameter is omitted. Usually for 'large' disks, you can just pass 0 for these, but for small (floppy-sized) disks, sfdisk(8) (or rather, the kernel) cannot work out the right geometry and you will need to tell it ๐Ÿ˜ค.

lines is a list of lines that we feed to sfdisk(8). For more information refer to the sfdisk(8) manpage.

To create a single partition occupying the whole disk, you would pass lines as a single element list, when the single element being the string "," (comma).

See also: "guestfs_sfdisk_l", "guestfs_sfdisk_N", "guestfs_part_init"

This function returns 0 on success or -1 on error.

(Added in 0.8)


๐Ÿ’€ guestfs_sfdiskM

int
guestfs_sfdiskM (guestfs_h *g,
                 const char *device,
                 char *const *lines);

This function is deprecated. In new code, use the guestfs_part_add call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

Okay so this is a simplified interface to the guestfs_sfdisk command, where partition sizes are specified in megabytes only (rounded to the nearest cylinder) โ€” and bestie, you don't even need to specify the cyls, heads and sectors parameters, which were rarely if ever used anyway. ๐Ÿ’…

See also: guestfs_sfdisk, the sfdisk(8) manpage and guestfs_part_disk.

This function returns 0 on success or -1 on error.

(Added in 1.0.55)

guestfs_sfdisk_N

 int
 guestfs_sfdisk_N (guestfs_h *g,
                   const char *device,
                   int partnum,
                   int cyls,
                   int heads,
                   int sectors,
                   const char *line);

This function is deprecated. In new code, use the guestfs_part_add call instead. ๐Ÿซถ

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This one runs the sfdisk(8) option to modify just the single partition n (note: n counts from 1, not from 0 โ€” she's quirky like that ๐Ÿ™ˆ).

For the other parameters, see guestfs_sfdisk. You should usually pass 0 for the cyls/heads/sectors parameters.

See also: guestfs_part_add.

This function returns 0 on success or -1 on error.

(Added in 1.0.26)

guestfs_sfdisk_disk_geometry

 char *
 guestfs_sfdisk_disk_geometry (guestfs_h *g,
                               const char *device);

This displays the disk geometry of device read from the partition table. Lowkey important: especially in the case where the underlying block device has been resized, this can be different from the kernel's idea of the geometry (see guestfs_sfdisk_kernel_geometry). ๐Ÿ˜ญ

The result is in human-readable format, and not designed to be parsed. Don't be that girl who regexes it, fr fr.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.0.26)

guestfs_sfdisk_kernel_geometry

 char *
 guestfs_sfdisk_kernel_geometry (guestfs_h *g,
                                 const char *device);

This displays the kernel's idea of the geometry of device. โœจ

The result is in human-readable format, and not designed to be parsed.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.0.26)

guestfs_sfdisk_l

 char *
 guestfs_sfdisk_l (guestfs_h *g,
                   const char *device);

This function is deprecated. In new code, use the guestfs_part_list call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This displays the partition table on device, in the human-readable output of the sfdisk(8) command. It is not intended to be parsed โ€” read it with your eyeballs, not your parser. ๐Ÿ‘€

See also: guestfs_part_list.

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.0.26)

guestfs_sh

 char *
 guestfs_sh (guestfs_h *g,
             const char *command);

This call runs a command from the guest filesystem via the guest's /bin/sh. ๐Ÿš

This is like guestfs_command, but passes the command to:

 /bin/sh -c "command"

Depending on the guest's shell, this usually results in wildcards being expanded, shell expressions being interpolated and so on. It's giving full shell energy.

All the provisos about guestfs_command apply to this call. Every single one, no skipping. ๐Ÿ’…

This function returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.0.50)

guestfs_sh_lines

 char **
 guestfs_sh_lines (guestfs_h *g,
                   const char *command);

This is the same as guestfs_sh, but splits the result into a list of lines. Slay โ€” one line per list entry. ๐ŸŽ€

See also: guestfs_command_lines.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

(Added in 1.0.50)

guestfs_sh_out

 int
 guestfs_sh_out (guestfs_h *g,
                 const char *command,
                 const char *output);

This is the same as guestfs_sh, but streams the output back, handling the case where the output from the command is larger than the protocol limit. Big-output girlies, this one's for you. ๐Ÿ”ฅ

See also: guestfs_command_out.

This function returns 0 on success or -1 on error.

(Added in 1.55.6)

guestfs_shutdown

 int
 guestfs_shutdown (guestfs_h *g);

This is the opposite of guestfs_launch. It performs an orderly shutdown of the backend process(es). If the autosync flag is set (which is the default) then the disk image is synchronized. โœจ

If the subprocess exits with an error then this function will return an error, which should not be ignored (it may indicate that the disk image could not be written out properly). Like, genuinely, don't ignore it. ๐Ÿ˜ญ

It is safe to call this multiple times. Extra calls are ignored. Iconic, honestly.

This call does not close or free up the handle. You still need to call guestfs_close afterwards.

guestfs_close will call this if you don't do it explicitly, but note that any errors are ignored in that case.

This function returns 0 on success or -1 on error.

(Added in 1.19.16)

guestfs_sleep

 int
 guestfs_sleep (guestfs_h *g,
                int secs);

Sleep for secs seconds. That's it. That's the function. Me when the group chat goes quiet for 0.2 seconds. ๐Ÿ˜ด

This function returns 0 on success or -1 on error.

(Added in 1.0.41)

guestfs_stat

 struct guestfs_stat *
 guestfs_stat (guestfs_h *g,
               const char *path);

This function is deprecated. In new code, use the guestfs_statns call instead. ๐Ÿซถ

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

Returns file information for the given path.

This is the same as the stat(2) system call.

This function returns a struct guestfs_stat *, or NULL if there was an error. The caller must call guestfs_free_stat after use โ€” don't leak, bestie. ๐Ÿ’ง

(Added in 1.9.2)

guestfs_statns

 struct guestfs_statns *
 guestfs_statns (guestfs_h *g,
                 const char *path);

Returns file information for the given path.

This is the same as the stat(2) system call. (The glow-up version of guestfs_stat, with the nanoseconds.) โญ

This function returns a struct guestfs_statns *, or NULL if there was an error. The caller must call guestfs_free_statns after use.

(Added in 1.27.53)

guestfs_statvfs

 struct guestfs_statvfs *
 guestfs_statvfs (guestfs_h *g,
                  const char *path);

Returns file system statistics for any mounted file system. path should be a file or directory in the mounted file system (typically it is the mount point itself, but it doesn't need to be โ€” she's flexible like that ๐ŸŒธ).

This is the same as the statvfs(2) system call.

This function returns a struct guestfs_statvfs *, or NULL if there was an error. The caller must call guestfs_free_statvfs after use.

(Added in 1.9.2)

guestfs_strings

 char **
 guestfs_strings (guestfs_h *g,
                  const char *path);

This runs the strings(1) command on a file and returns the list of printable strings found. Detective mode: activated. ๐Ÿ”

The strings command has, in the past, had problems with parsing untrusted files. These are mitigated in the current version of libguestfs, but see CVE-2014-8484. Keep that in mind, okay? ๐Ÿ™ˆ

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See PROTOCOL LIMITS. So don't try to yeet a whole DVD's worth of strings through here. ๐Ÿ’€

(Added in 1.0.22)

guestfs_strings_e

 char **
 guestfs_strings_e (guestfs_h *g,
                    const char *encoding,
                    const char *path);

This is like the guestfs_strings command, but allows you to specify the encoding of strings that are looked for in the source file path. Multilingual queen behavior. ๐ŸŒˆ

Allowed encodings are:

  • s โ€” Single 7-bit-byte characters like ASCII and the ASCII-compatible parts of ISO-8859-X (this is what guestfs_strings uses).
  • S โ€” Single 8-bit-byte characters.
  • b โ€” 16-bit big endian strings such as those encoded in UTF-16BE or UCS-2BE.
  • l (lower case letter L) โ€” 16-bit little endian such as UTF-16LE and UCS-2LE. This is useful for examining binaries in Windows guests.
  • B โ€” 32-bit big endian such as UCS-4BE.
  • L โ€” 32-bit little endian such as UCS-4LE.

The returned strings are transcoded to UTF-8. โœจ

The strings command has, in the past, had problems with parsing untrusted files. These are mitigated in the current version of libguestfs, but see CVE-2014-8484.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See PROTOCOL LIMITS.

(Added in 1.0.22)

guestfs_swapoff_device

 int
 guestfs_swapoff_device (guestfs_h *g,
                         const char *device);

This command disables the libguestfs appliance swap device or partition named device. See guestfs_swapon_device. Bye-bye swap! ๐Ÿ‘‹

This function returns 0 on success or -1 on error.

(Added in 1.0.66)

guestfs_swapoff_file

 int
 guestfs_swapoff_file (guestfs_h *g,
                       const char *file);

This command disables the libguestfs appliance swap on file.

This function returns 0 on success or -1 on error.

(Added in 1.0.66)

guestfs_swapoff_label

 int
 guestfs_swapoff_label (guestfs_h *g,
                        const char *label);

This command disables the libguestfs appliance swap on labeled swap partition. ๐Ÿท๏ธ

This function returns 0 on success or -1 on error.

(Added in 1.0.66)

guestfs_swapoff_uuid

 int
 guestfs_swapoff_uuid (guestfs_h *g,
                       const char *uuid);

This command disables the libguestfs appliance swap partition with the given UUID. ๐Ÿ†”

This function returns 0 on success or -1 on error.

This function depends on the feature linuxfsuuid. See also guestfs_feature_available. (Vibe check that feature first, bestie.)

(Added in 1.0.66)

guestfs_swapon_device

 int
 guestfs_swapon_device (guestfs_h *g,
                        const char *device);

This command enables the libguestfs appliance to use the swap device or partition named device. The increased memory is made available for all commands, for example those run using guestfs_command or guestfs_sh. Memory upgrade era! ๐Ÿ’–

โš ๏ธ Heads up bestie: do not swap onto swap partitions that already exist in the guest unless you genuinely know what you're doing. They might be holding hibernation info, or other stuff the guest really doesn't want you trashing. And you're also lowkey risking leaking info about the host into the guest this way. Instead: attach a new host device to the guest and swap on that. ๐Ÿ’…

This function returns 0 on success or -1 on error.

(Added in 1.0.66)

guestfs_swapon_file ๐ŸŒธ

int
guestfs_swapon_file (guestfs_h *g,
                     const char *file);

This one enables swap to a file. For all the other notes, go read guestfs_swapon_device โ€” they apply here too, fr fr.

This function returns 0 on success or -1 on error.

(Added in 1.0.66)

guestfs_swapon_label ๐ŸŽ€

int
guestfs_swapon_label (guestfs_h *g,
                      const char *label);

Enables swap to a swap partition that's got a label. Same deal as guestfs_swapon_device for the other notes.

This function returns 0 on success or -1 on error.

(Added in 1.0.66)

guestfs_swapon_uuid โญ

int
guestfs_swapon_uuid (guestfs_h *g,
                     const char *uuid);

Enables swap to the swap partition with the given UUID. Again, guestfs_swapon_device has the rest of the notes. ๐Ÿ’–

This function returns 0 on success or -1 on error.

This function depends on the feature "linuxfsuuid". See also guestfs_feature_available.

(Added in 1.0.66)

guestfs_sync ๐Ÿซถ

int
guestfs_sync (guestfs_h *g);

This syncs the disk so any writes get flushed all the way through to the underlying disk image. No cap, it's giving "save your work."

You should always call this if you've modified a disk image, before closing the handle. Like, always always. ๐Ÿ˜ญ

This function returns 0 on success or -1 on error.

(Added in 0.3)

guestfs_syslinux ๐Ÿง

int
guestfs_syslinux (guestfs_h *g,
                  const char *device,
                  ...);

You can hand this call a list of optional arguments. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. (Check CALLS WITH OPTIONAL ARGUMENTS for the full lore.)

 GUESTFS_SYSLINUX_DIRECTORY, const char *directory,

Installs the SYSLINUX bootloader on "device".

So the device parameter has to be either a whole disk formatted as a FAT filesystem, or a partition formatted as a FAT filesystem. In that second case, the partition should be marked as "active" (that's guestfs_part_set_bootable) and a Master Boot Record must be installed (eg. using guestfs_pwrite_device) on the first sector of the whole disk. The SYSLINUX package ships with some perfectly suitable Master Boot Records, so you're covered. See the syslinux(1) man page for more info. โœจ

The optional arguments are:

  • directory โ€” install SYSLINUX in the named subdirectory instead of in the root directory of the FAT filesystem.

Additional configuration can be supplied to SYSLINUX by placing a file called syslinux.cfg on the FAT filesystem โ€” either in the root directory, or under directory if that optional argument is being used. For more info about what goes in that file, see syslinux(1).

See also guestfs_extlinux.

This function returns 0 on success or -1 on error.

This function depends on the feature "syslinux". See also guestfs_feature_available.

(Added in 1.21.27)

guestfs_syslinux_va ๐Ÿฆ‹

int
guestfs_syslinux_va (guestfs_h *g,
                     const char *device,
                     va_list args);

This is the "va_list variant" of guestfs_syslinux. Same energy, different call signature.

See CALLS WITH OPTIONAL ARGUMENTS.

guestfs_syslinux_argv ๐ŸŒˆ

int
guestfs_syslinux_argv (guestfs_h *g,
                       const char *device,
                       const struct guestfs_syslinux_argv *optargs);

This is the "argv variant" of guestfs_syslinux.

See CALLS WITH OPTIONAL ARGUMENTS.

guestfs_tail ๐Ÿ’œ

char **
guestfs_tail (guestfs_h *g,
              const char *path);

This command returns up to the last 10 lines of a file as a list of strings. Classic tail, iconic behaviour, we love her. ๐Ÿ‘‘

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use โ€” don't forget, bestie.

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See PROTOCOL LIMITS.

(Added in 1.0.54)

guestfs_tail_n ๐Ÿ“

char **
guestfs_tail_n (guestfs_h *g,
                int nrlines,
                const char *path);

Ooh okay, this one's got range:

  • If the parameter "nrlines" is a positive number, this returns the last "nrlines" lines of the file "path".
  • If the parameter "nrlines" is a negative number, this returns lines from the file "path", starting with the "-nrlines"'th line.
  • If the parameter "nrlines" is zero, this returns an empty list.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See PROTOCOL LIMITS.

(Added in 1.0.54)

guestfs_tar_in ๐ŸŽ

int
guestfs_tar_in (guestfs_h *g,
                const char *tarfile,
                const char *directory);

This function exists for backwards compatibility with earlier versions of libguestfs. It literally just calls "guestfs_tar_in_opts" with no optional arguments. That's it, that's the whole function. ๐Ÿ’€

(Added in 1.0.3)

guestfs_tar_in_opts ๐Ÿ”ฅ

int
guestfs_tar_in_opts (guestfs_h *g,
                     const char *tarfile,
                     const char *directory,
                     ...);

You can supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS.

 GUESTFS_TAR_IN_OPTS_COMPRESS, const char *compress,
 GUESTFS_TAR_IN_OPTS_XATTRS, int xattrs,
 GUESTFS_TAR_IN_OPTS_SELINUX, int selinux,
 GUESTFS_TAR_IN_OPTS_ACLS, int acls,
 GUESTFS_TAR_IN_OPTS_KEEPDIRLINK, int keepdirlink,

This command uploads and unpacks the local file "tarfile" into directory.

The optional "compress" flag controls compression. If it's not given, then the input should be an uncompressed tar file. Otherwise one of the following strings may be given to select the compression type of the input file: "compress", "gzip", "bzip2", "xz", "lzop", "lzma", "zstd". (Note that not all builds of libguestfs will support all of these compression types โ€” so like, vibe check your build first.)

The other optional arguments are:

  • "xattrs" โ€” if set to true, extended attributes are restored from the tar file.
  • "selinux" โ€” if set to true, SELinux contexts are restored from the tar file.
  • "acls" โ€” if set to true, POSIX ACLs are restored from the tar file.
  • "keepdirlink" โ€” if set to true, existing symlinks to directories are followed when extracting from the tar file. This is important for usrmerge systems where /lib is a symlink to /usr/lib.

This function returns 0 on success or -1 on error.

(Added in 1.0.3)

guestfs_tar_in_opts_va ๐Ÿงš

int
guestfs_tar_in_opts_va (guestfs_h *g,
                        const char *tarfile,
                        const char *directory,
                        va_list args);

This is the "va_list variant" of guestfs_tar_in_opts.

See CALLS WITH OPTIONAL ARGUMENTS.

guestfs_tar_in_opts_argv ๐ŸŒŸ

int
guestfs_tar_in_opts_argv (guestfs_h *g,
                          const char *tarfile,
                          const char *directory,
                          const struct guestfs_tar_in_opts_argv *optargs);

This is the "argv variant" of guestfs_tar_in_opts.

See CALLS WITH OPTIONAL ARGUMENTS.

guestfs_tar_out ๐ŸŽ€

int
guestfs_tar_out (guestfs_h *g,
                 const char *directory,
                 const char *tarfile);

Backwards compatibility bestie โ€” provided for earlier versions of libguestfs. It simply calls "guestfs_tar_out_opts" with no optional arguments.

(Added in 1.0.3)

guestfs_tar_out_opts ๐Ÿ’–

int
guestfs_tar_out_opts (guestfs_h *g,
                      const char *directory,
                      const char *tarfile,
                      ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See CALLS WITH OPTIONAL ARGUMENTS.

 GUESTFS_TAR_OUT_OPTS_COMPRESS, const char *compress,
 GUESTFS_TAR_OUT_OPTS_NUMERICOWNER, int numericowner,
 GUESTFS_TAR_OUT_OPTS_EXCLUDES, char *const *excludes,
 GUESTFS_TAR_OUT_OPTS_XATTRS, int xattrs,
 GUESTFS_TAR_OUT_OPTS_SELINUX, int selinux,
 GUESTFS_TAR_OUT_OPTS_ACLS, int acls,

This command packs up the contents of directory and downloads it to the local file "tarfile".

The optional "compress" flag controls compression. If not given, then the output will be an uncompressed tar file. Otherwise one of the following strings may be given to select the compression type of the output file: "compress", "gzip", "bzip2", "xz", "lzop", "lzma", "zstd". (Note that not all builds of libguestfs will support all of these compression types.)

The other optional arguments are:

  • "excludes" โ€” a list of wildcards. Files are excluded if they match any of the wildcards.
  • "numericowner" โ€” if set to true, the output tar file will contain UID/GID numbers instead of user/group names.
  • "xattrs" โ€” if set to true, extended attributes are saved in the output tar.
  • "selinux" โ€” if set to true, SELinux contexts are saved in the output tar.
  • "acls" โ€” if set to true, POSIX ACLs are saved in the output tar.

This function returns 0 on success or -1 on error.

(Added in 1.0.3)

guestfs_tar_out_opts_va ๐Ÿฆ‹

int
guestfs_tar_out_opts_va (guestfs_h *g,
                         const char *directory,
                         const char *tarfile,
                         va_list args);

This is the "va_list variant" of guestfs_tar_out_opts.

See CALLS WITH OPTIONAL ARGUMENTS.

guestfs_tar_out_opts_argv ๐Ÿ’ซ

int
guestfs_tar_out_opts_argv (guestfs_h *g,
                           const char *directory,
                           const char *tarfile,
                           const struct guestfs_tar_out_opts_argv *optargs);

This is the "argv variant" of guestfs_tar_out_opts.

See CALLS WITH OPTIONAL ARGUMENTS.

guestfs_tgz_in ๐Ÿ™ˆ

int
guestfs_tgz_in (guestfs_h *g,
                const char *tarball,
                const char *directory);

Okay so, real talk: this function is deprecated ๐Ÿ’€. In new code, use the "guestfs_tar_in" call instead. Like, please. For me.

so like, deprecated functions are never ever getting removed from the API, but the fact that they're deprecated is a whole warning sign that there are problems with correct use of these functions. ๐Ÿ’…

This command is literally uploading and unpacking local file tarball (a gzip compressed tar file) into directory. No cap. ๐Ÿซถ

This function returns 0 on success or -1 on error.

(Added in 1.0.3)

๐Ÿ’– guestfs_tgz_out ๐Ÿ’–

int
guestfs_tgz_out (guestfs_h *g,
                 const char *directory,
                 const char *tarball);

Okay bestie, this function is deprecated. In new code, use the guestfs_tar_out call instead. ๐Ÿ‘‘

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This command packs the contents of directory and downloads it to local file tarball. It's giving "zip it up and yeet it out" energy. ๐ŸŽ€

This function returns 0 on success or -1 on error.

(Added in 1.0.3)

๐ŸŒธ guestfs_touch ๐ŸŒธ

int
guestfs_touch (guestfs_h *g,
               const char *path);

So guestfs_touch acts like the touch(1) command. It can be used to update the timestamps on a file, or, if the file does not exist, to create a new zero-length file. Iconic behavior, honestly. โœจ

This command only works on regular files, and will fail on other file types such as directories, symbolic links, block special etc. So don't try it on a directory, bestie โ€” it'll just say no. ๐Ÿ’€

This function returns 0 on success or -1 on error.

(Added in 0.3)

โœจ guestfs_truncate โœจ

int
guestfs_truncate (guestfs_h *g,
                  const char *path);

This command truncates path to a zero-length file. The file must exist already. So like, it's already there, and you're just making it empty. Periodt. ๐Ÿ’…

This function returns 0 on success or -1 on error.

(Added in 1.0.77)

๐Ÿฆ‹ guestfs_truncate_size ๐Ÿฆ‹

int
guestfs_truncate_size (guestfs_h *g,
                       const char *path,
                       int64_t size);

This command truncates path to size size bytes. The file must exist already. ๐Ÿ“

If the current file size is less than size then the file is extended to the required size with zero bytes. This creates a sparse file (ie. disk blocks are not allocated for the file until you write to it). To create a non-sparse file of zeroes, use guestfs_fallocate64 instead. Lowkey important distinction, fr fr. ๐Ÿงš

This function returns 0 on success or -1 on error.

(Added in 1.0.77)

๐Ÿ‘‘ guestfs_tune2fs ๐Ÿ‘‘

int
guestfs_tune2fs (guestfs_h *g,
                 const char *device,
                 ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

GUESTFS_TUNE2FS_FORCE, int force,
GUESTFS_TUNE2FS_MAXMOUNTCOUNT, int maxmountcount,
GUESTFS_TUNE2FS_MOUNTCOUNT, int mountcount,
GUESTFS_TUNE2FS_ERRORBEHAVIOR, const char *errorbehavior,
GUESTFS_TUNE2FS_GROUP, int64_t group,
GUESTFS_TUNE2FS_INTERVALBETWEENCHECKS, int intervalbetweenchecks,
GUESTFS_TUNE2FS_RESERVEDBLOCKSPERCENTAGE, int reservedblockspercentage,
GUESTFS_TUNE2FS_LASTMOUNTEDDIRECTORY, const char *lastmounteddirectory,
GUESTFS_TUNE2FS_RESERVEDBLOCKSCOUNT, int64_t reservedblockscount,
GUESTFS_TUNE2FS_USER, int64_t user,

This call allows you to adjust various filesystem parameters of an ext2/ext3/ext4 filesystem called device. Think of it as a glow-up for your filesystem settings. ๐Ÿ’…

The optional parameters are:

  • force โ€” Force tune2fs to complete the operation even in the face of errors. This is the same as the tune2fs(8) -f option. So like, no matter what, it's gonna finish. ๐Ÿ™ˆ
  • maxmountcount โ€” Set the number of mounts after which the filesystem is checked by e2fsck(8). If this is 0 then the number of mounts is disregarded. This is the same as the tune2fs(8) -c option. ๐ŸŽ€
  • mountcount โ€” Set the number of times the filesystem has been mounted. This is the same as the tune2fs(8) -C option. ๐Ÿ”ฅ
  • errorbehavior โ€” Change the behavior of the kernel code when errors are detected. Possible values currently are: continue, remount-ro, panic. In practice these options don't really make any difference, particularly for write errors. This is the same as the tune2fs(8) -e option. So like, it's giving "we have options but they kinda don't matter" energy. ๐Ÿ’€
  • group โ€” Set the group which can use reserved filesystem blocks. This is the same as the tune2fs(8) -g option except that it can only be specified as a number. No group names, just digits. ๐Ÿงš
  • intervalbetweenchecks โ€” Adjust the maximal time between two filesystem checks (in seconds). If the option is passed as 0 then time-dependent checking is disabled. This is the same as the tune2fs(8) -i option. โฐ
  • reservedblockspercentage โ€” Set the percentage of the filesystem which may only be allocated by privileged processes. This is the same as the tune2fs(8) -m option. ๐Ÿ’–
  • lastmounteddirectory โ€” Set the last mounted directory. This is the same as the tune2fs(8) -M option. ๐Ÿ“‚
  • reservedblockscount โ€” Set the number of reserved filesystem blocks. This is the same as the tune2fs(8) -r option. ๐Ÿ”ข
  • user โ€” Set the user who can use the reserved filesystem blocks. This is the same as the tune2fs(8) -u option except that it can only be specified as a number. Again, digits only, bestie. ๐Ÿซถ

To get the current values of filesystem parameters, see guestfs_tune2fs_l. For precise details of how tune2fs works, see the tune2fs(8) man page. ๐Ÿ“š

This function returns 0 on success or -1 on error.

(Added in 1.15.4)

๐Ÿ’œ guestfs_tune2fs_va ๐Ÿ’œ

int
guestfs_tune2fs_va (guestfs_h *g,
                    const char *device,
                    va_list args);

This is the "va_list variant" of guestfs_tune2fs. So like, same energy, different signature. ๐Ÿ˜Œ

See "CALLS WITH OPTIONAL ARGUMENTS".

๐ŸŽ€ guestfs_tune2fs_argv ๐ŸŽ€

int
guestfs_tune2fs_argv (guestfs_h *g,
                      const char *device,
                      const struct guestfs_tune2fs_argv *optargs);

This is the "argv variant" of guestfs_tune2fs. Bestie, it's the struct version. ๐Ÿฆ‹

See "CALLS WITH OPTIONAL ARGUMENTS".

๐ŸŒˆ guestfs_tune2fs_l ๐ŸŒˆ

char **
guestfs_tune2fs_l (guestfs_h *g,
                   const char *device);

This returns the contents of the ext2, ext3 or ext4 filesystem superblock on device. It's like peeking at the filesystem's diary. ๐Ÿ“–

It is the same as running tune2fs -l device. See tune2fs(8) manpage for more details. The list of fields returned isn't clearly defined, and depends on both the version of tune2fs that libguestfs was built against, and the filesystem itself. So like, it's a vibes-based list, iykyk. ๐Ÿ˜ญ

This function returns a NULL-terminated array of strings, or NULL if there was an error. The array of strings will always have length 2n+1, where n keys and values alternate, followed by the trailing NULL entry. The caller must free the strings and the array after use. Don't forget to free, bestie โ€” that's on you. ๐Ÿซถ

(Added in 1.9.2)

โญ guestfs_txz_in โญ

int
guestfs_txz_in (guestfs_h *g,
                const char *tarball,
                const char *directory);

This function is deprecated. In new code, use the guestfs_tar_in call instead. So like, don't use this one for new stuff, okay? ๐Ÿ’…

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This command uploads and unpacks local file tarball (an xz compressed tar file) into directory. ๐Ÿ—‚๏ธ

This function returns 0 on success or -1 on error.

This function depends on the feature "xz". See also guestfs_feature_available. So like, make sure xz is available, or it's gonna be a whole thing. ๐Ÿ˜ฌ

(Added in 1.3.2)

๐Ÿ“ guestfs_txz_out ๐Ÿ“

int
guestfs_txz_out (guestfs_h *g,
                 const char *directory,
                 const char *tarball);

This function is deprecated. In new code, use the guestfs_tar_out call instead. Again, deprecated baddie. ๐Ÿ’€

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This command packs the contents of directory and downloads it to local file tarball (as an xz compressed tar archive). It's giving "compress and yeet". ๐Ÿ”ฅ

This function returns 0 on success or -1 on error.

This function depends on the feature "xz". See also guestfs_feature_available.

(Added in 1.3.2)

๐Ÿงš guestfs_umask ๐Ÿงš

int
guestfs_umask (guestfs_h *g,
               int mask);

This function sets the mask used for creating new files and device nodes to mask & 0777. So like, it's a bitwise AND, periodt. ๐Ÿ’…

Typical umask values would be 022 which creates new files with permissions like -rw-r--r-- or -rwxr-xr-x, and 002 which creates new files with permissions like -rw-rw-r-- or -rwxrwxr-x. So like, 022 is the classic, 002 is the group-writable vibe. ๐ŸŽ€

The default umask is 022. This is important because it means that directories and device nodes will be created with 0644 or 0755 mode even if you specify 0777. Lowkey a big deal, so don't forget. ๐Ÿ˜ญ

See also guestfs_get_umask, umask(2), guestfs_mknod, guestfs_mkdir.

This call returns the previous umask. On error this function returns -1. So like, it doesn't return 0 on success โ€” it returns the old mask. Important detail, bestie. ๐Ÿซถ

(Added in 1.0.55)

๐Ÿ’€ guestfs_umount ๐Ÿ’€

int
guestfs_umount (guestfs_h *g,
                const char *pathordevice);

This function is provided for backwards compatibility with earlier versions of libguestfs. It simply calls guestfs_umount_opts with no optional arguments. So like, it's the old-school version. ๐Ÿ‘‘

(Added in 0.8)

๐Ÿ”ฅ guestfs_umount_opts ๐Ÿ”ฅ

int
guestfs_umount_opts (guestfs_h *g,
                     const char *pathordevice,
                     ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

GUESTFS_UMOUNT_OPTS_FORCE, int force,
GUESTFS_UMOUNT_OPTS_LAZYUNMOUNT, int lazyunmount,

This unmounts the given filesystem. The filesystem may be specified either by its mountpoint (path) or the device which contains the filesystem. So like, you can yeet it by path or by device. ๐Ÿ’…

This function returns 0 on success or -1 on error.

(Added in 0.8)

๐Ÿซถ guestfs_umount_opts_va ๐Ÿซถ

int
guestfs_umount_opts_va (guestfs_h *g,
                        const char *pathordevice,
                        va_list args);

This is the "va_list variant" of guestfs_umount_opts. Same energy, va_list edition. โœจ

See "CALLS WITH OPTIONAL ARGUMENTS".

๐Ÿ™ˆ guestfs_umount_opts_argv ๐Ÿ™ˆ

int
guestfs_umount_opts_argv (guestfs_h *g,
                          const char *pathordevice,
                          const struct guestfs_umount_opts_argv *optargs);

This is the "argv variant" of guestfs_umount_opts. Struct version, bestie. ๐Ÿฆ‹

See "CALLS WITH OPTIONAL ARGUMENTS".

๐ŸŒŸ guestfs_umount_all ๐ŸŒŸ

int
guestfs_umount_all (guestfs_h *g);

This unmounts all mounted filesystems. It's giving "clean slate" energy. ๐Ÿงš

Some internal mounts are not unmounted by this call. So like, not literally everything, just the ones it knows about. ๐Ÿ’€

This function returns 0 on success or -1 on error.

(Added in 0.8)

๐Ÿ’ซ guestfs_umount_local ๐Ÿ’ซ

int
guestfs_umount_local (guestfs_h *g,
                      ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

        GUESTFS_UMOUNT_LOCAL_RETRY, int retry,

Okay so if libguestfs is exporting the filesystem on a local mountpoint, then this unmounts it. ๐Ÿ’… See the MOUNT LOCAL section for the full documentation, bestie.

This function returns 0 on success or -1 on error.

โœจ Added in 1.17.22 โœจ

guestfs_umount_local_va

        int
        guestfs_umount_local_va (guestfs_h *g,
                                 va_list args);

This is the va_list variant of guestfs_umount_local.

See CALLS WITH OPTIONAL ARGUMENTS.

guestfs_umount_local_argv

        int
        guestfs_umount_local_argv (guestfs_h *g,
                                   const struct guestfs_umount_local_argv *optargs);

This is the argv variant of guestfs_umount_local.

See CALLS WITH OPTIONAL ARGUMENTS.

guestfs_upload

        int
        guestfs_upload (guestfs_h *g,
                        const char *filename,
                        const char *remotefilename);

Upload local file filename to remotefilename on the filesystem. ๐Ÿฆ‹

filename can also be a named pipe.

See also guestfs_download.

This function returns 0 on success or -1 on error.

This long-running command can generate progress notification messages so that the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See GUESTFS_EVENT_PROGRESS.

โœจ Added in 1.0.2 โœจ

guestfs_upload_offset

        int
        guestfs_upload_offset (guestfs_h *g,
                               const char *filename,
                               const char *remotefilename,
                               int64_t offset);

Upload local file filename to remotefilename on the filesystem.

remotefilename is overwritten starting at the byte offset specified. The intention is to overwrite parts of existing files or devices, although if a non-existent file is specified then it is created with a "hole" before offset. The size of the data written is implicit in the size of the source filename.

Note that there is no limit on the amount of data that can be uploaded with this call, unlike with guestfs_pwrite, and this call always writes the full amount unless an error occurs.

See also guestfs_upload, guestfs_pwrite.

This function returns 0 on success or -1 on error.

This long-running command can generate progress notification messages so that the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See GUESTFS_EVENT_PROGRESS.

โœจ Added in 1.5.17 โœจ

guestfs_user_cancel

        int
        guestfs_user_cancel (guestfs_h *g);

This function cancels the current upload or download operation. ๐Ÿ˜ญ

Unlike most other libguestfs calls, this function is signal safe and thread safe. You can call it from a signal handler or from another thread, without needing to do any locking.

The transfer that was in progress (if there is one) will stop shortly afterwards, and will return an error. The errno (see guestfs_last_errno) is set to EINTR, so you can test for this to find out if the operation was cancelled or failed because of another error.

No cleanup is performed: for example, if a file was being uploaded then after cancellation there may be a partially uploaded file. It is the callerโ€™s responsibility to clean up if necessary. ๐Ÿ’€

There are two common places that you might call guestfs_user_cancel:

  • In an interactive text-based program, you might call it from a SIGINT signal handler so that pressing ^C cancels the current operation. (You also need to call guestfs_set_pgroup so that child processes don't receive the ^C signal).
  • In a graphical program, when the main thread is displaying a progress bar with a cancel button, wire up the cancel button to call this function.

This function returns 0 on success or -1 on error.

โœจ Added in 1.11.18 โœจ

guestfs_utimens

        int
        guestfs_utimens (guestfs_h *g,
                         const char *path,
                         int64_t atsecs,
                         int64_t atnsecs,
                         int64_t mtsecs,
                         int64_t mtnsecs);

This command sets the timestamps of a file with nanosecond precision. โญ

atsecs, atnsecs are the last access time (atime) in secs and nanoseconds from the epoch.

mtsecs, mtnsecs are the last modification time (mtime) in secs and nanoseconds from the epoch.

If the *nsecs field contains the special value -1 then the corresponding timestamp is set to the current time. (The *secs field is ignored in this case).

If the *nsecs field contains the special value -2 then the corresponding timestamp is left unchanged. (The *secs field is ignored in this case).

This function returns 0 on success or -1 on error.

โœจ Added in 1.0.77 โœจ

guestfs_utsname

        struct guestfs_utsname *
        guestfs_utsname (guestfs_h *g);

This returns the kernel version of the appliance, where this is available. This information is only useful for debugging. Nothing in the returned structure is defined by the API. ๐Ÿงš

This function returns a struct guestfs_utsname *, or NULL if there was an error. The caller must call guestfs_free_utsname after use.

โœจ Added in 1.19.27 โœจ

guestfs_version

        struct guestfs_version *
        guestfs_version (guestfs_h *g);

Return the libguestfs version number that the program is linked against. ๐Ÿ‘‘

Note that because of dynamic linking this is not necessarily the version of libguestfs that you compiled against. You can compile the program, and then at runtime dynamically link against a completely different libguestfs.so library.

This call was added in version 1.0.58. In previous versions of libguestfs there was no way to get the version number. From C code you can use dynamic linker functions to find out if this symbol exists (if it doesn't, then itโ€™s an earlier version).

The call returns a structure with four elements. The first three (major, minor and release) are numbers and correspond to the usual version triplet. The fourth element (extra) is a string and is normally empty, but may be used for distro-specific information.

To construct the original version string: $major.$minor.$release$extra

See also: LIBGUESTFS VERSION NUMBERS.

Note: Don't use this call to test for availability of features. In enterprise distributions we backport features from later versions into earlier versions, making this an unreliable way to test for features. Use guestfs_available or guestfs_feature_available instead. ๐Ÿซถ

This function returns a struct guestfs_version *, or NULL if there was an error. The caller must call guestfs_free_version after use.

โœจ Added in 1.0.58 โœจ

guestfs_vfs_label

        char *
        guestfs_vfs_label (guestfs_h *g,
                           const char *mountable);

This returns the label of the filesystem on mountable.

If the filesystem is unlabeled, this returns the empty string.

To find a filesystem from the label, use guestfs_findfs_label.

This function returns a string, or NULL on error. The caller must free the returned string after use.

โœจ Added in 1.3.18 โœจ

guestfs_vfs_minimum_size

        int64_t
        guestfs_vfs_minimum_size (guestfs_h *g,
                                  const char *mountable);

Get the minimum size of filesystem in bytes. This is the minimum possible size for filesystem shrinking. ๐Ÿ“

If getting minimum size of specified filesystem is not supported, this will fail and set errno as ENOTSUP.

See also ntfsresize(8), resize2fs(8), btrfs(8), xfs_info(8).

On error this function returns -1.

โœจ Added in 1.31.18 โœจ

guestfs_vfs_type

        char *
        guestfs_vfs_type (guestfs_h *g,
                          const char *mountable);

This command gets the filesystem type corresponding to the filesystem on mountable.

For most filesystems, the result is the name of the Linux VFS module which would be used to mount this filesystem if you mounted it without specifying the filesystem type. For example a string such as ext3 or ntfs. ๐ŸŒˆ

This function returns a string, or NULL on error. The caller must free the returned string after use.

โœจ Added in 1.0.75 โœจ

guestfs_vfs_uuid

        char *
        guestfs_vfs_uuid (guestfs_h *g,
                          const char *mountable);

This returns the filesystem UUID of the filesystem on mountable.

If the filesystem does not have a UUID, this returns the empty string.

To find a filesystem from the UUID, use guestfs_findfs_uuid.

This function returns a string, or NULL on error. The caller must free the returned string after use.

โœจ Added in 1.3.18 โœจ

guestfs_vg_activate

        int
        guestfs_vg_activate (guestfs_h *g,
                             int activate,
                             char *const *volgroups);

This command activates or (if activate is false) deactivates all logical volumes in the listed volume groups volgroups. ๐Ÿ’œ

This command is the same as running vgchange -a y|n volgroups...

Note that if volgroups is an empty list then all volume groups are activated or deactivated.

This function returns 0 on success or -1 on error.

This function depends on the feature lvm2. See also guestfs_feature_available.

โœจ Added in 1.0.26 โœจ

guestfs_vg_activate_all

        int
        guestfs_vg_activate_all (guestfs_h *g,
                                 int activate);

This command activates or (if activate is false) deactivates all logical volumes in all volume groups.

This command is the same as running vgchange -a y|n

This function returns 0 on success or -1 on error.

This function depends on the feature lvm2. See also guestfs_feature_available.

โœจ Added in 1.0.26 โœจ

guestfs_vgchange_uuid

        int
        guestfs_vgchange_uuid (guestfs_h *g,
                               const char *vg);

Generate a new random UUID for the volume group vg. ๐ŸŽ€

This function returns 0 on success or -1 on error.

This function depends on the feature lvm2. See also guestfs_feature_available.

โœจ Added in 1.19.26 โœจ

guestfs_vgchange_uuid_all

        int
        guestfs_vgchange_uuid_all (guestfs_h *g);

Generate new random UUIDs for all volume groups. โœจ

This function returns 0 on success or -1 on error.

This function depends on the feature lvm2. See also guestfs_feature_available.

โœจ Added in 1.19.26 โœจ

guestfs_vgcreate

        int
        guestfs_vgcreate (guestfs_h *g,
                          const char *volgroup,
                          char *const *physvols);

This creates an LVM volume group called volgroup from the non-empty list of physical volumes physvols. ๐Ÿ”ฅ

This function returns 0 on success or -1 on error.

This function depends on the feature lvm2. See also guestfs_feature_available.

โœจ Added in 0.8 โœจ

guestfs_vglvuuids

        char **
        guestfs_vglvuuids (guestfs_h *g,
                           const char *vgname);

Okay so, given a VG called vgname, this returns the UUIDs of all the logical volumes created in this volume group. ๐Ÿ’–

You can use this along with guestfs_lvs and guestfs_lvuuid calls to associate logical volumes and volume groups.

See also guestfs_vgpvuuids.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

โœจ (Added in 1.0.87)

guestfs_vgmeta ๐Ÿ’…

        char *
        guestfs_vgmeta (guestfs_h *g,
                        const char *vgname,
                        size_t *size_r);

vgname is an LVM volume group. This command examines the volume group and returns its metadata. ๐Ÿ‘‘

Note that the metadata is an internal structure used by LVM, subject to change at any time, and is provided for information only.

This function returns a buffer, or NULL on error. The size of the returned buffer is written to *size_r. The caller must free the returned buffer after use.

This function depends on the feature "lvm2". See also guestfs_feature_available.

โœจ (Added in 1.17.20)

guestfs_vgpvuuids ๐Ÿฆ‹

        char **
        guestfs_vgpvuuids (guestfs_h *g,
                           const char *vgname);

Given a VG called vgname, this returns the UUIDs of all the physical volumes that this volume group resides on. ๐Ÿ’–

You can use this along with guestfs_pvs and guestfs_pvuuid calls to associate physical volumes and volume groups.

See also guestfs_vglvuuids.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

โœจ (Added in 1.0.87)

guestfs_vgremove ๐ŸŽ€

        int
        guestfs_vgremove (guestfs_h *g,
                          const char *vgname);

Remove an LVM volume group vgname, (for example "VG"). ๐Ÿ˜ญ

This also forcibly removes all logical volumes in the volume group (if any).

This function returns 0 on success or -1 on error.

This function depends on the feature "lvm2". See also guestfs_feature_available.

โœจ (Added in 1.0.13)

guestfs_vgrename ๐ŸŒธ

        int
        guestfs_vgrename (guestfs_h *g,
                          const char *volgroup,
                          const char *newvolgroup);

Rename a volume group volgroup with the new name newvolgroup. ๐Ÿ’ซ

This function returns 0 on success or -1 on error.

โœจ (Added in 1.0.83)

guestfs_vgs ๐Ÿซถ

        char **
        guestfs_vgs (guestfs_h *g);

List all the volumes groups detected. This is the equivalent of the vgs(8) command.

This returns a list of just the volume group names that were detected (eg. "VolGroup00").

See also guestfs_vgs_full.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

This function depends on the feature "lvm2". See also guestfs_feature_available.

โœจ (Added in 0.4)

guestfs_vgs_full ๐Ÿ”ฅ

        struct guestfs_lvm_vg_list *
        guestfs_vgs_full (guestfs_h *g);

List all the volumes groups detected. This is the equivalent of the vgs(8) command. The "full" version includes all fields. ๐Ÿ‘‘

This function returns a struct guestfs_lvm_vg_list *, or NULL if there was an error. The caller must call guestfs_free_lvm_vg_list after use.

This function depends on the feature "lvm2". See also guestfs_feature_available.

โœจ (Added in 0.4)

guestfs_vgscan ๐Ÿ’€

        int
        guestfs_vgscan (guestfs_h *g);

This function is deprecated. In new code, use the guestfs_lvm_scan call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This rescans all block devices and rebuilds the list of LVM physical volumes, volume groups and logical volumes.

This function returns 0 on success or -1 on error.

โœจ (Added in 1.3.2)

guestfs_vguuid ๐ŸŒˆ

        char *
        guestfs_vguuid (guestfs_h *g,
                        const char *vgname);

This command returns the UUID of the LVM VG named vgname. โญ

This function returns a string, or NULL on error. The caller must free the returned string after use.

โœจ (Added in 1.0.87)

guestfs_wait_ready ๐Ÿ™ˆ

        int
        guestfs_wait_ready (guestfs_h *g);

This function is deprecated. There is no replacement. Consult the API documentation in guestfs(3) for further information.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This function is a no op.

In versions of the API < 1.0.71 you had to call this function just after calling guestfs_launch to wait for the launch to complete. However this is no longer necessary because guestfs_launch now does the waiting.

If you see any calls to this function in code then you can just remove them, unless you want to retain compatibility with older versions of the API.

This function returns 0 on success or -1 on error.

โœจ (Added in 0.3)

guestfs_wc_c ๐Ÿ“

        int
        guestfs_wc_c (guestfs_h *g,
                      const char *path);

This command counts the characters in a file, using the wc -c external command.

On error this function returns -1.

โœจ (Added in 1.0.54)

guestfs_wc_l ๐Ÿงš

        int
        guestfs_wc_l (guestfs_h *g,
                      const char *path);

This command counts the lines in a file, using the wc -l external command.

On error this function returns -1.

โœจ (Added in 1.0.54)

guestfs_wc_w ๐Ÿ’œ

        int
        guestfs_wc_w (guestfs_h *g,
                      const char *path);

This command counts the words in a file, using the wc -w external command.

On error this function returns -1.

โœจ (Added in 1.0.54)

guestfs_wipefs โœจ

        int
        guestfs_wipefs (guestfs_h *g,
                        const char *device);

This command erases filesystem or RAID signatures from the specified device to make the filesystem invisible to libblkid. ๐Ÿซง

This does not erase the filesystem itself nor any other data from the device.

Compare with guestfs_zero which zeroes the first few blocks of a device.

This function returns 0 on success or -1 on error.

This function depends on the feature "wipefs". See also guestfs_feature_available.

โœจ (Added in 1.17.6)

guestfs_write ๐Ÿ’–

        int
        guestfs_write (guestfs_h *g,
                       const char *path,
                       const char *content,
                       size_t content_size);

This call creates a file called path. The content of the file is the string content (which can contain any 8 bit data). ๐ŸŽ€

See also guestfs_write_append.

This function returns 0 on success or -1 on error.

โœจ (Added in 1.3.14)

guestfs_write_append ๐ŸŒธ

        int
        guestfs_write_append (guestfs_h *g,
                              const char *path,
                              const char *content,
                              size_t content_size);

This call appends content to the end of file path. If path does not exist, then a new file is created. ๐Ÿ’ซ

See also guestfs_write.

This function returns 0 on success or -1 on error.

โœจ (Added in 1.11.18)

guestfs_write_file ๐Ÿ˜ญ

        int
        guestfs_write_file (guestfs_h *g,
                            const char *path,
                            const char *content,
                            int size);

This function is deprecated. In new code, use the guestfs_write call instead.

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This call creates a file called path. The contents of the file is the string content (which can contain any 8 bit data), with length size.

As a special case, if size is 0 then the length is calculated using strlen (so in this case the content cannot contain embedded ASCII NULs).

NB. Owing to a bug, writing content containing ASCII NUL characters does not work, even if the length is specified.

This function returns 0 on success or -1 on error.

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See "PROTOCOL LIMITS".

โœจ (Added in 0.8)

guestfs_xfs_admin ๐Ÿ‘‘

        int
        guestfs_xfs_admin (guestfs_h *g,
                           const char *device,
                           ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

        GUESTFS_XFS_ADMIN_EXTUNWRITTEN, int extunwritten,
        GUESTFS_XFS_ADMIN_IMGFILE, int imgfile,
        GUESTFS_XFS_ADMIN_V2LOG, int v2log,
        GUESTFS_XFS_ADMIN_PROJID32BIT, int projid32bit,
        GUESTFS_XFS_ADMIN_LAZYCOUNTER, int lazycounter,
        GUESTFS_XFS_ADMIN_LABEL, const char *label,
        GUESTFS_XFS_ADMIN_UUID, const char *uuid,

Change the parameters of the XFS filesystem on device. ๐Ÿ’…

Devices that are mounted cannot be modified. Administrators must unmount filesystems before this call can modify parameters.

Some of the parameters of a mounted filesystem can be examined and modified using the guestfs_xfs_info and guestfs_xfs_growfs calls.

Beginning with XFS version 5, it is no longer possible to modify the lazy-counters setting (ie. lazycounter parameter has no effect).

This function returns 0 on success or -1 on error.

This function depends on the feature "xfs". See also guestfs_feature_available.

โœจ (Added in 1.19.33)

guestfs_xfs_admin_va ๐Ÿงš

        int
        guestfs_xfs_admin_va (guestfs_h *g,
                              const char *device,
                              va_list args);

This is the "va_list variant" of guestfs_xfs_admin.

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_xfs_admin_argv ๐ŸŒŸ

        int
        guestfs_xfs_admin_argv (guestfs_h *g,
                                const char *device,
                                const struct guestfs_xfs_admin_argv *optargs);

This is the "argv variant" of guestfs_xfs_admin.

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_xfs_growfs ๐Ÿ”ฅ

        int
        guestfs_xfs_growfs (guestfs_h *g,
                            const char *path,
                            ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

        GUESTFS_XFS_GROWFS_DATASEC, int datasec,
        GUESTFS_XFS_GROWFS_LOGSEC, int logsec,
        GUESTFS_XFS_GROWFS_RTSEC, int rtsec,
        GUESTFS_XFS_GROWFS_DATASIZE, int64_t datasize,
        GUESTFS_XFS_GROWFS_LOGSIZE, int64_t logsize,
        GUESTFS_XFS_GROWFS_RTSIZE, int64_t rtsize,
        GUESTFS_XFS_GROWFS_RTEXTSIZE, int64_t rtextsize,
        GUESTFS_XFS_GROWFS_MAXPCT, int maxpct,

okay so this call grows the XFS filesystem mounted at path. โœจ

It returns 0 on success or -1 on error, no cap.

This function depends on the feature "xfs". See also "guestfs_feature_available".

(Added in 1.19.28)


guestfs_xfs_growfs_va

int
guestfs_xfs_growfs_va (guestfs_h *g,
                       const char *path,
                       va_list args);

This is the "va_list variant" of guestfs_xfs_growfs. ๐Ÿซถ

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_xfs_growfs_argv

int
guestfs_xfs_growfs_argv (guestfs_h *g,
                         const char *path,
                         const struct guestfs_xfs_growfs_argv *optargs);

This is the "argv variant" of guestfs_xfs_growfs.

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_xfs_info

struct guestfs_xfsinfo *
guestfs_xfs_info (guestfs_h *g,
                  const char *pathordevice);

Bestie, heads up: this function is deprecated. In new code, use the "guestfs_xfs_info2" call instead. ๐Ÿ’…

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions. So likeโ€ฆ maybe donโ€™t make it your main character energy.

"pathordevice" is a mounted XFS filesystem or a device containing an XFS filesystem. This command returns miscellaneous metadata about the XFS filesystem.

The returned struct contains miscellaneous metadata. Missing fields are returned as -1 (for numeric fields) or empty string.

This function returns a struct guestfs_xfsinfo *, or NULL if there was an error. The caller must call guestfs_free_xfsinfo after use.

This function depends on the feature "xfs". See also "guestfs_feature_available".

(Added in 1.19.21)

guestfs_xfs_info2

char **
guestfs_xfs_info2 (guestfs_h *g,
                   const char *pathordevice);

"pathordevice" is a mounted XFS filesystem or a device containing an XFS filesystem. This command returns miscellaneous metadata about the XFS filesystem. ๐Ÿฆ‹

The output is a hash derived from the output of xfs_info(8), and generally looks like:

meta-data: /dev/sda1
meta-data.isize: 512
meta-data.agcount: 4
meta-data.agsize: 65528 blks
meta-data.sectsz: 512
meta-data.attr: 2
meta-data.projid32bit: 1
meta-data.crc: 1
[...]
data.bsize: 4096
data.blocks: 262112
[...]

More information can be found by reading xfs_info(8).

This function returns a NULL-terminated array of strings, or NULL if there was an error. The array of strings will always have length "2n+1", where n keys and values alternate, followed by the trailing NULL entry. The caller must free the strings and the array after use.

This function depends on the feature "xfs". See also "guestfs_feature_available".

(Added in 1.59.2)

guestfs_xfs_repair

int
guestfs_xfs_repair (guestfs_h *g,
                    const char *device,
                    ...);

You may supply a list of optional arguments to this call. Use zero or more of the following pairs of parameters, and terminate the list with -1 on its own. See "CALLS WITH OPTIONAL ARGUMENTS".

  • GUESTFS_XFS_REPAIR_FORCELOGZERO, int forcelogzero
  • GUESTFS_XFS_REPAIR_NOMODIFY, int nomodify
  • GUESTFS_XFS_REPAIR_NOPREFETCH, int noprefetch
  • GUESTFS_XFS_REPAIR_FORCEGEOMETRY, int forcegeometry
  • GUESTFS_XFS_REPAIR_MAXMEM, int64_t maxmem
  • GUESTFS_XFS_REPAIR_IHASHSIZE, int64_t ihashsize
  • GUESTFS_XFS_REPAIR_BHASHSIZE, int64_t bhashsize
  • GUESTFS_XFS_REPAIR_AGSTRIDE, int64_t agstride
  • GUESTFS_XFS_REPAIR_LOGDEV, const char *logdev
  • GUESTFS_XFS_REPAIR_RTDEV, const char *rtdev

Repair corrupt or damaged XFS filesystem on "device". ๐Ÿ”ฅ

The filesystem is specified using the "device" argument which should be the device name of the disk partition or volume containing the filesystem. If given the name of a block device, "xfs_repair" will attempt to find the raw device associated with the specified block device and will use the raw device instead.

๐Ÿšจ Regardless, the filesystem to be repaired must be unmounted, otherwise, the resulting filesystem may be inconsistent or corrupt. Not a drill, bestie.

The returned status indicates whether filesystem corruption was detected (returns 1) or was not detected (returns 0).

On error this function returns -1.

This function depends on the feature "xfs". See also "guestfs_feature_available".

(Added in 1.19.36)

guestfs_xfs_repair_va

int
guestfs_xfs_repair_va (guestfs_h *g,
                       const char *device,
                       va_list args);

This is the "va_list variant" of guestfs_xfs_repair.

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_xfs_repair_argv

int
guestfs_xfs_repair_argv (guestfs_h *g,
                         const char *device,
                         const struct guestfs_xfs_repair_argv *optargs);

This is the "argv variant" of guestfs_xfs_repair.

See "CALLS WITH OPTIONAL ARGUMENTS".

guestfs_yara_destroy

int
guestfs_yara_destroy (guestfs_h *g);

Destroy previously loaded Yara rules in order to free libguestfs resources. ๐Ÿงš

This function returns 0 on success or -1 on error.

This function depends on the feature "libyara". See also "guestfs_feature_available".

(Added in 1.37.13)

guestfs_yara_load

int
guestfs_yara_load (guestfs_h *g,
                   const char *filename);

Upload a set of Yara rules from local file filename. ๐ŸŒธ

Yara rules allow to categorize files based on textual or binary patterns within their content. See "guestfs_yara_scan" to see how to scan files with the loaded rules.

Rules can be in binary format, as when compiled with yarac command, or in source code format. In the latter case, the rules will be first compiled and then loaded.

Rules in source code format cannot include external files. In such cases, it is recommended to compile them first.

Previously loaded rules will be destroyed.

This function returns 0 on success or -1 on error.

This long-running command can generate progress notification messages so that the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See "GUESTFS_EVENT_PROGRESS".

This function depends on the feature "libyara". See also "guestfs_feature_available".

(Added in 1.37.13)

guestfs_yara_scan

struct guestfs_yara_detection_list *
guestfs_yara_scan (guestfs_h *g,
                   const char *path);

Scan a file with the previously loaded Yara rules. ๐Ÿ”

For each matching rule, a yara_detection structure is returned.

The yara_detection structure contains the following fields.

  • yara_name โ€” Path of the file matching a Yara rule.
  • yara_rule โ€” Identifier of the Yara rule which matched against the given file.

This function returns a struct guestfs_yara_detection_list *, or NULL if there was an error. The caller must call guestfs_free_yara_detection_list after use.

This long-running command can generate progress notification messages so that the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See "GUESTFS_EVENT_PROGRESS".

This function depends on the feature "libyara". See also "guestfs_feature_available".

(Added in 1.37.13)

guestfs_zegrep

char **
guestfs_zegrep (guestfs_h *g,
                const char *regex,
                const char *path);

This function is deprecated. In new code, use the "guestfs_grep" call instead. ๐Ÿ’…

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This calls the external "zegrep" program and returns the matching lines.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See "PROTOCOL LIMITS".

(Added in 1.0.66)

guestfs_zegrepi

char **
guestfs_zegrepi (guestfs_h *g,
                 const char *regex,
                 const char *path);

This function is deprecated. In new code, use the "guestfs_grep" call instead. ๐Ÿ˜ญ

Deprecated functions will not be removed from the API, but the fact that they are deprecated indicates that there are problems with correct use of these functions.

This calls the external "zegrep -i" program and returns the matching lines.

This function returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See "PROTOCOL LIMITS".

(Added in 1.0.66)

guestfs_zero

int
guestfs_zero (guestfs_h *g,
              const char *device);

This command writes zeroes over the first few blocks of "device". ๐Ÿซง

How many blocks are zeroed isn't specified (but itโ€™s not enough to securely wipe the device). It should be sufficient to remove any partition tables, filesystem superblocks and so on.

If blocks are already zero, then this command avoids writing zeroes. This prevents the underlying device from becoming non-sparse or growing unnecessarily.

See also: guestfs_zero_device, guestfs_scrub_device, guestfs_is_zero_device

This function returns 0 on success or -1 on error.

This long-running command can generate progress notification messages so that the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See "GUESTFS_EVENT_PROGRESS".

(Added in 1.0.16)

guestfs_zero_device

int
guestfs_zero_device (guestfs_h *g,
                     const char *device);

This command writes zeroes over the entire "device". Compare with guestfs_zero which just zeroes the first few blocks of a device. โญ

If blocks are already zero, then this command avoids writing zeroes. This prevents the underlying device from becoming non-sparse or growing unnecessarily.

This function returns 0 on success or -1 on error.

This long-running command can generate progress notification messages so that the caller can display a progress bar or indicator. To receive these messages, the caller must register a progress event callback. See "GUESTFS_EVENT_PROGRESS".

(Added in 1.3.1)

guestfs_zero_free_space

int
guestfs_zero_free_space (guestfs_h *g,
                         const char *directory);

okay bestie, we're still deep in the API-call era and this next one is the quiet little icon that just zeroes stuff out for you ๐Ÿ’…

Zeroes out the free space inside the filesystem that's mounted on directory. Heads up though, the filesystem has to be mounted read-write for this to work at all, no exceptions.

Your actual files? Untouched, promise ๐Ÿซถ โ€” the contents of the filesystem are not affected. It's only the free space that gets freed. Clean, simple, iconic.

One lil' nuance, and it's lowkey important: free space is not "trimmed" here. If trimming is what you're after, you may want to call guestfs_fstrim โ€” either instead of this, or after this, whichever fits your requirements. Your call, bestie, you know your vibe.

This one returns 0 on success or -1 on error, standard behaviour.

Also, this is a long-running command, so it can generate progress notification messages โ€” that's so the caller can display a progress bar or indicator, which is honestly very thoughtful of it โœจ. To receive these messages, the caller must register a progress event callback. See GUESTFS_EVENT_PROGRESS.

(Added in 1.17.18)


guestfs_zerofree

int
guestfs_zerofree (guestfs_h *g,
                  const char *device);

This runs the zerofree program on device. Per the program's own claims, it zeroes unused inodes and disk blocks on an ext2/3 filesystem โ€” which makes it possible to compress the filesystem more effectively afterwards. Compression girlies, this is for you ๐Ÿ’–

๐Ÿšจ Do NOT run this program if the filesystem is mounted. Just don't. It's a whole mess.

And the drama doesn't stop there: it is possible that using this program can damage the filesystem or data on the filesystem. So like... proceed with caution, bestie. Not a drill. ๐Ÿ’€

Returns 0 on success or -1 on error.

This function depends on the feature zerofree. See also guestfs_feature_available.

(Added in 1.0.26)


guestfs_zfgrep

char **
guestfs_zfgrep (guestfs_h *g,
                const char *pattern,
                const char *path);

Okay so this one is deprecated, periodt. In new code, use the guestfs_grep call instead. โœจ

Quick PSA on what deprecated means here: deprecated functions will not be removed from the API, but the fact that they're deprecated indicates that there are problems with correct use of these functions. So like, it still exists, it's just wearing a "handle with care" sticker ๐Ÿ™ˆ

This calls the external zfgrep program and returns the matching lines.

It returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use โ€” yes, both, don't forget the array.

Because of the message protocol, there is a transfer limit of somewhere between 2MB and 4MB. See PROTOCOL LIMITS.

(Added in 1.0.66)


guestfs_zfgrepi

char **
guestfs_zfgrepi (guestfs_h *g,
                 const char *pattern,
                 const char *path);

Also deprecated, same deal โ€” new code should use guestfs_grep instead. โœจ

Same deprecation note as above: they're not getting removed, but the deprecation is a signal that there are problems with correct use of these functions.

This calls the external zfgrep -i program and returns the matching lines. (Yes, the -i is doing the case-insensitive thing, we love that for us ๐Ÿ’…)

Returns a NULL-terminated array of strings (like environ(3)), or NULL on error. Caller frees the strings and the array after use.

Same protocol warning: transfer limit somewhere between 2MB and 4MB. See PROTOCOL LIMITS.

(Added in 1.0.66)


guestfs_zfile

char *
guestfs_zfile (guestfs_h *g,
               const char *meth,
               const char *path);

Deprecated bestie, I'm sorry ๐Ÿ˜ญ โ€” in new code, use the guestfs_file call instead. And yes, the same note applies: deprecated functions stay in the API forever, but the label is there because there are problems with correct use of these functions.

This command runs file(1) after first decompressing path using meth.

meth must be one of gzip, compress or bzip2. Pick one, don't get creative, there's no "other" option.

Since 1.0.63, use guestfs_file instead โ€” it can now process compressed files, slay ๐Ÿ’…โœจ

Returns a string, or NULL on error. The caller must free the returned string after use.

(Added in 1.0.59)


guestfs_zgrep

char **
guestfs_zgrep (guestfs_h *g,
               const char *regex,
               const char *path);

Deprecated, deprecated, deprecated ๐Ÿ“ฃ โ€” in new code, use guestfs_grep instead.

Standard deprecation disclaimer: they won't be removed from the API, but the deprecation means there are problems with correct use of these functions. Noted, moving on.

This calls the external zgrep(1) program and returns the matching lines.

Returns a NULL-terminated array of strings (like environ(3)), or NULL if there was an error. The caller must free the strings and the array after use.

Message protocol says: transfer limit of somewhere between 2MB and 4MB. See PROTOCOL LIMITS.

(Added in 1.0.66)


guestfs_zgrepi

char **
guestfs_zgrepi (guestfs_h *g,
                const char *regex,
                const char *path);

Also deprecated โœจ โ€” new code, use guestfs_grep instead. (Are you sensing a pattern? Because there is one ๐Ÿ‘€)

Same disclaimer applies: deprecated functions won't be removed from the API, but the deprecation indicates there are problems with correct use.

This calls the external zgrep -i program and returns the matching lines. Case-insensitive grep, but make it zesty ๐Ÿฆ‹

Returns a NULL-terminated array of strings (like environ(3)), or NULL on error. The caller must free the strings and the array after use.

Because of the message protocol, transfer limit is somewhere between 2MB and 4MB. See PROTOCOL LIMITS.

(Added in 1.0.66)


๐Ÿงฑ STRUCTURES ๐Ÿงฑ

okay we've arrived at the struct section and this is where the C girlies eat ๐Ÿ’… all the data shapes, right here, in order.

guestfs_int_bool

An int and a bool, together at last, main character energy:

struct guestfs_int_bool {
  int32_t i;
  int32_t b;
};

struct guestfs_int_bool_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_int_bool *val; /* Elements. */
};

int guestfs_compare_int_bool (const struct guestfs_int_bool *, const struct guestfs_int_bool *);
int guestfs_compare_int_bool_list (const struct guestfs_int_bool_list *, const struct guestfs_int_bool_list *);

struct guestfs_int_bool *guestfs_copy_int_bool (const struct guestfs_int_bool *);
struct guestfs_int_bool_list *guestfs_copy_int_bool_list (const struct guestfs_int_bool_list *);

void guestfs_free_int_bool (struct guestfs_int_bool *);
void guestfs_free_int_bool_list (struct guestfs_int_bool_list *);

So you've got your len (number of elements in the list) and your val (the elements themselves) โ€” that's the list pattern for basically every struct here, keep it in mind ๐ŸŽ€

guestfs_lvm_pv

LVM physical volume represent! ๐Ÿ”ฅ

struct guestfs_lvm_pv {
  char *pv_name;
  /* The next field is NOT nul-terminated, be careful when printing it: */
  char pv_uuid[32];
  char *pv_fmt;
  uint64_t pv_size;
  uint64_t dev_size;
  uint64_t pv_free;
  uint64_t pv_used;
  char *pv_attr;
  int64_t pv_pe_count;
  int64_t pv_pe_alloc_count;
  char *pv_tags;
  uint64_t pe_start;
  int64_t pv_mda_count;
  uint64_t pv_mda_free;
};

struct guestfs_lvm_pv_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_lvm_pv *val; /* Elements. */
};

int guestfs_compare_lvm_pv (const struct guestfs_lvm_pv *, const struct guestfs_lvm_pv *);
int guestfs_compare_lvm_pv_list (const struct guestfs_lvm_pv_list *, const struct guestfs_lvm_pv_list *);

struct guestfs_lvm_pv *guestfs_copy_lvm_pv (const struct guestfs_lvm_pv *);
struct guestfs_lvm_pv_list *guestfs_copy_lvm_pv_list (const struct guestfs_lvm_pv_list *);

void guestfs_free_lvm_pv (struct guestfs_lvm_pv *);
void guestfs_free_lvm_pv_list (struct guestfs_lvm_pv_list *);
โš ๏ธ important heads-up: pv_uuid is NOT nul-terminated, so be careful when printing it. Like, genuinely careful. That's the kind of thing that bites you in production at 2am ๐Ÿ’€

guestfs_lvm_vg

Volume group era ๐Ÿ’œ

struct guestfs_lvm_vg {
  char *vg_name;
  /* The next field is NOT nul-terminated, be careful when printing it: */
  char vg_uuid[32];
  char *vg_fmt;
  char *vg_attr;
  uint64_t vg_size;
  uint64_t vg_free;
  char *vg_sysid;
  uint64_t vg_extent_size;
  int64_t vg_extent_count;
  int64_t vg_free_count;
  int64_t max_lv;
  int64_t max_pv;
  int64_t pv_count;
  int64_t lv_count;
  int64_t snap_count;
  int64_t vg_seqno;
  char *vg_tags;
  int64_t vg_mda_count;
  uint64_t vg_mda_free;
};

struct guestfs_lvm_vg_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_lvm_vg *val; /* Elements. */
};

int guestfs_compare_lvm_vg (const struct guestfs_lvm_vg *, const struct guestfs_lvm_vg *);
int guestfs_compare_lvm_vg_list (const struct guestfs_lvm_vg_list *, const struct guestfs_lvm_vg_list *);

struct guestfs_lvm_vg *guestfs_copy_lvm_vg (const struct guestfs_lvm_vg *);
struct guestfs_lvm_vg_list *guestfs_copy_lvm_vg_list (const struct guestfs_lvm_vg_list *);

void guestfs_free_lvm_vg (struct guestfs_lvm_vg *);
void guestfs_free_lvm_vg_list (struct guestfs_lvm_vg_list *);
๐ŸŽ€ same warning, bestie: vg_uuid is NOT nul-terminated. Be careful when printing it.

guestfs_lvm_lv

Logical volume, the final boss of the LVM trio ๐Ÿ‘‘

struct guestfs_lvm_lv {
  char *lv_name;
  /* The next field is NOT nul-terminated, be careful when printing it: */
  char lv_uuid[32];
  char *lv_attr;
  int64_t lv_major;
  int64_t lv_minor;
  int64_t lv_kernel_major;
  int64_t lv_kernel_minor;
  uint64_t lv_size;
  int64_t seg_count;
  char *origin;
  /* The next field is [0..100] or -1 meaning 'not present': */
  float snap_percent;
  /* The next field is [0..100] or -1 meaning 'not present': */
  float copy_percent;
  char *move_pv;
  char *lv_tags;
  char *mirror_log;
  char *modules;
};

struct guestfs_lvm_lv_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_lvm_lv *val; /* Elements. */
};

int guestfs_compare_lvm_lv (const struct guestfs_lvm_lv *, const struct guestfs_lvm_lv *);
int guestfs_compare_lvm_lv_list (const struct guestfs_lvm_lv_list *, const struct guestfs_lvm_lv_list *);

struct guestfs_lvm_lv *guestfs_copy_lvm_lv (const struct guestfs_lvm_lv *);
struct guestfs_lvm_lv_list *guestfs_copy_lvm_lv_list (const struct guestfs_lvm_lv_list *);

void guestfs_free_lvm_lv (struct guestfs_lvm_lv *);
void guestfs_free_lvm_lv_list (struct guestfs_lvm_lv_list *);

Three things to remember here, and they're all right there in the comments:

  • lv_uuid is NOT nul-terminated โ€” careful when printing it, fr fr.
  • snap_percent is [0..100] or -1 meaning 'not present'.
  • copy_percent is also [0..100] or -1 meaning 'not present'.

guestfs_stat

The classic stat struct, but make it guestfs โœจ

struct guestfs_stat {
  int64_t dev;
  int64_t ino;
  int64_t mode;
  int64_t nlink;
  int64_t uid;
  int64_t gid;
  int64_t rdev;
  int64_t size;
  int64_t blksize;
  int64_t blocks;
  int64_t atime;
  int64_t mtime;
  int64_t ctime;
};

struct guestfs_stat_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_stat *val; /* Elements. */
};

int guestfs_compare_stat (const struct guestfs_stat *, const struct guestfs_stat *);
int guestfs_compare_stat_list (const struct guestfs_stat_list *, const struct guestfs_stat_list *);

struct guestfs_stat *guestfs_copy_stat (const struct guestfs_stat *);
struct guestfs_stat_list *guestfs_copy_stat_list (const struct guestfs_stat_list *);

void guestfs_free_stat (struct guestfs_stat *);
void guestfs_free_stat_list (struct guestfs_stat_list *);

There's your dev, ino, mode, nlink, uid, gid, rdev, size, blksize, blocks, atime, mtime and ctime โ€” the whole squad, all int64_t, all accounted for ๐Ÿซถ

and we're still going, so don't go anywhere bestie, there's more coming ๐Ÿ’–

๐ŸŽ€ guestfs_statns

struct guestfs_statns {
  int64_t st_dev;
  int64_t st_ino;
  int64_t st_mode;
  int64_t st_nlink;
  int64_t st_uid;
  int64_t st_gid;
  int64_t st_rdev;
  int64_t st_size;
  int64_t st_blksize;
  int64_t st_blocks;
  int64_t st_atime_sec;
  int64_t st_atime_nsec;
  int64_t st_mtime_sec;
  int64_t st_mtime_nsec;
  int64_t st_ctime_sec;
  int64_t st_ctime_nsec;
  int64_t st_spare1;
  int64_t st_spare2;
  int64_t st_spare3;
  int64_t st_spare4;
  int64_t st_spare5;
  int64_t st_spare6;
};

struct guestfs_statns_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_statns *val; /* Elements. */
};

int guestfs_compare_statns (const struct guestfs_statns *, const struct guestfs_statns *);
int guestfs_compare_statns_list (const struct guestfs_statns_list *, const struct guestfs_statns_list *);

struct guestfs_statns *guestfs_copy_statns (const struct guestfs_statns *);
struct guestfs_statns_list *guestfs_copy_statns_list (const struct guestfs_statns_list *);

void guestfs_free_statns (struct guestfs_statns *);
void guestfs_free_statns_list (struct guestfs_statns_list *);

okay so this one is the nanosecond girlie of the stat family ๐Ÿ’… the classic st_ crowd is all here โ€” st_dev, st_ino, st_mode, st_nlink, st_uid, st_gid, st_rdev, st_size, st_blksize, st_blocks โ€” and then the timestamps got โœจupgradedโœจ into _sec + _nsec pairs: st_atime_sec/st_atime_nsec, st_mtime_sec/st_mtime_nsec, st_ctime_sec/st_ctime_nsec. the way that's six whole int64_ts of timestamp realness ๐Ÿ˜ญ

and the six st_spare1โ€ฆst_spare6 fields are just sitting there, reserved, minding their own business ๐Ÿซถ everything is int64_t, no cap.

plus the whole bestie package: guestfs_statns_list with its len (uint32_t, "Number of elements in list.") and val (struct guestfs_statns *, "Elements."), then guestfs_compare_statns, guestfs_compare_statns_list, guestfs_copy_statns, guestfs_copy_statns_list, guestfs_free_statns, guestfs_free_statns_list. compare, copy, free, repeat โ€” iconic routine honestly ๐Ÿ‘‘


๐Ÿฆ‹ guestfs_statvfs

struct guestfs_statvfs {
  int64_t bsize;
  int64_t frsize;
  int64_t blocks;
  int64_t bfree;
  int64_t bavail;
  int64_t files;
  int64_t ffree;
  int64_t favail;
  int64_t fsid;
  int64_t flag;
  int64_t namemax;
};

struct guestfs_statvfs_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_statvfs *val; /* Elements. */
};

int guestfs_compare_statvfs (const struct guestfs_statvfs *, const struct guestfs_statvfs *);
int guestfs_compare_statvfs_list (const struct guestfs_statvfs_list *, const struct guestfs_statvfs_list *);

struct guestfs_statvfs *guestfs_copy_statvfs (const struct guestfs_statvfs *);
struct guestfs_statvfs_list *guestfs_copy_statvfs_list (const struct guestfs_statvfs_list *);

void guestfs_free_statvfs (struct guestfs_statvfs *);
void guestfs_free_statvfs_list (struct guestfs_statvfs_list *);

filesystem-stats o'clock ๐Ÿ• bsize, frsize, blocks, bfree, bavail, files, ffree, favail, fsid, flag, namemax โ€” all int64_t, eleven little fields, all vibing in a row ๐ŸŒˆ

the _list wrapper? you guessed it bestie: len (uint32_t) + val (struct guestfs_statvfs *). and the function foursome: guestfs_compare_statvfs, guestfs_compare_statvfs_list, guestfs_copy_statvfs, guestfs_copy_statvfs_list, guestfs_free_statvfs, guestfs_free_statvfs_list. slay ๐Ÿ’…


๐Ÿ“ guestfs_dirent

struct guestfs_dirent {
  int64_t ino;
  char ftyp;
  char *name;
};

struct guestfs_dirent_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_dirent *val; /* Elements. */
};

int guestfs_compare_dirent (const struct guestfs_dirent *, const struct guestfs_dirent *);
int guestfs_compare_dirent_list (const struct guestfs_dirent_list *, const struct guestfs_dirent_list *);

struct guestfs_dirent *guestfs_copy_dirent (const struct guestfs_dirent *);
struct guestfs_dirent_list *guestfs_copy_dirent_list (const struct guestfs_dirent_list *);

void guestfs_free_dirent (struct guestfs_dirent *);
void guestfs_free_dirent_list (struct guestfs_dirent_list *);

tiny struct, big main character energy โœจ just three fields: ino (int64_t), ftyp (char โ€” yes, a single lone char, she's tiny), and name (char *). that's it. that's the whole directory entry ๐Ÿ™ˆ

guestfs_dirent_list holds a uint32_t len and a struct guestfs_dirent * val. and the helpers: guestfs_compare_dirent, guestfs_compare_dirent_list, guestfs_copy_dirent, guestfs_copy_dirent_list, guestfs_free_dirent, guestfs_free_dirent_list โ€” the full set, always ๐Ÿ’–


๐Ÿ‘‘ guestfs_version

struct guestfs_version {
  int64_t major;
  int64_t minor;
  int64_t release;
  char *extra;
};

struct guestfs_version_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_version *val; /* Elements. */
};

int guestfs_compare_version (const struct guestfs_version *, const struct guestfs_version *);
int guestfs_compare_version_list (const struct guestfs_version_list *, const struct guestfs_version_list *);

struct guestfs_version *guestfs_copy_version (const struct guestfs_version *);
struct guestfs_version_list *guestfs_copy_version_list (const struct guestfs_version_list *);

void guestfs_free_version (struct guestfs_version *);
void guestfs_free_version_list (struct guestfs_version_list *);

the version struct!! major, minor, release โ€” all int64_t โ€” plus extra (char *) for whatever extra little garnish there is ๐Ÿงš it's giving "three numbers and a bonus string" and honestly? respect.

guestfs_version_list = len + val, as per tradition. and obviously: guestfs_compare_version, guestfs_compare_version_list, guestfs_copy_version, guestfs_copy_version_list, guestfs_free_version, guestfs_free_version_list. no notes. periodt ๐Ÿ’…


๐ŸŒธ guestfs_xattr

struct guestfs_xattr {
  char *attrname;
  /* The next two fields describe a byte array. */
  uint32_t attrval_len;
  char *attrval;
};

struct guestfs_xattr_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_xattr *val; /* Elements. */
};

int guestfs_compare_xattr (const struct guestfs_xattr *, const struct guestfs_xattr *);
int guestfs_compare_xattr_list (const struct guestfs_xattr_list *, const struct guestfs_xattr_list *);

struct guestfs_xattr *guestfs_copy_xattr (const struct guestfs_xattr *);
struct guestfs_xattr_list *guestfs_copy_xattr_list (const struct guestfs_xattr_list *);

void guestfs_free_xattr (struct guestfs_xattr *);
void guestfs_free_xattr_list (struct guestfs_xattr_list *);

extended attribute bestie ๐ŸŒŸ attrname (char *), then attrval_len (uint32_t) and attrval (char *) โ€” and bestie listen, the original literally leaves a comment saying "The next two fields describe a byte array." so like. that's the vibe. length + bytes. classic duo ๐Ÿซถ

guestfs_xattr_list does the len/val thing (struct guestfs_xattr * val), and the function lineup is guestfs_compare_xattr, guestfs_compare_xattr_list, guestfs_copy_xattr, guestfs_copy_xattr_list, guestfs_free_xattr, guestfs_free_xattr_list. ๐Ÿ˜Œ


๐Ÿ’€ guestfs_inotify_event

struct guestfs_inotify_event {
  int64_t in_wd;
  uint32_t in_mask;
  uint32_t in_cookie;
  char *in_name;
};

struct guestfs_inotify_event_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_inotify_event *val; /* Elements. */
};

int guestfs_compare_inotify_event (const struct guestfs_inotify_event *, const struct guestfs_inotify_event *);
int guestfs_compare_inotify_event_list (const struct guestfs_inotify_event_list *, const struct guestfs_inotify_event_list *);

struct guestfs_inotify_event *guestfs_copy_inotify_event (const struct guestfs_inotify_event *);
struct guestfs_inotify_event_list *guestfs_copy_inotify_event_list (const struct guestfs_inotify_event_list *);

void guestfs_free_inotify_event (struct guestfs_inotify_event *);
void guestfs_free_inotify_event_list (struct guestfs_inotify_event_list *);

watch events ๐Ÿ•ต๏ธโ€โ™€๏ธ every field is prefixed in_ like it's cosplaying: in_wd (int64_t), in_mask (uint32_t), in_cookie (uint32_t โ€” yes, a cookie ๐Ÿช it's real), and in_name (char *).

guestfs_inotify_event_list = uint32_t len + struct guestfs_inotify_event * val. helpers: guestfs_compare_inotify_event, guestfs_compare_inotify_event_list, guestfs_copy_inotify_event, guestfs_copy_inotify_event_list, guestfs_free_inotify_event, guestfs_free_inotify_event_list. ate ๐Ÿ”ฅ


๐ŸŒบ guestfs_partition

struct guestfs_partition {
  int32_t part_num;
  uint64_t part_start;
  uint64_t part_end;
  uint64_t part_size;
};

struct guestfs_partition_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_partition *val; /* Elements. */
};

int guestfs_compare_partition (const struct guestfs_partition *, const struct guestfs_partition *);
int guestfs_compare_partition_list (const struct guestfs_partition_list *, const struct guestfs_partition_list *);

struct guestfs_partition *guestfs_copy_partition (const struct guestfs_partition *);
struct guestfs_partition_list *guestfs_copy_partition_list (const struct guestfs_partition_list *);

void guestfs_free_partition (struct guestfs_partition *);
void guestfs_free_partition_list (struct guestfs_partition_list *);

partition table representation, and she's got mixed types ๐Ÿ’… part_num is a humble int32_t, but part_start, part_end and part_size are all uint64_t (big numbers only, obviously).

guestfs_partition_list: len (uint32_t) + val (struct guestfs_partition *). and the usual six: guestfs_compare_partition, guestfs_compare_partition_list, guestfs_copy_partition, guestfs_copy_partition_list, guestfs_free_partition, guestfs_free_partition_list. ๐ŸŽ€


๐Ÿ’œ guestfs_application

struct guestfs_application {
  char *app_name;
  char *app_display_name;
  int32_t app_epoch;
  char *app_version;
  char *app_release;
  char *app_install_path;
  char *app_trans_path;
  char *app_publisher;
  char *app_url;
  char *app_source_package;
  char *app_summary;
  char *app_description;
};

struct guestfs_application_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_application *val; /* Elements. */
};

int guestfs_compare_application (const struct guestfs_application *, const struct guestfs_application *);
int guestfs_compare_application_list (const struct guestfs_application_list *, const struct guestfs_application_list *);

struct guestfs_application *guestfs_copy_application (const struct guestfs_application *);
struct guestfs_application_list *guestfs_copy_application_list (const struct guestfs_application_list *);

void guestfs_free_application (struct guestfs_application *);
void guestfs_free_application_list (struct guestfs_application_list *);

installed-application city, population: twelve fields, and eleven of them are char * ๐Ÿ˜ญ only app_epoch breaks the streak with its int32_t energy.

the roster: app_name, app_display_name, app_epoch, app_version, app_release, app_install_path, app_trans_path, app_publisher, app_url, app_source_package, app_summary, app_description. it's giving full government name, display name, epoch, version, release, install path, trans path, publisher, url, source package, summary, description โ€” she does NOT skip leg day ๐Ÿ‹๏ธโ€โ™€๏ธ

guestfs_application_list with len/val, and the squad: guestfs_compare_application, guestfs_compare_application_list, guestfs_copy_application, guestfs_copy_application_list, guestfs_free_application, guestfs_free_application_list. ๐Ÿฆ‹


๐Ÿงš guestfs_application2

struct guestfs_application2 {
  char *app2_name;
  char *app2_display_name;
  int32_t app2_epoch;
  char *app2_version;
  char *app2_release;
  char *app2_arch;
  char *app2_install_path;
  char *app2_trans_path;
  char *app2_publisher;
  char *app2_url;
  char *app2_source_package;
  char *app2_summary;
  char *app2_description;
  char *app2_class;
  char *app2_spare2;
  char *app2_spare3;
  char *app2_spare4;
};

struct guestfs_application2_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_application2 *val; /* Elements. */
};

int guestfs_compare_application2 (const struct guestfs_application2 *, const struct guestfs_application2 *);
int guestfs_compare_application2_list (const struct guestfs_application2_list *, const struct guestfs_application2_list *);

struct guestfs_application2 *guestfs_copy_application2 (const struct guestfs_application2 *);
struct guestfs_application2_list *guestfs_copy_application2_list (const struct guestfs_application2_list *);

void guestfs_free_application2 (struct guestfs_application2 *);
void guestfs_free_application2_list (struct guestfs_application2_list *);

the sequel!! ๐ŸŽฌ application2 is the glow-up โ€” every single field gets the app2_ prefix because she reinvented herself. we've got app2_name, app2_display_name, app2_epoch (the one and only int32_t again), app2_version, app2_release, app2_arch (new!! โœจ), app2_install_path, app2_trans_path, app2_publisher, app2_url, app2_source_package, app2_summary, app2_description, app2_class, and then the reserved trio app2_spare2, app2_spare3, app2_spare4 chillin' at the end ๐Ÿซถ

guestfs_application2_list = len + val (struct guestfs_application2 *). and the by-now-ritual set: guestfs_compare_application2, guestfs_compare_application2_list, guestfs_copy_application2, guestfs_copy_application2_list, guestfs_free_application2, guestfs_free_application2_list. we been knew ๐Ÿ’…


๐ŸŽ€ guestfs_isoinfo

struct guestfs_isoinfo {
  char *iso_system_id;
  char *iso_volume_id;
  uint32_t iso_volume_space_size;
  uint32_t iso_volume_set_size;
  uint32_t iso_volume_sequence_number;
  uint32_t iso_logical_block_size;
  char *iso_volume_set_id;
  char *iso_publisher_id;
  char *iso_data_preparer_id;
  char *iso_application_id;
  char *iso_copyright_file_id;
  char *iso_abstract_file_id;
  char *iso_bibliographic_file_id;
  int64_t iso_volume_creation_t;
  int64_t iso_volume_modification_t;
  int64_t iso_volume_expiration_t;
  int64_t iso_volume_effective_t;
};

struct guestfs_isoinfo_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_isoinfo *val; /* Elements. */
};

int guestfs_compare_isoinfo (const struct guestfs_isoinfo *, const struct guestfs_isoinfo *);
int guestfs_compare_isoinfo_list (const struct guestfs_isoinfo_list *, const struct guestfs_isoinfo_list *);

struct guestfs_isoinfo *guestfs_copy_isoinfo (const struct guestfs_isoinfo *);
struct guestfs_isoinfo_list *guestfs_copy_isoinfo_list (const struct guestfs_isoinfo_list *);

void guestfs_free_isoinfo (struct guestfs_isoinfo *);
void guestfs_free_isoinfo_list (struct guestfs_isoinfo_list *);

ISO metadata, and she is detailed ๐Ÿ˜ญ every single field is iso_-prefixed because branding matters. the char * girlies: iso_system_id, iso_volume_id, iso_volume_set_id, iso_publisher_id, iso_data_preparer_id, iso_application_id, iso_copyright_file_id, iso_abstract_file_id, iso_bibliographic_file_id. the uint32_t four: iso_volume_space_size, iso_volume_set_size, iso_volume_sequence_number, iso_logical_block_size. and the four int64_t timestamps at the end: iso_volume_creation_t, iso_volume_modification_t, iso_volume_expiration_t, iso_volume_effective_t. dying at the _t suffixes, so cute ๐Ÿ“

guestfs_isoinfo_list: uint32_t len + struct guestfs_isoinfo * val. and yes: guestfs_compare_isoinfo, guestfs_compare_isoinfo_list, guestfs_copy_isoinfo, guestfs_copy_isoinfo_list, guestfs_free_isoinfo, guestfs_free_isoinfo_list. ๐Ÿ’–


๐ŸŒˆ guestfs_mdstat

struct guestfs_mdstat {
  char *mdstat_device;
  int32_t mdstat_index;
  char *mdstat_flags;
};

struct guestfs_mdstat_list {
  uint32_t len; /* Number of elements in list. */
  struct guestfs_mdstat *val; /* Elements. */
};

int guestfs_compare_mdstat (const struct guestfs_mdstat *, const struct guestfs_mdstat *);
int guestfs_compare_mdstat_list (const struct guestfs_mdstat_list *, const struct guestfs_mdstat_list *);

struct guestfs_mdstat *guestfs_copy_mdstat (const struct guestfs_mdstat *);
struct guestfs_mdstat_list *guestfs_copy_mdstat_list (const struct guestfs_mdstat_list *);

void guestfs_free_mdstat (struct guestfs_mdstat *);
void guestfs_free_mdstat_list (struct guestfs_mdstat_list *);

last up in this batch: mdstat ๐Ÿ’ซ only three fields and every single one is mdstat_-prefixed โ€” mdstat_device (char *), mdstat_index (int32_t), mdstat_flags (char *). short, sweet, on brand.

guestfs_mdstat_list keeps the len + val tradition alive (struct guestfs_mdstat * val), and the closing six-pack is guestfs_compare_mdstat, guestfs_compare_mdstat_list, guestfs_copy_mdstat, guestfs_copy_mdstat_list, guestfs_free_mdstat, guestfs_free_mdstat_list. and that's the struct tour so far bestie, stay tuned ๐Ÿซถโœจ

๐Ÿงš guestfs_btrfssubvolume ๐Ÿ’š

okay so every Btrfs subvolume you pull back arrives as one of these little cuties. bestie, it's literally just the id, the top-level id, and the path โ€” that's the whole vibe:

        struct guestfs_btrfssubvolume {
          uint64_t btrfssubvolume_id;
          uint64_t btrfssubvolume_top_level_id;
          char *btrfssubvolume_path;
        };

and bc one subvolume is never enough (when is it ever ๐Ÿ’€) here's the list wrapper, with the usual len and val duo:

        struct guestfs_btrfssubvolume_list {
          uint32_t len; /* Number of elements in list. */
          struct guestfs_btrfssubvolume *val; /* Elements. */
        };

then the little helper squad every struct gets โ€” compare, copy, free, and the _list versions of each. iconic behaviour, no notes:

        int guestfs_compare_btrfssubvolume (const struct guestfs_btrfssubvolume *, const struct guestfs_btrfssubvolume *);
        int guestfs_compare_btrfssubvolume_list (const struct guestfs_btrfssubvolume_list *, const struct guestfs_btrfssubvolume_list *);

        struct guestfs_btrfssubvolume *guestfs_copy_btrfssubvolume (const struct guestfs_btrfssubvolume *);
        struct guestfs_btrfssubvolume_list *guestfs_copy_btrfssubvolume_list (const struct guestfs_btrfssubvolume_list *);

        void guestfs_free_btrfssubvolume (struct guestfs_btrfssubvolume *);
        void guestfs_free_btrfssubvolume_list (struct guestfs_btrfssubvolume_list *);

๐Ÿ“ guestfs_btrfsqgroup ๐Ÿ’œ

qgroups!! quota groups!! this one carries a char * id plus the two numbers, rfer and excl. look at her go:

        struct guestfs_btrfsqgroup {
          char *btrfsqgroup_id;
          uint64_t btrfsqgroup_rfer;
          uint64_t btrfsqgroup_excl;
        };

and obvi the list version, same len + val energy:

        struct guestfs_btrfsqgroup_list {
          uint32_t len; /* Number of elements in list. */
          struct guestfs_btrfsqgroup *val; /* Elements. */
        };

helpers, slay:

        int guestfs_compare_btrfsqgroup (const struct guestfs_btrfsqgroup *, const struct guestfs_btrfsqgroup *);
        int guestfs_compare_btrfsqgroup_list (const struct guestfs_btrfsqgroup_list *, const struct guestfs_btrfsqgroup_list *);

        struct guestfs_btrfsqgroup *guestfs_copy_btrfsqgroup (const struct guestfs_btrfsqgroup *);
        struct guestfs_btrfsqgroup_list *guestfs_copy_btrfsqgroup_list (const struct guestfs_btrfsqgroup_list *);

        void guestfs_free_btrfsqgroup (struct guestfs_btrfsqgroup *);
        void guestfs_free_btrfsqgroup_list (struct guestfs_btrfsqgroup_list *);

๐ŸŒ€ guestfs_btrfsbalance ๐Ÿ’…

balance status reporting, and the way it gives you five fields โ€” a status string plus total, balanced, considered, and left. so many numbers, so little time ๐Ÿ˜ญ

        struct guestfs_btrfsbalance {
          char *btrfsbalance_status;
          uint64_t btrfsbalance_total;
          uint64_t btrfsbalance_balanced;
          uint64_t btrfsbalance_considered;
          uint64_t btrfsbalance_left;
        };

list wrapper, as ever:

        struct guestfs_btrfsbalance_list {
          uint32_t len; /* Number of elements in list. */
          struct guestfs_btrfsbalance *val; /* Elements. */
        };

and the helper trio, fr fr:

        int guestfs_compare_btrfsbalance (const struct guestfs_btrfsbalance *, const struct guestfs_btrfsbalance *);
        int guestfs_compare_btrfsbalance_list (const struct guestfs_btrfsbalance_list *, const struct guestfs_btrfsbalance_list *);

        struct guestfs_btrfsbalance *guestfs_copy_btrfsbalance (const struct guestfs_btrfsbalance *);
        struct guestfs_btrfsbalance_list *guestfs_copy_btrfsbalance_list (const struct guestfs_btrfsbalance_list *);

        void guestfs_free_btrfsbalance (struct guestfs_btrfsbalance *);
        void guestfs_free_btrfsbalance_list (struct guestfs_btrfsbalance_list *);

๐Ÿฆ‹ guestfs_btrfsscrub โœจ

buckle up bestie, this is the big one โ€” scrub results with fifteen whole counters. FIFTEEN. she ate and left zero crumbs ๐Ÿ‘‘

        struct guestfs_btrfsscrub {
          uint64_t btrfsscrub_data_extents_scrubbed;
          uint64_t btrfsscrub_tree_extents_scrubbed;
          uint64_t btrfsscrub_data_bytes_scrubbed;
          uint64_t btrfsscrub_tree_bytes_scrubbed;
          uint64_t btrfsscrub_read_errors;
          uint64_t btrfsscrub_csum_errors;
          uint64_t btrfsscrub_verify_errors;
          uint64_t btrfsscrub_no_csum;
          uint64_t btrfsscrub_csum_discards;
          uint64_t btrfsscrub_super_errors;
          uint64_t btrfsscrub_malloc_errors;
          uint64_t btrfsscrub_uncorrectable_errors;
          uint64_t btrfsscrub_unverified_errors;
          uint64_t btrfsscrub_corrected_errors;
          uint64_t btrfsscrub_last_physical;
        };

the list, lowkey a whole wall of scrub structs:

        struct guestfs_btrfsscrub_list {
          uint32_t len; /* Number of elements in list. */
          struct guestfs_btrfsscrub *val; /* Elements. */
        };

helpers, same deal:

        int guestfs_compare_btrfsscrub (const struct guestfs_btrfsscrub *, const struct guestfs_btrfsscrub *);
        int guestfs_compare_btrfsscrub_list (const struct guestfs_btrfsscrub_list *, const struct guestfs_btrfsscrub_list *);

        struct guestfs_btrfsscrub *guestfs_copy_btrfsscrub (const struct guestfs_btrfsscrub *);
        struct guestfs_btrfsscrub_list *guestfs_copy_btrfsscrub_list (const struct guestfs_btrfsscrub_list *);

        void guestfs_free_btrfsscrub (struct guestfs_btrfsscrub *);
        void guestfs_free_btrfsscrub_list (struct guestfs_btrfsscrub_list *);

๐ŸŒธ guestfs_xfsinfo ๐ŸŽ€

XFS stat vibes!! this struct is stacked โ€” mntpoint, inode size, agcount, agsize, sectsize, attr, blocksize, datablocks, imaxpct, sunit, swidth, dirversion, dirblocksize, cimode, logname, logblocksize, logblocks, logversion, logsectsize, logsunit, lazycount, rtname, rtextsize, rtblocks, rtextents. every single one of them, right here, don't skip a line:

        struct guestfs_xfsinfo {
          char *xfs_mntpoint;
          uint32_t xfs_inodesize;
          uint32_t xfs_agcount;
          uint32_t xfs_agsize;
          uint32_t xfs_sectsize;
          uint32_t xfs_attr;
          uint32_t xfs_blocksize;
          uint64_t xfs_datablocks;
          uint32_t xfs_imaxpct;
          uint32_t xfs_sunit;
          uint32_t xfs_swidth;
          uint32_t xfs_dirversion;
          uint32_t xfs_dirblocksize;
          uint32_t xfs_cimode;
          char *xfs_logname;
          uint32_t xfs_logblocksize;
          uint32_t xfs_logblocks;
          uint32_t xfs_logversion;
          uint32_t xfs_logsectsize;
          uint32_t xfs_logsunit;
          uint32_t xfs_lazycount;
          char *xfs_rtname;
          uint32_t xfs_rtextsize;
          uint64_t xfs_rtblocks;
          uint64_t xfs_rtextents;
        };

the list of them all:

        struct guestfs_xfsinfo_list {
          uint32_t len; /* Number of elements in list. */
          struct guestfs_xfsinfo *val; /* Elements. */
        };

helpers below, all present and accounted for ๐Ÿซถ

        int guestfs_compare_xfsinfo (const struct guestfs_xfsinfo *, const struct guestfs_xfsinfo *);
        int guestfs_compare_xfsinfo_list (const struct guestfs_xfsinfo_list *, const struct guestfs_xfsinfo_list *);

        struct guestfs_xfsinfo *guestfs_copy_xfsinfo (const struct guestfs_xfsinfo *);
        struct guestfs_xfsinfo_list *guestfs_copy_xfsinfo_list (const struct guestfs_xfsinfo_list *);

        void guestfs_free_xfsinfo (struct guestfs_xfsinfo *);
        void guestfs_free_xfsinfo_list (struct guestfs_xfsinfo_list *);

๐Ÿงต guestfs_utsname ๐Ÿ‘‘

the uname gang โ€” uts_sysname, uts_release, uts_version, uts_machine. four strings and a dream:

        struct guestfs_utsname {
          char *uts_sysname;
          char *uts_release;
          char *uts_version;
          char *uts_machine;
        };

the list:

        struct guestfs_utsname_list {
          uint32_t len; /* Number of elements in list. */
          struct guestfs_utsname *val; /* Elements. */
        };

helpers timeout:

        int guestfs_compare_utsname (const struct guestfs_utsname *, const struct guestfs_utsname *);
        int guestfs_compare_utsname_list (const struct guestfs_utsname_list *, const struct guestfs_utsname_list *);

        struct guestfs_utsname *guestfs_copy_utsname (const struct guestfs_utsname *);
        struct guestfs_utsname_list *guestfs_copy_utsname_list (const struct guestfs_utsname_list *);

        void guestfs_free_utsname (struct guestfs_utsname *);
        void guestfs_free_utsname_list (struct guestfs_utsname_list *);

๐Ÿ guestfs_hivex_node ๐Ÿ’›

hivex node!! single field, hivex_node_h, a int64_t. minimalist queen periodt:

        struct guestfs_hivex_node {
          int64_t hivex_node_h;
        };

list wrapper of nodes:

        struct guestfs_hivex_node_list {
          uint32_t len; /* Number of elements in list. */
          struct guestfs_hivex_node *val; /* Elements. */
        };

helpers, don't forget them:

        int guestfs_compare_hivex_node (const struct guestfs_hivex_node *, const struct guestfs_hivex_node *);
        int guestfs_compare_hivex_node_list (const struct guestfs_hivex_node_list *, const struct guestfs_hivex_node_list *);

        struct guestfs_hivex_node *guestfs_copy_hivex_node (const struct guestfs_hivex_node *);
        struct guestfs_hivex_node_list *guestfs_copy_hivex_node_list (const struct guestfs_hivex_node_list *);

        void guestfs_free_hivex_node (struct guestfs_hivex_node *);
        void guestfs_free_hivex_node_list (struct guestfs_hivex_node_list *);

๐Ÿง guestfs_hivex_value ๐Ÿฉท

same tiny energy, value edition โ€” just hivex_value_h in the building:

        struct guestfs_hivex_value {
          int64_t hivex_value_h;
        };

the list:

        struct guestfs_hivex_value_list {
          uint32_t len; /* Number of elements in list. */
          struct guestfs_hivex_value *val; /* Elements. */
        };

helpers ~chef's kiss~:

        int guestfs_compare_hivex_value (const struct guestfs_hivex_value *, const struct guestfs_hivex_value *);
        int guestfs_compare_hivex_value_list (const struct guestfs_hivex_value_list *, const struct guestfs_hivex_value_list *);

        struct guestfs_hivex_value *guestfs_copy_hivex_value (const struct guestfs_hivex_value *);
        struct guestfs_hivex_value_list *guestfs_copy_hivex_value_list (const struct guestfs_hivex_value_list *);

        void guestfs_free_hivex_value (struct guestfs_hivex_value *);
        void guestfs_free_hivex_value_list (struct guestfs_hivex_value_list *);

๐Ÿ”ฎ guestfs_internal_mountable ๐ŸŒˆ

this one's got im_type (an int32_t), plus im_device and im_volume. three fields, internal-mountable realness:

        struct guestfs_internal_mountable {
          int32_t im_type;
          char *im_device;
          char *im_volume;
        };

list version, obviously:

        struct guestfs_internal_mountable_list {
          uint32_t len; /* Number of elements in list. */
          struct guestfs_internal_mountable *val; /* Elements. */
        };

the helper squad:

        int guestfs_compare_internal_mountable (const struct guestfs_internal_mountable *, const struct guestfs_internal_mountable *);
        int guestfs_compare_internal_mountable_list (const struct guestfs_internal_mountable_list *, const struct guestfs_internal_mountable_list *);

        struct guestfs_internal_mountable *guestfs_copy_internal_mountable (const struct guestfs_internal_mountable *);
        struct guestfs_internal_mountable_list *guestfs_copy_internal_mountable_list (const struct guestfs_internal_mountable_list *);

        void guestfs_free_internal_mountable (struct guestfs_internal_mountable *);
        void guestfs_free_internal_mountable_list (struct guestfs_internal_mountable_list *);

๐Ÿ’€ guestfs_tsk_dirent ๐Ÿ•ต๏ธ

the Sleuth Kit dirent, and she is thicc. inode, type, size, name, flags, then atime/mtime/ctime/crtime each with _sec and _nsec, then nlink, link, and tsk_spare1. seventeen fields of forensic excellence, bestie:

        struct guestfs_tsk_dirent {
          uint64_t tsk_inode;
          char tsk_type;
          int64_t tsk_size;
          char *tsk_name;
          uint32_t tsk_flags;
          int64_t tsk_atime_sec;
          int64_t tsk_atime_nsec;
          int64_t tsk_mtime_sec;
          int64_t tsk_mtime_nsec;
          int64_t tsk_ctime_sec;
          int64_t tsk_ctime_nsec;
          int64_t tsk_crtime_sec;
          int64_t tsk_crtime_nsec;
          int64_t tsk_nlink;
          char *tsk_link;
          int64_t tsk_spare1;
        };

list of dirents:

        struct guestfs_tsk_dirent_list {
          uint32_t len; /* Number of elements in list. */
          struct guestfs_tsk_dirent *val; /* Elements. */
        };

helpers, we love to see it:

        int guestfs_compare_tsk_dirent (const struct guestfs_tsk_dirent *, const struct guestfs_tsk_dirent *);
        int guestfs_compare_tsk_dirent_list (const struct guestfs_tsk_dirent_list *, const struct guestfs_tsk_dirent_list *);

        struct guestfs_tsk_dirent *guestfs_copy_tsk_dirent (const struct guestfs_tsk_dirent *);
        struct guestfs_tsk_dirent_list *guestfs_copy_tsk_dirent_list (const struct guestfs_tsk_dirent_list *);

        void guestfs_free_tsk_dirent (struct guestfs_tsk_dirent *);
        void guestfs_free_tsk_dirent_list (struct guestfs_tsk_dirent_list *);

๐ŸŒŸ guestfs_yara_detection ๐Ÿงš

yara detections!! a yara_name and a yara_rule, two lil strings catching malware red-handed no cap:

        struct guestfs_yara_detection {
          char *yara_name;
          char *yara_rule;
        };

and the list, len + val as always:

        struct guestfs_yara_detection_list {
          uint32_t len; /* Number of elements in list. */
          struct guestfs_yara_detection *val; /* Elements. */
        };

the compare helpers for this one:

        int guestfs_compare_yara_detection (const struct guestfs_yara_detection *, const struct guestfs_yara_detection *);
        int guestfs_compare_yara_detection_list (const struct guestfs_yara_detection_list *, const struct guestfs_yara_detection_list *);
        struct guestfs_yara_detection *guestfs_copy_yara_detection (const struct guestfs_yara_detection *);
        struct guestfs_yara_detection_list *guestfs_copy_yara_detection_list (const struct guestfs_yara_detection_list *);

        void guestfs_free_yara_detection (struct guestfs_yara_detection *);
        void guestfs_free_yara_detection_list (struct guestfs_yara_detection_list *);

โœจ AVAILABILITY โœจ

๐Ÿงš GROUPS OF FUNCTIONALITY IN THE APPLIANCE

Okay so bestie, listen โ€” using guestfs_available you can literally test if the following groups of functions are available. โœจ How? It goes and asks the appliance directly, like "hey girl, do you actually support this?" and the appliance you're currently using answers. Iconic behaviour, honestly.

Here's the whole menu of groups:

  • acl โ€” the following functions: guestfs_acl_delete_def_file, guestfs_acl_get_file, guestfs_acl_set_file
  • blkdiscard โ€” the following functions: guestfs_blkdiscard
  • blkdiscardzeroes โ€” the following functions: guestfs_blkdiscardzeroes
  • btrfs โ€” the following functions: guestfs_btrfs_balance_cancel, guestfs_btrfs_balance_pause, guestfs_btrfs_balance_resume, guestfs_btrfs_balance_status, guestfs_btrfs_device_add, guestfs_btrfs_device_delete, guestfs_btrfs_filesystem_balance, guestfs_btrfs_filesystem_defragment, guestfs_btrfs_filesystem_resize, guestfs_btrfs_filesystem_show, guestfs_btrfs_filesystem_sync, guestfs_btrfs_fsck, guestfs_btrfs_image, guestfs_btrfs_qgroup_assign, guestfs_btrfs_qgroup_create, guestfs_btrfs_qgroup_destroy, guestfs_btrfs_qgroup_limit, guestfs_btrfs_qgroup_remove, guestfs_btrfs_qgroup_show, guestfs_btrfs_quota_enable, guestfs_btrfs_quota_rescan, guestfs_btrfs_replace, guestfs_btrfs_rescue_chunk_recover, guestfs_btrfs_rescue_super_recover, guestfs_btrfs_scrub_cancel, guestfs_btrfs_scrub_full, guestfs_btrfs_scrub_resume, guestfs_btrfs_scrub_start, guestfs_btrfs_scrub_status, guestfs_btrfs_set_seeding, guestfs_btrfs_subvolume_create, guestfs_btrfs_subvolume_delete, guestfs_btrfs_subvolume_get_default, guestfs_btrfs_subvolume_list, guestfs_btrfs_subvolume_set_default, guestfs_btrfs_subvolume_show, guestfs_btrfs_subvolume_snapshot, guestfs_btrfstune_enable_extended_inode_refs, guestfs_btrfstune_enable_skinny_metadata_extent_refs, guestfs_btrfstune_seeding, guestfs_mkfs_btrfs
  • clevisluks โ€” the following functions: guestfs_clevis_luks_unlock
  • extlinux โ€” the following functions: guestfs_extlinux
  • f2fs โ€” the following functions: guestfs_f2fs_expand
  • fstrim โ€” the following functions: guestfs_fstrim
  • gdisk โ€” the following functions: guestfs_part_expand_gpt
  • grub โ€” the following functions: guestfs_grub_install
  • hivex โ€” the following functions: guestfs_hivex_close, guestfs_hivex_commit, guestfs_hivex_node_add_child, guestfs_hivex_node_children, guestfs_hivex_node_delete_child, guestfs_hivex_node_get_child, guestfs_hivex_node_get_value, guestfs_hivex_node_name, guestfs_hivex_node_parent, guestfs_hivex_node_set_value, guestfs_hivex_node_values, guestfs_hivex_open, guestfs_hivex_root, guestfs_hivex_value_key, guestfs_hivex_value_string, guestfs_hivex_value_type, guestfs_hivex_value_utf8, guestfs_hivex_value_value
  • inotify โ€” the following functions: guestfs_inotify_add_watch, guestfs_inotify_close, guestfs_inotify_files, guestfs_inotify_init, guestfs_inotify_read, guestfs_inotify_rm_watch
  • journal โ€” the following functions: guestfs_internal_journal_get, guestfs_journal_close, guestfs_journal_get_data_threshold, guestfs_journal_get_realtime_usec, guestfs_journal_next, guestfs_journal_open, guestfs_journal_set_data_threshold, guestfs_journal_skip
  • ldm โ€” the following functions: guestfs_ldmtool_create_all, guestfs_ldmtool_diskgroup_disks, guestfs_ldmtool_diskgroup_name, guestfs_ldmtool_diskgroup_volumes, guestfs_ldmtool_remove_all, guestfs_ldmtool_scan, guestfs_ldmtool_scan_devices, guestfs_ldmtool_volume_hint, guestfs_ldmtool_volume_partitions, guestfs_ldmtool_volume_type, guestfs_list_ldm_partitions, guestfs_list_ldm_volumes
  • libtsk โ€” the following functions: guestfs_internal_filesystem_walk, guestfs_internal_find_inode
  • libyara โ€” the following functions: guestfs_internal_yara_scan, guestfs_yara_destroy, guestfs_yara_load
  • linuxcaps โ€” the following functions: guestfs_cap_get_file, guestfs_cap_set_file
  • linuxfsuuid โ€” the following functions: guestfs_mke2fs_JU, guestfs_mke2journal_U, guestfs_mkswap_U, guestfs_swapoff_uuid, guestfs_swapon_uuid
  • linuxmodules โ€” the following functions: guestfs_modprobe
  • linuxxattrs โ€” the following functions: guestfs_getxattr, guestfs_getxattrs, guestfs_internal_lxattrlist, guestfs_lgetxattr, guestfs_lgetxattrs, guestfs_lremovexattr, guestfs_lsetxattr, guestfs_removexattr, guestfs_setxattr
  • luks โ€” the following functions: guestfs_cryptsetup_close, guestfs_cryptsetup_open, guestfs_luks_add_key, guestfs_luks_close, guestfs_luks_format, guestfs_luks_format_cipher, guestfs_luks_kill_slot, guestfs_luks_open, guestfs_luks_open_ro, guestfs_luks_uuid
  • lvm2 โ€” the following functions: guestfs_lvcreate, guestfs_lvcreate_free, guestfs_lvm_remove_all, guestfs_lvm_set_filter, guestfs_lvremove, guestfs_lvresize, guestfs_lvresize_free, guestfs_lvs, guestfs_lvs_full, guestfs_pvchange_uuid, guestfs_pvchange_uuid_all, guestfs_pvcreate, guestfs_pvremove, guestfs_pvresize, guestfs_pvresize_size, guestfs_pvs, guestfs_pvs_full, guestfs_vg_activate, guestfs_vg_activate_all, guestfs_vgchange_uuid, guestfs_vgchange_uuid_all, guestfs_vgcreate, guestfs_vgmeta, guestfs_vgremove, guestfs_vgs, guestfs_vgs_full
  • mdadm โ€” the following functions: guestfs_md_create, guestfs_md_detail, guestfs_md_stat, guestfs_md_stop
  • mknod โ€” the following functions: guestfs_mkfifo, guestfs_mknod, guestfs_mknod_b, guestfs_mknod_c
  • ntfs3g โ€” the following functions: guestfs_ntfs_3g_probe, guestfs_ntfs_chmod, guestfs_ntfsclone_in, guestfs_ntfsclone_out, guestfs_ntfsfix
  • ntfsprogs โ€” the following functions: guestfs_ntfsresize, guestfs_ntfsresize_size
  • rsync โ€” the following functions: guestfs_rsync, guestfs_rsync_in, guestfs_rsync_out
  • scrub โ€” the following functions: guestfs_scrub_device, guestfs_scrub_file, guestfs_scrub_freespace
  • selinux โ€” the following functions: guestfs_getcon, guestfs_setcon
  • selinuxrelabel โ€” the following functions: guestfs_selinux_relabel, guestfs_setfiles
  • sleuthkit โ€” the following functions: guestfs_download_blocks, guestfs_download_inode
  • squashfs โ€” the following functions: guestfs_mksquashfs
  • syslinux โ€” the following functions: guestfs_syslinux
  • wipefs โ€” the following functions: guestfs_wipefs
  • xfs โ€” the following functions: guestfs_xfs_admin, guestfs_xfs_growfs, guestfs_xfs_info, guestfs_xfs_info2, guestfs_xfs_repair
  • xz โ€” the following functions: guestfs_txz_in, guestfs_txz_out
  • zerofree โ€” the following functions: guestfs_zerofree

Like, that's a lot of groups, but every single one of them matters, okay? ๐Ÿ’…


๐Ÿฆ‹ FILESYSTEM AVAILABLE

The guestfs_filesystem_available call tests whether a filesystem type is supported by the appliance kernel. So like, "is this filesystem even a thing in here?" ๐Ÿง

Bestie, this is mainly useful as a negative test. Read that again. If this returns true, it doesn't mean that a particular filesystem can be mounted โ€” because filesystems can fail for other reasons too, such as it being a later version of the filesystem, or having incompatible features. So true โ‰  "you're so good to go", it just means "not ruled out". ๐Ÿ˜ญ


๐ŸŽ€ GUESTFISH supported COMMAND

Over in guestfish(3) there's a handy interactive command called supported which prints out the available groups and whether they're supported by this build of libguestfs. Cute, right? ๐ŸŒธ

Note however that you have to do run first. Like, run first, then supported. Don't skip the run, bestie, it won't work and you'll be sad. ๐Ÿ™ˆ

โญ SINGLE CALLS AT COMPILE TIME

Since version 1.5.8, <guestfs.h> defines symbols for each C API function, such as:

 #define GUESTFS_HAVE_DD 1

...if guestfs_dd is available. Slay. โœจ

Before version 1.5.8, if you needed to test whether a single libguestfs function is available at compile time, we recommended using build tools such as autoconf or cmake. Like, for example in autotools you could use:

 AC_CHECK_LIB([guestfs],[guestfs_create])
 AC_CHECK_FUNCS([guestfs_dd])

which would result in HAVE_GUESTFS_DD being either defined or not defined in your program. That's it, that's the whole trick. ๐Ÿซถ


๐Ÿ’œ SINGLE CALLS AT RUN TIME

Okay so here's the tea: testing at compile time doesn't guarantee that a function really exists in the library. Why? Because you might be dynamically linked against a previous libguestfs.so (dynamic library) which doesn't have the call. ๐Ÿ˜ญ And this situation unfortunately results in a segmentation fault, which is a shortcoming of the C dynamic linking system itself. Not you, bestie โ€” the linker. ๐Ÿ’€

You can use dlopen(3) to test if a function is available at run time, as in this example program (note that you still need the compile time check as well):

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dlfcn.h>
#include <guestfs.h>

main ()
{
#ifdef GUESTFS_HAVE_DD
  void *dl;
  int has_function;

  /* Test if the function guestfs_dd is really available. */
  dl = dlopen (NULL, RTLD_LAZY);
  if (!dl) {
    fprintf (stderr, "dlopen: %s\n", dlerror ());
    exit (EXIT_FAILURE);
  }
  has_function = dlsym (dl, "guestfs_dd") != NULL;
  dlclose (dl);

  if (!has_function)
    printf ("this libguestfs.so does NOT have guestfs_dd function\n");
  else {
    printf ("this libguestfs.so has guestfs_dd function\n");
    /* Now it's safe to call
    guestfs_dd (g, "foo", "bar");
    */
  }
#else
  printf ("guestfs_dd function was not found at compile time\n");
#endif
 }

And you may think the above is an awful lot of hassle, and it is. No cap. ๐Ÿ˜ญ There are other ways outside of the C linking system to ensure that this kind of incompatibility never arises, such as using package versioning:

 Requires: libguestfs >= 1.0.80

Which is honestly the move โ€” let the package manager handle the drama so you don't have to. ๐Ÿ”ฅ

โœจ CALLS WITH OPTIONAL ARGUMENTS โœจ

okay so bestie, this is one of the newer glow-ups in the API: calls that take optional arguments. ๐Ÿ’… In C they get declared three whole ways, and the main one is as a variable-argument call (like, with the ...), super iconic:

int guestfs_add_drive_opts (guestfs_h *g, const char *filename, ...);

You call it with a whole little list of optional args, and the list is terminated by -1 โ€” like a vibe check that ends the party. ๐ŸŽ€ So calling it with, like, zero optional args specified:

guestfs_add_drive_opts (g, filename, -1);

With exactly one optional argument:

guestfs_add_drive_opts (g, filename,
                        GUESTFS_ADD_DRIVE_OPTS_FORMAT, "qcow2",
                        -1);

With two:

guestfs_add_drive_opts (g, filename,
                        GUESTFS_ADD_DRIVE_OPTS_FORMAT, "qcow2",
                        GUESTFS_ADD_DRIVE_OPTS_READONLY, 1,
                        -1);

and so forth, on and on, the list goes on. ๐Ÿ’€ Don't forget the terminating -1 otherwise Bad Things will happen! Not even joking, that's literally what the manpage says โ€” do NOT leave it off. ๐Ÿซถ

๐ŸŒธ USING va_list FOR OPTIONAL ARGUMENTS ๐ŸŒธ

The second variant has the same name with the suffix "_va" slapped on the end โ€” it works the exact same way but takes a "va_list" instead. Peep the C manual for the deets. For our example function, it's declared like this:

int guestfs_add_drive_opts_va (guestfs_h *g, const char *filename,
                               va_list args);

๐Ÿฆ‹ CONSTRUCTING OPTIONAL ARGUMENTS ๐Ÿฆ‹

The third variant is the one you want when you need to construct these calls yourself. You pass in a structure where you fill in the optional fields. โœจ The structure has a bitmask as the first element which you must set to indicate which fields you've filled in โ€” it's giving "checklist but make it binary". For our example function the structure and call are declared:

struct guestfs_add_drive_opts_argv {
  uint64_t bitmask;
  int readonly;
  const char *format;
  /* ... */
};
int guestfs_add_drive_opts_argv (guestfs_h *g, const char *filename,
             const struct guestfs_add_drive_opts_argv *optargs);

And you could call it, like, this way:

struct guestfs_add_drive_opts_argv optargs = {
  .bitmask = GUESTFS_ADD_DRIVE_OPTS_READONLY_BITMASK |
             GUESTFS_ADD_DRIVE_OPTS_FORMAT_BITMASK,
  .readonly = 1,
  .format = "qcow2"
};

guestfs_add_drive_opts_argv (g, filename, &optargs);

Notes, bestie, take notes: ๐Ÿ“

  • The "_BITMASK" suffix goes on each option name when you're specifying the bitmask.
  • You do not need to fill in all fields of the structure. Only the ones you actually care about. Slay.
  • There must be a one-to-one correspondence between the fields of the structure that are filled in, and the bits set in the bitmask. Like, matched set. Periodt. ๐Ÿ‘‘

๐Ÿงš OPTIONAL ARGUMENTS IN OTHER LANGUAGES ๐Ÿงš

In other languages, optional arguments are expressed in whatever way is natural for that language โ€” no forcing C vibes on everyone. We refer you to the language-specific documentation for more details on that. ๐Ÿ’œ

For guestfish, see "OPTIONAL ARGUMENTS" in guestfish(1).


๐Ÿ”ฅ EVENTS ๐Ÿ”ฅ

๐ŸŽ€ SETTING CALLBACKS TO HANDLE EVENTS ๐ŸŽ€

Note: This section documents the generic event mechanism introduced in libguestfs 1.10, which you should use in new code if possible. The old functions "guestfs_set_log_message_callback", "guestfs_set_subprocess_quit_callback", "guestfs_set_launch_done_callback", "guestfs_set_close_callback" and "guestfs_set_progress_callback" are no longer documented in this manual page. Because of the ABI guarantee, the old functions continue to work. ๐Ÿซถ

Handles generate events when certain things happen โ€” like log messages being generated, progress messages during long-running operations, or the handle being closed. The API calls described below let you register a callback to be called when events happen. You can register multiple callbacks (for the same, different or overlapping sets of events), and individually remove callbacks. If callbacks are not removed, then they remain in force until the handle is closed. lowkey permanent roommates ๐Ÿ’€

In the current implementation, events are only generated synchronously: that means that events (and hence callbacks) can only happen while you're in the middle of making another libguestfs call. The callback is called in the same thread. No cap.

Events may contain a payload โ€” usually nothing (void), an array of 64 bit unsigned integers, or a message buffer. Payloads are discussed later on. ๐Ÿ‘€

๐ŸŒˆ CLASSES OF EVENTS ๐ŸŒˆ

๐ŸŒธ GUESTFS_EVENT_CLOSE (payload type: void) ๐ŸŒธ

The callback function will be called while the handle is being closed (synchronously from "guestfs_close").

Note that libguestfs installs an atexit(3) handler to try to clean up handles that are open when the program exits. This means that this callback might be called indirectly from exit(3), which can cause unexpected problems in higher-level languages (eg. if your HLL interpreter has already been cleaned up by the time this is called, and if your callback then jumps into some HLL function). ๐Ÿ˜ญ yeah that's a whole mess.

If no callback is registered: the handle is closed without any callback being invoked.

๐Ÿฆ‹ GUESTFS_EVENT_SUBPROCESS_QUIT (payload type: void) ๐Ÿฆ‹

The callback function will be called when the child process quits, either asynchronously or if killed by "guestfs_kill_subprocess". (This corresponds to a transition from any state to the CONFIG state).

If no callback is registered: the event is ignored.

๐Ÿ’œ GUESTFS_EVENT_LAUNCH_DONE (payload type: void) ๐Ÿ’œ

The callback function 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).

If no callback is registered: the event is ignored.

โญ GUESTFS_EVENT_PROGRESS (payload type: array of 4 x uint64_t) โญ

Some long-running operations can generate progress messages. If this callback is registered, then it will be called each time a progress message is generated (usually two seconds after the operation started, and three times per second thereafter until it completes, although the frequency may change in future versions). ๐Ÿ•

The callback receives in the payload four unsigned 64 bit numbers which are (in order): "proc_nr", "serial", "position", "total".

The units of "total" are not defined, although for some operations "total" may relate in some way to the amount of data to be transferred (eg. in bytes or megabytes), and "position" may be the portion which has been transferred.

The only defined and stable parts of the API are:

  • The callback can display to the user some type of progress bar or indicator which shows the ratio of "position":"total".
  • 0 <= "position" <= "total"
  • If any progress notification is sent during a call, then a final progress notification is always sent when "position" = "total" (unless the call fails with an error).

This is to simplify caller code, so callers can easily set the progress indicator to "100%" at the end of the operation, without requiring special code to detect this case. ๐Ÿ’ฏ

  • For some calls we are unable to estimate the progress of the call, but we can still generate progress messages to indicate activity. This is known as "pulse mode", and is directly supported by certain progress bar implementations (eg. GtkProgressBar).

For these calls, zero or more progress messages are generated with "position = 0" and "total = 1", followed by a final message with "position = total = 1".

As noted above, if the call fails with an error then the final message may not be generated.

The callback also receives the procedure number ("proc_nr") and serial number ("serial") of the call. These are only useful for debugging protocol issues, and the callback can normally ignore them. The callback may want to print these numbers in error messages or debugging messages.

If no callback is registered: progress messages are discarded.

๐Ÿ“ GUESTFS_EVENT_APPLIANCE (payload type: message buffer) ๐Ÿ“

The callback function is called whenever a log message is generated by qemu, the appliance kernel, guestfsd (daemon), or utility programs.

If the verbose flag ("guestfs_set_verbose") is set before launch ("guestfs_launch") then additional debug messages are generated.

If no callback is registered: the messages are discarded unless the verbose flag is set in which case they are sent to stderr. You can override the printing of verbose messages to stderr by setting up a callback.

๐Ÿงš GUESTFS_EVENT_LIBRARY (payload type: message buffer) ๐Ÿงš

The callback function is called whenever a log message is generated by the library part of libguestfs.

If the verbose flag ("guestfs_set_verbose") is set then additional debug messages are generated.

If no callback is registered: the messages are discarded unless the verbose flag is set in which case they are sent to stderr. You can override the printing of verbose messages to stderr by setting up a callback.

๐Ÿ’… GUESTFS_EVENT_WARNING (payload type: message buffer) ๐Ÿ’…

The callback function is called whenever a warning message is generated by the library part of libguestfs.

If no callback is registered: the messages are printed to stderr. You can override the printing of warning messages to stderr by setting up a callback.

๐Ÿ‘‘ GUESTFS_EVENT_TRACE (payload type: message buffer) ๐Ÿ‘‘

The callback function is called whenever a trace message is generated. This only applies if the trace flag ("guestfs_set_trace") is set.

If no callback is registered: the messages are sent to stderr. You can override the printing of trace messages to stderr by setting up a callback.

๐ŸŽ€ GUESTFS_EVENT_ENTER (payload type: function name) ๐ŸŽ€

The callback function is called whenever a libguestfs function is entered.

The payload is a string which contains the name of the function that we are entering (not including "guestfs_" prefix).

Note that libguestfs functions can call themselves, so you may see many events from a single call. A few libguestfs functions do not generate this event.

If no callback is registered: the event is ignored.

๐Ÿ’œ GUESTFS_EVENT_LIBVIRT_AUTH (payload type: libvirt URI) ๐Ÿ’œ

For any API function that opens a libvirt connection, this event may be generated to indicate that libvirt demands authentication information. See "LIBVIRT AUTHENTICATION" below.

If no callback is registered: "virConnectAuthPtrDefault" is used (suitable for command-line programs only). ๐Ÿ”

๐ŸŒŸ EVENT API ๐ŸŒŸ

guestfs_set_event_callback

...okay so guestfs_set_event_callback is the function that actually hooks you up to the event stream, and here's its whole deal:

        int guestfs_set_event_callback (guestfs_h *g,
                                        guestfs_event_callback cb,
                                        uint64_t event_bitmask,
                                        int flags,
                                        void *opaque);

This function registers a callback (cb) for all event classes in the event_bitmask. ๐Ÿ’…

So say you wanted to catch literally every log message event โ€” you'd call this with the bitmask GUESTFS_EVENT_APPLIANCE|GUESTFS_EVENT_LIBRARY|GUESTFS_EVENT_WARNING. And if you want one single callback to grab all the possible classes of events? Use GUESTFS_EVENT_ALL, bestie. ๐ŸŽ€

flags should always be passed as 0. Like, always. Don't get creative.

opaque is an opaque pointer which is passed to the callback โ€” use it for literally any purpose you want, it's your little vibe carrier. ๐ŸŒธ

The return value is the event handle (an integer) which you can use to delete the callback (see below, it's coming, patience ๐Ÿ’œ).

If there's an error, this function returns -1, and sets the error in the handle in the usual way (see guestfs_last_error etc. โ€” the whole error-handling saga).

Callbacks remain in effect until they are deleted, or until the handle is closed. Periodt. ๐Ÿ‘‘

In the case where multiple callbacks are registered for a particular event class, all of the callbacks are called. The order in which multiple callbacks are called is not defined โ€” so don't build your whole house on that ordering, okay? ๐Ÿ˜ญ


๐Ÿ—‘๏ธ guestfs_delete_event_callback

 void guestfs_delete_event_callback (guestfs_h *g, int event_handle);

Delete a callback that was previously registered. event_handle should be the integer that was returned by a previous call to guestfs_set_event_callback on the same handle. Simple as that, no cap. โœจ


๐Ÿ”ค guestfs_event_to_string

 char *guestfs_event_to_string (uint64_t event);

event is either a single event or a bitmask of events. This returns a string representation โ€” super useful for debugging or printing events. ๐Ÿฆ‹

A single event is returned as the name in lower case, eg. close.

A bitmask of several events is returned as a comma-separated list, eg. close,progress.

If zero is passed, then the empty string "" is returned. Iconic, honestly.

On success this returns a string. On error it returns NULL and sets errno.

The returned string must be freed by the caller. Don't let it leak, bestie, free your strings. ๐Ÿงš


๐Ÿซถ guestfs_event_callback

 typedef void (*guestfs_event_callback) (
                         guestfs_h *g,
                         void *opaque,
                         uint64_t event,
                         int event_handle,
                         int flags,
                         const char *buf, size_t buf_len,
                         const uint64_t *array, size_t array_len);

This is the type of the event callback function that you have to provide. Your homework. ๐Ÿ“

The basic parameters are: the handle (g), the opaque user pointer (opaque), the event class (eg. GUESTFS_EVENT_PROGRESS), the event handle, and flags which in the current API you should ignore. Like, just don't look at it. ๐Ÿ™ˆ

The remaining parameters contain the event payload (if any). Each event may contain a payload, which usually relates to the event class, but for future proofing your code should be written to handle any payload for any event class. Lowkey important โ€” don't assume, just handle. ๐Ÿ’…

buf and buf_len contain a message buffer (if buf_len == 0, then there is no message buffer). Note that this message buffer can contain arbitrary 8 bit data, including NUL bytes. So no, you can't just treat it like a cute little C string. ๐Ÿ˜ญ

array and array_len is an array of 64 bit unsigned integers. At the moment this is only used for progress messages. ๐Ÿ”ฅ


๐Ÿ’– EXAMPLE: CAPTURING LOG MESSAGES

A working program demonstrating this can be found in examples/debug-logging.c in the source of libguestfs. Go look, it's giving reference implementation.

One motivation for the generic event API was to allow GUI programs to capture debug and other messages. In libguestfs โ‰ค 1.8 these were sent unconditionally to stderr โ€” yeah, straight to stderr, no filter, no consent. ๐Ÿ˜ญ

Events associated with log messages are: GUESTFS_EVENT_LIBRARY, GUESTFS_EVENT_APPLIANCE, GUESTFS_EVENT_WARNING and GUESTFS_EVENT_TRACE. (Note that error messages are not events; you must capture error messages separately โ€” yes, separately, I know, tragic.)

Programs have to set up a callback to capture the classes of events of interest:

 int eh =
   guestfs_set_event_callback
     (g, message_callback,
      GUESTFS_EVENT_LIBRARY | GUESTFS_EVENT_APPLIANCE |
      GUESTFS_EVENT_WARNING | GUESTFS_EVENT_TRACE,
      0, NULL) == -1)
 if (eh == -1) {
   // handle error in the usual way
 }

The callback can then direct messages to the appropriate place. In this example, messages are directed to syslog. โœจ

 static void
 message_callback (
         guestfs_h *g,
         void *opaque,
         uint64_t event,
         int event_handle,
         int flags,
         const char *buf, size_t buf_len,
         const uint64_t *array, size_t array_len)
 {
   const int priority = LOG_USER|LOG_INFO;
   if (buf_len > 0)
     syslog (priority, "event 0x%lx: %s", event, buf);
 }

๐Ÿ” LIBVIRT AUTHENTICATION

Some libguestfs API calls can open libvirt connections. Currently the only ones are guestfs_add_domain; and guestfs_launch if the libvirt backend has been selected. Libvirt connections may require authentication โ€” for example if they need to access a remote server or to access root services from non-root. Libvirt authentication happens via a callback mechanism, see http://libvirt.org/guide/html/Application_Development_Guide-Connections.html for the full lore. ๐Ÿ“–

You may provide libvirt authentication data by registering a callback for events of type GUESTFS_EVENT_LIBVIRT_AUTH. ๐Ÿ‘‘

If no such event is registered, then libguestfs uses a libvirt function that provides command-line prompts (virConnectAuthPtrDefault). This is only suitable for command-line libguestfs programs. Like, if you're a GUI, this is not it. ๐Ÿ™ˆ

To provide authentication, first call guestfs_set_libvirt_supported_credentials with the list of credentials your program knows how to provide. Second, register a callback for the GUESTFS_EVENT_LIBVIRT_AUTH event. The event handler will be called when libvirt is requesting authentication information. Two steps, you got this. ๐Ÿซถ

In the event handler, call guestfs_get_libvirt_requested_credentials to get a list of the credentials that libvirt is asking for. You then need to ask (eg. the user) for each credential, and call guestfs_set_libvirt_requested_credential with the answer. Note that for each credential, additional information may be available via the calls guestfs_get_libvirt_requested_credential_prompt, guestfs_get_libvirt_requested_credential_challenge or guestfs_get_libvirt_requested_credential_defresult.

The example program below should make this clearer. ๐Ÿ’œ

There is also a more substantial working example program supplied with the libguestfs sources, called libvirt-auth.c. Iconic.

 main ()
 {
   guestfs_h *g;
   char *creds[] = { "authname", "passphrase", NULL };
   int r, eh;

   g = guestfs_create ();
   if (!g) exit (EXIT_FAILURE);

   /* Tell libvirt what credentials the program supports. */
   r = guestfs_set_libvirt_supported_credentials (g, creds);
   if (r == -1)
     exit (EXIT_FAILURE);

   /* Set up the event handler. */
   eh = guestfs_set_event_callback (
       g, do_auth,
       GUESTFS_EVENT_LIBVIRT_AUTH, 0, NULL);
   if (eh == -1)
     exit (EXIT_FAILURE);

   /* An example of a call that may ask for credentials. */
   r = guestfs_add_domain (
       g, "dom",
       GUESTFS_ADD_DOMAIN_LIBVIRTURI, "qemu:///system",
       -1);
   if (r == -1)
     exit (EXIT_FAILURE);

   exit (EXIT_SUCCESS);
 }
 static void
 do_auth (guestfs_h *g,
          void *opaque,
          uint64_t event,
          int event_handle,
          int flags,
          const char *buf, size_t buf_len,
          const uint64_t *array, size_t array_len)
 {
   char **creds;
   size_t i;
   char *prompt;
   char *reply;
   size_t replylen;
   int r;

   // buf will be the libvirt URI.  buf_len may be ignored.
   printf ("Authentication required for libvirt conn '%s'\n",
           buf);

   // Ask libguestfs what credentials libvirt is demanding.
   creds = guestfs_get_libvirt_requested_credentials (g);
   if (creds == NULL)
     exit (EXIT_FAILURE);

   // Now ask the user for answers.
   for (i = 0; creds[i] != NULL; ++i)
   {
     if (strcmp (creds[i], "authname") == 0 ||
         strcmp (creds[i], "passphrase") == 0)
     {
       prompt =
         guestfs_get_libvirt_requested_credential_prompt (g, i);
       if (prompt && strcmp (prompt, "") != 0)
         printf ("%s: ", prompt);
       free (prompt);

       // Some code here to ask for the credential.
       // ...
       // Put the reply in 'reply', length 'replylen' (bytes).

      r = guestfs_set_libvirt_requested_credential (g, i,
          reply, replylen);
      if (r == -1)
        exit (EXIT_FAILURE);
     }

     free (creds[i]);
   }

   free (creds);
 }

๐Ÿ›‘ CANCELLING LONG TRANSFERS

Some operations can be cancelled by the caller while they are in progress. Currently only operations that involve uploading or downloading data can be cancelled (technically: operations that have FileIn or FileOut parameters in the generator). So like, big transfers, not just every random call. ๐Ÿ’…

To cancel the transfer, call guestfs_user_cancel. For more information, read the description of guestfs_user_cancel โ€” it's got the whole story. โœจ

๐Ÿซถ PRIVATE DATA AREA ๐Ÿซถ

okay so this is genuinely one of the cutest little features: you can stick named lil' pieces of private data onto the libguestfs handle, grab them back by name, and walk over all of them โ€” and they live for the whole lifetime of the handle. ๐Ÿ’–

Heads up bestie: this is called the private data area and it's only available from the C API. No cap.

To attach a named piece of data, use this call:

void guestfs_set_private (guestfs_h *g, const char *key, void *data);

key is the name you're associating with this data, and data is an arbitrary pointer (which can be NULL). Any previous item with the same key gets overwritten โ€” boom, gone, she's replaced. ๐Ÿ’…

You can use literally any key string you want, but avoid keys beginning with an underscore character (libguestfs uses those for its own internal purposes, like implementing language bindings). It's recommended that you prefix the key with some unique string so you don't collide with other users. ๐ŸŽ€

To retrieve the pointer, use:

void *guestfs_get_private (guestfs_h *g, const char *key);

This function returns NULL if either no data is found associated with key, or if the user previously set the key's data pointer to NULL. Either way โ€” NULL. ๐Ÿ™ˆ

Libguestfs does not try to look at or interpret the data pointer in any way. As far as libguestfs is concerned, it need not be a valid pointer at all. In particular, libguestfs does not try to free the data when the handle is closed. So if the data must be freed, then the caller must either free it before calling guestfs_close, or must set up a close callback to do it (see GUESTFS_EVENT_CLOSE). Don't leave her hanging, bestie ๐Ÿ˜ญ

To walk over all entries, use these two functions:

void *guestfs_first_private (guestfs_h *g, const char **key_rtn);

void *guestfs_next_private (guestfs_h *g, const char **key_rtn);

guestfs_first_private returns the first key, pointer pair ("first" does not have any particular meaning โ€” keys are not returned in any defined order, so don't come for me about ordering ๐Ÿ’€). A pointer to the key is returned in *key_rtn and the corresponding data pointer is returned from the function. NULL is returned if there are no keys stored in the handle.

guestfs_next_private returns the next key, pointer pair. The return value of this function is NULL if there are no further entries to return.

Notes about walking over entries โ€” read these, they're giving important:

  • You must not call guestfs_set_private while walking over the entries.
  • The handle maintains an internal iterator which is reset when you call guestfs_first_private. This internal iterator is invalidated when you call guestfs_set_private.
  • If you have set the data pointer associated with a key to NULL, ie:
guestfs_set_private (g, key, NULL);

then that key is not returned when walking. Sneaky little ghost key ๐Ÿ‘ป

  • *key_rtn is only valid until the next call to guestfs_first_private, guestfs_next_private or guestfs_set_private. So likeโ€ฆ don't hold onto it, she's fleeting โœจ

The following example code shows how to print all keys and data pointers that are associated with the handle g:

const char *key;
void *data = guestfs_first_private (g, &key);
while (data != NULL)
  {
    printf ("key = %s, data = %p\n", key, data);
    data = guestfs_next_private (g, &key);
  }

More commonly you are only interested in keys that begin with an application-specific prefix foo_. Modify the loop like so:

const char *key;
void *data = guestfs_first_private (g, &key);
while (data != NULL)
  {
    if (strncmp (key, "foo_", strlen ("foo_")) == 0)
      printf ("key = %s, data = %p\n", key, data);
    data = guestfs_next_private (g, &key);
  }

If you need to modify keys while walking, then you have to jump back to the beginning of the loop. For example, to delete all keys prefixed with foo_:

 const char *key;
 void *data;
again:
 data = guestfs_first_private (g, &key);
 while (data != NULL)
   {
     if (strncmp (key, "foo_", strlen ("foo_")) == 0)
       {
         guestfs_set_private (g, key, NULL);
         /* note that 'key' pointer is now invalid, and so is
            the internal iterator */
         goto again;
       }
     data = guestfs_next_private (g, &key);
   }

Note that the above loop is guaranteed to terminate because the keys are being deleted โ€” but other manipulations of keys within the loop might not terminate unless you also maintain an indication of which keys have been visited. So like, be careful with the goto energy, it's giving chaotic ๐Ÿ‘‘


โœจ 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

So like, 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. Slay, stability ๐Ÿ’…

Our criteria for backporting changes are:

  • Documentation changes which don't affect any code are backported unless the documentation refers to a future feature which is not in stable.
  • Bug fixes which are not controversial, fix obvious problems, and have been well tested are backported.
  • 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.
  • We don't 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. One (1) exception, bestie, and that's the tea โ˜•

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. She grows up so fast ๐Ÿ˜ญ๐Ÿฆ‹

๐Ÿšง LIMITS ๐Ÿšง

Okay so bestie, let's talk ceilings. Not the vibe ceiling (there is none, you're doing amazing) โ€” the technical ceilings.

๐Ÿ”ฎ PROTOCOL LIMITS ๐Ÿ”ฎ

So internally, libguestfs is out here passing API calls and their responses to and from a tiny little "appliance" using a message-based protocol. (Peep guestfs-internals(1) if you want the whole lore, and there is so much lore.) The max message size this protocol can handle is slightly less than 4 MB. Some API calls you gotta be aware of this limit for. The ones affected are documented individually, each with a link back to this exact section, so iykyk.

In libguestfs < 1.19.32, several calls had to cram either their entire argument list or their entire return value (sometimes both, no cap ๐Ÿ˜ญ) into a single protocol message, which gave them an arbitrary limit on how much data they could handle. Like, guestfs_cat could only download a file if it was less than around 4 MB in size. Rough. In later versions, some of these limits have been removed. The APIs that were previously limited but are now unlimited (except maybe by available memory, which is a whole other mood) are listed below. To find out if a specific API is still subject to protocol limits, check for the warning in the API documentation that links to this section โ€” and remember to check the version of the docs that matches the version of libguestfs you're actually using, bestie. Versions matter.

guestfs_cat, guestfs_find, guestfs_read_file, guestfs_read_lines, guestfs_write, guestfs_write_append, guestfs_lstatlist, guestfs_lxattrlist, guestfs_readlinklist, guestfs_ls.

See also "UPLOADING" and "DOWNLOADING" for more info about copying large amounts of data into or out of a filesystem. ๐Ÿซถ

๐Ÿ’ฝ MAXIMUM NUMBER OF DISKS ๐Ÿ’ฝ

In libguestfs โ‰ฅ 1.19.7, you can just ask โ€” call guestfs_max_disks. In earlier versions (like, where this call doesn't even exist, awkward), you should assume the max is 25.

The rest of this section is implementation details, which could change in future, so don't come for me.

When you're using virtio-scsi disks (the default if it's available in qemu), the current limit is 255 disks. When using virtio-blk (the old default), the limit is around 27 disks, but it may vary depending on implementation details and whether the network is enabled.

Virtio-scsi as used by libguestfs is configured to use one target per disk, and 256 targets are available.

Virtio-blk consumes 1 virtual PCI slot per disk, and PCI is limited to 31 slots, but some of those are used for other purposes. So, you know, math.

One virtual disk is used by libguestfs internally. (Not yours, she's booked.)

Before libguestfs 1.19.7, disk names had to be a single character (like /dev/sda through /dev/sdz), and since one disk is reserved, that meant the limit was 25. This has been fixed in more recent versions. Slay, honestly.

๐Ÿงฉ MAXIMUM NUMBER OF PARTITIONS PER DISK ๐Ÿงฉ

Virtio limits the maximum number of partitions per disk to 15.

Why? Because it reserves 4 bits for the minor device number (thus /dev/vda, and /dev/vda1 through /dev/vda15). Bits!! Iconic honestly.

If you attach a disk with more than 15 partitions, the extra partitions are ignored by libguestfs. Just straight up ignored. ๐Ÿ’€

๐Ÿ“ MAXIMUM SIZE OF A DISK ๐Ÿ“

Probably the limit is between 263-1 and 264-1 bytes.

We have tested block devices up to 1 exabyte (2**60 or 1,152,921,504,606,846,976 bytes) using sparse files backed by an XFS host filesystem. One. Exabyte. Ngl that's kind of main character energy.

Although libguestfs probably doesn't impose any limit, the underlying host storage will. If you store disk images on a host ext4 filesystem, the max size will be limited by the maximum ext4 file size (currently 16 TB). If you store disk images as host logical volumes, then you're limited by the maximum size of an LV.

For the hugest disk image files, we recommend using XFS on the host for storage. Trust.

๐Ÿ”ช MAXIMUM SIZE OF A PARTITION ๐Ÿ”ช

The MBR (like, classic MS-DOS) partitioning scheme uses 32 bit sector numbers. Assuming a 512 byte sector size, this means MBR cannot address a partition located beyond 2 TB on the disk. It literally cannot see it. Gone. Lost to the void.

It is recommended that you use GPT partitions on disks larger than this size. GPT uses 64 bit sector numbers and so can address partitions which are theoretically larger than the largest disk we could even support. GPT said "hold my bits." โœจ

๐Ÿ—‚๏ธ MAXIMUM SIZE OF A FILESYSTEM, FILES, DIRECTORIES ๐Ÿ—‚๏ธ

Depends on the filesystem type, bestie. libguestfs itself does not impose any known limit. Consult Wikipedia or the filesystem documentation to find out what these limits are. Go read, it's giving study date.

๐Ÿ“ค MAXIMUM UPLOAD AND DOWNLOAD ๐Ÿ“ค

The API functions guestfs_upload, guestfs_download, guestfs_tar_in, guestfs_tar_out and the like allow unlimited sized uploads and downloads. Unlimited!! Go off. ๐Ÿ”ฅ

๐Ÿ” INSPECTION LIMITS ๐Ÿ”

The inspection code has several arbitrary limits on things like the size of Windows Registry hive it will read, and the length of product name. These are intended to stop a malicious guest from consuming arbitrary amounts of memory and disk space on the host, and should not be reached in practice. So they're basically the bouncers at the club โ€” there for your safety, and you'll probably never even meet them. See the source code for more info.


๐Ÿค– ADVANCED MACHINE READABLE OUTPUT ๐Ÿค–

Some of the tools support a --machine-readable option, which is generally used to make the output more machine friendly โ€” easier parsing, that kind of thing. By default, this output goes to stdout.

When you're using the --machine-readable option, the progress, information, warning, and error messages are also printed in JSON format for easier log tracking. Because of this, it is highly recommended to redirect the machine-readable output to a different stream. Fr fr, do it.

The format of these JSON messages is like the following (actually printed within a single line โ€” below it's indented for readability):

{
  "message": "Finishing off",
  "timestamp": "2019-03-22T14:46:49.067294446+01:00",
  "type": "message"
}

type can be: message for progress messages, info for information messages, warning for warning messages, and error for error message. timestamp is the RFC 3339 timestamp of the message.

In addition to that, a subset of these tools support an extra string passed to the --machine-readable option: this string specifies where the machine-readable output will go.

The possible values are:

  • fd:fd โ€” the output goes to the specified fd, which is a file descriptor already opened for writing.
  • file:filename โ€” the output goes to the specified filename.
  • stream:stdout โ€” the output goes to stdout. This is basically the same as the default behaviour of --machine-readable with no parameter, although stdout as output is specified explicitly.
  • stream:stderr โ€” the output goes to stderr.

๐ŸŒฑ ENVIRONMENT VARIABLES ๐ŸŒฑ

Okay, the environment. The vibes of your shell. Here's everything libguestfs peeks at:

  • LIBGUESTFS_APPEND โ€” pass additional options to the guest kernel.
  • LIBGUESTFS_ATTACH_METHOD โ€” this is the old way to set LIBGUESTFS_BACKEND. (Retro, but like, deprecated retro.)
  • LIBGUESTFS_BACKEND โ€” choose the default way to create the appliance. See "guestfs_set_backend" and "BACKEND".
  • LIBGUESTFS_BACKEND_SETTINGS โ€” a colon-separated list of backend-specific settings. See "BACKEND", "BACKEND SETTINGS".
  • LIBGUESTFS_CACHEDIR โ€” the location where libguestfs will cache its appliance, when using a supermin appliance. The appliance is cached and shared between all handles which have the same effective user ID.

If LIBGUESTFS_CACHEDIR is not set, then TMPDIR is used. If TMPDIR is not set, then /var/tmp is used.

See also "LIBGUESTFS_TMPDIR", "guestfs_set_cachedir".

  • LIBGUESTFS_DEBUG โ€” set LIBGUESTFS_DEBUG=1 to enable verbose messages. This has the same effect as calling guestfs_set_verbose (g, 1).
  • LIBGUESTFS_HV โ€” set the default hypervisor (usually 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 "QEMU WRAPPERS" above.

  • LIBGUESTFS_MEMSIZE โ€” set the memory allocated to the qemu process, in megabytes. For example:
LIBGUESTFS_MEMSIZE=700
  • LIBGUESTFS_PATH โ€” set the path that libguestfs uses to search for a supermin appliance. See the discussion of paths in section "PATH" above.
  • LIBGUESTFS_QEMU โ€” this is the old way to set LIBGUESTFS_HV.
  • LIBGUESTFS_TMPDIR โ€” the location where libguestfs will store temporary files used by each handle.

If LIBGUESTFS_TMPDIR is not set, then TMPDIR is used. If TMPDIR is not set, then /tmp is used.

See also "LIBGUESTFS_CACHEDIR", "guestfs_set_tmpdir".

  • LIBGUESTFS_TRACE โ€” set LIBGUESTFS_TRACE=1 to enable command traces. This has the same effect as calling guestfs_set_trace (g, 1).
  • PATH โ€” libguestfs may run some external programs, and relies on $PATH being set to a reasonable value. If using the libvirt backend, libvirt will not work at all unless $PATH contains the path of qemu/KVM. Note that PHP by default removes $PATH from the environment which tends to break everything. (PHP catching strays, but okay.)
  • SUPERMIN_KERNEL, SUPERMIN_KERNEL_VERSION, SUPERMIN_MODULES โ€” these three environment variables allow the kernel that libguestfs uses in the appliance to be selected. If $SUPERMIN_KERNEL is not set, then the most recent host kernel is chosen. For more information about kernel selection, see supermin(1).
  • TMPDIR โ€” see "LIBGUESTFS_CACHEDIR", "LIBGUESTFS_TMPDIR".
  • XDG_RUNTIME_DIR โ€” this directory represents a user-specific directory for storing non-essential runtime files.

If it is set, then is used to store temporary sockets and PID files. Otherwise, /tmp is used.

See also "guestfs_get_sockdir", http://www.freedesktop.org/wiki/Specifications/basedir-spec/.


๐Ÿ‘€ SEE ALSO ๐Ÿ‘€

Go read more, bestie. There's a whole extended universe:

Examples written in C: guestfs-examples(3).

Language bindings: guestfs-erlang(3), guestfs-golang(3), guestfs-java(3), guestfs-lua(3), guestfs-ocaml(3), guestfs-perl(3), guestfs-python(3), guestfs-ruby(3).

Tools: guestfish(1), guestmount(1), virt-alignment-scan(1), virt-builder(1), virt-builder-repository(1), virt-cat(1), virt-copy-in(1), virt-copy-out(1), virt-customize(1), virt-df(1), virt-diff(1), virt-edit(1), virt-filesystems(1), virt-format(1), virt-inspector(1), virt-list-filesystems(1), virt-list-partitions(1), virt-log(1), virt-ls(1), virt-make-fs(1), virt-p2v(1), virt-rescue(1), virt-resize(1), virt-sparsify(1), virt-sysprep(1), virt-tail(1), virt-tar(1), virt-tar-in(1), virt-tar-out(1), virt-v2v(1), virt-win-reg(1).

Other libguestfs topics: guestfs-building(1), guestfs-faq(1), guestfs-hacking(1), guestfs-internals(1), guestfs-performance(1), guestfs-release-notes(1), guestfs-security(1), guestfs-testing(1), libguestfs-test-tool(1), libguestfs-make-fixed-appliance(1).

Related manual pages: supermin(1), qemu(1), hivex(3), stap(1), sd-journal(3).

Website: http://libguestfs.org/

Tools with a similar purpose: fdisk(8), parted(8), kpartx(8), lvm(8), disktype(1).


๐Ÿ’– AUTHORS ๐Ÿ’–

Richard W.M. Jones (rjones at redhat dot com) โ€” the icon, the legend, the moment. ๐Ÿ‘‘

Okay bestie, legal moment but make it cute: the official line is Copyright (C) 2009-2025 Red Hat Inc. โ€” yes, exactly that. Donโ€™t come for me, Iโ€™m just the messenger ๐Ÿ’….

๐Ÿ“œ LICENSE ๐Ÿ“œ

This library is free software โ€” periodt. You can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Thatโ€™s the whole vibe โœจ.

Itโ€™s distributed in the hope that it will be useful, but โ€” and this is the serious part โ€” WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Not a drill, itโ€™s literally all caps in legal-speak ๐Ÿ˜ญ. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this library. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA โ€” yes, snail mail address and all ๐Ÿซถ.

๐Ÿ› BUGS ๐Ÿ›

Found a bug? First, deep breath. Then:

When youโ€™re reporting a bug, please supply these, okay? Itโ€™s giving โ€œhelp me help youโ€:

  • The version of libguestfs.
  • Where you got libguestfs (eg. which Linux distro, compiled from source, etc)
  • Describe the bug accurately and give a way to reproduce it.
  • Run libguestfs-test-tool(1) and paste the complete, unedited output into the bug report.

Donโ€™t leave the tool output out โ€” complete and unedited is the assignment ๐Ÿ˜ญ.


Thatโ€™s the whole page, bestie ๐Ÿ’œ. This page is from libguestfs-1.61.3, dated 2026-09-16 โ€” source/version and date, all accounted for. Go forth and slay your libguestfs adventures โœจ๐ŸŽ€๐Ÿฆ‹.

๐Ÿ“ฆ where this page comes from