Manually restoring raw partclone partition image to a VMWare
Join the DZone community and get the full member experience.Join For Free
This post sums up how to manually restore a partition backup create by Clonezilla (using partclone) into a VMware virtual machine, which can be then either executed or its (virtual) disk mounted. The difficult points are “manual” and “partition backup” (would be much easier with a full disk backup). Normally I restore a backup by running Clonezilla from a virtual machine with sufficiently large virtual disk, but at times it isn’t possible, e.g. because the Clonezilla kernel has a buggy USB driver which tends to disconnect at times (at least with my version & flash disk).
Problems with VMware
- VMware can boot from a raw partition, but it must be a physical one, not its image stored in a file
- VMware doesn’t support loop devices for accessing such a partition (or disk) image – that’s because loop devices don’t behave as true physical disk, i.e. are missing support for some commands that VMware uses (though sb. has implemented a patch for VMware to work around this)
- VMware can boot from an image of a raw disk, but it must be a full disk (including MBR, partition table), not just a partition
Failed attempt: Use VirtualBox’s support for partitions
In theory, Virtual Box could be used with few tricks to mount from a raw partition image (by configuring it to boot from the original true raw partition and then changing the device in the configuration to a loop device) but for me VB was very unreliable, managed to boot correctly only occasionally and when it did then the graphics was a bit strange, which prevented me from logging in to the backed-up OS. Anyway, for those who’re interested, I’ll record my steps here.
0. Mount the restored partition:
sudo mount -t ext4 -o loop,nosuid,nodev /media/jholy1g/sda1.ext4-ptcl-restored.img /mnt
# in my case mounted to /dev/loop0 as revealed by running mount.
1. Create vbox image from a physical disk where the backed-up partition comes from (/dev/sda, partition #5 in my case):
sudo VBoxManage internalcommands createrawvmdk -filename vbox-sda.vmdk -rawdisk /dev/sda -partitions 5 -relative
2. In the generated vbox-sda.vmdk, replace the physical /dev/sda5 with /dev/loop0
3. Start virtualbox from the commandline where you’re sure to have access to /dev/loop0
(adduser myname disk; newgrp disk; virtualbox)
4. Create new VirtualBox virt. machine with an existing hard drive image, i.e. the one created above
Success: Restoration to a mounted vmware partition
- Create a pre-allocated (non-growing) vmware disk of a sufficient size
- Run a virtual machine with e.g. an Ubuntu live CD and the disk, create there a partitiona and set its boot flag
- Stop the vmware VM
- Mount the virtual vmdk disk as a loop device from the host system
- Mount the vmdk’s first partition as a loop device (beware you need to use the correct offset here!)
- Use partclone to restore the (joined & decompressed) backup to the partition’s loop device
- Umount the partition
- Install GRUB into the virtual disk and configure it to boot the 1st partition (either from the host system, or, which may be easier, from within vmware)
- Run the virtual machine, booting from the thus prepared disk
Restoring to a virtual vmware disk’s partition
Create a pre-allocated (non-growing) vmware disk of a sufficient size in the VMWare Player.
This part is mostly taken over from Mount Flat VMWare Disk Images Under Linux.
Mount the virtual disk:
sudo losetup /dev/loop0 /media/MyBook-Linux/vmware/Ubuntu-candyRestore/Ubuntu-candyRestore-0-flat.vmdk
Find out where the first partition of the virtual disk starts for correct offset when mounting it:
$ sudo fdisk -lu /dev/loop0 Disk /dev/loop0: 306.0 GB, 306016419840 bytes 97 heads, 12 sectors/track, 513477 cylinders, total 597688320 sectors Units = sectors of 1 * 512 = 512 bytes Disk identifier: 0xaa3590f4 Device Boot Start End Blocks Id System /dev/loop0p1 * 2048 597688319 298843136 83 Linux
=> 2048 * 512 = 1048576 bytes
Mount the VMDK partition, using the computed offset (in bytes):
sudo losetup -v -o 1048576 /dev/loop1 /dev/loop0
Restore the (joined and uncompressed) partclone backup to the virtual partition:
sudo partclone.restore -C -s /media/jholy1g/sda1.ext4-ptcl-img -o /dev/loop1
To verify, mount the restored filesystem:
sudo mount /dev/loop1 /tmp/mpoint
Further verification: Run the VM with a live CD, try to manually mount the partition similarly as above (or check whether the OS recognizes it as a valid, mountable one) – if not then perhaps the offset wasn’t right.
Making the virtual disk bootable from the restored partition
Now that we have restored our backup to a VMDK’s partition, we need to make it possible for VMWare to boot from the partition. To achieve that, we would need to install a boot manager such as Grub to the virtual image and configure it to use the partition.
There is a related blog describing how to install grub to a raw disk image and another similar article, which is quite similar to our need here.
TBD: I clearly won’t have an opportunity to try this in the forseeable future but I suppose the easiest way would be to run the virtual machine with the disk booting from a Linux live CD and install Grub there (perhaps via the Grub Customizer GUI).
Installing Grub without vmware, from the host system (having the vmdk partition mounted as a loop device as described above), should be also pretty much possible.
Sorry for leaving this unfinished. If I ever have time to come back to this, I’ll update the post.
- VMWare comes with a tool for mounting its virtual disks from the host
Published at DZone with permission of Jakub Holý, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Design Patterns for Microservices: Ambassador, Anti-Corruption Layer, and Backends for Frontends
A Complete Guide to AWS File Handling and How It Is Revolutionizing Cloud Storage
RBAC With API Gateway and Open Policy Agent (OPA)
How to LINQ Between Java and SQL With JPAStreamer