As an IT professional, it’s important to take the time to sharpen your tools. And as a systems programmer and project leader in research computing, one of my most valuable tools is a lean, mean operating system install. Prior to the deployment of Wharton’s High Performance Computing Cluster (HPCC), the goal was to reacquaint myself with a minimal Linux from scratch. Enter Packer – a tool for building machine images.
Here I am using Packer to build an image for VirtualBox containing a minimal CentOS 7 install:
Getting started…
- Install VirtualBox https://www.virtualbox.org/wiki/Downloads
- Install Packer http://www.packer.io/downloads.html
- Install Vagrant http://www.vagrantup.com/downloads
- Download the CentOS 7 Minimal ISOhttp://isoredirect.centos.org/centos/7/isos/x86_64/
Next let’s take a look at our packer file: centos7.json
{ "variables": { }, "builders": [{ "type": "virtualbox-iso", "guest_os_type": "RedHat_64", "iso_url": "CentOS-7.0-1406-x86_64-Minimal.iso", "iso_checksum": "e3afe3f1121d69c40cc23f0bafa05e5d", "iso_checksum_type": "md5", "ssh_username": "vagrant", "ssh_password": "vagrant", "ssh_wait_timeout": "600s", "vm_name": "centos70", "http_directory": "./", "boot_wait": "10s", "boot_command": [ "<esc><wait>", "linux ks=http://{{.HTTPIP}}:{{.HTTPPort}}/ks.cfg", "<enter><wait>" ], "shutdown_command": "echo 'vagrant' |sudo -S shutdown -P now", "vboxmanage": [ ["modifyvm", "{{.Name}}", "--memory", "512"], ["modifyvm", "{{.Name}}", "--usb", "off"], ["modifyvm", "{{.Name}}", "--audio", "none"] ] }], "provisioners": [{ "type": "shell", "inline": [ "sudo yum -y install http://download.fedoraproject.org/pub/epel/beta/7/x86_64/epel-release-7-0.2.noarch.rpm", "sudo yum -y install gcc make bzip2 kernel-headers kernel-devel dkms", "sudo yum clean all", "sudo mount -o loop /home/vagrant/VBoxGuestAdditions.iso /mnt", "sudo sh /mnt/VBoxLinuxAdditions.run", "sudo umount /mnt", "sudo /etc/rc.d/init.d/vboxadd setup", "sudo rm -f /home/vagrant/VBoxGuestAdditions.iso", "sudo dd if=/dev/zero of=/boot/zero bs=1M", "sudo rm -f /boot/zero", "sudo dd if=/dev/zero of=/zero bs=1M", "sudo rm -f /zero" ] }], "post-processors": [{ "type": "vagrant", "output": "./centos-70-x64-{{.Provider}}-minimal.box", "vagrantfile_template": "./Vagrantfile" }] }
Make sure to update the above json for the exact ISO filename and checksum. The anaconda installer in CentOS also needs to know what to do via a kickstart file: ks.cfg
install text cdrom skipx lang en_US.UTF-8 keyboard us timezone UTC rootpw vagrant user --name=vagrant --password=vagrant auth --enableshadow --passalgo=sha512 --kickstart firewall --disabled selinux --permissive bootloader --location=mbr zerombr clearpart --all --initlabel autopart firstboot --disable reboot %packages --instLangs=en_US.utf8 --nobase --ignoremissing --excludedocs openssh-clients sudo kernel-headers kernel-devel gcc make perl curl wget nfs-utils net-tools vim-minimal bzip2 -fprintd-pam -intltool -mariadb-libs -postfix -linux-firmware -aic94xx-firmware -atmel-firmware -b43-openfwwf -bfa-firmware -ipw2100-firmware -ipw2200-firmware -ivtv-firmware -iwl100-firmware -iwl105-firmware -iwl135-firmware -iwl1000-firmware -iwl2030-firmware -iwl2000-firmware -iwl3060-firmware -iwl3160-firmware -iwl3945-firmware -iwl4965-firmware -iwl5000-firmware -iwl5150-firmware -iwl6000-firmware -iwl6000g2a-firmware -iwl6000g2b-firmware -iwl6050-firmware -iwl7260-firmware -libertas-sd8686-firmware -libertas-sd8787-firmware -libertas-usb8388-firmware -ql2100-firmware -ql2200-firmware -ql23xx-firmware -ql2400-firmware -ql2500-firmware -rt61pci-firmware -rt73usb-firmware -xorg-x11-drv-ati-firmware -zd1211-firmware %end %post --log=/root/ks.log echo "vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/vagrant echo "Defaults:vagrant !requiretty" >> /etc/sudoers.d/vagrant chmod 0440 /etc/sudoers.d/vagrant mkdir -pm 700 /home/vagrant/.ssh #curl -o /home/vagrant/.ssh/authorized_keys https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub cat <<EOK >/home/vagrant/.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8Y\ Vr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdO\ KLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7Pt\ ixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmC\ P3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcW\ yLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key EOK chmod 0600 /home/vagrant/.ssh/authorized_keys chown -R vagrant.vagrant /home/vagrant/.ssh yum -y update yum -y remove linux-firmware %end
Now that we have a Packer and a kickstart file, we can issue the Packer build command:
packer build centos7.json
It is pretty neat to watch packer do its thing. Packer will now boot a virtual machine from the ISO, using the kickstart file to configure it. If all goes according to plan, we’ll have a box file that we can open via Vagrant.
On that note, let’s take a look at a minimal Vagrant config file: Vagrantfile
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.box = "bug/centos70" config.vm.box_url = "centos-70-x64-virtualbox-minimal.box" config.vm.provider :virtualbox do |p| p.customize ["modifyvm", :id, "--memory", 1024] p.customize ["modifyvm", :id, "--cpus", 2] p.customize ["modifyvm", :id, "--cpuexecutioncap", 50] end config.vm.hostname = "centos70" config.vm.network "forwarded_port", guest: 80, host: 8000 #config.vm.provision :shell, path: "bootstrap.sh" #config.vm.provision "ansible" do |ansible| # ansible.playbook = "provisioning/site.yml" # ansible.host_key_checking = false # ansible.raw_ssh_args = '-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o PasswordAuthentication=no -o IdentitiesOnly=yes' #end end
We can now take the minimal OS for a test drive with these commands:
vagrant up vagrant ssh
All of this marked the beginning of Red Hat Enterprise Linux 7 support for the Wharton HPCC system (CentOS being binary compatible with RHEL).