qq2clone/qq2clone.1

618 lines
23 KiB
Groff

.\" Automatically generated by Pandoc 2.5
.\"
.TH "QQ2CLONE" "1" "February 2021" "qq2clone" ""
.hy
.SH NAME
.PP
qq2clone \- Create and manage QEMU/KVM VMs using template machines and
qcow2 images with backing files
.SH SYNOPSIS
.PP
\f[B]qq2clone\f[R] [\f[I]OPTION\f[R]]\&... \f[I]COMMAND\f[R]
[\f[I]ARG\f[R]]\&...
.SH DESCRIPTION
.PP
\f[B]qq2clone\f[R] is a tool that uses libvirt to make creating clones
of template QEMU/KVM machines simple.
By using the copy on write feature for which qcow2 is named, clones of
an existing virtual machine can be made without inadvertently altering
the original image (with caveats \- read the \f[B]LIMITATIONS\f[R]
section if you aren\[cq]t already familiar with how copy on write
works).
\f[B]qq2clone\f[R] makes creating and managing these clones simple and
efficient.
.PP
\f[B]qq2clone\f[R] supports creating numerous clones of a template and
performing batch operations on them \- including the execution of
arbitrary commands with exec.
This simplifies workflows involving large numbers of virtual machines,
or the frequent creation/destruction of virtual machines.
.PP
To easily establish graphical connections to your virtual machines,
qq2clone can use virt\-viewer or spicy.
.SH OPTIONS
.PP
Not every option has an effect in the context of every command.
Specifying an option that has no effect in the context of the command
being invoked will not produce an error, it simply will not do anything
.PP
Options are parsed left to right, and right\-hand options override
left\-hand options.
The only exception is for \-Q/\-\-quieter, which \f[I]must\f[R] be the
first option listed to work properly.
.TP
.B \-c, \-\-connection [\f[I]URI\f[R]]
Specify a non\-default connection URI: sets the value of
LIBVIRT_DEFAULT_URI
.TP
.B \-C, \-\-copy\-disks
When importing or copying a template, make a (full) copy of images
.TP
.B \-f, \-\-no\-spice
Do not attempt to connect to a virtual machine\[cq]s Spice graphics.
Overrides USE_SPICE setting in configuration
.TP
.B \-g, \-\-use\-spice
Attempt to connect to a virtual machine\[cq]s spice graphics.
Overrides SPICE setting in configuration
.TP
.B \-h, \-\-help
Print basic help information and exit
.TP
.B \-n, \-\-no\-run
After making a clone of a template, do not run it.
Overrides NORUN setting in configuration
.TP
.B \-q, \-\-quiet
Suppress most non\-error output.
Overrides QUIET setting in configuration.
Also suppresses various prompts for user choices, either exiting with an
error or making a safe default choice depending on the command.
Recommended only once familiar with the behavior of \f[B]qq2clone\f[R]
.TP
.B \-Q, \-\-quieter
This option is (currently) required to appear immediately following the
invocation of \f[B]qq2clone\f[R].
Suppresses all output, error message or otherwise, except when running
interactive commands or commands that require output to be useful.
The commands for which output is not entirely supressed are: config
list, config info, list, list\-templates, exec, edit, modify\-template
edit, and check.
Other commands will receive only an exit code as output.
This option is intended for calling qq2clone from a script.
.TP
.B \-r, \-\-run
Run a clone when creating it.
Overrides NORUN setting in configuration
.TP
.B \-s, \-\-storage [\f[I]LOCATION\f[R]]
When creating a clone, place new disk image file(s) at location
specified by [\f[I]LOCATION\f[R]].
[\f[I]LOCATION\f[R]] may be one of an absolute filepath, or the name of
a libvirt directory type storage pool.
Also defines where state files will be saved when using \f[B]save\f[R]
command.
Overrides STORAGE option in configuration
.TP
.B \-S, \-\-spicy
Use spicy rather than virt\-viewer when connecting to the spice graphics
of a clone.
Overrides SPICY setting in configuration
.TP
.B \-t, \-\-template [\f[I]NAME\f[R]]
Use template of given name as context when executing a clone command
(see TYPES OF COMMAND section below).
Overrides TEMPLATE option in configuration
.TP
.B \-v, \-\-verbose
Enable all output.
Overrides QUIET setting in configuration
.TP
.B \-V, \-\-virt\-viewer
Use virt\-viewer rather than spicy when connecting to the spice graphics
of a clone.
Overrides SPICY setting in configuration
.SH TYPES OF COMMAND
.PP
There are two main classes of commands: commands that operate directly
on templates, and commands that create or operate on clones of
templates.
In order to make it less likely that the user may unintentionally invoke
a command of one class when they intended to invoke one of the other,
they use a different syntax.
Commands that operate on templates use the syntax:
.PP
\f[B]qq2clone\f[R] \f[B]command\f[R] [\f[I]template\-name\f[R]]
[\f[I]ARG\f[R]] \&...
.PP
while commands that operate on clones use the syntax:
.PP
\f[B]qq2clone\f[R] \-\-template [\f[I]template\-name\f[R]]
\f[B]command\f[R] [\f[I]ARG\f[R]] \&...
.PP
Notice that commands operating on clones work within the context of a
template defined by the option \-\-template/\-t.
Conversely, commands operating on templates specify the template as an
argument to the command.
There can also be a default template defined by the TEMPLATE
configuration option, allowing the \-\-template flag to be omitted for
commands that operate on clones.
Commands operating on templates do not respect this default \- the
template must always be explicitly defined, further reducing the
likelihood of accidentally modifying or deleting a template.
.SH TEMPLATE COMMMANDS
.TP
.B \f[B]copy\-template\f[R] [\f[I]CURRENT\-NAME\f[R]] [\f[I]NEW\-NAME\f[R]]
Copy the XML of template \f[I]CURRENT\-NAME\f[R] to a new template with
\f[I]NEW\-NAME\f[R].
The new template will not receive a copy of the old template\[cq]s
storage devices \- it will point to the same locations
.TP
.B \f[B]delete\-template\f[R] [\f[I]NAME\f[R]]
Delete the template \f[I]NAME\f[R].
This operation will succeed only if there are currently no clones of the
template
.PP
\f[B]import\-template\f[R] [\f[I]LIBVIRT\-DOMAIN\f[R]] [\f[I]NAME\f[R]],
\f[B]import\-template\f[R] [\f[I]XML\-LOCATION\f[R]] [\f[I]NAME\f[R]] :
Import a new template from either an existing libvirt domain, or a fully
qualified filepath to a libvirt domain XML file on disk.
If argument \f[I]NAME\f[R] is ommited, qq2clone will assume you want to
use the machine\[cq]s name as described in the XML file as the template
name
.TP
.B \f[B]list\-templates\f[R]
List the names of all existing templates
.TP
.B \f[B]modify\-template\f[R] [\f[I]NAME\f[R]] \f[B]sub\-command\f[R] [\f[I]ARG\f[R]] \&...
Templates can be modified in various ways by invoking
\f[B]modify\-template\f[R].
Each subcommand is described below
.TP
.B \f[B]modify\-template\f[R] [\f[I]NAME\f[R]] \f[B]commit\-image\f[R]
After an image has been created and modified as desired using
\f[B]modify\-template\f[R] [\f[I]NAME\f[R]] \f[B]prepare\-image\f[R],
\f[B]commit\-image\f[R] is used to alter a template\[cq]s underlying
storage device by commiting any changes made using prepare\-image.
See the commit command described in \f[B]man\f[R] \f[B]qemu\-img\f[R]
for more information on how this works
.TP
.B \f[B]modify\-template\f[R] [\f[I]NAME\f[R]] \f[B]destroy\-image\f[R]
Invoke virsh destroy on a running image created/run through
\f[B]modify\-template\f[R] [\f[I]NAME\f[R]] \f[B]prepare\-image\f[R].
This is generally not wise, as it is equivalent to unplugging a physical
machine and could cause corruption to the image that will later be
commited as a permanent change to the template\[cq]s image
.TP
.B \f[B]modify\-template\f[R] [\f[I]NAME\f[R]] \f[B]discard\-image\f[R]
Delete an image produced by \f[B]modify\-template\f[R] [\f[I]NAME\f[R]]
\f[B]prepare\-image\f[R] without commiting any changes
.TP
.B \f[B]modify\-template\f[R] [\f[I]NAME\f[R]] \f[B]edit\f[R]
Edit the XML document defining a template
.TP
.B \f[B]modify\-template\f[R] [\f[I]NAME\f[R]] \f[B]rename\f[R] [\f[I]NEW\-NAME\f[R]]
Change the name of a template, and all of its clones
.TP
.B \f[B]modify\-template\f[R] [\f[I]NAME\f[R]] \f[B]prepare\-image\f[R]
Create and/or run a clone that acts as a staging area for changes to the
\f[C]template\[aq]s\f[R] actual image.
For instance, you could update the \f[C]template\[aq]s\f[R] software by
running \f[B]modify\-template\f[R] [\f[I]NAME\f[R]]
\f[B]prepare\-image\f[R], updating the clone produced by this command,
shutting it down, and then running \f[B]modify\-template\f[R]
[\f[I]NAME\f[R]] \f[B]commit\-image\f[R].
This serves a twofold purpose \- to prevent incidental damage to an
underlying image by providing a safe buffer to work in, and to allow
modifications to be safely prepared for an underlying image even while
that image has existing clones.
.SH CLONE COMMANDS
.PP
A description of the argument \f[I]SET\f[R] is described in the
\f[B]SETS\f[R] section below
.TP
.B \f[B]clone\f[R] [\f[I]NUMBER\f[R]]
Invoke without any argument to produce a single clone.
Supply a number as an argument to specify the number of clones to create
.TP
.B \f[B]connect\f[R] [\f[I]SET\f[R]]
Start any machine in \f[I]SET\f[R] that \f[C]isn\[aq]t\f[R] already
running.
If any machine in \f[I]SET\f[R] has spice graphics and spicy or
virt\-viewer is installed, use one or the other (chosen by command\-line
option or configuration) to connect to the graphical console
.TP
.B \f[B]destroy\f[R] [\f[I]SET\f[R]]
Invoke virsh destroy on any running machine in \f[I]SET\f[R] (in other
words, if the domain is running forcibly turn it off)
.TP
.B \f[B]edit\f[R] [\f[I]NUMBER\f[R]]
Edit the XML file of the clone with given number
.TP
.B \f[B]exec\f[R] [\f[I]SET\f[R]] [\f[I]command\-string\f[R]]
For every machine in \f[I]SET\f[R], sequentially, execute the contents
of the command string in an environment where the following variables
are defined per clone: \f[C]\[dq]$uuid\[dq]\f[R],
\f[C]\[dq]$name\[dq]\f[R], \f[C]\[dq]$disks\[dq]\f[R] (a newline
delimited string containing the machine\[cq]s qcow2 disk device
filepaths).
This is done using bash\[cq]s eval command, so be sure to put any
instances of these variables in single quotes (double quotes inside the
single quotes is best practice) or they will not be set properly.
If any instance of exec has a non\-zero return value, execution stops.
.TP
.B \f[B]list\f[R] [\f[I]ARG\f[R]]
Without arguments, list all clones of the current template and their
state.
With argument \[lq]all\[rq], provide list including all clones of every
template.
With argument \[lq]xml\[rq], produce an XML document with information
about every template, their clones, and their state.
The XML option is not complete \- its format is at this point defined
only implicitly, by the output of this command.
.TP
.B \f[B]resume\f[R] [\f[I]SET\f[R]]
Resume any suspended machines in \f[I]SET\f[R]
.TP
.B \f[B]rm\f[R] [\f[I]SET\f[R]]
Destroy every domain in \f[I]SET\f[R] (if running), undefine them and
delete their storage volumes
.TP
.B \f[B]rm\-wipe\f[R] [\f[I]SET\f[R]]
Destroy every domain in \f[I]SET\f[R] (if running), undefine them and
wipe their storage volumes using virsh
.TP
.B \f[B]rm\-shred\f[R] [\f[I]SET\f[R]]
Destroy every domain in \f[I]SET\f[R] (if running), undefine them and
shred their storage volumes
.TP
.B \f[B]save\f[R] [\f[I]SET\f[R]]
Save execution state of every running domain in \f[I]SET\f[R] to file
.TP
.B \f[B]save\-rm\f[R] [\f[I]SET\f[R]]
Delete the state file associated with every machine in \f[I]SET\f[R]
.TP
.B \f[B]start\f[R] [\f[I]SET\f[R]]
Start every machine in \f[I]SET\f[R] that is currently not running.
For saved domains, their state will be restored
.TP
.B \f[B]suspend\f[R] [\f[I]SET\f[R]]
Suspend execution of every machine in \f[I]SET\f[R]
.SH OTHER COMMANDS
.TP
.B \f[B]check\f[R] [\f[I]TEMPLATE\-NAME\f[R]]
As described in the limitations section, there are ways that qq2clone
can lose track of a clone.
If this happens, it will remain in qq2clone\[cq]s database, its ID
number will remain reserved, and its image files may not be deleted and
take up space doing nothing.
The \f[B]check\f[R] command finds and fixes occurences of this problem.
The \f[I]TEMPLATE\-NAME\f[R] argument is optional, and restricts the
check to that template and its clones.
Otherwise, all templates are checked
.TP
.B \f[B]config\f[R] list, \f[B]config\f[R] info [\f[I]OPTION\f[R]], \f[B]config\f[R] edit [\f[I]OPTION\f[R]]
List all configuration options and their current value, get info about a
particular option, or edit one
.TP
.B \f[B]copyright\f[R]
Output copyright information
.TP
.B \f[B]license\f[R]
Output the GNU GPL v2 complete text
.TP
.B \f[B]setup\f[R]
Perform initial setup.
This is run automatically by the installer script, but can be invoked
manually to reset the database to its initial fresh state
.SH SETS
.PP
\f[I]SET\f[R] is listed as an argument to many commands.
\f[I]SET\f[R] simply describes a set of virtual machines \- clones of a
given template.
\f[I]SET\f[R] is a comma delimited list with no whitespace.
\f[I]SET\f[R] can be an individual machine or several individual
machines designated by number:
.IP
.nf
\f[C]
1 (Machine 1)
3,7 (Machines 3 and 7)
\f[R]
.fi
.PP
Machine numbers can be shown with \f[B]qq2clone\f[R] \f[B]list\f[R].
Ranges and omitted values are supported as well:
.IP
.nf
\f[C]
1,2\-5,\[ha]3 (Machines 1 and 2\-5 excluding 3)
1\-10,\[ha]3\-7 (Machines 1\-10 excluding 3\-7)
\f[R]
.fi
.PP
Lastly, groups of machines can be addressed by their state:
.IP
.nf
\f[C]
all (All machines)
all,\[ha]running (All machines that aren\[aq]t running)
\[ha]running,1\-10 (Machines 1\-10 except those that are running)
\f[R]
.fi
.PP
The possible states of a virtual machine are based on the states listed
in \f[B]man virsh\f[R], with some modifications.
States in qq2clone are:
.IP
.nf
\f[C]
all
crashed
idle
in\-shutdown
off
paused
pmsuspended
running
saved
\f[R]
.fi
.PP
Specifying machines that do not exist will not cause an error: i.e.,
1\-10 is a valid set even if only machines 3\-7 exist.
A set will only cause an error if it is malformed, includes zero
existing machines, contains no machines that the command being invoked
may act upon, or includes numbers less than 1.
.SH CONFIG
.PP
There is no need to refer to the manual to understand configuration
options.
Use \[lq]\f[B]qq2clone\f[R] config list\[rq] to see all options and
their current values, and \[lq]\f[B]qq2clone\f[R] config info
[\f[I]OPTION\f[R]]\[rq] to get information about a particular option.
However, here is the same information provided by \f[B]qq2clone\f[R]
info for each option
.PP
TEMPLATE
.RS
.PP
This template will be used for commands like clone, rm, destroy when
option \-\-template/\-t is not specified
.PP
Default value: \f[C]\[aq]0\[aq]\f[R]
.RE
.PP
TEMPLATE_DIR
.RS
.PP
This is the where template XML files will be kept
.PP
Default value: \f[C]\[aq]${HOME}/storage\-qq2clone/templates\[aq]\f[R]
.RE
.PP
QUIET
.RS
.PP
If set to 1, most non\-error output will be suppressed
.PP
Default value: \f[C]\[aq]0\[aq]\f[R]
.RE
.PP
USE_SPICE
.RS
.PP
If set to 1, attempt to connect to the spice graphics of a virtual
machine by default when cloning it, if it is configured to use spice
graphics.
qq2clone can do this using the programs spicy and virt\-viewer.
If either is installed on your system during the first run, the default
value is \f[C]\[aq]1\[aq]\f[R] (enabled).
Otherwise, the default value is \f[C]\[aq]0\[aq]\f[R]
.RE
.PP
S_TIMEOUT
.RS
.PP
Wait this many seconds before timing out when trying to connect to a
virtual \f[C]machine\[aq]s\f[R] spice graphics.
.PP
Default value: \f[C]\[aq]10\[aq]\f[R]
.RE
.PP
STORAGE
.RS
.PP
The default location to store clone images when creating them.
Changing this location is fine, but it is a good idea to ensure that
whatever location you do choose is only used by qq2clone
.PP
Default value:
\f[C]\[aq]${HOME}/storage\-qq2clone/qq2clone\-pool\[aq]\f[R]
.RE
.SH EXAMPLES
.TP
.B \f[B]qq2clone\f[R] \f[B]import\-template\f[R] Debian
Import a domain on the current libvirt connection of name Debian.
Now Debian can be used as a template to produce clone machines
.TP
.B \f[B]qq2clone\f[R] \f[B]import\-template\f[R] /home/user/Debian.xml
Import domain from a libvirt domain XML file to be used as a template
.TP
.B \f[B]qq2clone\f[R] \-\-template Debian \-\-run \-\-virt\-viewer clone
Make a clone of Debian, run it, and connect to its spice graphics using
virt\-viewer.
All of these options could have instead been defined in the
configuration, so that the entire command would be: \f[B]qq2clone\f[R]
clone
.TP
.B \f[B]qq2clone\f[R] \-\-template Debian exec 3 `virsh console \[lq]$uuid\[rq]'
Use virsh to connect to the serial console of template Debian\[cq]s
clone with number 3 (as shown in \f[B]qq2clone\f[R] list)
.TP
.B \f[B]qq2clone\f[R] \f[B]modify\-template\f[R] Debian \f[B]prepare\-image\f[R]
Create a clone of Debian that can be used as a staging area for
permanent changes to the backing template storage device
.TP
.B \f[B]qq2clone\f[R] \f[B]modify\-template\f[R] Debian \f[B]commit\-image\f[R]
Commit changes to the image Debian staged with the previous command
.TP
.B \f[B]qq2clone\f[R] \f[B]copy\-template\f[R] Debian Debian_2
Copy the XML of template Debian, creating a new template with the same
backing storage device that you can edit as you please
.SH LIMITATIONS
.PP
The largest limitation of \f[B]qq2clone\f[R] is that it cannot protect
your template images from the actions of other software.
If nothing else touches a template\[cq]s storage volumes, qq2clone can
safely handle them (barring unknown bugs or bad luck during a
commit\-image).
However, if something else alters the image upon which a template is
based, its existing clones may be corrupted and future clones may behave
differently than expected.
It is the user\[cq]s responsibility to understand this aspect of copy on
write and carefully manage template images.
Future updates to qq2clone may add features that give some additional
protections, but this risk is inherent to copy on write.
.PP
Libvirt has permissions errors when a storage pool is in a
\[lq]hidden\[rq] directory with a name beginning with \[lq].\[rq] and
qcow2 files with backing files are involved.
This may be due to apparmor, or it may be an issue with libvirt.
It is unknown how widespread this issue is, but it is the reason that
the default directory storage\-qq2clone does not start with `.'
.PP
If the UUID of a clone is changed, qq2clone will no longer be able to
track it and will not be able to perform commands on it anymore.
This will be addressed in the future using custom metadata in the
libvirt domain XML.
If the user undefines a domain, this will obviously cause it to
disappear from qq2clone\[cq]s perspective when it is turned off,
creating a discrepancy in its database.
This can be fixed with \f[B]qq2clone\f[R] \f[B]check\f[R].
.PP
qq2clone can only produce clones by making qcow2 image files.
The backing file need not be qcow2, but the images produced by qq2clone
always will be.
This is unlikely to ever change \- levaraging the features of qcow2 is
the entire purpose of qq2clone.
If it does change, qq2clone will need a new name.
.PP
qq2clone does not support creating images in pool types other than
directories, and attempting to use a machine as a template when it has
storage volumes in a non\-directory pool is likely to fail or have
unexpected results.
Support for some other pool types may be added in the future.
.PP
qq2clone currently cannot copy storage volumes when importing a template
(it just references the originals), or when copying a template.
This will change in the future, and qq2clone will also be able to handle
more complex relationships between templates, clones and their images
.SH FILES
.TP
.B \[ti]/.config/qq2clone
This document simply contains a string defining the location at which
qq2clone will store files, including the database containing the rest of
it configuration options.
Currently, qq2clone cannot run without ${HOME} being defined unless a
few lines are altered to refer to a new location
.TP
.B \[ti]/storage\-qq2clone
Directory where qq2clone stores all files and binary executables.
Can be changed by modifying \[ti]/.config/qq2clone.
This directory is not named \[lq]qq2clone\[rq] because (at least on
Ubuntu 20.04) default Bash completion scripts will see a file starting
with \[lq]qq2clone\[rq] as well as a command in PATH of that name, and
fail to insert a space after \[lq]qq2clone\[rq] when in the home
directory.
It does not start with a `.' for the reasons described in the
\f[B]LIMITATIONS\f[R] section above
.TP
.B \[ti]/storage\-qq2clone/qq2clone.db
sqlite3 database containing the configuration information for qq2clone,
as well as data about templates and clones
.TP
.B \[ti]/storage\-qq2clone/qq2clone\-pool
Storage pool used for clone images, if the \-\-storage option is not
used when creating or saving a clone and the option STORAGE is not
changed in the configuration file
.TP
.B \[ti]/qq2clone/templates
Directory in which template XML files are stored.
These can be edited manually, but it is more advisable to use
\f[B]qq2clone\f[R] \f[B]modify\-template\f[R] [\f[I]template\-name\f[R]]
\f[B]edit\f[R]
.SH BUGS
.PP
As described in the options section, the implementation of the
\-\-quieter/\-Q option needs some work.
Its current behavior is the easiest functional approach without
complicating the options parser, but it will eventually be modified and
become better behaved.
In addition to the previously described problem, very early error
messages will not be suppressed.
Most likely, the solution is to implement a better options parser and
make it the first thing to run when executing qq2clone.
However, the impact of this bug is minimal and other improvements are
likely to come before this bug fix.
.PP
If you find any worse bugs, and I\[cq]m sure I missed some, please let
me know and I will fix them as time allows.
Contact me at: jgardner7289\[at]protonmail.com
.SH COPYRIGHT 2021, Jesse Gardner
.PP
This file is part of qq2clone.
.PP
qq2clone is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation, either version 2 of the License, or (at your
option) any later version.
.PP
qq2clone is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
.PP
You should have received a copy of the GNU General Public License along
with qq2clone.
If not, see <https://www.gnu.org/licenses/>.
.SH EXIT VALUES
.TP
.B \f[B]10\f[R]
No permission to access file or file doesn\[cq]t exist
.TP
.B \f[B]11\f[R]
Required software dependencies are not met (see description for a list),
or are cannot be found in PATH
.TP
.B \f[B]12\f[R]
Invalid command line argument specified, or command specifies an invalid
action
.TP
.B \f[B]13\f[R]
Problem with a template \- i.e., specified template does not exist, or
import\-template failed because template of specified name already
exists
.TP
.B \f[B]14\f[R]
Invocation of an external command failed
.TP
.B \f[B]15\f[R]
Problem with a libvirt XML file
.TP
.B \f[B]16\f[R]
Attempted action with a libvirt tool resulted in failure
.TP
.B \f[B]17\f[R]
Could not establish graphical spice connection to machine before timeout
expired
.TP
.B \f[B]18\f[R]
A file is of the wrong type or does not exist
.TP
.B \f[B]19\f[R]
Unexpected error \- a bug in qq2clone, or a highly unexpected failure of
some command
.SH AUTHORS
Jesse Gardner.