Joggler Linux Boot Mysteries
PCs boot first using a system known as a BIOS (basic input output system), that's the bit you might see when you very first switch on your computer and might say something like "Press F1 to enter system menu" or similar. The BIOS is responsible for knowing enough about your hardware such that it can start the computer, run your boot loader and ultimately pass on some information to your operating system which takes over control of the hardware. The Joggler doesn't boot using the mechanism most of us as PC users are familiar with, however, abandoning the BIOS in favour of EFI (extensible firmware interface). EFI is much bigger, more flexible and inevitably a lot more complicated than the older BIOS system. I'll attempt to unravel in simple terms some of the mysteries of booting your own operating system on the Joggler here.
EFI has its roots in Intel in the same way as a BIOS has its roots in IBM. Basically, it consists of a set of executables able to run within the simple environment EFI provides. These executables are just little computer programs that can vary extremely widely from talking to a piece of your hardware to providing you with a shell environment in which you can interact with EFI through to booting your operating system. This last function is quite important to us as computer users if we're to understand how EFI is used to start your machine, in this case your Joggler. A BIOS will boot your machine by looking at the master boot record and starting the boot loader that your installed operating system has put there; your operating system is responsible for booting itself. EFI does away with this, moving the responsibility for booting operating systems into the firmware interface itself, you no longer need a boot loader for your operating system. Instead, the boot loader is now just another EFI program that runs within the simple EFI environment I mentioned earlier.
You've been wondering what this FAT partition on your Joggler image is all about? FAT is just another file system like NTFS for Windows or ext for Linux, it's very widely understood so is commonly used these days on USB sticks but not necessarily many other places. If your disk is to be used to boot an operating system then EFI says you need a FAT file system as the first partition of that disk. EFI actually says FAT12 or FAT16 must be used for "removable media" so for us Joggler users with USB sticks or hard disks we should be using FAT16 even though EFI can understand FAT32 as well. You could boot any other disk from your FAT partition but all the simple Joggler cases would just involve booting an operating system somewhere else on the same disk i.e. the second partition.
Fortunately for us, when you start your Joggler its EFI looks both at its internal disk (the one with the O2 interface on it) and removable media (your USB disk). The FAT partition is discovered on your USB disk and by convention the file called startup.nsh is executed. This file is simply a script which can be used to execute any EFI script commands you wish. For Joggler USB booting it just runs a local script on your disk to start your boot loader EFI program.
So for the Joggler we might have something like this in startup.nsh on our disk in order to call the boot.nsh:
And the following in the file boot.nsh to start the grub EFI boot loader program:
You now know what to do in order to boot your Joggler from a USB disk but the final missing piece to the puzzle is the EFI boot loader program itself. In the example above I used grub as the boot loader program. Yes, this is the same grub you're familiar with from booting Linux on BIOS based machines. However, in this example it's an EFI program so you'd be right to be wondering how you go about getting a copy of it. In my example here your FAT partition already has 2 files on it (startup.nsh and boot.nsh) and you'll need another 2 files (grub.efi and grub.cfg) to be able to boot your disk
There are two versions of grub. The old version, grub 1 or grub legacy as it's know known is not the one you want. You're looking for the current version which is (or will become) grub 2. At the time of writing grub 1.98 is the latest version, download the released version. Unfortunately, it doesn't work on the Joggler without applying a patch. So it's with thanks and reference to the guys over at Joggler Hacks I got my Joggler booting with my own grub 2.
To compile an EFI version of grub 2, unpack the source you've downloaded, then apply the Joggler grub 2 patch (using patch -p1), run ./configure --with-platform=efi and make. The compilation should proceed through to completion leaving you just finish off by making the grub EFI program. You can do this with ./grub-mkimage -d . -o grub.efi part_msdos hfsplus fat ext2 normal sh chain boot configfile linux. The file grub.efi will be created and you can copy this to your FAT partition.
The one remaining thing to do is create the grub configuration file. In grub 2 this is called grub.cfg and can be put in the root directory of your FAT partition with the other three files already there. If you've got your root file system on your second partition then the following should be enough for you to boot it:
This configuration requires your kernel (vmlinuz) and ram disk (initramfs or initrd) to be on the FAT partition too. The final piece to the puzzle is to copy these files from your installed version of Linux in the second partition from the /boot directory. With all six files in place on the FAT partition you're all set to boot the OS on the second partition. Most recent versions of Linux should at least boot on the Joggler. However, the Joggler does have some interesting hardware which may not be optimally supported. Hence, for the quickest out of the box working system you're still better off using a pre-built image from someone else as now you've got the thing booted the hard work is only about to begin.
You can find a lot more of my information about the Joggler at my Joggler Index post. I also have a list of Joggler Bookmarks.
EFI has its roots in Intel in the same way as a BIOS has its roots in IBM. Basically, it consists of a set of executables able to run within the simple environment EFI provides. These executables are just little computer programs that can vary extremely widely from talking to a piece of your hardware to providing you with a shell environment in which you can interact with EFI through to booting your operating system. This last function is quite important to us as computer users if we're to understand how EFI is used to start your machine, in this case your Joggler. A BIOS will boot your machine by looking at the master boot record and starting the boot loader that your installed operating system has put there; your operating system is responsible for booting itself. EFI does away with this, moving the responsibility for booting operating systems into the firmware interface itself, you no longer need a boot loader for your operating system. Instead, the boot loader is now just another EFI program that runs within the simple EFI environment I mentioned earlier.
You've been wondering what this FAT partition on your Joggler image is all about? FAT is just another file system like NTFS for Windows or ext for Linux, it's very widely understood so is commonly used these days on USB sticks but not necessarily many other places. If your disk is to be used to boot an operating system then EFI says you need a FAT file system as the first partition of that disk. EFI actually says FAT12 or FAT16 must be used for "removable media" so for us Joggler users with USB sticks or hard disks we should be using FAT16 even though EFI can understand FAT32 as well. You could boot any other disk from your FAT partition but all the simple Joggler cases would just involve booting an operating system somewhere else on the same disk i.e. the second partition.
Fortunately for us, when you start your Joggler its EFI looks both at its internal disk (the one with the O2 interface on it) and removable media (your USB disk). The FAT partition is discovered on your USB disk and by convention the file called startup.nsh is executed. This file is simply a script which can be used to execute any EFI script commands you wish. For Joggler USB booting it just runs a local script on your disk to start your boot loader EFI program.
So for the Joggler we might have something like this in startup.nsh on our disk in order to call the boot.nsh:
fs1:boot2
fs0:boot
And the following in the file boot.nsh to start the grub EFI boot loader program:
fs1:
grub
You now know what to do in order to boot your Joggler from a USB disk but the final missing piece to the puzzle is the EFI boot loader program itself. In the example above I used grub as the boot loader program. Yes, this is the same grub you're familiar with from booting Linux on BIOS based machines. However, in this example it's an EFI program so you'd be right to be wondering how you go about getting a copy of it. In my example here your FAT partition already has 2 files on it (startup.nsh and boot.nsh) and you'll need another 2 files (grub.efi and grub.cfg) to be able to boot your disk
There are two versions of grub. The old version, grub 1 or grub legacy as it's know known is not the one you want. You're looking for the current version which is (or will become) grub 2. At the time of writing grub 1.98 is the latest version, download the released version. Unfortunately, it doesn't work on the Joggler without applying a patch. So it's with thanks and reference to the guys over at Joggler Hacks I got my Joggler booting with my own grub 2.
To compile an EFI version of grub 2, unpack the source you've downloaded, then apply the Joggler grub 2 patch (using patch -p1), run ./configure --with-platform=efi and make. The compilation should proceed through to completion leaving you just finish off by making the grub EFI program. You can do this with ./grub-mkimage -d . -o grub.efi part_msdos hfsplus fat ext2 normal sh chain boot configfile linux. The file grub.efi will be created and you can copy this to your FAT partition.
The one remaining thing to do is create the grub configuration file. In grub 2 this is called grub.cfg and can be put in the root directory of your FAT partition with the other three files already there. If you've got your root file system on your second partition then the following should be enough for you to boot it:
set timeout=0
menuentry "Linux" {
set root=(hd0,1)
linux /vmlinuz root=/dev/sda2 acpi=force ro idle=halt
initrd /initrd
}
You can find a lot more of my information about the Joggler at my Joggler Index post. I also have a list of Joggler Bookmarks.