L2200: 2.6 kernel configuration

The IBM N2200 is rather kinky when it comes to newer Linux kernels. The one I’ve had most success with is 2.6.24, so that’s the one I’ll describe in this post.

First of all, kernel configuration. (I’ll fill this in later)

And now it’s time for patching the kernel. (I’ll fix .diff patches later) Graphics are powered by the AMD Geode GX1 chip but from my experience it won’t (always) work out of the box without setting another default resolution probe. This might depend on BIOS versions, but I’ll investigate that further on. So edit the GX1 framebuffer driver like so the 640×480 is 1024×768 at the static definitions in drivers/video/geode/gx1fb_core.c

static char mode_option[32] = “1024×768-16@60″;
static int crt_option = 1;
static char panel_option[32] = “”;

Next up, root device detection. Apparently with SCSI emulation (at least), the CF card won’t be identified correctly. Or so it seems. Anyhow, I’ve personally implemented the following fallback in init/do_mounts.c on line 469 (just above mount_root();):

if (ROOT_DEV == 0)


Now just make and get a cup of coffee.

After compiling this, you will have the kernel arch/x86/boot/compressed/vmlinux (no, not bzImage or anything like that). Of course the troubles aren’t over yet! The IBM N2200 won’t be able to read this due to the ELF header count specified as 2, something I think started showing up with Linux 2.6.

Even though I prefer not editing binaries with a hex editor blindly, it seems to be the only working solution for IBM’s buggy BIOS to my (limited) knowledge. So fire up your preferred hexeditor (like hexedit) and set position 0×2C to the hexadecimal value 01 instead of 02.

Now put your patched, hexedited kernel in the root of your previously debootstrapped system. Make sure to name it kernel.2×00. Pray that it will work.

L2200: partitions and debootstrap

fdisk $CF_CARD
Setup the partitions so the first isn’t too big for the N2200 BIOS to mount. I recommend 256-512 MB for the first primary partition. Then partition further systems along your personal own conviction for /usr, /var or even /home. Remember that apt will want to cache stuff in /var/cache/apt/archives, unless you do a magic ftpfs mount of kernel.org 🙂

Following this you can re-insert the CF card (or udevadm trigger I suppose) or probe your new partitions to get UUID values for your future fstab. My list turned out to be the following. Your UUIDs and drive names will differ:

# ls -l /dev/disk/by-uuid|grep sdd
51c371e3-45ca-4ed0-ac9b-1401db7a8ce9 -> ../../sdd5
81f94c5b-4319-4c3c-b413-36634c32e708 -> ../../sdd7
cb7bbb36-b65f-4e29-88a6-e9b36f44e2a0 -> ../../sdd8
cb880d31-9509-46e2-90c6-7fc2e9189c17 -> ../../sdd6
eee1b774-5bc4-41e4-a469-8ca58dbe88b8 -> ../../sdd1


After making filesystems (use ext2 for / at least), mount it somewhere smart and debootstrap a system. Of course, you need debootstrap for this, which is in the default Ubuntu repository at least. To avoid having to create your own /dev nodes, include udev in the minbase variant of your favorite deb-based system. gpgvapt-utilscronntpdateopenssh-server as well as vim-tiny are also good for your health. To make your internet life easier, the netbase utilities, iputils-ping and a dhcp client are recommended.
debootstrap --variant=minbase --include=udev,gpgv,apt-utils,cron,ntpdate,openssh-server,vim-tiny,netbase,iputils-ping,dhcp3-client jaunty /mnt/l2200

Edit your debootstrapped system’s hostname, chroot into the environment, set the root password for future use and then open up /etc/fstab to make sure your partitions are mounted at boot. You might have to alias vim=vim-tiny.
# echo l2200 > /mnt/l2200/etc/hostname
# chroot /mnt/l2200
@l2200:/# passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
@l2200:/# vim /etc/fstab

Now. Time to get your UUIDs ready and setup your /etc/fstab. An easy way to get a pastable output is the command for i in /dev/sdd?; do echo -en “#$i\nUUID=” ; sudo vol_id –uuid $i; done

# L2200 /etc/fstab config for MMN-o
proc    /proc   proc    defaults        0 0
tmp     /tmp    tmpfs   defaults        0 0
UUID=eee1b774-5bc4-41e4-a469-8ca58dbe88b8       /       auto    defaults        0 0
UUID=51c371e3-45ca-4ed0-ac9b-1401db7a8ce9       /usr    auto    defaults        0 0
UUID=cb880d31-9509-46e2-90c6-7fc2e9189c17       /var    auto    defaults        0 0
UUID=81f94c5b-4319-4c3c-b413-36634c32e708       /srv    auto    defaults        0 0
UUID=cb7bbb36-b65f-4e29-88a6-e9b36f44e2a0       /var/cache/apt/archives auto    defaults        0 0

Just to make this complete, we’ll add network settings as well. That’s in /etc/network/interfaces

# L2200 /etc/network/interfaces for MMN-o

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

Running dpkg-reconfigure -p high -a (which will take a while and require some input) is a rather easy way to make your system behave without screaming about various problems related to a totally unconfigured system. If you want fanatic control over the settings, do it with -p low.

Now, all we should need is a kernel. That’s quite a bit of trickery, so it’ll need a second blog post.