5 Image definition #
In keg terminology, an image definition is the data set that specifies the
KIWI image description that should be generated. keg reads image definition
from the images directory in the recipes root directory.
Keg considers all leaf directories in images to be image definitions.
This means by parsing any YAML file from those directories and all YAML files
in any parent directory and merging their data into a dictionary, a complete
image definition needs to be available in the resulting dictionary. There is no
specific hierarchy required in images. Any level of sub directories can
be used to create multiple levels of inheritance, or simply just to group image
definitions. Example directory layout:
images/
opensuse/
defaults.yaml
leap/
content.yaml
15.2/
image.yaml
15.3/
image.yamlThis example layout defines two images, opensuse/leap/15.2 and
opensuse/leap/15.3. It uses inheritance to define a common content
definition for both image definitions, and to set some opensuse specific
defaults. Running keg -d output_dir opensuse/leap/15.3 would merge
data from the following files in the show order:
images/opensuse/defaults.yaml images/opensuse/leap/content.yaml images/opensuse/leap/15.3/image.yaml
All keys from the individual YAML files that are in the given tree will be merged into a dictionary that defines the image to be generated.
5.1 Image definition structure #
An image definition dictionary is composed of several parts that define different parts of the image. The actual image description, configuration scripts, overlay archives. All parts are defined under a top-level key in the dictionary. There are additional top-level keys that affect data parsing and generator selection.
The top-level keys are as follows:
5.1.1 image #
The image dictionary. This is the only mandatory top-level key. It defines
the content of the config.kiwi file keg should generate and is
essentially a YAML version of KIWI's image description (typically in XML). It
contains all image configuration properties, package lists, and references to
overlay archives. There is a number of special keys that influence how keg
constructs the dictionary and generates the XML output. The basic structure is
as follows:
image:
_attributes:
schemaversion: "<schema_maj>.<schema_min>"
name: <image_name>
displayname: <image_boot_title>
description:
_attributes:
type: <system_type>
author: <author_name>
contact: <author_email>
preferences:
- version: <version_string>
- _attributes:
profiles:
- <profile_name>
...
type:
_attributes:
image: <image_type>
kernelcmdline:
<kernel_param>: <kernel_param_value>
...
...
size:
_attributes:
unit: <size_unit>
_text: <disk_size>
...
users:
user:
- _attributes:
name: <user_name>
groups: <user_groups>
home: <user_home>
password: <user_password>
...
packages:
- _attributes:
type: image|bootstrap
profiles:
- <profile>
...
archive:
_attributes:
name: <archive_filename>
<namespace>:
package:
- _attributes:
name: <package_name>
arch: <package_arch>
...
...
...
profiles:
profile:
- _attributes:
name: <profile_name>
description: <profile_description>
...This only outlines the structure and includes some of the configuration keys
that KIWI supports. See KIWI Image Description
for full details.
For the purpose of generating the KIWI XML image description, any key in the
image dictionary that is not a plain data type is converted to an XML element
in the KIWI image description, with the tag name being the key name. Any key
that starts with an _ has a special meaning. The following are supported:
_attributes
If a key contains a sub key called _attributes, it instructs the XML
generator to produce an attribute for the XML element with the given key name
and value as its name-value pair. If value is not a plain data type, it is
converted to a string, which allows for complex attributes being split over
different files and also for redefinition on lower levels. For example:
type:
_attributes:
image: vmx
kernelcmdline:
console: ttyS0
debug: []Would generate the following XML element:
<type image="vmx" kernelcmdline="console=ttyS0 debug"/>The empty list used as value for debug means the attribute parameter is
valueless (i.e. a flag).
_text
If a key contains a key called _text, its value is considered the element’s
content string.
_namespace[_name]
Any key that start with _namespace does not produce an XML element in the
output. Namespaces are used to group data and allow for an inheritance and
overwrite mechanism. Namespaces produce comments in the XML output that
states which namespace the enclosed data was part of.
_map_attribute
If a key contains a key _map_attribute, which needs to be a string type,
any _attribute key under the key that is a simple list instead of the
actually required mapping, is automatically converted to a mapping with the
attribute key equal to _map_attribute value. For example:
packages:
_map_attribute: name
_namespace_some_pkgs:
package:
- pkg1
- pkg2Is automatically converted to:
packages:
_namespace_some_pkgs:
package:
- _attribute:
name: pkg1
- _attribute:
name: pkg1
archive:
- _attributes:
name: archive1.tar.gzThis allows for making lists of elements that all have the same attribute (which package lists typically have) more compact and readable.
_comment[_name]
Any key that has a key that starts with _comment will have a comment above
it in the XML output, reading the value of the _comment key (needs to be
a string).
5.1.2 config #
The config dictionary defines the content of the config.sh file keg
should generate. config.sh is a script that KIWI runs during the image
prepare step and can be used to modify the image’s configuration. The
config dictionary structure is as follows:
config:
- profiles:
- <profile_name>
...
files:
<namespace>:
- path: <file>
append: bool (defaults to False if missing)
content: string
...
...
scripts:
<namespace>:
- <script>
...
...
services:
<namespace>:
- <service_name>
- name: <service_name>
enable: bool
...
...
sysconfig:
<namespace>:
- file: <sysconfig_file>
name: <sysconfig_variable>
value: string
...
...
...Each list item in config produces a section in config.sh, with the
optional profiles key defining for which image profile that section should
apply. Each item can have the following keys (all are optional, but there has
to be at least one):
files defines files that should be created (or overwritten if existing) with
the given content or have content appended to in config.sh.
scripts defines which scriptlets should be included. <script> refers to
a file data/scripts/<script>.sh in the recipes tree.
services defines which systemd services and timers should be enabled or
disabled in the image. The short version (just a string) means the
string is the service name and it should be enabled.
defines which existing sysconfig variables should the altered.
<namespace> defines a namespace with the same purpose as in the image
dictionary, but config namespaces don’t have to start with _, but are
allowed to.
5.1.3 setup #
The config dictionary defines the content of the images.sh file keg
should generate. This script is run by KIWI during the image create step. Its
structure is identical to config.
See User defined scripts
in the KIWI documentation for more details on user scripts.
5.1.4 archive #
The archive dictionary defines the content of overlay tar archives, that can be
included in the image via the archive sub-section of the packages section
of the image dictionary. The structure is as follows:
archive:
- name: <archive_filename>
<namespace>:
_include_overlays:
- <overlay_module>
...
...When generating the image description, keg will produce a tar archive for
each entry in archive with the given file name, with its contents being
composed of all files that are in the listed overlay modules. Each module
references a directory in data/overlayfiles.
Keg automatically compresses the archive based on the file name extension.
Supported are gz, , xz, or no extension for uncompressed archive.
The archive name root.tar (regardless of compression extension) is
automatically included in all profiles (if there are any) by KIWI.
It is not necessary to include it explicitly in the image definition.
5.2 The _include statement #
Keg supports importing parts of the image definition from other directory
trees within the recipes to allow for modularization. For that purpose, a key
in the image dictionary may have a sub-key called _include. Its value is a
list of strings, each of which points to a directory in the data
sub-directory of the recipes root. To process the instruction, keg generates
another dictionary from all YAML files in the referenced directory trees (the
same mechanism as when parsing the images tree applies). It then looks up the
key in that dictionary that is equal to the parent key of the _include key,
and replaces the _include key with its contents. That means, if the
_include statement is below a key called packages, only data under
packages in the include dictionary will be copied into the image definition
dictionary. This allows for having different types of configuration data in the
same directory and including them in different places in the image definition.
See Chapter 6, Data modules for details on data modules.
5.3 Additional configuration directives #
There are three additional optional top-level image definition sections that affect how the image definition dictionary is composed and the image description is generated:
5.3.1 include-paths #
The include-paths key defines a list of search paths that get appended
when _include statements are processed. This allows for having different
versions of data modules and still share the most of an image definition
between different versions. See Chapter 6, Data modules for details.
5.3.2 image-config-comments #
This section allows to add top-level comments in the produced KIWI file.
The format is as follows:
image-config-comments:
<comment_name>: <comment>
...<comment_name> is just a name and is not included in the generated output.
Comments can be used to include arbitrary information in the image description.
Some comments have a special meaning for processing image descriptions by the
Open Build Service, for instance the OBS-Profiles directive that is required
to process multi-profile image descriptions. See
https://osinside.github.io/kiwi/working_with_images/build_in_buildservice.html
for details.
Keg generates some comments automatically. In case the image definition has
multiple profiles and the --disable-multibuild command line switch is not
set, it will add an OBS-Profiles: @BUILD_FLAVOR@ comment. In case the
image description is generated for one or more specific architectures
via the -a command line option, the apprpriate OBS-ExclusiveArch
comment is added.
5.3.3 xmlfiles #
This optional section allows generating additional custom XML files. The format is as follows:
xmlfiles:
- name: <filename>
content:
<content_dictionary>
...For each list item in this section, an XML file named <filename> will
be created, with the content being generated from the <content_dictionary>.
For this dictionary the same rules about formatting, including, namespacing,
etc., apply as for the image dictionary.
Custom XML files can be useful when generating image descriptions for use in
the Open Build Service, which accepts build configuration directives via XML
source files, like the _constraints file. See
https://openbuildservice.org/help/manuals/obs-user-guide/cha.obs.build_job_constraints.html
for details.
5.3.4 schema #
Keg starting with version 2.0.0 has an internal XML generator to produce
KIWI image descriptions. Previously, a Jinja2 template was used to convert
the image dictionary that keg constructed into a KIWI image description.
Using a Jinja2 template is still supported and can be configured as follows
in the image definition:
schema: <template>In this case, instead of running the XML generator, keg would read the
file <template>.kiwi.templ from the schemas directory in the recipes
root directory and run it trough the Jinja2 engine.
While using a Jinja2 template would in theory allow to operate on different
input data structures, the internal schema validator requires the image
definition to comply with what keg expects.