10.9. Aligning Disks and Partitions in Virtual Machines¶
Most of the modern operating systems automatically align partitions when they are installed in virtual machines. For example, Windows Server 2008 creates a default partition offset of 1024 KB to satisfy the partition alignment requirements. The following figure shows an example of correct partition alignment:
In this example, any cluster (the smallest unit of data) in the guest OS file system is aligned with the boundaries of an NFS block, and reading from or writing to a cluster requires only access to one NFS block. For example, reading from Cluster 1 causes only a read from Block 1.
At the same time, virtual machines running non-modern systems (for example, Windows Server 2008 or Red Hat Enterprise Linux 5) do usually have misaligned partitions, which is shown in the figure below:
In this example, clusters of the guest OS file system do not match the boundaries of NFS blocks, and reading from or writing to a cluster requires access to several NFS blocks. For example, reading from Cluster 1 causes two reads: from Block 1 and from Block 2. This results in a slower read time as compared to properly aligned partitions and leads to performance degradation.
10.9.1. Aligning Partitions¶
Basically, to align disks and partitions in virtual machines, you need to set an offset so that clusters in the guest OS file system match the volume block size on your NFS storage. Usually, the block size of most network storages is 512 bytes or a multiple of 512 bytes. As an example, the following sections describe the procedure of aligning disks and partitions for Linux and Windows virtual machines assuming that the size of your NFS blocks is 512 bytes.
When deciding on aligning disks and partitions, take into account that this process destroys all data on these disks and partitions. So if you want to have a correctly aligned system partition, you need to align your disks and partitions before creating a virtual machine and installing a guest operating system in it. If you do not want an aligned system partition, you can first create a virtual machine and install a guest OS in it, and then align your data disks from inside the virtual machine.
The sections below demonstrate how to align disks and partitions before you start installing a guest OS. You can, however, use a similar procedure to align data disks and partitions from inside your virtual machines.
10.9.2. Checking Partition Alignment in Existing Virtual Machines¶
First of all, you may wish to know how you can check that the partitions of a virtual machine are not aligned. Depending on the operating system installed in the virtual machine, you can do the following.
10.9.2.1. Linux Virtual Machines¶
To check the partition alignment in a Linux virtual machine, log in to this virtual machine and run the following command:
# fdisk -l -u /dev/device_name
For example, to check the partition alignment on the sdc device, you can run this command:
# fdisk -l -u /dev/sdc Disk /dev/sdc: 73.0 GB, 73014444032 bytes 255 heads, 63 sectors/track, 8876 cylinders, total 142606336 sectors Units = sectors of 1 * 512 = 512 bytes Device Boot Start End Blocks Id System /dev/sdc1 * 63 208844 104391 83 Linux /dev/sdc2 208845 142592939 71192047+ 8e Linux LVM
Pay attention to the number of sectors in the Start column. Usually, a sector contains 512 bytes, which makes up 32256 bytes for 63 sectors for the
/dev/sdc1 partition and 26105625 bytes for 208845 for the
/dev/sdc2 partition. For a partition to be properly aligned, it must align with 4096 byte boundaries (assuming that the block size of your storage is 4 KB). As 32256 and 106928640 is not a multiple of 4096, the partitions
/dev/sdc2 are not aligned properly. To align them, you should offset
/dev/sdc1partition by 1 sector so that it starts at 64. In this case, 64 sectors each containing 512 bytes make up 32768 that is a multiple of 4096.
/dev/sdc2partition by 3 sectors so that it starts at 208848. In this case, 208848 sectors each containing 512 bytes make up 106930176 that is a multiple of 4096.
10.9.2.2. Windows Virtual Machines¶
To check the partition alignment in a Windows virtual machine, do the following:
Click Start > Run, type
msinfo32.exe, and press Enter to open System Information.
Navigate to Components > Storage > Disks, and look for the Partition Starting Offset field in the right part of the window.
To find out if the partition is aligned properly, use the method described above for Linux virtual machines.
10.9.3. Aligning Disks for Linux Virtual Machines¶
To align partitions for use in a Linux virtual machine, you need a working Linux virtual machine. Once you have it at hand, follow the steps below:
- Create a new disk for the virtual machine. On this disk, you will create aligned partitions. Then you will connect the disk to a new virtual machine and install your Linux guest OS on this disk.
- Start the virtual machine and log in to it using SSH.
- Run the
fdiskutility for the disk you want to align.
- Create a primary partition, and set the starting block number for the created partition.
- Repeat steps 3-4 to create and align all partitions you plan to have in your new virtual machine.
The following example creates partition #1 with the size of 1 GB on the
/dev/sda device and uses the offset of 64 KB.
# fdisk /dev/sda Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. The number of cylinders for this disk is set to 1044. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First sector (63-16777215, default 63): 64 Last sector or +size or +sizeM or +sizeK (64-16777215, default 16777215): 208848 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
Once you align all the necessary partitions, disconnect the disk from the virtual machine. When creating a new virtual machine, choose this disk for use with this virtual machine.
10.9.4. Aligning Partitions for Windows Virtual Machines¶
To align a disk for a Windows virtual machine, you need a working Windows virtual machine. Once you have it at hand, you can use the
diskpar utility (depending on your operating system) to align the disk:
- Create a new disk for the virtual machine. On this disk, you will create aligned partitions. Then you will connect the disk to a new virtual machine and install your Windows guest OS on this disk.
- Open the command-line prompt, and run the
- Select the disk you want to align.
- Create the primary partition on the disk, and align it.
- Exit the
diskparutility, and close the command-line prompt.
The following example demonstrates how to use the
diskpart utility to align disk 1 by setting the offset of 64 for it:
Once you align the virtual disk, disconnect it from the virtual machine. When creating a new virtual machine, choose this disk for use with this virtual machine.
10.9.5. Creating a Template of a Virtual Machine with Aligned Partitions¶
To facilitate the procedure of creating virtual machines that have aligned system partitions, you can create a template of the aligned virtual machine and deploy new virtual machines from this template.
For example, if you align a disk by following the steps in Aligning Partitions for Windows Virtual Machines, then create a new virtual machine that uses this disk, and then install Windows Server 2008 operating system in the virtual machine, you will have a clean Windows Server 2008 installation on the correctly aligned disk. Now you can create a template of this virtual machine and use this template each time you need to deploy a new virtual machine with Windows Server 2008.