In this tutorial you wil learn how to mount VM partitions within a disk image. If you use virtualisation technologies, such as KVM or XEN, there will be occasions where you need to access the data within a partition, in particular when the disk image has been partitioned by an OS installer such as Debian.
A good example of when this might be neccessary is if a VM (Virtual Machine) cannot boot and you need to access the data.
Table of Contents
Requirements
- You will need root access to the Linux distribution
- You will need a disk image that is not in use or can be mounted.
Before you begin
For this tutorial, we will be using Debian 11, you can use other versions of Linux such as CentOS or AlmaLinux. If you require a server for testing, please visit our website.
Create A Disk Image
For our tutorial we will now create a new disk image to demonstrate the process of how to create disk image file, then to mount it and create an empty file within the image.
Change to a directory that has disk space available, for example /home.
Next create the disk image by running the following command:
dd if=/dev/zero of=mydisk.img bs=1024k count=0 seek=5000
You should now have a disk image called mydisk.img which is 5GB in size.
Now we can format the volume by running the following command:
mkfs.ext4 mydisk.img
We can now easily mount this volume to a mount point and create files. To do this run the following command:
mount -o loop mydisk.img /mnt/
If we now change to the mount point directory, we can create an empty file:
cd/mnt
touch myfile
We can now view the new file within the new disk image
ls -la
As you can see, this is a simple process, the disk image is created, we have mounted the disk image and created an empty file.
When using VM creation tools such as bootstrap from the main hypervisor, this is the normal process for mounting the disk image, the partition is create by the hypervisor and is accessible.
Mounting HVM Disk Images
The problem comes when you create a new HVM and the OS installer is run from an ISO or net install. The installer will usually create multiple partitions within the image, therefore when you attempt to mount the disk from the hypervisor, it will not work.
mount -o loop mydisk.img /mnt/disk1: you must specify the filesystem type
We can examine the file further by running the following command:
fdisk -lu mydisk.img
This gives us an output of
You must set cylinders.
You can do this from the extra functions menu.
Disk hda: 0 MB, 0 bytes
255 heads, 63 sectors/track, 0 cylinders, total 0 sectors
Units = sectors of 1 * 512 = 512 bytes
Device Boot Start End Blocks Id System
centos.img * 1060290 17848214 8393962+ 83 Linux
Partition 1 has different physical/logical endings:
phys=(1023, 254, 63) logical=(1110, 254, 63)
hda2 17848215 20964824 1558305 83 Linux
Partition 2 has different physical/logical beginnings (non-Linux?):
phys=(1023, 254, 63) logical=(1111, 0, 1)
Partition 2 has different physical/logical endings:
phys=(1023, 254, 63) logical=(1304, 254, 63)
The ‘u’ flag inside fdisk tells us the partition table sizes in sectors rather than cylinders. From here we will need this information so we can calculate the correct offset.
Calculate the Offset in “Bytes”
In order to mount the two partitions from the image, we need to know the starting Byte from where each partition starts.
To calculate this offset, we have to mulitply start_sector * sector_byte_size. So for Partition 1 we have (1060290 * 512) = 542868480 and for Partition 2 we have (17848215 * 512) = 9138286080.
With is information we can now mount each partition to a mount point on our main host.
First we will create 2 new mount point directories by running the following commands:
mkdir /mnt/partition1
mkdir /mnt/partition2
Next, lets now mount the disk image paritions by using the information we gathered from the fdisk output and the calculation by running the following commands:
mount -o loop,offset=542868480 mydisk.img /mnt/partition1
mount -o loop,offset=9138286080 mydisk.img /mnt/partition2
As you can see, the partitions mounted successfully.
We can now change into each mount point directory and view files within the disk image.
You have now learned how to mount VM partitions within a disk image. Caution should be taken when carrying out these steps as data could be lost if you incorrectly mount the partition.