Wednesday, September 27, 2006

Grub2 on soekris net4801

Outline
I. Requirements
II. Compile via source
III. Installation on target device
IV. Grub configuration
V. Soekris net4801 configuration
VI. Minicom configuration
VII. Related resource - Debian/GNU Linux installation

Requirements
- Download grub2 (latest alpha! build is 1.94)
- build-essential (glibc6, gcc4, make, etc), depends on your Linux installation
- minicom for terminal emulation
- I am installing grub2 on a cf.

Installation via source
- Download grub2.
- Auto-configure with serial enabled and install root directory set to /usr/local:
./configure --prefix=/usr/local --enable-serial

- Build:
make

- Install binaries and libraries:
make install

Installation on target boot device
* grub-install - installs grub2 on your device
* grub-setup - set up images to boot from your device

- grub-install: (grub-install --help to see available options)

Example:

grub-install --root-directory=/media/usbdisk /dev/sdb1


Note 1: Make sure that you are using the binary that you just compiled and installed. Earlier, I indicated /usr/local as my prefix. In this case, the binaries can be found in /usr/local/bin and /usr/local/sbin.

Note 2: When I run the command, I get the following errors:
grub-probefs: error: Cannot get the real path of `/dev/fd0'
Auto-detection of a filesystem module failed.
Please specify the module with the option `--modules' explicitly.

The fix is to explicitly indicate the module ext2 (I am installing on an ext2 filesystem) and skip the floppy probing. I skip the floppy probing my copying a device.map without the /dev/fd0 mapping to the folder indicated in --root-directory=. This command copies the device.map to its proper location:
cp /its_dir/device.map /media/usbdisk/boot/grub

My device.map looks like this:
(hd0)   /dev/hda
(hd1) /dev/sdb

The working command is as follows:

./grub-install --modules=ext2 --root-directory=/media/usbdisk /dev/sdb1


- grub-setup:

Example:
grub-setup -d /media/usbdisk/boot/grub -v -r "(hd1,0)" \ 
-m /media/usbdisk/boot/grub/device.map "(hd1)"

Note: Grub has a different naming scheme for devices. hd1 is mapped to /dev/sdb as indicated in device.map. The 0 (zero) denotes the first partition of /dev/sdb (i.e. /dev/sdb1).

Grub configuration
Sample grub configuration file in /{root_device_dir}/boot/grub/grub.cfg
#serial --unit=0 --speed=19200 --word=8 --parity=no --stop=1
#terminal serial

# Timeout for menu
#set timeout=10

# Set default boot entry as Entry 0
set default=0

# Entry 0 - Load Linux kernel
menuentry "My Linux Kernel on (hd0,1)" {
set root=(hd0,1)
linux /vmlinuz root=/dev/hda2 console=ttyS0,9600
initrd /initrd
}

# Entry 1 - Chainload another bootloader
menuentry "Chainload my OS" {
set root=(hd0,3)
chainloader +1
}


Note: Uncomment the first two lines if you want a serial terminal for grub2. Refer to the Grub2 documentation for the available commands.

Soekris net4801 configuration
The default baud rate of grub2 is 9600. You can set the parameter in the Monitor (Ctrl+P) using the command:
set ConSpeed=9600.

Minicom configuration
This is the content of my minicom configuration file in /etc/minicom/minirc.dfl:

pu port             /dev/ttyS0
#pu baudrate 115200
#pu baudrate 19200
pu baudrate 9600
pu bits 8
pu parity N
pu stopbits 1
pu rtscts No
pu xonxoff No


NOTE: The last two lines are important to disable the software and hardware flow control in minicom.

It's now time to boot!

Related Resources
To install an OS, you can follow this documentation to install Debian GNU/Linux.

No comments: