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: mac$ ls
The virtual host
terminal: virtaul$ pwd
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 (mac$
or virtaul$).
The problem
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 ~/virtual-boxes/centos
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
Initiate it:
mac$ vagrant init puppetlabs/centos-6.6-64-puppet
Start it:
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.
virtaul$ exit
Stop it.
mac$ vagrant halt
Locate the disk that should be increased
List all virtual boxes that VirtualBox is aware of:
mac$ VBoxManage list vms
I found "centos_default_1441182442099_63483" {b8bd7884-9c1a-4680-8fd6-52ac5b2d9ff3}
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
I got:
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
I got
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
virtaul$ df
I got
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
/dev/mapper/VolGroup-lv_root
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 /dev/sda
Create a new primary partition
Let's use /dev/sda to create a new primary partition.
virtaul$ fdisk /dev/sda
Follow these steps:
- Press
pto print the partition table to identify the number of partitions. By default there are two - sda1 and sda2. - Press
nto create a new primary partition - Press
pfor primary - Press
3for the partition number, depending the output of the partition table print - Press Enter two times to accept the default First and Last cylinder
- Press
tto change the system's partition ID - Press
3to select the newly creation partition - Type
8eto change the Hex Code of the partition for Linux LVM - Press
wto write the changes to the partition table
A new partition was created.
Reboot the machine, ssh back into it and become root.
virtaul$ reboot
mac$ vagrant ssh
virtaul$ sudo su -
Create a new physical volume
virtaul$ pvcreate /dev/sda3
Find the name of the logical volume group
virtaul$ vgdisplay
I got
--- 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
virtaul$ df
I got
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
I got
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
Start it
mac$ vagrant up
Use the new box with the increased disk.
mac$ vagrant ssh
Conclusion
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.
Acknowledgements
I would like to thank Johan Helmfrid for proof reading.
Resources
- 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