.. _simple_disk: Build a Virtual Disk Image ========================== .. sidebar:: Abstract This page explains how to build a simple disk image. It covers the following topics: - defines a simple disk image in the image description - builds a simple disk image - runs 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 it does not require an additional installation workflow or a complex first-boot setup procedure. To enable {kiwi} to build a simple disk image, add a `type` element with `image="oem"` in :file:`config.xml`, where the `oem-resize` option is disabled. An example configuration for a 42-GB large VMDK image with 512 MB of RAM, an IDE controller, and a bridged network interface is shown below: .. code:: xml 42 false The following attributes of the `type` element deserve attention 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`. In addition, a disk can be wrapped into a container by prefixing the format with `oci:` or `docker:`, for example `format="oci:qcow2"`. The permitted sub-formats are `gce`, `ova`, `qcow2`, `vmdk`, `vdi`, `vhd`, `vhdx`, `vhd-fixed` and `raw`. Note that `vagrant` cannot be used as a sub-format. - `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, as expected by :command:`qemu-img`. {kiwi} forwards the settings from the 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. These elements are described in the following sections: :ref:`disk-bootloader`, :ref:`disk-the-size-element`, and :ref:`disk-the-machine-element`. Once your image description is finished, you can build the image using the following {kiwi} command: .. 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 resulting :file:`.raw` image is stored in :file:`/tmp/myimage`. You can test the image using 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 on how to configure the image to work within a cloud framework, see: * :ref:`setup_for_ec2` * :ref:`setup_for_azure` * :ref:`setup_for_gce` For information on how to set up a Vagrant system, see :ref:`setup_vagrant`. .. _disk-bootloader: Setting up the Bootloader in the Image -------------------------------------- .. code:: xml The `bootloader` element defines which bootloader to use in the image, and the element 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 an 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 further customize the image size: - `unit`: Defines the unit used for the provided numerical value. Possible values are `M` for megabytes and `G` for gigabytes. The default unit is megabytes. - `additive`: A boolean value that determines whether the provided value is added to the current image size (`additive="true"`) or whether it is the total size (`additive="false"`). The default value is `false`. - `unpartitioned`: Specifies the image space in the image that is not partitioned. The attribute uses either the same unit as defined in the attribute `unit` or the default value. .. _disk-the-machine-element: Customizing the Virtual Machine ------------------------------- The `machine` child element of `type` can be used to customize the virtual machine configuration, including the number of CPUs and 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 distributing them in an archive called an 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 value is `vmware`. - `HWversion`: The virtual machine's hardware version (`vmdk` and `ova` formats only); refer to VMware documentation for further information on the supported values. - `arch`: the VM architecture (`vmdk` format only). Valid values are `ix86` (= `i586` and `i686`) and `x86_64`. - `xen_loader`: the Xen target loader that is expected to load the guest. Valid 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). Note: For vmware ovftools, guestOS is a VMX GuestOS, but not a VIM GuestOS. For instance, the correct value for Ubuntu 64-bit is "ubuntu-64", but not "ubuntu64Guest". See GUEST_OS_KEY_MAP in guest_os_tables.h at https://github.com/vmware/open-vm-tools for another guestOS values. - `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 number of virtual CPUs available to the virtual machine (all formats). `machine` also 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. 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 makes it possible to add another bridged interface or to specify the driver to be used. Note that this element is used for the `vmdk` image format only. The following example adds a bridged network interface that uses the `e1000` driver: .. code:: xml The `vmnic` element supports the following attributes: - `interface`: **Mandatory** interface ID for the VM's network interface. - `driver`: An optional driver. - `mac`: The MAC address of the specified interface. - `mode`: The mode of the interface. Note that {kiwi} does **not** verify the values of the attributes; it only inserts them into the appropriate configuration files. Specifying Disks and Disk Controllers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The `vmdisk` element can be used to customize the disk and disk controller for the virtual machine. At most one `vmdisk` element may be specified per `machine` element. Note that this element is used for `vmdk` and `ova` image formats only. The following example adds a disk with the ID 0 that uses an IDE controller: .. code:: xml Each `vmdisk` element can be further customized using 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). Valid values are `monolithicSparse`, `monolithicFlat`, `twoGbMaxExtentSparse`, `twoGbMaxExtentFlat`, and `streamOptimized` (see also https://vdc-download.vmware.com/vmwb-repository/dcr-public/6335f27c-c6e9-4804-95b0-ea9449958403/c7798a8b-4c73-41d9-84e8-db5453de7b17/doc/vddkDataStruct.5.3.html). - `disktype`: The type of the disk handled internally 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 adding one IDE or SCSI CD/DVD drive to the virtual machine using the `vmdvd` element for the `vmdk` and `ova` image formats. At most one `vmdvd` element may be specified per `machine` element. The following example adds a single drive with a SCSI controller: .. code:: xml The `vmdvd` element features two **mandatory** attributes: - `id`: The CD/DVD ID of the drive. - `controller`: The CD/DVD controller used for the VM guest. Valid values are `ide` and `scsi`.