Creating a minimal CentOS VM using VMWare Fusion on Mac OS X
I’ve written before about bootstrapping my development virtual infrastructure. When I did that I used an existing bare image VM I had lying around, but with CentOS 6 around the corner I wanted to document a process for creating a bare image from scratch.
First, you need CentOS 5.6 ISOs, so download CentOS if needed.
We need to create a floppy drive with a FAT or EXT2 filesystem, with a
ks.cfg file on it. On the mac this seems trickier than it should be. If you have an existing linux VM you can use that. If not, make a new default VM, then
- attach the CentOS 5.6 part1 DVD iso as the DVD drive.
- Run installer. Settings do not matter. Disable packages to make install go quickly.
- shut down VM.
echo ' ' > floppy144.flp, add floppy drive with that file.
- start VM.
fdformat /dev/floppy mkfs.ext2 /dev/floppy mount /dev/floppy /mnt/floppy cat >/mnt/floppy/ks.cfg <<END authconfig --enableshadow --enablemd5 bootloader --location=mbr --driveorder=sda firewall --disable install cdrom keyboard us-acentos lang en_US.UTF-8 network --device eth0 --bootproto dhcp rootpw changeme12 selinux --disabled timezone --utc Europe/London skipx text clearpart --all --initlabel part /boot --fstype ext3 --size=100 --ondisk=sda part pv.2 --size=0 --grow --ondisk=sda volgroup VolGroup00 --pesize=32768 pv.2 logvol / --fstype ext3 --name=LogVol00 --vgname=VolGroup00 --size=1024 --grow logvol swap --fstype swap --name=LogVol01 --vgname=VolGroup00 --size=256 --grow --maxsize=512 %packages --excludedocs --nobase @Core END
Note among other things the above settings disable the iptables firewall and disable selinux and use a plaintext password
changeme12. You should understand what that means and be happy with the security implications before you continue.
Shut down the VM, or at least unmount the floppy. If you made that VM just to create the floppy file, you can now throw that VM away. If you’re writing your own kickstart file you may want to keep it around though in case you made a mistake, so you can go back easily and edit the file on the floppy.
Now we’re ready to start work on our image:
- create new empty VM called
- Resize the disk image to 10GB.
- set RAM to 256MB.
- disable just about all options including audio support, usb support, printer support, file sharing, etc.
- set to NAT networking.
- attach CentOS part1 DVD to cdrom drive.
floppy144.flpas a new floppy drive.
- Start the VM.
- At the prompt, type
- Wait until prompted, then press enter to reboot.
- log in as root.
yum -y update.
find /var/cache -type f | xargs rm -f.
shutdown -h now.
- open the settings pane, open the hard disk panel, and select “clean up disk”.
- disconnect and remove the floppy drive. Disconnect the DVD drive.
- (optional), open the directory containing the VM location in the terminal and
mv *.vmwarevm/* . && rm -r *.vmwarevm. When you next open the VM (you will need to use File > Open), select “I moved it”.
- Make a backup copy of the virtual machine files, this is your clean VMWare-independent base VM.
- Start the virtual machine.
- in the Fusion menu, select Virtual Machine > Install VMWare tools, and install the tools:
mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom cd /tmp tar zxf /mnt/cdrom/VMwareTools*.tar.gz yum install -y perl ./vmware-install.pl --default umount /mnt/cdrom cd rm -Rf /tmp/vmware-tools-distrib
- In the Fusion menu, select Virtual Machine > CD/DVD > Disconnect CD/DVD
- Shut down the virtual machine
- Make a backup copy of the virtual machine files, this is your clean VMWare-ready base VM.
So now you have one squeaky clean VM image and a documented process for recreating it. Of course, most of this process isn’t particularly specific to CentOS, or VMWare, or Mac OS X. If you use different install media, these instructions work without changes for various versions of Fedora and Red Hat Enterprise Linux. According to this official ubuntu help page the same basic approach may work for recent Ubuntu releases (though replacing
I seem to remember that on linux there’s various more convenient ways to do this stuff. For example, you can install into a loopback device. But for now, this will do.