====== Diskimage Builder ======
===== Installing Diskimage Builder =====
[[https://github.com/openstack/diskimage-builder| Github diskimage-builder repo]]
[[http://docs.openstack.org/developer/diskimage-builder/user_guide/installation.html | Openstack diskimage-builder user install guide]]
First, update your system as **root**:
$ apt-get update
$ apt-get upgrade
To install the **diskimage-builder** on your instance, you need pip. Run as **root**
$ apt-get install python-pip
After this, install the **diskimage-builder** with pip as **root**:
$ pip install diskimage-builder
$ apt-get install qemu-utils
==== Errors while installing ====
=== Language Package ===
Depending on your locale settings or installed language-packages, it can happen that this error occur:
Traceback (most recent call last):
File "/usr/bin/pip", line 11, in
sys.exit(main())
File "/usr/lib/python2.7/dist-packages/pip/__init__.py", line 215, in main
locale.setlocale(locale.LC_ALL, '')
File "/usr/lib/python2.7/locale.py", line 581, in setlocale
return _setlocale(category, locale)
locale.Error: unsupported locale setting
This can be resolved by installing your language-pack. For german, run as **root**
$ apt-get install language-pack-de
Check your 2 letters country code [[http://www.worldatlas.com/aatlas/ctycodes.htm|here]]
=== Unresolved Hostname ===
To prevent an error like this:
sudo: unable to resolve host
in /etc/hosts, add the name of the instance as **root**
127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
===== Create a new Disk Image =====
Basically, invoking the following command is sufficient to create a new image:
disk-image-create ubuntu vm
Images can be customized by specifying further arguments. Read the following sections to learn more about customizing your image.
* -a architecture
* -o target output file
* -p package name[s]
* elements
==== Elements ====
Nevertheless, images can be customized either by passing package identifiers or element names.
Corresponding the OpenStack documentation, elements define "what goes into [the] image and what modifications will be performed". For an bootable image, one should at least provide two Elements, **vm** which "[s]ets up a partitioned disk (rather than building just one filesystem with no partition table)" and a **distribution name** (e.g. Ubuntu, CentOS, OpenSUSE). Whereas we recommend Ubuntu, due to the entire documentation covers Ubuntu examples.
See [[https://github.com/openstack/diskimage-builder/tree/master/elements | here]] for a list of pre-built elements.
Adding more elements to the image during the creation process can simply achieved be append them to the end of the function call:
disk-image-create ubuntu vm docker # Note: Element 'docker' needs further parameters
An element defines steps for each phase of the creation cycle. Every single step could be implemented as a Bash or Python script. Have a look [[ http://docs.openstack.org/developer/diskimage-builder/developer/developing_elements.html#phase-subdirectories | here]] to learn more about the single stages.
==== Packages ====
As mentioned above, packages which are available through the, e.g. Ubuntu, [[ http://packages.ubuntu.com/ | package repository ]], could be installed during the creation process by simply append package names.
# create Ubuntu Trusty as qcow2 image
disk-image-create -a amd64 -o ubuntu-trusty.qcow ubuntu vm
# create Ubuntu Trusty as qcow2 image, additionally install Tomcat from Ubuntu repositories
disk-image-create -a amd64 -o ubuntu-trusty-with-tomcat.qcow -p tomcat8 ubuntu vm
# create Ubuntu 16.04 (Xenial) as qcow2 image and Tomcat
DIB_RELEASE=xenial disk-image-create -a amd64 -o ubuntu-xenial-with-tomcat.qcow -p tomcat8 ubuntu vm
==== Create own Elements ====
Developing new elements is straightforward. All one have to do is to create an executable script containing the command and place it within a directory of the right execution stage (see section Elements).
For example, placing the following script in ''/path/to/elements/clojure-boot/install.d'' instructs the image builder to create an image with Boot, a build tool for the Clojure programming language, pre-installed:
#!/bin/bash
set -eu
set -o pipefail
sudo bash -c "cd /usr/local/bin && \
curl -fsSLo boot https://github.com/boot-clj/boot-bin/releases/download/latest/boot.sh && \
chmod 755 boot"
Don't forget to set right permissions:
chmod +x 01-clojure-boot
Additionally, pointing the environment variable ''ELEMENTS_PATH'' to a custom directory, let you define a personal element path:
export ELEMENTS_PATH=/home/ubuntu/elements/
By default, all elements are located in ''/usr/local/share/diskimage-builder/elements''. Have a look [[ http://docs.openstack.org/developer/diskimage-builder/elements.html | here]] or [[ https://github.com/openstack/diskimage-builder/tree/master/elements | here ]] to examine whether a desired element already exists or which elements are available, in general.
**Note:** All executable files without extension are executed, thus removing the executable flag prevents the image builder to execute those files.
In order to create your customized image, simply invoke:
# creates image with GNU Octave, Octave documentation and gnuplot (from Ubuntu repository)
# identifier of the custom element have to match with directory name (/path/to/elements/clojure-boot)
disk-image-create -a amd64 -o ubuntu-with-clojure.qcow2 -p octave,octave-doc,gnuplot ubuntu vm clojure-boot
=== Docker install latest ===
This is an example for using shell scripts to install packages manually
https://get.docker.com/
$mkdir -p elements/latest_docker/install.d
$cd elements/latest_docker/install.d
Edit file ''10-latest-docker'' in ''install.d''. Pay attention that you don't use file extensions. Additionally, you have to use a [[https://en.wikipedia.org/wiki/Shebang_(Unix)|shebang]].
#!/bin/bash
curl https://get.docker.com | sh
chmod a+x 10-latest-docker
disk-image-create -a amd64 -o ubuntu-trusty_dap.qcow2 ubuntu vm latest_docker
==== package-installs.yaml ====
Placing a ''package-installs.yaml'' into a element directory is further way to specify packages, which should be installed.
Basically, the yaml file has the following structure:
---
package:version
See [[ http://docs.openstack.org/developer/diskimage-builder/elements/package-installs/README.html | here ]] for more details.
=== Example Docker ===
To remember the path of the host home directory:
home=$(dirname $0)
You need a system variable ''ELEMENTS_PATH'' with the path to your elements:
mkdir /home/ubuntu/elements
export ELEMENTS_PATH=/home/ubuntu/elements/
mkdir -p /home/ubuntu/elements/docker_as_package && cd /home/ubuntu/elements/docker_as_package
touch package-installs.yaml
Edit package-installs.yaml
---
docker.io:
Finally, create your new image by invoking the following command:
$ disk-image-create -a amd64 -o ubuntu-trusty_dap.qcow2 ubuntu vm docker_as_package
===== Upload Image (via CLI) =====
As soon your image was successfully created, it's possible to upload and register the image in Glance, the OpenStack service to manage images, via the command line.
Firstly, one have to set up neccessary user credentials to "set[...] variables in your shell that allow you to interact with OpenStack services". For this purpose, enter the "Access & Security" screen and switch to the "API Access" tab. Here, download the ''OpenStack RC File V3''.
Afterwards, issue the following commands:
source -openrc.sh
sudo apt-get install python-openstackclient
openstack
(openstack) router list
(openstack) help
The command below will upload your image. After the upload is completed, an image called ''dlatest'' should be available through the "Images" tab, within the OpenStack dashboard.
* %%--%%disk-format qcow2
* %%--%%file
*
== Example 1 ==
(openstack) image create --disk-format qcow2 --file ubuntu-trusty_dlatest.qcow2 dlatest
== Example 2 ==
(openstack) image create --disk-format qcow2 --file /home/ubuntu/ubuntu-trusty_dap.qcow2 docker_as_a_package