[CentOS] Backup KVM Guest VM in OVA or VMDK format

Tue Sep 20 10:08:04 UTC 2022
Ondřej Budai <obudai at redhat.com>

Hi Kaushal,

st 14. 9. 2022 v 16:07 odesílatel Kaushal Shriyan <kaushalshriyan at gmail.com>
napsal:

> On Fri, Sep 2, 2022 at 5:41 PM Fabian Arrotin <arrfab at centos.org> wrote:
>
> > On 01/09/2022 18:14, Kaushal Shriyan wrote:
> > > Hi,
> > >
> > > Is there a way to backup KVM Guest VM running CentOS Linux release
> > 7.9.2009
> > > (Core) OS in kvmguestosimage.ova or kvmguestosimage.vmdk format as I am
> > > trying to restore it in AWS by referring to
> > > https://aws.amazon.com/ec2/vm-import/ article as per the below
> supported
> > > file format.
> > >
> > > [1] Open Virtualization Archive (OVA)
> > > [2] Virtual Machine Disk (VMDK)
> > > [3] Virtual Hard Disk (VHD/VHDX)
> > > [4] raw
> > >
> > > Also any method to take full and incremental backup of KVM Guest VM.
> > >
> > > Any help will be highly appreciated. I look forward to hearing from
> you.
> > > Thanks in Advance.
> > >
> > > Best Regards,
> > >
> > > Kaushal
> >
> > Stop the vm
> > qemu-img convert -f raw origin.qcow2 dest.raw
> >
> > You can then import but while we use this to create official centos
> > image, don't forget to ensure that you node is ready to be imported, so
> > cloud-init, etc, etc
> >
> > It's usually easier/better/faster to have automation in place to
> > configure an application and so replay it on a new node, and then
> > replicate data
> >
> > I guess only option why you'd want to not do this is that it's a running
> > machine that was configured "by hands" by someone who left the company
> > (and so without automation in place)
> >
> > --
> > Fabian Arrotin
> > The CentOS Project | https://www.centos.org
> > gpg key: 17F3B7A1 | twitter: @arrfab
> > _______________________________________________
> > CentOS mailing list
> > CentOS at centos.org
> > https://lists.centos.org/mailman/listinfo/centos
>
>
> Thanks Fabian for the detailed email. I followed the below steps by
> referring to
>
> https://docs.aws.amazon.com/vm-import/latest/userguide/vmimport-image-import.html
> .
>
> # qemu-img -h | grep Supported
> Supported formats: blkdebug blklogwrites blkverify compress
> copy-before-write copy-on-read file ftp ftps gluster host_cdrom host_device
> http https iscsi iser luks nbd null-aio null-co nvme preallocate qcow2
> quorum raw rbd ssh throttle vhdx vmdk vpc
>
> # qemu-img --version
> qemu-img version 6.2.0 (qemu-kvm-6.2.0-12.module_el8.7.0+1140+ff0772f9)
> Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers
> #
>
> *Step No. 1*
> #qemu-img convert -O vmdk openapibox.img openapibox.vmdk -p
>

I'm not 100% sure but I think that AWS only accepts the stream-optimized
subformat, the command is:

$ qemu-img convert -O vmdk -o subformat=streamOptimized openapibox.img
openapibox.vmdk


>
> *Step No. 2*
> #aws ec2 import-image --disk-containers
> Format=vmdk,UserBucket="{S3Bucket=daclabservers,S3Key=openapidbox.vmdk}"
> {
>     "ImportTaskId": "import-ami-0232f452194f6efe0",
>     "Progress": "1",
>     "SnapshotDetails": [
>         {
>             "DiskImageSize": 0.0,
>             "Format": "VMDK",
>             "UserBucket": {
>                 "S3Bucket": "daclabservers",
>                 "S3Key": "openapibox.vmdk"
>             }
>         }
>     ],
>     "Status": "active",
>     "StatusMessage": "pending"
> }
>

Our project (https://www.osbuild.org/) uses the raw format for disks,
uploads it to S3, calls import-snapshot to import it as an EBS snapshot and
finally calls register-image to create a new AMI. Basically:

$ qemu-img convert -O raw openapibox.img openapibox.raw
# upload into S3
$ aws ec2 import-snapshot ...
# wait for the snapshot to be imported
$ aws ec2 register-image ...

Docs:
- https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html
- https://docs.aws.amazon.com/cli/latest/reference/ec2/import-snapshot.html
-
https://docs.aws.amazon.com/vm-import/latest/userguide/vmimport-import-snapshot.html

If you want to see this in practice, we have some Go code. As awscli is
just a thin wrapper over the API, it should be pretty easy to translate our
code into awscli calls:
https://github.com/osbuild/osbuild-composer/blob/bfd90cf191eece5c1331dcb43a85bcca02d8d7d4/internal/cloud/awscloud/awscloud.go#L211

Hope that helps,

Ondřej


>
> *Step No. 3*
> #aws ec2 describe-import-image-tasks --import-task-ids
> import-ami-0232f452194f6efe0
> {
>     "ImportImageTasks": [
>         {
>             "ImportTaskId": "import-ami-0232f452194f6efe0",
>             "SnapshotDetails": [
>                 {
>                     "DiskImageSize": 0.0,
>                     "Status": "completed"
>                 }
>             ],
>             "Status": "deleted",
>             "StatusMessage": "ClientError: Disk validation failed
> [Unsupported VMDK File Format]",
>             "Tags": []
>         }
>     ]
> }
>
> Please guide me. Am I missing anything? Thanks in advance.
>
> Best Regards,
>
> Kaushal
> _______________________________________________
> CentOS mailing list
> CentOS at centos.org
> https://lists.centos.org/mailman/listinfo/centos
>
>