Now that you have diskimage-builder properly installed you can get started by building your first disk image.
Our first image is going to be a bootable vm image using one of the standard supported distribution elements (Ubuntu or Fedora).
The following command will start our image build (distro must be either ‘ubuntu’ or ‘fedora’):
disk-image-create <distro> vm
This will create a qcow2 file ‘image.qcow2’ which can then be booted.
It is important to note that we are passing in a list of elements to disk-image-create in our above command. Elements are how we decide what goes into our image and what modifications will be performed.
Some elements provide a root filesystem, such as the ubuntu or fedora element in our example above, which other elements modify to create our image. At least one of these ‘distro elements’ must be specified when performing an image build. It’s worth pointing out that there are many distro elements (you can even create your own), and even multiples for some of the distros. This is because there are often multiple ways to install a distro which are very different. For example: One distro element might use a cloud image while another uses a package installation tool to build a root filesystem for the same distro.
Other elements modify our image in some way. The ‘vm’ element in our example above ensures that our image has a bootloader properly installed. This is only needed for certain use cases and certain output formats and therefore it is not performed by default.
By default a qcow2 image is created by the disk-image-create command. Other output formats may be specified using the -t <format> argument. Multiple output formats can also be specified by comma separation. The supported output formats are:
- qcow2
- tar
- tgz
- squashfs
- vhd
- docker
- raw
The disk image layout (like number of images, partitions, LVM, disk encryption) is something which should be set up during the initial image build: it is mostly not possible to change these things later on.
There are currently two defaults:
The user can overwrite the default handling by setting the environment variable DIB_BLOCK_DEVICE_CONFIG. This variable must hold YAML structured configuration data.
The default when using the vm element is:
DIB_BLOCK_DEVICE_CONFIG='
- local_loop:
name: image0
- partitioning:
base: image0
label: mbr
partitions:
- name: root
flags: [ boot, primary ]
size: 100%
mkfs:
mount:
mount_point: /
fstab:
options: "defaults"
fsck-passno: 1'
The default when not using the vm element is:
DIB_BLOCK_DEVICE_CONFIG='
- local_loop:
name: image0
mkfs:
name: mkfs_root
mount:
mount_point: /
fstab:
options: "defaults"
fsck-passno: 1'
There are a lot of different options for the different levels. The following sections describe each level in detail.
In general each module that depends on another module has a base element that points to the depending base. Also each module has a name that can be used to reference the module.
The configuration is specified as a digraph. Each module is a node; a edge is the relation of the current element to its base.
Because the general digraph approach is somewhat complex when it comes to write it down, the configuration can also be given as a tree.
Example: The tree like notation
mkfs:
name: root_fs
base: root_part
mount:
mount_point: /
is exactly the same as writing
mkfs:
name: root_fs
base: root_part
mount:
name: mount_root_fs
base: root_fs
mount_point: /
Non existing name and base entries in the tree notation are automatically generated: the name is the name of the base module prepended by the type-name of the module itself; the base element is automatically set to the parent node in the tree.
In mostly all cases the much simpler tree notation can be used. Nevertheless there are some use cases when the more general digraph notation is needed. Example: when there is the need to combine two or more modules into one new, like combining a couple of physical volumes into one volume group.
Tree and digraph notations can be mixed as needed in a configuration.
There are a couple of new modules planned, but not yet implemented, like LVM, MD, encryption, …
To provide an interface towards the existing elements, there are currently three fixed keys used - which are not configurable:
This module generates a local image file and uses the loop device to create a block device from it. The symbolic name for this module is local_loop.
Configuration options:
Example:
local_loop:
name: image0
local_loop:
name: data_image
size: 7.5GiB
directory: /var/tmp
This creates two image files and uses the loop device to use them as block devices. One image file called image0 is created with default size in the default temp directory. The second image has the size of 7.5GiB and is created in the /var/tmp folder.
This module generates partitions on existing block devices. This means that it is possible to take any kind of block device (e.g. LVM, encrypted, …) and create partition information in it.
The symbolic name for this module is partitioning.
Currently the only supported partitioning layout is Master Boot Record MBR.
It is possible to create primary or logical partitions or a mix of them. The numbering of the primary partitions will start at 1, e.g. /dev/vda1; logical partitions will typically start with 5, e.g. /dev/vda5 for the first partition, /dev/vda6 for the second and so on.
The number of logical partitions created by this module is theoretical unlimited and it was tested with more than 1000 partitions inside one block device. Nevertheless the Linux kernel and different tools (like parted, sfdisk, fdisk) have some default maximum number of partitions that they can handle. Please consult the documentation of the appropriate software you plan to use and adapt the number of partitions.
Partitions are created in the order they are configured. Primary partitions - if needed - must be first in the list.
There are the following key / value pairs to define one partition table:
The following key / value pairs can be given for each partition:
(optional) List of flags for the partition. Default: empty. Possible values:
Example:
- partitioning:
base: image0
label: mbr
partitions:
- name: part-01
flags: [ boot ]
size: 1GiB
- name: part-02
size: 100%
- partitioning:
base: data_image
label: mbr
partitions:
- name: data0
size: 33%
- name: data1
size: 50%
- name: data2
size: 100%
On the image0 two partitions are created. The size of the first is 1GiB, the second uses the remaining free space. On the data_image three partitions are created: all are about 1/3 of the disk size.
This module creates file systems on the block device given as base. The following key / value pairs can be given:
Example:
- mkfs:
name: mkfs_root
base: root
type: ext4
label: cloudimage-root
uuid: b733f302-0336-49c0-85f2-38ca109e8bdb
opts: "-i 16384"
This module mounts a filesystem. The options are:
There is no need to list the mount points in the correct order: an algorithm will automatically detect the mount order.
Example:
- mount:
name: root_mnt
base: mkfs_root
mount_point: /
This module creates fstab entries. The following options exists. For details please consult the fstab man page.
Example:
- fstab:
name: var_log_fstab
base: var_log_mnt
options: nodev,nosuid
dump-freq: 2
By default, disk-image-create uses a 4k byte-to-inode ratio when
creating the filesystem in the image. This allows large ‘whole-system’
images to utilize several TB disks without exhausting inodes. In
contrast, when creating images intended for tenant instances, this
ratio consumes more disk space than an end-user would expect (e.g. a
50GB root disk has 47GB avail.). If the image is intended to run
within a tens to hundrededs of gigabyte disk, setting the
byte-to-inode ratio to the ext4 default of 16k will allow for more
usable space on the instance. The default can be overridden by passing
--mkfs-options
like this:
disk-image-create --mkfs-options '-i 16384' <distro> vm
You can also select a different filesystem by setting the FS_TYPE
environment variable.
Note --mkfs-options
are options passed to the mfks driver,
rather than mkfs
itself (i.e. after the initial -t argument).
If you have 4GB of available physical RAM (as reported by /proc/meminfo MemTotal), or more, diskimage-builder will create a tmpfs mount to build the image in. This will improve image build time by building it in RAM. By default, the tmpfs file system uses 50% of the available RAM. Therefore, the RAM should be at least the double of the minimum tmpfs size required.
For larger images, when no sufficient amount of RAM is available, tmpfs can be disabled completely by passing –no-tmpfs to disk-image-create. ramdisk-image-create builds a regular image and then within that image creates ramdisk.
If tmpfs is not used, you will need enough room in /tmp to store two uncompressed cloud images. If tmpfs is used, you would still need /tmp space for one uncompressed cloud image and about 20% of that image for working files.
If needed you can specify an override the architecture selection by passing a
-a
argument like:
disk-image-create -a <arch> ...
PowerPC can operate in either Big or Little Endian mode. ppc64
always refers to Big Endian operation. When running in little endian
mode it can be referred to as ppc64le
or ppc64el
.
Typically ppc64el
refers to a .deb
based distribution
architecture, and ppc64le
refers to a .rpm
based distribution.
Regardless of the distribution the kernel architecture is always
ppc64le
.
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.