The Depenguinator, version 2.0
In December 2003, I wrote a script for remotely upgrading a linux system to FreeBSD. I gave it a catchy name ("depenguinator", inspired by the "Antichickenator" in Baldur's Gate), announced it on a FreeBSD mailing list and on slashdot, and before long it was famous. Unfortunately, it didn't take long for changes in the layout of FreeBSD releases to make the depenguination script stop working; so for the past three years I have been receiving emails asking me to update it to work with newer FreeBSD releases.A few weeks ago, Richard Bejtlich came forward with an offer to pay me to make the necessary improvements (money doesn't solve everything, but offering money certainly helps break the "I'll do it when I have some free time" / "I never have any free time" deadlock). In the end I asked him to arrange for a donation to the FreeBSD Foundation instead of paying me, but his offer was enough of a prompt for me to spend ten hours revising and testing the depenguinator.
The key changes from before are as follows:
- The depenguinator now works with recent FreeBSD releases.
- The makefs code borrowed from NetBSD is updated, and as a result will compile on more recent versions of Linux.
- Instead of setting a root password, the depenguinator now installs an SSH public key.
- Instead of constructing a disk image which must be written to the first 40MB of the boot drive (which would often fail if that space contained an active filesystem), the depenguinator now constructs a disk image which can be written to a swap partition (after swapping is turned off, of course) and then booted via GRUB.
Without further ado, here are the steps I needed to upgrade an Ubuntu 7.10 system to FreeBSD 7.0-RC1:
-
Install some bits which the depenguinator needs which aren't included
in the default Ubuntu install.
apt-get install curl apt-get install bsdtar apt-get install libc6-dev apt-get install zlib1g-dev
-
Download the depenguinator and verify its SHA256 hash.
curl http://www.daemonology.net/depenguinator/depenguin-2.0.tar.gz > depenguin-2.0.tar.gz sha256sum depenguin-2.0.tar.gz
The computed SHA256 hash should be aa5d98dd3998545600f5af1d406196832ef8bea59cb022bc3a5efb303ac57cf7. -
Extract the depenguination code.
tar -xzf depenguin-2.0.tar.gz cd depenguin-2.0
-
Create the depenguinator configuration file.
mv depenguinator.conf.dist depenguinator.conf nano depenguinator.conf
This configuration file contains basic networking configuration parameters, so that the system can get back online after it boots into FreeBSD. -
Download the FreeBSD disc1 ISO image and verify its SHA256 hash (change
"7.0" and "7.0-RC1" as appropriate.)
curl ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/7.0/7.0-RC1-i386-disc1.iso > disc1.iso sha256sum disc1.iso
Compare the SHA256 hash against the hash contained in the announcement signed by the FreeBSD release engineer -- we've never found any signs of Evil People deliberately tampering with release ISO images, but a few years ago there was a mirror which was corrupting ISO images due to a faulty network switch. -
Create the disk image. Change "7.0-RC1" to the appropriate release
name, and replace ~/.ssh/authorized_keys by the path to the
SSH public keys you want to be authorized to login as root.
sh -e makeimage.sh disc1.iso 7.0-RC1 ~/.ssh/authorized_keys
-
Turn off swapping.
swapoff -a
-
Write the disk image to the partition which used to contain the swap
space (in my case, /dev/sda2).
dd if=disk.img of=/dev/sda2
-
Add FreeBSD to GRUB's list of operating systems, and set it as the
default system to boot into. In my case, this meant adding
title FreeBSD root (hd0,1) makeactive chainloader +1
to /boot/grub/menu.lst and changing the default line to default 3. -
Reboot into FreeBSD.
shutdown -r now
- After waiting for the system to reboot, SSH back in; FreeBSD is now running in a memory disk; so now you can slice, partition, and create file systems on the hard drive(s) and install FreeBSD however you wish.
If you find this useful, please consider donating to the FreeBSD Foundation and sending me an email to let me know that you have done so -- it's remarkably gratifying to see such a concrete demonstration that people appreciate what I've done.
Now go forth and depenguinate!