In order to do some performance comparisons of qemu with various host parameters, I will be wanting to do many installs on the same hardware. That, of course, begs for automation. Automated install perhaps should be done with orchestra, and I’ll look into that soon, but as I hadn’t implemented anything like this myself in awhile, I wanted to make sure I knew how. Here, for my own future reference, is exactly how I did it.
There is nothing new or groundbreaking here. It just records a working setup for future reference.
First, the ‘lab’. I’m sitting away from my router. There are two laptops involved. A is the big one which I use for daily work. It runs a mostly stock desktop install with unity. B is the victim. A is on my wireless network through wlan0. B is connected with a crossover cable to A. Network manager doesn’t seem happy about this, so on A I run a script which does:
stop network-manager iwconfig wlan0 essid myname enc mykey iwconfig wlan0 ap apmacaddr iwconfig wlan0 freq 2.417 ifconfig wlan0 up dhclient wlan0 ifconfig eth0 10.42.43.1 netmask 255.255.255.0 up /etc/init.d/dnsmasq restart /opt/bin/share-eth0-wlan0
/etc/dnsmasq.conf has
interface=eth0 dhcp-range=10.42.43.2,10.42.43.100,72h bind-interfaces dhcp-boot=pxelinux.0,biglap,10.42.43.1
and /opt/bin/share-eth0-wlan0 has:
#!/bin/sh # Share wlan over eth0 echo 1 > /proc/sys/net/ipv4/ip_forward iptables -A FORWARD -o wlan0 -i eth0 -s 10.42.43.0/24 -m conntrack --ctstate NEW -j ACCEPT iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A POSTROUTING -t nat -j MASQUERADE /etc/init.d/dnsmasq start
‘biglap’ is another name for A.
Packages installed on A include: dnsmasq, nfs-kernel-server, tftpd-hpa, syslinux-common, apt-cacher-ng, and etherwake. When I do ‘sudo etherwake macaddr-of-B’ on A, B wakes up and starts pxeboot. It talks to dnsmasq on A, which tells B to pxeboot from biglap.
The install images are set up under /var/lib/tftboot as follows. First, /var/lib/tftboot/pxelinux.cfg/ has a file ‘default’ which contains:
# Default boot option to use DEFAULT menu.c32 # Prompt user for selection PROMPT 0 # Menu Configuration MENU WIDTH 80 MENU MARGIN 10 MENU PASSWORDMARGIN 3 MENU ROWS 12 MENU TABMSGROW 18 MENU CMDLINEROW 18 MENU ENDROW 24 MENU PASSWORDROW 11 MENU TIMEOUTROW 20 MENU TITLE Main Menu label linux kernel chain.c32 append hd0 label precise-amd64-mini-preseed kernel precise-amd64-mini/linux append initrd=precise-amd64-mini/initrd.gz ro netboot=nfs nfsroot=10.42.43.1:/var/lib/tftpboot/precise-amd64-mini boot=casper -- priority=critical locale=en_US file=/preseed-nopart.cfg label precise-i386-mini-preseed kernel precise-i386-mini/linux append initrd=precise-i386-mini/initrd.gz ro netboot=nfs nfsroot=10.42.43.1:/var/lib/tftpboot/precise-i386-mini boot=casper -- priority=critical locale=en_US file=/preseed-nopart.cfg label oneiric-i386-mini-preseed kernel oneiric-i386-mini/linux append initrd=oneiric-i386-mini/initrd.gz ro netboot=nfs nfsroot=10.42.43.1:/var/lib/tftpboot/oneiric-i386-mini boot=casper -- priority=critical locale=en_US file=/preseed.cfg
For each install image, I grabbed the ‘mini.iso from archive.ubuntu.com.
For instance, for precise-amd64, I did
wget -O precise-amd64-mini.iso \ http://archive.ubuntu.com/ubuntu/dists/precise/main/installer-amd64/current/images/netboot/mini.iso mount -o loop precise-amd64-mini.iso /mnt mkdir /var/lib/tftpboot/precise-amd64-mini cp -a /mnt/. /var/lib/tftpboot/precise-amd64-mini/ umount /mnt
The ‘linux’ target boots from local disk. In order for this to work, I
had to copy chain.c32 from a full install iso (there must be a better
way?) into /var/lib/tftpboot.
In order to export the nfs filesystem I added the following to /etc/exports:
/var/lib/tftpboot/iso 10.42.43.0/24(ro,subtree_check)
and did ‘sudo exportfs -a’.
I created a preseed file and copied it (called preseed-nopart.cfg) into each /var/lib/tftpboot/*-mini/ directory. Mine looks like this, obviously based on Dustin’s :
# Ubuntu Server Quick Install # by Dustin Kirkland # * Documentation: http://bit.ly/uquick-doc d-i hw-detect/load_firmware boolean false # mirroring d-i mirror/country string enter information manually d-i mirror/http/hostname string 10.42.43.1:3142 d-i mirror/http/directory string /us.archive.ubuntu.com/ubuntu d-i debian-installer/locale string en_US.UTF-8 d-i debian-installer/splash boolean false d-i console-setup/ask_detect boolean false d-i console-setup/layoutcode string us d-i console-setup/variantcode string d-i netcfg/get_nameservers string d-i netcfg/get_hostname string stack d-i netcfg/get_ipaddress string d-i netcfg/get_netmask string 255.255.255.0 d-i netcfg/get_gateway string d-i netcfg/confirm_static boolean true d-i time/zone string America/Chicago d-i clock-setup/utc boolean true d-i clock-setup/ntp boolean true d-i clock-setup/ntp-server string ntp.ubuntu.com d-i base-installer/kernel/image string linux-server d-i passwd/root-login boolean false d-i passwd/make-user boolean true d-i passwd/user-fullname string Ubuntu d-i passwd/username string ubuntu d-i passwd/user-password password ubuntu d-i passwd/user-password-again password ubuntu d-i user-setup/allow-password-weak boolean true d-i user-setup/encrypt-home boolean false d-i apt-setup/services-select multiselect security d-i apt-setup/security_host string security.ubuntu.com d-i apt-setup/security_path string /ubuntu d-i debian-installer/allow_unauthenticated string false d-i pkgsel/upgrade select safe-upgrade d-i pkgsel/language-packs multiselect d-i pkgsel/update-policy select none d-i pkgsel/updatedb boolean true d-i grub-installer/skip boolean false d-i lilo-installer/skip boolean false d-i grub-installer/only_debian boolean true d-i grub-installer/with_other_os boolean true d-i finish-install/keep-consoles boolean false d-i finish-install/reboot_in_progress note d-i cdrom-detect/eject boolean true d-i debian-installer/exit/halt boolean false d-i debian-installer/exit/poweroff boolean false d-i pkgsel/include string byobu vim openssh-server byobu byobu/launch-by-default boolean true d-i debian-installer/exit/poweroff boolean true
The partitioning steps were taken out of there because I wanted to keep my partitioning on B for the moment, but I’ll be adding it again soon to make the whole thing fully automated.
Note that I set 10.42.43.1:3142, in other words laptop A, as archive mirror. I installed apt-cacher-ng on A, which also serves as mirror for all of my schroots, containers, VMs, and for that matter my other laptops, to save a bit of bandwidth from the house.
Now, with all that, I’m able to do repeated automated installs without any changes to house or lab network. For that matter, I’ll be able to do this from a coffee shop or a car tethered over 3G. You know, if I wanted to.
