Understanding the yaboot bootstrap process
Again, if you're researching and you don't have access to a debian box, here's some juicy bits, this time from the bootstrap man page that comes with yaboot. I'm including this because it gives a good explanation of OpenFirmware paths, boot partitions, and the bootstrap process in general. It assumes that you are working off of an internal IDE drive like a normal person.
NEWWORLD
The process of booting so called NewWorld PowerMacs from
disk starts with OpenFirmware first attempting to execute
the file specified in the boot-device variable. Unlike
older versions of OpenFirmware the NewWorld version will
not attempt to read a boot sector. By default Open
Firmware attempts to load a file with HFS file type "tbxi"
in the "blessed" directory from each partition of each
disk OpenFirmware is aware of, the first partition/disk
that is found to be bootable is booted immediately.
Ybin(8) configures a bootstrap partition to pass all of
OpenFirmware's tests to determine if the partition is con
sidered to be bootable or not. The boot script is given
file type "tbxi" and the root directory is marked as
"blessed", the blessing is important because OpenFirmware
will immediately consider a partition unbootable if no
directory is marked as blessed (you can still manually
execute a loader such as yaboot(8) with OpenFirmware even
without a blessed directory but it will not happen auto
matically).
The MacOS System Folder is always marked as blessed, this
is required for MacOS as well as OpenFirmware. The MacOS
System Folder also contains its own boot loader which has
the tbxi file type, this makes installing yaboot(8) onto a
MacOS partition is difficult. The only way to install
yaboot(8) on a MacOS boot partition is to modify Open
Firmware to boot the CHRP script directly. Given this it
is highly recommended that you create a dedicated boot
strap partition for yaboot(8).
Since OpenFirmware boots the first partition it finds to
be bootable it is important that the bootstrap partition
be first on the disk before any MacOS partition, otherwise
MacOS will be booted instead of a dual boot menu used with
yaboot(8).
The bootstrap partition should also NOT be mountable by
MacOS, the reason is MacOS will (almost always) closely
inspect any blessed directories to make sure its real
MacOS, if it is not satisfied that the contents are a real
copy of MacOS it will unbless the directory, resulting in
OpenFirmware no longer considering it bootable. The best
way to protect against this is to create the bootstrap
partition with the partition type "Apple_Bootstrap" which
OpenFirmware accepts as a valid HFS partition, but MacOS
will ignore and refuse to mount. The bootstrap partition
need not be any larger then 800K. 800K is the minimum
size of an HFS filesystem, and is much more then enough
for this purpose. You need not, and should not keep ker
nels on this partition, yaboot(8) will load them from your
ext2fs root partition just fine, as well as from any HFS
or HFS+ partitions (yaboot(8) uses OpenFirmware's HFS+
filesystem support).
To create the bootstrap partition, use GNU parted(8) or
mac-fdisk(8) to create a partiton of type "Apple_Boot
strap". This is documented better in mac-fdisks-basics
(http://penguinppc.org/usr/ybin/doc/mac-fdisk-
basics.shtml).
The bootstrap need not and should not be mounted anywhere
on your filesystem, especially not on top of /boot.
Yaboot(8) is able to load the kernels from the ext2fs root
partition so that is where they should be kept.
OpenFirmware maintains a hierarchy of all the hardware it
is aware of. To access or specify a boot device you must
use the OpenFirmware path. For example: the path to a
SCSI hard disk partition might look like this:
/pci@80000000/pci-bridge@d/ADPT,2930CU@2/@2:2 . The first
part, pci@80000000, shows that the target device is
accessed through the PCI bus. The next part is the PCI
bridge, the next is the name of the SCSI host adapter
installed (this name is provided by a BootROM on the card
itself), and after that is the SCSI ID number. The colon
delimits the device from partition specification, so the
last 2 means the second partition of this device. After
the partition number we can specify pathnames to files in
two ways: lazy and absolute. The "," delimits the Open
Firmware path from the location of the bootfile.
",\\:tbxi" specifies the file that has a HFS file type of
"tbxi" in the blessed directory. If there is not blessed
directory this will fail. The second is to specify a
absolute pathname to an arbitrary file on the disk, exam
ple: 2:,yaboot would load the file named "yaboot" in the
root directory of the filesystem. It is possible to load
files in subdirectories but OpenFirmware does not always
do this reliably, and any special characters such as an
embedded space must be expressed like %20 (for a space)
the directory separator used by OpenFirmware is the back
slash \. Example: 2:,\boot\yaboot. Determining the Open
Firmware path to a given device is unfortunately not a
trivial task. If you are using the built in ATA hard disk
you can use the alias "hd:".
Ybin also includes a utility ofpath(8) which can in most
cases find the OpenFirmware device path from a unix device
node (ie /dev/hda2).
In addition to binary executables OpenFirmware can also
execute a CHRP script. This is somewhat similar to a
shell script. A CHRP script is useful to create simple
boot menus, among other things. CHRP scripts are divided
into sections in a way similar to HTML. Here is a basic
example of a CHRP script used as a wrapper to yaboot(8)
(since OpenFirmware will only load a file with type "tbxi"
if it is a CHRP script).
<CHRP-BOOT>
<COMPATIBLE>
MacRISC
</COMPATIBLE>
<DESCRIPTION>
GNU/Linux PowerPC bootloader
</DESCRIPTION>
<BOOT-SCRIPT>
boot hd:,\\yaboot
</BOOT-SCRIPT>
</CHRP-BOOT>
The COMPATIBLE section defines what machines this script
is compatible with, if the machine name encoded into the
ROM does not match one of these entries OpenFirmware will
print out a lot of incomprehensible junk and fail to load
the script. The DESCRIPTION is ignored by OpenFirmware as
far as I know. The BOOT-SCRIPT section is where arbitrary
OpenFirmware Forth commands may go. They are executed the
same way as you would enter them on the OpenFirmware com
mand line. The entire script is wrapped with the CHRP-
BOOT tags so that such a script may be attached as a
header to a binary file. Much more complicated and elabo
rate CHRP scripts are possible but that is beyond the
scope of this document.
Ybin as of version 0.17 includes a more robust script that
is automatically configured with the correct OpenFirmware
paths based on /etc/yaboot.conf. This new script need not
and should not be edited by the user.
If you have G4 hardware then your OpenFirmware may already
have a graphical boot selector built in. This selector can
be accessed by holding down the option key when booting
the machine. You should see a screen with buttons for
each bootable partition. The current version (as of
ybin(8) 0.13) of ofboot includes a badge icon, the button
with a penguin icon is your bootstrap partition. If you
decide to use this built in selector you really do not
need to use a CHRP script that provides a boot menu.
Thanks to Nicholas Humfrey for creating the Badge icon.
Research Notes
A well-commented yaboot.conf file. What exactly is an initrd file? From the mkinitrd man page:
mkinitrd creates filesystem images which are suitable for use as Linux initial ramdisk (initrd) images. Such images are often used for preloading the block device modules (such as IDE, SCSI or RAID) which are needed to access the root filesystem. mkinitrd automatically loads IDE modules, all scsi_hostadapter entries in /etc/modules.conf, and raid modules if the system's root partition is on raid, which makes it simple to build and use kernels using modular device
drivers.
Any module options specified in /etc/modules.conf are passed to the modules as they are loaded by the initial ramdisk.
Useful notes from the yaboot.conf man page (which you probably won't have on your Mac OSX system!):
boot=boot-device
Specifies the bootstrap(8) partition ybin(8) will
install the boot loader on. This partition needs
to have an HFS or MSDOS filesystem created on it
(except on IBM hardware). ybin(8) will not create
a filesystem. If a filesystem is not present run
mkofboot(8) instead of ybin(8) for the first time.
The bootstrap(8) partition must have a partition
type of Apple_Bootstrap to prevent MacOS[X] from
mounting it. If MacOS is able to mount the boot
strap(8) partition it will make it unbootable by
removing the attributes ybin(8) set to make the
partition bootable by OpenFirmware. The bootstrap
partition must not be mounted anywhere on your
filesystem, ybin(8) and mkofboot(8) will refuse to
operate on it if it is mounted. On IBM hardware
the bootstrap(8) should be a type 0x41 PReP Boot
partition.
ofboot=of-path
This option defines the OpenFirmware device path to
the bootstrap(8) partition. This is needed so the
first stage ofboot.b loader can be configured prop
erly. It should include the OpenFirmware path
including the partition number (but not a file
name). Example: if your bootstrap partition is
/dev/hda2 the OF path will likely be hd:2. As of
ybin(8) 0.18 you no longer are required to (and
should not) specify this option. If left undefined
ybin(8) will attempt to figure out the OpenFirmware
path automatically using the ofpath(8) utility.
You should only need to define this option if
ofpath(8) fails.
magicboot=magicboot-script
Specifies the path to an OpenFirmware CHRP script
that ybin(8) will copy to the bootstrap(8) parti
tion. Such a script contains Forth commands that
can allow you to do interesting things such as cre
ating a boot menu to choose between MacOS or
GNU/Linux. Currently you must use a magicboot
script do to a bug in OpenFirmware. Eventually a
CHRP header could be added to the yaboot(8) exe
cutable so this can be optional. When this option
is defined the magicboot script will be executed by
OF automatically at boot (instead of the install
file.) See man bootstrap(8) for more information
on this. As of ybin 0.22 you should set this to
/usr/local/lib/yaboot/ofboot which is a autoconfig
uring first stage loader for yaboot. It is capable
of presenting a dual boot menu for GNU/Linux, MacOS
and MacOSX. If dual booting is not required or
configured it will simply load yaboot directly.
You must specify this for most PowerMacs or they
will fail to boot. You cannot use magicboot
scripts with IBM hardware.
NAILED: HOWTO install bootable mac ubuntu on your external firewire harddrive
This is version 0.1 of this document.
Purpose and Rationale
To explain to you, the eager Mac linux noobie, how to get your Ubuntu system of your dreams up and running. I am performing the surgery on a dual 800 G4 mac; YMMV. The idea is to be able to install Ubuntu onto an external firewire drive so you don't have to trash your existing Mac OS X set-up. I use my Mac to run Logic Pro, so I had no interest in re-partitioning my internal hard drives. I am also a software developer and wanted to be able to use familiar Linux tools and not have to mess with weird Darwin/BSD hack arounds for my projects.
Known Issues
I don't currently have instructions for how to download, build, and install a debian linux kernel with the SCSI stuff compiled in (rather than built as a module). Thanks and praise are due to Brent Stephens who hooked me up with the deb packages I needed. I am a Redhat hacker by trade, so I am new to all this debian stuff.
I plan on creating a condensed HOWTO to explain how to download, build, and install a debian linux kernel at the "yaboot install failure" juncture. For now, you'll have to rely upon the kindliness of strangers to provide you with the necessary
Background
A quick and dirty explanation of why you can't just install Ubuntu to your firewire drive. Nerds, feel free to correct my crude explanations. Be sure to flame me for how stupid I am to further enhance my impression of engineering culture. No cynicism here, no siree bob.
I know this explanation is crap, but it gives a high level explanation of some kind. Ubuntu is designed to work with a kernel image. The kernel image lives on your hard drive. In order to access your hard drive, the bootstrap process needs to be able to access the SCSI drive on which your kernel lives. If the SCSI code for the kernel lives in a module, the kernel image won't be able to find itself, and you're screwed.
The bootstrap thingy is called yaboot. It creates a Mac-readable partition known as a bootstrap partition. It has special magic powers that enable it to find a linux kernel image when you provide it with the path to the image. Apple uses something called Open Firmware, which is a very rough and tumble boot loader among other things. One tricky bit about this whole business is that you have to provide yaboot with Open Firmware paths to your image, which is a relatively obscure activity that the Ubuntu installer doesn't know how to deal with. So it will die when it tries to perform the sacred ritual known as installing yaboot. Ubuntu just uses plain old /dev/sdX, and mkofboot needs Open Firmware (I'll refer to it as OF) paths in order to work.
Another note is that the usual way to boot up linux is to use an initrd, which I think is a bootstrap kernel that gets loaded into memory, which then finds your real kernel (/boot/vmlinux). What we're doing here doesn't require initrd, which maybe one day we'll both understand how cool that is.
Make it work for me dammit! I want my MommyYou need to roll your own yaboot.conf and install it, but that's easier said then done. Here's some step-by-step with some generous hand holding. Be sure to do some t'ai ch'i breathing and review your typing carefully. Welcome to the real world, boys and girls. Btw, once you get this thing up and running, you'll never have to deal with this crap again. You can happily use all the friendly Ubuntu GUI stuff afterwards.
Credit where it's due: Brent pointed out
this article which was really helpful, but it is intended for hackers in the know.
Follow the usual instructions to download and burn an Ubuntu install CD iso.
Begin the install process by restarting your mac with your iso in the drive. Hold down 'C' to boot off of your CD-ROM.
Go about the installation tasks as usual -- follow the wiki above if need be. Be sure to make a note of the BOOTSTRAP partition and the ROOT partition. For me, these were /dev/sda2 and /dev/sda3, respectively.
Your install will crap out when it tries to install yaboot. Now the fun begins. Drop to a terminal by typing "alt-f2" (aka option-f2).
Note: this doc will be updated since we can't count on Brent Stephens to leave these deb packages lying around forever. I'm making these notes for posterity.
Type chroot /target
You need to figure out the OF path of your FW drive. Type "echo /proc/device-tree/pci*/firewire*/node*/sbp-2*". Write down what it says carefully and legibly.
Type "apt-get install wget". Make sure your cdrom is still mounted and all that jazz. If it got ejected, apt-get will magically remount it so don't worry about it.
Type "cd /tmp", then type "wget http://brent.warehouse6.com/misc/kernel.tbz2"
Type "tar xvjf kernel.tbz2".
cd into that dir, kernel-2.6.14.2 or something like that, mine is blown away now
type "dpkg -i *". you can ignore whatever warning messages safely.
Now you need to make your yaboot.conf. Use your favorite editor, like vi /etc/yaboot.conf. In the file, put the following:
boot=/dev/sda2
Unix path to the bootstrap partition (Note: this will be where ever you put it, as noted above)
ofboot=fw/node@00d04b4a1905397c/sbp-2@c000/disk@0:2
Open Firmware path to the bootstrap partition. Remember the output from the "echo /proc/device-tree/..." command? Follow my example above for formatting help. The number 2 in my example is the bootstrap partition. Like /dev/sda2 means use the number 2 at the end. You can ignore everything before the node part from the output of the echo command.
ofdevice=fw/@00d04b4a1905397c/sbp-2@c000/disk@0:
Open Firmware path to the root partition, more or less. You specify the actual partition next, this is just the path to the device.
partition=3
number of the root partition (like mine is /dev/sda3, so use the number 3)
Now there's some stock stuff that goes in here which I'm not going to explain. just do it.
timeout=40
install=/usr/lib/yaboot/yaboot
magicboot=/usr/lib/yaboot/ofboot
default=linux
macosx=/dev/hda5 --> if you edit /etc/yaboot.conf, you'll find ubuntu's attempt at this file. Find the value for macosx in there. don't just copy what I put.
image=/boot/vmlinux
label=Linux
root=8:3
append="rootdelay=10"
Ok, that "root=8:3" part is tricky. Go here to figure out the correct values for your installation.
My yaboot.conf:
boot=/dev/sda2
ofboot=fw/node@00d04b4a1905397c/sbp-2@c000/disk@0:2
ofdevice=fw/node@00d04b4a1905397c/sbp-2@c000/disk@0:
partition=3
timeout=40
install=/usr/lib/yaboot/yaboot
magicboot=/usr/lib/yaboot/ofboot
default=linux
macosx=/dev/hda5
image=/boot/vmlinux
label=Linux
root=8:3
append="rootdelay=10"
Ok, now you must install this gizmo onto your bootstrap partition. Type "mkofboot -v" and hope it works! You should see some promising output.
Switch back to the install by pressing alt-f1. Bail out of there and restart. Hold down ALT + APPLE KEY + O + F to get to the OF bootloader thingy.
At the bootloader, type "boot fw/node/sbp-2/disk@0:2, yaboot" substituting YOUR bootstrap partition for the number 2 in the disk@0:2 part.
Type "mac-boot" or "mac-start" or whatever it says, it tells you in the OF boot thing, I'll look it up later.
Congrats, you're at the yaboot prompt. The screen will flash and your computer will convulse for a minute. when you get the "boot:" prompt, type Linux and go! The Ubunutu install process will magically continue.