Improved man page

This commit is contained in:
Jesse Gardner 2021-07-15 19:47:59 -07:00
parent cc72e7ab80
commit 8465507daf
5 changed files with 1202 additions and 1363 deletions

152
man.md
View File

@ -12,19 +12,16 @@ SYNOPSIS
DESCRIPTION DESCRIPTION
=========== ===========
**qq2clone** is a tool that uses libvirt to make creating clones of **qq2clone** is a tool for creating and managing clones of QEMU/KVM
template QEMU/KVM machines simple. By using the copy on write feature virtual machines. By using the copy on write feature of qcow2, clones of
for which qcow2 is named, clones of an existing virtual machine can be an existing virtual machine can be made using few system resources and
made without inadvertently altering the original image (with caveats - little time or effort.
read the **LIMITATIONS** section if you arent already familiar with how
copy on write works). **qq2clone** makes creating and managing these
clones simple and efficient.
**qq2clone** supports creating numerous clones of a template and **qq2clone** supports creating numerous clones of a template and
performing batch operations on them - including the execution of performing batch operations on them - including the execution of
arbitrary commands with exec. This simplifies workflows involving large arbitrary commands with **qq2clone** exec. This simplifies workflows
numbers of virtual machines, or the frequent creation/destruction of involving large numbers of virtual machines, or the frequent
virtual machines. creation/deletion of virtual machines.
To easily establish graphical connections to your virtual machines, To easily establish graphical connections to your virtual machines,
qq2clone can use virt-viewer or spicy. qq2clone can use virt-viewer or spicy.
@ -34,18 +31,17 @@ OPTIONS
Not every option has an effect in the context of every command. 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 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 being invoked will not produce an error, it simply will not do anything.
Options are parsed left to right, and right-hand options override Options are parsed left to right, and right-hand options override
left-hand options. The only exception is for -Q/--quieter, which *must* left-hand options.
be the first option listed to work properly.
-c, --connection \[*URI*\] -c, --connection \[*URI*\]
Specify a non-default connection URI: sets the value of Specify a non-default connection URI: sets the value of
LIBVIRT\_DEFAULT\_URI LIBVIRT\_DEFAULT\_URI
-C, --copy-disks -C, --copy-disks
When importing or copying a template, make a (full) copy of images When importing or copying a template, make a (full) copy of its image(s)
-f, --no-spice -f, --no-spice
Do not attempt to connect to a virtual machines Spice graphics. Do not attempt to connect to a virtual machines Spice graphics.
@ -70,17 +66,15 @@ command. Recommended only once familiar with the behavior of
**qq2clone** **qq2clone**
-Q, --quieter -Q, --quieter
This option is (currently) required to appear immediately following the This option is (currently) required to appear as the first argument to
invocation of **qq2clone**. Suppresses all output, error message or **qq2clone**. Suppresses all output, error message or otherwise, except
otherwise, except when running interactive commands or commands that when running interactive commands or commands that require output to be
require output to be useful. The commands for which output is not useful. Other commands will receive only an exit code as output. This
entirely supressed are: config list, config info, list, list-templates, option is intended for calling qq2clone from a script.
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.
-r, --run -r, --run
Run a clone when creating it. Overrides NORUN setting in configuration Start a clone after creating it. Overrides NORUN setting in
configuration
-s, --storage \[*LOCATION*\] -s, --storage \[*LOCATION*\]
When creating a clone, place new disk image file(s) at location When creating a clone, place new disk image file(s) at location
@ -110,10 +104,9 @@ TYPES OF COMMAND
There are two main classes of commands: commands that operate directly There are two main classes of commands: commands that operate directly
on templates, and commands that create or operate on clones of on templates, and commands that create or operate on clones of
templates. In order to make it less likely that the user may templates. To prevent unintended actions, these two command types use
unintentionally invoke a command of one class when they intended to slightly different syntax. Commands that operate on templates use the
invoke one of the other, they use a different syntax. Commands that syntax:
operate on templates use the syntax:
**qq2clone** **command** \[*template-name*\] \[*ARG*\] … **qq2clone** **command** \[*template-name*\] \[*ARG*\] …
@ -121,15 +114,15 @@ while commands that operate on clones use the syntax:
**qq2clone** --template \[*template-name*\] **command** \[*ARG*\] … **qq2clone** --template \[*template-name*\] **command** \[*ARG*\] …
Notice that commands operating on clones work within the context of a Commands operating on clones work within the context of a template
template defined by the option --template/-t. Conversely, commands defined by --template/-t. Conversely, commands operating on templates
operating on templates specify the template as an argument to the specify the template as an argument to the command.
command. There can also be a default template defined by the TEMPLATE
configuration option, allowing the --template flag to be omitted for A default template can be defined by the TEMPLATE configuration option,
commands that operate on clones. Commands operating on templates do not allowing the --template flag to be omitted for commands that operate on
respect this default - the template must always be explicitly defined, clones. Commands operating on templates do not respect this default -
further reducing the likelihood of accidentally modifying or deleting a the template must always be explicitly defined, reducing the likelihood
template. of accidentally modifying or deleting a template.
TEMPLATE COMMMANDS TEMPLATE COMMMANDS
================== ==================
@ -220,10 +213,9 @@ For every machine in *SET*, sequentially, execute the contents of the
command string in an environment where the following variables are command string in an environment where the following variables are
defined per clone: `"$uuid"`, `"$name"`, `"$disks"` (a newline delimited defined per clone: `"$uuid"`, `"$name"`, `"$disks"` (a newline delimited
string containing the machines qcow2 disk device filepaths). This is string containing the machines qcow2 disk device filepaths). This is
done using bashs eval command, so be sure to put any instances of these done using bashs eval command, so contain the command string in single
variables in single quotes (double quotes inside the single quotes is quotes to avoid unexpected behavior. If any instance of exec has a
best practice) or they will not be set properly. If any instance of exec non-zero return value, execution stops.
has a non-zero return value, execution stops.
**list** \[*ARG*\] **list** \[*ARG*\]
Without arguments, list all clones of the current template and their Without arguments, list all clones of the current template and their
@ -265,13 +257,13 @@ OTHER COMMANDS
============== ==============
**check** \[*TEMPLATE-NAME*\] **check** \[*TEMPLATE-NAME*\]
As described in the limitations section, there are ways that qq2clone If a clone is deleted, has its UUID changed or is otherwise unavailable,
can lose track of a clone. If this happens, it will remain in qq2clones it will remain in qq2clones database. Its ID number will remain
database, its ID number will remain reserved, and its image files may reserved, and its image files may not be deleted and take up space doing
not be deleted and take up space doing nothing. The **check** command nothing. The **check** command finds and fixes occurences of this
finds and fixes occurences of this problem. The *TEMPLATE-NAME* argument problem. The *TEMPLATE-NAME* argument is optional, and restricts the
is optional, and restricts the check to that template and its clones. check to that template and its clones. Otherwise, all templates are
Otherwise, all templates are checked checked
**config** list, **config** info \[*OPTION*\], **config** edit \[*OPTION*\] **config** list, **config** info \[*OPTION*\], **config** edit \[*OPTION*\]
List all configuration options and their current value, get info about a List all configuration options and their current value, get info about a
@ -415,48 +407,18 @@ backing storage device that you can edit as you please
LIMITATIONS LIMITATIONS
=========== ===========
The largest limitation of **qq2clone** is that it cannot protect your Understand what copy on write is. If you modify an image, you will
template images from the actions of other software. If nothing else corrupt images using it as a backing file. If you dont understand what
touches a templates storage volumes, qq2clone can safely handle them that means, use a search engine to research copy on write. To safely
(barring unknown bugs or bad luck during a commit-image). However, if modify a templates underlying image, use the prepare-image and
something else alters the image upon which a template is based, its commit-image subcommands of **qq2clone** modify-template.
existing clones may be corrupted and future clones may behave
differently than expected. It is the users 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.
Libvirt has permissions errors when a storage pool is in a “hidden” qq2clone uses a virtual machines UUID as defined in its libvirt XML
directory with a name beginning with “.” and qcow2 files with backing file to track it. Dont change a clones UUID.
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
.
If the UUID of a clone is changed, qq2clone will no longer be able to qq2clone does not support pool types other than directories. If there is
track it and will not be able to perform commands on it anymore. This another pool type you wish it could use, email me at
will be addressed in the future using custom metadata in the libvirt jgardner7289@protonmail.com and let me know.
domain XML. If the user undefines a domain, this will obviously cause it
to disappear from qq2clones perspective when it is turned off, creating
a discrepancy in its database. This can be fixed with **qq2clone**
**check**.
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.
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.
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
FILES FILES
===== =====
@ -493,19 +455,9 @@ manually, but it is more advisable to use **qq2clone**
BUGS BUGS
==== ====
As described in the options section, the implementation of the If you find a bug, please check to see if it already appears in
--quieter/-Q option needs some work. Its current behavior is the easiest https://git.j-g-web.com/jesse/qq2clone/issues. If not, email me at
functional approach without complicating the options parser, but it will jgardner7289@protonmail.com.
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.
If you find any worse bugs, and Im sure I missed some, please let me
know and I will fix them as time allows. Contact me at:
jgardner7289@protonmail.com
COPYRIGHT 2021, Jesse Gardner COPYRIGHT 2021, Jesse Gardner
============================= =============================

View File

@ -10,18 +10,16 @@ qq2clone - Create and manage QEMU/KVM VMs using template machines and qcow2
**qq2clone** [*OPTION*]... *COMMAND* [*ARG*]... **qq2clone** [*OPTION*]... *COMMAND* [*ARG*]...
# DESCRIPTION # DESCRIPTION
**qq2clone** is a tool that uses libvirt to make creating clones **qq2clone** is a tool for creating and managing clones of QEMU/KVM
of template QEMU/KVM machines simple. By using the copy on write feature virtual machines. By using the copy on write feature of qcow2, clones of
for which qcow2 is named, clones of an existing virtual machine can be made an existing virtual machine can be made using few system resources and
without inadvertently altering the original image (with caveats - read the little time or effort.
**LIMITATIONS** section if you aren't already familiar with how copy on
write works). **qq2clone** makes creating and managing these clones simple
and efficient.
**qq2clone** supports creating numerous clones of a template and **qq2clone** supports creating numerous clones of a template and
performing batch operations on them - including the execution of arbitrary performing batch operations on them - including the execution of arbitrary
commands with exec. This simplifies workflows involving large numbers of commands with **qq2clone** exec. This simplifies workflows involving large
virtual machines, or the frequent creation/destruction of virtual machines. numbers of virtual machines, or the frequent creation/deletion of virtual
machines.
To easily establish graphical connections to your virtual machines, qq2clone To easily establish graphical connections to your virtual machines, qq2clone
can use virt-viewer or spicy. can use virt-viewer or spicy.
@ -30,18 +28,17 @@ can use virt-viewer or spicy.
Not every option has an effect in the context of every command. Specifying 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 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 will not produce an error, it simply will not do anything.
Options are parsed left to right, and right-hand options override Options are parsed left to right, and right-hand options override
left-hand options. The only exception is for \-Q/\-\-quieter, which *must* left-hand options.
be the first option listed to work properly.
\-c, \-\-connection [*URI*] \-c, \-\-connection [*URI*]
: Specify a non-default connection URI: sets the value of : Specify a non-default connection URI: sets the value of
LIBVIRT_DEFAULT_URI LIBVIRT_DEFAULT_URI
\-C, \-\-copy\-disks \-C, \-\-copy\-disks
: When importing or copying a template, make a (full) copy of images : When importing or copying a template, make a (full) copy of its image(s)
\-f, \-\-no\-spice \-f, \-\-no\-spice
: Do not attempt to connect to a virtual machine's Spice graphics. : Do not attempt to connect to a virtual machine's Spice graphics.
@ -65,17 +62,15 @@ exiting with an error or making a safe default choice depending on the
command. Recommended only once familiar with the behavior of **qq2clone** command. Recommended only once familiar with the behavior of **qq2clone**
\-Q, \-\-quieter \-Q, \-\-quieter
: This option is (currently) required to appear immediately following the : This option is (currently) required to appear as the first
invocation of **qq2clone**. Suppresses all output, error message or argument to **qq2clone**. Suppresses all output, error message or
otherwise, except when running interactive commands or otherwise, except when running interactive commands or
commands that require output to be useful. The commands for which output commands that require output to be useful. Other
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 commands will receive only an exit code as output. This option is intended
for calling qq2clone from a script. for calling qq2clone from a script.
\-r, \-\-run \-r, \-\-run
: Run a clone when creating it. Overrides NORUN setting in configuration : Start a clone after creating it. Overrides NORUN setting in configuration
\-s, \-\-storage [*LOCATION*] \-s, \-\-storage [*LOCATION*]
: When creating a clone, place new disk image file(s) at location : When creating a clone, place new disk image file(s) at location
@ -103,10 +98,9 @@ of a clone. Overrides SPICY setting in configuration
# TYPES OF COMMAND # TYPES OF COMMAND
There are two main classes of commands: commands that operate directly on There are two main classes of commands: commands that operate directly on
templates, and commands that create or operate on clones of templates. In templates, and commands that create or operate on clones of templates. To
order to make it less likely that the user may unintentionally invoke a prevent unintended actions, these two command types use slightly
command of one class when they intended to invoke one of the other, they different syntax. Commands that operate on templates use the syntax:
use a different syntax. Commands that operate on templates use the syntax:
**qq2clone** **command** [*template-name*] [*ARG*] ... **qq2clone** **command** [*template-name*] [*ARG*] ...
@ -115,14 +109,16 @@ while commands that operate on clones use the syntax:
**qq2clone** \-\-template [*template-name*] **command** [*ARG*] ... **qq2clone** \-\-template [*template-name*] **command** [*ARG*] ...
Notice that commands operating on clones work within the context of a Commands operating on clones work within the context of a
template defined by the option \-\-template/\-t. Conversely, commands template defined by \-\-template/\-t. Conversely, commands
operating on templates specify the template as an argument to the operating on templates specify the template as an argument to the
command. There can also be a default template defined by the command.
A default template can be defined by the
TEMPLATE configuration option, allowing the \-\-template TEMPLATE configuration option, allowing the \-\-template
flag to be omitted for commands that operate on clones. Commands flag to be omitted for commands that operate on clones. Commands
operating on templates do not respect this default - the template must operating on templates do not respect this default - the template must
always be explicitly defined, further reducing the likelihood of always be explicitly defined, reducing the likelihood of
accidentally modifying or deleting a template. accidentally modifying or deleting a template.
# TEMPLATE COMMMANDS # TEMPLATE COMMMANDS
@ -212,9 +208,8 @@ the domain is running forcibly turn it off)
command string in an environment where the following variables are defined command string in an environment where the following variables are defined
per clone: `"$uuid"`, `"$name"`, `"$disks"` (a newline delimited string per clone: `"$uuid"`, `"$name"`, `"$disks"` (a newline delimited string
containing the machine's qcow2 disk device filepaths). This is done using containing the machine's qcow2 disk device filepaths). This is done using
bash's eval command, so be sure to put any instances of these variables in bash's eval command, so contain the command string in single quotes to
single quotes (double quotes inside the single quotes is best practice) or avoid unexpected behavior. If any instance of exec has a non-zero
they will not be set properly. If any instance of exec has a non-zero
return value, execution stops. return value, execution stops.
**list** [*ARG*] **list** [*ARG*]
@ -256,13 +251,12 @@ domains, their state will be restored
# OTHER COMMANDS # OTHER COMMANDS
**check** [*TEMPLATE-NAME*] **check** [*TEMPLATE-NAME*]
: As described in the limitations section, there are ways that qq2clone : If a clone is deleted, has its UUID changed or is otherwise unavailable,
can lose track of a clone. If this happens, it will remain in qq2clone's it will remain in qq2clone's database. Its ID number will remain
database, its ID number will remain reserved, and its image files may not reserved, and its image files may not be deleted and take up space doing
be deleted and take up space doing nothing. The **check** command nothing. The **check** command finds and fixes occurences of this problem.
finds and fixes occurences of this problem. The *TEMPLATE-NAME* argument is The *TEMPLATE-NAME* argument is optional, and restricts the check to that
optional, and restricts the check to that template and its clones. template and its clones. Otherwise, all templates are checked
Otherwise, all templates are checked
**config** list, **config** info [*OPTION*], **config** edit [*OPTION*] **config** list, **config** info [*OPTION*], **config** edit [*OPTION*]
: List all configuration options and their current value, get info about a : List all configuration options and their current value, get info about a
@ -401,46 +395,18 @@ backing storage device that you can edit as you please
# LIMITATIONS # LIMITATIONS
The largest limitation of **qq2clone** is that it cannot protect your Understand what copy on write is. If you modify an image, you will
template images from the actions of other software. If nothing else corrupt images using it as a backing file. If you don't understand what
touches a template's storage volumes, qq2clone can safely handle them that means, use a search engine to research copy on write. To safely modify
(barring unknown bugs or bad luck during a commit-image). However, a template's underlying image, use the prepare-image and commit-image
if something else alters the image upon which a template is based, its subcommands of **qq2clone** modify-template.
existing clones may be corrupted and future clones may behave differently
than expected. It is the user'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.
Libvirt has permissions errors when a storage pool is in a "hidden" qq2clone uses a virtual machine's UUID as defined in its libvirt XML
directory with a name beginning with "." and qcow2 files with backing files file to track it. Don't change a clone's UUID.
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 '.'
If the UUID of a clone is changed, qq2clone will no longer be able to qq2clone does not support pool types other than directories. If there is
track it and will not be able to perform commands on it anymore. This will another pool type you wish it could use, email me at
be addressed in the future using custom metadata in the libvirt domain jgardner7289@protonmail.com and let me know.
XML. If the user undefines a domain, this will obviously cause it to
disappear from qq2clone's perspective when it is turned off, creating a
discrepancy in its database. This can be fixed with **qq2clone** **check**.
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.
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.
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
# FILES # FILES
@ -479,19 +445,9 @@ manually, but it is more advisable to use **qq2clone** **modify-template**
# BUGS # BUGS
As described in the options section, the implementation of the If you find a bug, please check to see if it already appears in
\-\-quieter/\-Q option needs some work. Its current behavior is the https://git.j-g-web.com/jesse/qq2clone/issues. If not, email me at
easiest functional approach without complicating the options parser, but it jgardner7289@protonmail.com.
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.
If you find any worse bugs, and I'm sure I missed some, please let me know
and I will fix them as time allows. Contact me at:
jgardner7289@protonmail.com
# COPYRIGHT 2021, Jesse Gardner # COPYRIGHT 2021, Jesse Gardner

424
qq2clone
View File

@ -3214,219 +3214,219 @@ return 0
# ENTRY POINT, at the bottom of this file # ENTRY POINT, at the bottom of this file
archive=' archive='
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
oAAA AAA=
' '
#-----------------# #-----------------#

View File

@ -12,21 +12,17 @@ qcow2 images with backing files
[\f[I]ARG\f[R]]\&... [\f[I]ARG\f[R]]\&...
.SH DESCRIPTION .SH DESCRIPTION
.PP .PP
\f[B]qq2clone\f[R] is a tool that uses libvirt to make creating clones \f[B]qq2clone\f[R] is a tool for creating and managing clones of
of template QEMU/KVM machines simple. QEMU/KVM virtual machines.
By using the copy on write feature for which qcow2 is named, clones of By using the copy on write feature of qcow2, clones of an existing
an existing virtual machine can be made without inadvertently altering virtual machine can be made using few system resources and little time
the original image (with caveats \- read the \f[B]LIMITATIONS\f[R] or effort.
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 .PP
\f[B]qq2clone\f[R] supports creating numerous clones of a template and \f[B]qq2clone\f[R] supports creating numerous clones of a template and
performing batch operations on them \- including the execution of performing batch operations on them \- including the execution of
arbitrary commands with exec. arbitrary commands with \f[B]qq2clone\f[R] exec.
This simplifies workflows involving large numbers of virtual machines, This simplifies workflows involving large numbers of virtual machines,
or the frequent creation/destruction of virtual machines. or the frequent creation/deletion of virtual machines.
.PP .PP
To easily establish graphical connections to your virtual machines, To easily establish graphical connections to your virtual machines,
qq2clone can use virt\-viewer or spicy. qq2clone can use virt\-viewer or spicy.
@ -34,19 +30,17 @@ qq2clone can use virt\-viewer or spicy.
.PP .PP
Not every option has an effect in the context of every command. 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 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 being invoked will not produce an error, it simply will not do anything.
.PP .PP
Options are parsed left to right, and right\-hand options override Options are parsed left to right, and right\-hand options override
left\-hand options. 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 .TP
.B \-c, \-\-connection [\f[I]URI\f[R]] .B \-c, \-\-connection [\f[I]URI\f[R]]
Specify a non\-default connection URI: sets the value of Specify a non\-default connection URI: sets the value of
LIBVIRT_DEFAULT_URI LIBVIRT_DEFAULT_URI
.TP .TP
.B \-C, \-\-copy\-disks .B \-C, \-\-copy\-disks
When importing or copying a template, make a (full) copy of images When importing or copying a template, make a (full) copy of its image(s)
.TP .TP
.B \-f, \-\-no\-spice .B \-f, \-\-no\-spice
Do not attempt to connect to a virtual machine\[cq]s Spice graphics. Do not attempt to connect to a virtual machine\[cq]s Spice graphics.
@ -71,18 +65,15 @@ error or making a safe default choice depending on the command.
Recommended only once familiar with the behavior of \f[B]qq2clone\f[R] Recommended only once familiar with the behavior of \f[B]qq2clone\f[R]
.TP .TP
.B \-Q, \-\-quieter .B \-Q, \-\-quieter
This option is (currently) required to appear immediately following the This option is (currently) required to appear as the first argument to
invocation of \f[B]qq2clone\f[R]. \f[B]qq2clone\f[R].
Suppresses all output, error message or otherwise, except when running Suppresses all output, error message or otherwise, except when running
interactive commands or commands that require output to be useful. 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. Other commands will receive only an exit code as output.
This option is intended for calling qq2clone from a script. This option is intended for calling qq2clone from a script.
.TP .TP
.B \-r, \-\-run .B \-r, \-\-run
Run a clone when creating it. Start a clone after creating it.
Overrides NORUN setting in configuration Overrides NORUN setting in configuration
.TP .TP
.B \-s, \-\-storage [\f[I]LOCATION\f[R]] .B \-s, \-\-storage [\f[I]LOCATION\f[R]]
@ -117,9 +108,8 @@ Overrides SPICY setting in configuration
There are two main classes of commands: commands that operate directly There are two main classes of commands: commands that operate directly
on templates, and commands that create or operate on clones of on templates, and commands that create or operate on clones of
templates. templates.
In order to make it less likely that the user may unintentionally invoke To prevent unintended actions, these two command types use slightly
a command of one class when they intended to invoke one of the other, different syntax.
they use a different syntax.
Commands that operate on templates use the syntax: Commands that operate on templates use the syntax:
.PP .PP
\f[B]qq2clone\f[R] \f[B]command\f[R] [\f[I]template\-name\f[R]] \f[B]qq2clone\f[R] \f[B]command\f[R] [\f[I]template\-name\f[R]]
@ -130,16 +120,17 @@ while commands that operate on clones use the syntax:
\f[B]qq2clone\f[R] \-\-template [\f[I]template\-name\f[R]] \f[B]qq2clone\f[R] \-\-template [\f[I]template\-name\f[R]]
\f[B]command\f[R] [\f[I]ARG\f[R]] \&... \f[B]command\f[R] [\f[I]ARG\f[R]] \&...
.PP .PP
Notice that commands operating on clones work within the context of a Commands operating on clones work within the context of a template
template defined by the option \-\-template/\-t. defined by \-\-template/\-t.
Conversely, commands operating on templates specify the template as an Conversely, commands operating on templates specify the template as an
argument to the command. argument to the command.
There can also be a default template defined by the TEMPLATE .PP
configuration option, allowing the \-\-template flag to be omitted for A default template can be defined by the TEMPLATE configuration option,
commands that operate on clones. allowing the \-\-template flag to be omitted for commands that operate
on clones.
Commands operating on templates do not respect this default \- the Commands operating on templates do not respect this default \- the
template must always be explicitly defined, further reducing the template must always be explicitly defined, reducing the likelihood of
likelihood of accidentally modifying or deleting a template. accidentally modifying or deleting a template.
.SH TEMPLATE COMMMANDS .SH TEMPLATE COMMMANDS
.TP .TP
.B \f[B]copy\-template\f[R] [\f[I]CURRENT\-NAME\f[R]] [\f[I]NEW\-NAME\f[R]] .B \f[B]copy\-template\f[R] [\f[I]CURRENT\-NAME\f[R]] [\f[I]NEW\-NAME\f[R]]
@ -236,9 +227,8 @@ 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 \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 delimited string containing the machine\[cq]s qcow2 disk device
filepaths). filepaths).
This is done using bash\[cq]s eval command, so be sure to put any This is done using bash\[cq]s eval command, so contain the command
instances of these variables in single quotes (double quotes inside the string in single quotes to avoid unexpected behavior.
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. If any instance of exec has a non\-zero return value, execution stops.
.TP .TP
.B \f[B]list\f[R] [\f[I]ARG\f[R]] .B \f[B]list\f[R] [\f[I]ARG\f[R]]
@ -281,11 +271,10 @@ Suspend execution of every machine in \f[I]SET\f[R]
.SH OTHER COMMANDS .SH OTHER COMMANDS
.TP .TP
.B \f[B]check\f[R] [\f[I]TEMPLATE\-NAME\f[R]] .B \f[B]check\f[R] [\f[I]TEMPLATE\-NAME\f[R]]
As described in the limitations section, there are ways that qq2clone If a clone is deleted, has its UUID changed or is otherwise unavailable,
can lose track of a clone. it will remain in qq2clone\[cq]s database.
If this happens, it will remain in qq2clone\[cq]s database, its ID Its ID number will remain reserved, and its image files may not be
number will remain reserved, and its image files may not be deleted and deleted and take up space doing nothing.
take up space doing nothing.
The \f[B]check\f[R] command finds and fixes occurences of this problem. 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 The \f[I]TEMPLATE\-NAME\f[R] argument is optional, and restricts the
check to that template and its clones. check to that template and its clones.
@ -462,52 +451,22 @@ Copy the XML of template Debian, creating a new template with the same
backing storage device that you can edit as you please backing storage device that you can edit as you please
.SH LIMITATIONS .SH LIMITATIONS
.PP .PP
The largest limitation of \f[B]qq2clone\f[R] is that it cannot protect Understand what copy on write is.
your template images from the actions of other software. If you modify an image, you will corrupt images using it as a backing
If nothing else touches a template\[cq]s storage volumes, qq2clone can file.
safely handle them (barring unknown bugs or bad luck during a If you don\[cq]t understand what that means, use a search engine to
commit\-image). research copy on write.
However, if something else alters the image upon which a template is To safely modify a template\[cq]s underlying image, use the
based, its existing clones may be corrupted and future clones may behave prepare\-image and commit\-image subcommands of \f[B]qq2clone\f[R]
differently than expected. modify\-template.
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 .PP
Libvirt has permissions errors when a storage pool is in a qq2clone uses a virtual machine\[cq]s UUID as defined in its libvirt XML
\[lq]hidden\[rq] directory with a name beginning with \[lq].\[rq] and file to track it.
qcow2 files with backing files are involved. Don\[cq]t change a clone\[cq]s UUID.
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 .PP
If the UUID of a clone is changed, qq2clone will no longer be able to qq2clone does not support pool types other than directories.
track it and will not be able to perform commands on it anymore. If there is another pool type you wish it could use, email me at
This will be addressed in the future using custom metadata in the jgardner7289\[at]protonmail.com and let me know.
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 .SH FILES
.TP .TP
.B \[ti]/.config/qq2clone .B \[ti]/.config/qq2clone
@ -544,21 +503,9 @@ These can be edited manually, but it is more advisable to use
\f[B]edit\f[R] \f[B]edit\f[R]
.SH BUGS .SH BUGS
.PP .PP
As described in the options section, the implementation of the If you find a bug, please check to see if it already appears in
\-\-quieter/\-Q option needs some work. https://git.j\-g\-web.com/jesse/qq2clone/issues.
Its current behavior is the easiest functional approach without If not, email me at jgardner7289\[at]protonmail.com.
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 .SH COPYRIGHT 2021, Jesse Gardner
.PP .PP
This file is part of qq2clone. This file is part of qq2clone.

File diff suppressed because it is too large Load Diff