Published on
October 26, 2005 in
FreeBSD.
A Tale of OS Bootstrapping
What do you do when an AMD64 box comes by your way but you only have an 32-bit operating system to run on it? With FreeBSD, you can bootstrap your way into a 64 bit world. Here is what you do:
- Install FreeBSD in the usual way. When doing so, keep a spare disk partition for holding the new amd64 OS. In this example, we'll assume that this is partition 'd'. Mount this partition on some convenient mount point, say /1. The full FreeBSD system occupies about ~250MB these days; so make this partition a few GB in size.
Don't forget to install the sources to the FreeBSD system of course, otherwise there won't be anything to cross-build.
- Change directory to the root of the source tree /usr/src and execute the following commands:
# cd /usr/src
# make world TARGET_ARCH=amd64 DESTDIR="/1"
This step builds an amd64 userland and populates it into /1. Several interesting things happen as part of this step.- Since the host OS at this point is running in 32-bit mode it has to build a full cross-toolchain first: tools running on the i386 architecture but manipulating libraries and executables for the amd64 architecture.
- It then needs to compile the whole source tree for the amd64 architecture using tools running on the i386.
- Once compilation succeeds, the build process transfers the newly built binaries into the filesystem rooted at /1.
Other options for TARGET_ARCH include powerpc, sparc64, alpha, ia64. - The next step is to populate a default /etc. This is how you do this:
# make distribution TARGET_ARCH=amd64 DESTDIR=/1
This step populates /1/etc with the default set of startup scripts. - Now we need an amd64 kernel to boot from:
# make kernel KERNCONF=GENERIC TARGET_ARCH=amd64 DESTDIR="/1"
This builds a kernel following the configuration specified in the configuration file named /usr/src/sys/amd64/conf/GENERIC and installs it under /1/boot/kernel. - Copy over /etc/fstab to /1/etc/fstab and change the definition of the / (root) mount point to use partition 'd' (the default is to mount / on the 'a' partition).
- Copy over /etc/rc.conf to /1/etc/rc.conf, as this contains the machine's hostname, and IP addresses of its interfaces.
- Create a file boot.config in the 'a' disk partition containing the following text:
0:ad(0,d)/boot/loader
This command informs the first stage boot loader (see boot(8)) that we want to boot from partition 'd' instead of the usual partition 'a'. If you've booted from a SCSI disk, you may need to specify the boot device as da(0,d). - Reboot. Viola! You boot into an AMD64 kernel running an AMD64 userland.
Published on
October 13, 2005 in
FreeBSD.

If you are bored and think about making yet another CPAN module into a FreeBSD port, you might find this useful.
Step 1
Get yourself a local CPAN mirror. Don’t worry, you won’t need the whole deal, the most recent versions of every module will suffice. This boils down to just under 700 MB. It’ll take a while the first time around, but after that it’ll require less time than your regular /home/ncvs updates.
Install devel/p5-CPAN-Mini port, then run
minicpan -l ~/share/CPAN/ \
-r ftp://ftp.funet.fi/pub/languages/perl/CPAN/ -p
Here ~/share/CPAN is a directory of your choosing. Similarly, choose a CPAN mirror closest to you instead of ftp.funet.fi.
Step 2
Install devel/p5-File-Random port. Then fetch this script, and modify the hard-coded path to CPAN.
Each time you run it, it will present you with some recent CPAN module that does not yet exist in the ports collection.
Please don’t forget to submit a PR. ;-)
Step 3
There is no step 3.