$ dd if=/dev/zero of=<loop10> bs=100M count=20
You can clone the PersistentVolumeClaim (PVC) of a virtual machine disk into a new block DataVolume by referencing the source PVC in your DataVolume configuration file.
If you require scratch space according to the CDI supported operations matrix, you must first define a StorageClass or prepare CDI scratch space for this operation to complete successfully.
DataVolume
objects are custom resources that are provided by the Containerized
Data Importer (CDI) project. DataVolumes orchestrate import, clone, and upload
operations that are associated with an underlying PersistentVolumeClaim (PVC).
DataVolumes are integrated with KubeVirt, and they prevent a virtual machine
from being started before the PVC has been prepared.
A block PersistentVolume (PV) is a PV that is backed by a raw block device. These volumes do not have a filesystem and can provide performance benefits for virtual machines that either write to the disk directly or implement their own storage service.
Raw block volumes are provisioned by specifying volumeMode: Block
in the
PV and PersistentVolumeClaim (PVC) specification.
Create a local block PersistentVolume (PV) on a node by populating a file and
mounting it as a loop device. You can then reference this loop device in a
PV configuration as a Block
volume and use it as a block device for a
virtual machine image.
Log in as root
to the node on which to create the local PV. This procedure
uses node01
for its examples.
Create a file and populate it with null characters so that it can be used as a block device.
The following example creates a file loop10
with a size of 2Gb (20 100Mb blocks):
$ dd if=/dev/zero of=<loop10> bs=100M count=20
Mount the loop10
file as a loop device.
$ losetup </dev/loop10>d3 <loop10> (1) (2)
1 | File path where the loop device is mounted. |
2 | The file created in the previous step to be mounted as the loop device. |
Create a PersistentVolume
configuration that references the mounted loop device.
kind: PersistentVolume
apiVersion: v1
metadata:
name: <local-block-pv10>
annotations:
spec:
local:
path: </dev/loop10> (1)
capacity:
storage: <2Gi>
volumeMode: Block (2)
storageClassName: local (3)
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- <node01> (4)
1 | The path of the loop device on the node. |
2 | Specifies it is a block PV. |
3 | Optional: Set a StorageClass for the PV. If you omit it, the cluster default is used. |
4 | The node on which the block device was mounted. |
Create the block PV.
# oc create -f <local-block-pv10.yaml>(1)
1 | The filename of the PersistentVolume created in the previous step. |
You can clone a PersistentVolumeClaim (PVC) of an existing virtual machine disk into a new DataVolume. The new DataVolume can then be used for a new virtual machine.
When a DataVolume is created independently of a virtual machine, the lifecycle of the DataVolume is independent of the virtual machine. If the virtual machine is deleted, neither the DataVolume nor its associated PVC is deleted. |
Determine the PVC of an existing virtual machine disk to use. You must power down the virtual machine that is associated with the PVC before you can clone it.
Install the OpenShift Command-line Interface (CLI), commonly known as oc
.
At least one available block PersistentVolume (PV) that is the same size as or larger than the source PVC.
Examine the virtual machine disk you want to clone to identify the name and namespace of the associated PVC.
Create a YAML file for a DataVolume object that specifies the name of the
new DataVolume, the name and namespace of the source PVC,
volumeMode: Block
so that an available block PV is used,
and the size of the new DataVolume.
For example:
apiVersion: cdi.kubevirt.io/v1alpha1
kind: DataVolume
metadata:
name: <cloner-datavolume> (1)
spec:
source:
pvc:
namespace: "<source-namespace>" (2)
name: "<my-favorite-vm-disk>" (3)
pvc:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: <2Gi> (4)
volumeMode: Block (5)
1 | The name of the new DataVolume. |
2 | The namespace where the source PVC exists. |
3 | The name of the source PVC. |
4 | The size of the new DataVolume. You must allocate enough space, or the cloning operation fails. The size must be the same as or larger than the source PVC. |
5 | Specifies that the destination is a block PV |
Start cloning the PVC by creating the DataVolume:
$ oc create -f <cloner-datavolume>.yaml
DataVolumes prevent a virtual machine from starting before the PVC is prepared, so you can create a virtual machine that references the new DataVolume while the PVC clones. |
This matrix shows the supported CDI operations for content types against endpoints, and which of these operations requires scratch space.
Content types | HTTP | HTTPS | HTTP basic auth | Registry | Upload |
---|---|---|---|---|---|
KubeVirt(QCOW2) |
✓ QCOW2 |
✓ QCOW2** |
✓ QCOW2 |
✓ QCOW2* |
✓ QCOW2* |
KubeVirt (RAW) |
✓ RAW |
✓ RAW |
✓ RAW |
✓ RAW* |
✓ RAW* |
Archive+ |
✓ TAR |
✓ TAR |
✓ TAR |
□ TAR |
□ TAR |
✓ Supported operation
□ Unsupported operation
* Requires scratch space
** Requires scratch space if a custom certificate authority is required
+ Archive does not support block mode DVs