.. _simple_disk: Build a Virtual Disk Image ========================== .. sidebar:: Abstract This page explains how to build a simple disk image. It contains how to: - define a simple disk image in the image description - build a simple disk image - run it with QEMU A simple Virtual Disk Image is a compressed system disk with additional metadata useful for cloud frameworks like Amazon EC2, Google Compute Engine, or Microsoft Azure. It is used as the native disk of a system and does not require an extra installation workflow or a complex first boot setup procedure which is why we call it a *simple* disk image. To instruct {kiwi} to build a simple disk image add a `type` element with `image="oem"` in :file:`config.xml` that has the `oem-resize` feature disabled. An example configuration for a 42 GB large VMDK image with 512 MB RAM, an IDE controller and a bridged network interface is shown below: .. code:: xml 42 false The following attributes of the `type` element are of special interest when building simple disk images: - `format`: Specifies the format of the virtual disk, possible values are: `gce`, `ova`, `qcow2`, `vagrant`, `vmdk`, `vdi`, `vhd`, `vhdx` and `vhd-fixed`. - `formatoptions`: Specifies additional format options passed to :command:`qemu-img`. `formatoptions` is a comma separated list of format specific options in a ``name=value`` format like :command:`qemu-img` expects it. {kiwi} will forward the settings from this attribute as a parameter to the `-o` option in the :command:`qemu-img` call. The `bootloader`, `size` and `machine` child-elements of `type` can be used to customize the virtual machine image further. We describe them in the following sections: :ref:`disk-bootloader`, :ref:`disk-the-size-element` and :ref:`disk-the-machine-element` Once your image description is finished (or you are content with a image from the :ref:`example descriptions ` and use one of them) build the image with {kiwi}: .. code:: bash $ sudo kiwi-ng system build \ --description kiwi/build-tests/{exc_description_disk_simple} \ --set-repo {exc_repo_leap} \ --target-dir /tmp/myimage The created image will be in the target directory :file:`/tmp/myimage` with the file extension :file:`.raw`. The live image can then be tested with QEMU: .. code:: bash $ sudo qemu \ -drive file={exc_image_base_name_disk_simple}.x86_64-{exc_image_version}.raw,format=raw,if=virtio \ -m 4096 For further information how to setup the image to work within a cloud framework see: * :ref:`setup_for_ec2` * :ref:`setup_for_azure` * :ref:`setup_for_gce` For information how to setup a Vagrant box, see: :ref:`setup_vagrant`. .. _disk-bootloader: Setting up the Bootloader of the Image -------------------------------------- .. code:: xml The `bootloader` element defines which bootloader will be used in the image and offers several options for customizing its configuration. For details, see: :ref:`preferences-type-bootloader` .. _disk-the-size-element: Modifying the Size of the Image ------------------------------- The `size` child element of `type` specifies the size of the resulting disk image. The following example shows a image description where 20 GB are added to the virtual machine image of which 5 GB are left unpartitioned: .. code:: xml 20 false The following optional attributes can be used to customize the image size further: - `unit`: Defines the unit used for the provided numerical value, possible settings are `M` for megabytes and `G` for gigabytes. The default unit are megabytes. - `additive`: boolean value that determines whether the provided value will be added to the current image's size (`additive="true"`) or whether it is the total size (`additive="false"`). The default is `false`. - `unpartitioned`: Specifies the image space in the image that will not be partitioned. This value uses the same unit as defined in the attribute `unit` or the default. .. _disk-the-machine-element: Customizing the Virtual Machine ------------------------------- The `machine` child element of `type` can be used to customize the virtual machine configuration which is used when the image is run, like the number of CPUs or the connected network interfaces. The following attributes are supported by the `machine` element: - `ovftype`: The OVF configuration type. The Open Virtualization Format is a standard for describing virtual appliances and distribute them in an archive called Open Virtual Appliance (OVA). The standard describes the major components associated with a disk image. The exact specification depends on the product using the format. Supported values are `zvm`, `powervm`, `xen` and `vmware`. - `HWversion`: The virtual machine's hardware version (`vmdk` and `ova` formats only), see https://kb.vmware.com/s/article/1003746 for further details which value to choose. - `arch`: the VM architecture (`vmdk` format only), possible values are: `ix86` (= `i585` and `i686`) and `x86_64`. - `xen_loader`: the Xen target loader which is expected to load this guest, supported values are: `hvmloader`, `pygrub` and `pvgrub`. - `guestOS`: The virtual guest OS' identification string for the VM (only applicable for `vmdk` and `ova` formats, note that the name designation is different for the two formats). - `min_memory`: The virtual machine's minimum memory in MB (`ova` format only). - `max_memory`: The virtual machine's maximum memory in MB (`ova` format only). - `min_cpu`: The virtual machine's minimum CPU count (`ova` format only). - `max_cpu`: The virtual machine's maximum CPU count (`ova` format only). - `memory`: The virtual machine's memory in MB (all formats). - `ncpus`: The umber of virtual CPUs available to the virtual machine (all formats). Additionally, `machine` supports additional child elements that are covered in the following subsections. Modifying the VM Configuration Directly ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The `vmconfig-entry` element is used to add entries directly into the virtual machine's configuration file. This is currently only supported for the `vmdk` format where the provided strings are directly pasted into the :file:`.vmx` file. The `vmconfig-entry` element has no attributes and can appear multiple times, the entries are added to the configuration file in the provided order. Note, that {kiwi} does not check the entries for correctness. {kiwi} only forwards them. The following example adds the two entries `numvcpus = "4"` and `cpuid.coresPerSocket = "2"` into the VM configuration file: .. code:: xml numvcpus = "4" cpuid.coresPerSocket = "2" Adding Network Interfaces to the VM ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Network interfaces can be explicitly specified for the VM when required via the `vmnic` element. This can be used to add another bridged interface or to specify the driver which is being used. Note, that this element is only used for the `vmdk` image format. In the following example we add a bridged network interface using the `e1000` driver: .. code:: xml The `vmnic` element supports the following attributes: - `interface`: **mandatory** interface ID for the VM's network interface. - `driver`: optionally the driver which will be used can be specified - `mac`: this interfaces' MAC address - `mode`: this interfaces' mode. Note that {kiwi} will **not** verify the values that are passed to these attributes, it will only paste them into the appropriate configuration files. Specifying Disks and Disk Controllers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The `vmdisk` element can be used to customize the disks and disk controllers for the virtual machine. This element can be specified multiple times, each time for each disk or disk controller present. Note that this element is only used for `vmdk` and `ova` image formats. The following example adds a disk with the ID 0 using an IDE controller: .. code:: xml Each `vmdisk` element can be further customized via the following optional attributes: - `controller`: The disk controller used for the VM guest (`vmdk` format only). Supported values are: `ide`, `buslogic`, `lsilogic`, `lsisas1068`, `legacyESX` and `pvscsi`. - `device`: The disk device to appear in the guest (`xen` format only). - `diskmode`: The disk mode (`vmdk` format only), possible values are: `monolithicSparse`, `monolithicFlat`, `twoGbMaxExtentSparse`, `twoGbMaxExtentFlat` and `streamOptimized` (see also https://www.vmware.com/support/developer/converter-sdk/conv60_apireference/vim.OvfManager.CreateImportSpecParams.DiskProvisioningType.html). - `disktype`: The type of the disk as it is internally handled by the VM (`ova` format only). This attribute is currently unused. - `id`: The disk ID of the VM disk (`vmdk` format only). Adding CD/DVD Drives ^^^^^^^^^^^^^^^^^^^^ {kiwi} supports the addition of IDE and SCSCI CD/DVD drives to the virtual machine using the `vmdvd` element for the `vmdk` image format. In the following example we add two drives: one with a SCSCI and another with a IDE controller: .. code:: xml The `vmdvd` element features just these two **mandatory** attributes: - `id`: The CD/DVD ID of the drive - `controller`: The CD/DVD controller used for the VM guest, supported values are `ide` and `scsi`.