This post has been migrated to http://www.thinkcode.se/blog/2015/09/10/increase-the-available-disk-on-a-centos-host-maintained-by-vagrant-and-virtualbox
Virtual servers are fantastic when you need to test something and want to make sure that you have a well know environment. A virtual server has no value. You can create it over and over again and it will only cost you some time to start and stop.
VirtualBox and Vagrant is a really easy combination to get started with. However, it may turn ut that the base box you use need to be enhanced. I will show you how you can increase the disk space available on the virtual host. Unfortunately, it isn’t as easy as one could hope for. But it is possible and I will show you how. When the disk has been increased, I will repackage the virtual host so it can be reused easily.
I assume that you have VirtualBox and Vagrant installed. If not, stop here and install them. I also assume that you are able to run commands from a shell. I am on a Mac and this has been tested in my terminal. You might want to consider installing Cygwin if you are using a broken os.
I want to make it clear where each command is executed, either in my terminal och the mac or in the virtual host. I will indicate the different environments like this:
The mac terminal:
The virtual host terminal:
This should be interpreted as that I did
ls on the mac and
pwd on the virtual host.
I would cut and paste each command to the terminal. If you do so, do not include the initial part (
I need to have a test host running CentOS. I will start from a base box created by Puppet Labs. The problem, however, is that the disk is too small for the application I want to test.
This means that the first thing I want to do is to increase the available disk space. This step by step guide has been my inspiration for increasing the disk: https://gist.github.com/christopher-hopper/9755310
As far as I know, I am not doing anything that is CentOS specific. This means that I expect this guide to be usable for any Linux box that uses LVM for managing its disks.
Let’s go through a scenario step by step.
Create a home for virtual boxes
My virtual boxes should have a home in
~/virtual-boxes and this CentOS test host should live in
Get a new box and start it
Get a new Vagrant box for VirtualBox:
mac$ vagrant box add puppetlabs/centos-6.6-64-puppet --provider virtualbox
This will download the needed resources from the Internet. It may take a while, it is a large download.
Change to the home directory for this virtual box:
mac$ cd ~/virtual-boxes/centos
mac$ vagrant init puppetlabs/centos-6.6-64-puppet
mac$ vagrant up
SSH into it:
mac$ vagrant ssh
Verify that we have a LVM system
Check the physical volume:
virtaul$ sudo pvdisplay
The result is:
--- Physical volume --- PV Name /dev/sda2 VG Name VolGroup PV Size 19.51 GiB / not usable 3.00 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 4994 Free PE 0 Allocated PE 4994 PV UUID wqDj0S-MIE8-RITx-Otf7-WsSe-5pPg-XYPCJw
This gave us something usable back, we have a LVM volume and can increase it.
Exit the host.
mac$ vagrant halt
Locate the disk that should be increased
List all virtual boxes that VirtualBox is aware of:
mac$ VBoxManage list vms
Locating the disk means searching for it using the box name. Let’s do
mac$ VBoxManage showvminfo centos_default_1441182442099_63483
This tells me much more than I need. Let me grep for anything with the suffix ‘vmdk’.
mac$ VBoxManage showvminfo centos_default_1441182442099_63483 | grep vmdk
The result looked like this:
IDE Controller (0, 0): /Users/tsu/VirtualBox VMs/centos_default_1441182442099_63483/packer-centos-6.6-x86_64-virtualbox-vagrant-puppet-1437997185-disk1.vmdk (UUID: 21a9238f-1ffe-4c53-8b0c-3168a2026f30)
I notice that the disk is stored in
~/VirtualBox VMs. That is the default location for VirtualBox files.
Clone the disk
VMDK disks can’t be extended. I will therefore clone it to a vdi disk that can be extended.
mac$ cd ~/VirtualBox\ VMs/centos_default_1441182442099_63483/
mac$ VBoxManage clonehd packer-centos-6.6-x86_64-virtualbox-vagrant-puppet-1437997185-disk1.vmdk clone-disk1.vdi --format vdi
Find the current disk size
Let’s see how large the current disk is
mac$ VBoxManage showhdinfo clone-disk1.vdi
UUID: 62bb925f-ea3a-4325-85ac-7bfeaeb97761 Parent UUID: base State: created Type: normal (base) Location: /Users/tsu/VirtualBox VMs/centos_default_1441182442099_63483/clone-disk1.vdi Storage format: VDI Format variant: dynamic default Capacity: 20480 MBytes Size on disk: 1854 MBytes Encryption: disabled
This tells me that the current size is 20 GBytes, 20480 MBytes. That is too small for stuff I want to test. I will resize it to 40 GBytes.
mac$ VBoxManage modifyhd clone-disk1.vdi --resize 40960
Find the name of the storage controller
Find out the name of the storage controller this resized disk should be attached to.
mac$ VBoxManage showvminfo centos_default_1441182442099_63483 | grep Storage
Storage Controller Name (0): IDE Controller Storage Controller Type (0): PIIX4 Storage Controller Instance Number (0): 0 Storage Controller Max Port Count (0): 2 Storage Controller Port Count (0): 2 Storage Controller Bootable (0): on
Attach the disk to the storage controller
mac$ VBoxManage storageattach centos_default_1441182442099_63483 --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium clone-disk1.vdi
Increase the disk size on the host
Bring the box up again
mac$ cd ~/virtual-boxes/centos/
mac$ vagrant up
Ssh back into it and become root
mac$ vagrant ssh
virtaul$ sudo su -
Find the name of the logical volume for the file system
Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/VolGroup-lv_root 19003260 1185320 16845960 7% / tmpfs 251080 0 251080 0% /dev/shm /dev/sda1 487652 28352 433700 7% /boot vagrant 487358464 263884424 223474040 55% /vagrant
The name I am looking for is
Find the name of the physical volume using disk.
virtaul$ fdisk -l
This gave me
Disk /dev/sda: 42.9 GB, 42949672960 bytes 255 heads, 63 sectors/track, 5221 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000906bd Device Boot Start End Blocks Id System /dev/sda1 * 1 64 512000 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 64 2611 20458496 8e Linux LVM Disk /dev/mapper/VolGroup-lv_root: 19.9 GB, 19906166784 bytes 255 heads, 63 sectors/track, 2420 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/mapper/VolGroup-lv_swap: 1040 MB, 1040187392 bytes 255 heads, 63 sectors/track, 126 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
I am interested in
Create a new primary partition
/dev/sda to create a new primary partition.
virtaul$ fdisk /dev/sda
Follow these steps:
pto print the partition table to identify the number of partitions. By default there are two – sda1 and sda2.
nto create a new primary partition
3for the partition number, depending the output of the partition table print
- Press Enter two times to accept the default First and Last cylinder
tto change the system’s partition ID
3to select the newly creation partition
8eto change the Hex Code of the partition for Linux LVM
wto write the changes to the partition table
A new partition was created.
Reboot the machine, ssh back into it and become root.
mac$ vagrant ssh
virtaul$ sudo su -
Create a new physical volume
virtaul$ pvcreate /dev/sda3
Find the name of the logical volume group
--- Volume group --- VG Name VolGroup System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 3 VG Access read/write VG Status resizable MAX LV 0 Cur LV 2 Open LV 2 Max PV 0 Cur PV 1 Act PV 1 VG Size 19.51 GiB PE Size 4.00 MiB Total PE 4994 Alloc PE / Size 4994 / 19.51 GiB Free PE / Size 0 / 0 VG UUID kolyjB-epDi-uOQt-pp9k-3WOe-twe8-JJb9pz
Extend the volume group to use the new physical volume
virtaul$ vgextend VolGroup /dev/sda3
Find the name of the logical volume
Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/VolGroup-lv_root 19003260 1185428 16845852 7% / tmpfs 251080 0 251080 0% /dev/shm /dev/sda1 487652 28352 433700 7% /boot
Extend the logical volume to use all available space
virtaul$ lvextend -l +100%FREE /dev/mapper/VolGroup-lv_root
Resize the file system
virtaul$ resize2fs /dev/mapper/VolGroup-lv_root
Verify that there are more space available
virtaul$ df -h
Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 38G 1.2G 35G 4% / tmpfs 246M 0 246M 0% /dev/shm /dev/sda1 477M 28M 424M 7% /boot
The disk is increased! We are almost done.
Now we want to do some cleaning and then repackage this as a new base box.
Clean and repackage
Remove the command history and last login. As root, do this:
virtaul$ cat /dev/null > ~/.bash_history && cat /dev/null > /var/log/lastlog && history -c && exit
and then, as vagrant, do
virtaul$ cat /dev/null > ~/.bash_history && history -c && exit
Now there won’t be any history available when you login again.
Time to re-package the new box.
mac$ vagrant package --output centos-6.6-64-puppet-40Gb.box
Move the new box somewhere where we can refer to it when a new box is created from it. Create a home for base boxes.
mac$ mkdir ~/virtual-boxes/base-boxes/
Then, move the newly created box there:
mac$ mv centos-6.6-64-puppet-40Gb.box ~/virtual-boxes/base-boxes/
Add this new box to Vagrant for later usage.
mac$ vagrant box add centos-6.6-64-puppet-40Gb ~/virtual-boxes/base-boxes/centos-6.6-64-puppet-40Gb.box
Destroy the current CentOS box
mac$ vagrant destroy -f
and finally delete the Vagrant file
mac$ rm Vagrantfile
Initiate the new box:
mac$ vagrant init centos-6.6-64-puppet-40Gb
mac$ vagrant up
Use the new box with the increased disk.
mac$ vagrant ssh
This was a step by step guide that initiated a small CentOS box, increased the disk and created a new base box.
I hope you have use for it.
I would like to thank Johan Helmfrid for proof reading.
- VirtualBox – a virtualization product
- Vagrant – a command line shell for simplified handling of virtual systems
- Cygwin – a fix for broken operating systems
- https://gist.github.com/christopher-hopper/9755310 – the inspiration for the extension part of this post
- Thomas Sundberg – The author