


           HOWTO install an (initrd) linux 2.6 kernel
                     on Debian woody

                        $Revision: 1.1 $

                   Marc.Herbert@free.fr


Motivation
----------

You may find this document useful if:

- you want to test the latest linux 2.6 kernels
- you want to keep your debian woody ("stable") box as intact as
possible, i.e., you want to test _only_ linux 2.6 and not all the latest
stuff from Debian.

You may find it even more useful if:

- you prefer booting from a RAM-disk instead of from your hard disk
(the "initrd-way"). See initrd(4) for more information.



Need fresh modutils and module-init-tools
-----------------------------------------

The mechanism for dynamically loading kernel modules has been
rewritten between 2.4 and 2.6. As a consequence, the former "modutils"
tools (insmod, modprobe,...) are not compatible with 2.6 You need the
new "module-init-tools" instead.

Issue: these new and incompatible tools have the same filenames as
their 2.4 siblings (insmod, modprobe,...). As often, installing from
source updated packages on your stable debian distribution does the
trick here. The recent debian packages "modutils" and
module-init-tools" do some automatic kernel version detection before
invoking the right version of modprobe, insmod, etc.

First you'll need some basic tools to compile and generate
the debian packages:
# apt-get install gcc debhelper fakeroot ...

Then edit your /etc/apt/sources/list file, so that the sources of
packages come from the "testing" or even "unstable" version of
debian. For instance:

deb-src ftp://ftp.yourmirror.org/pub/debian unstable main non-free contrib


Then fetch recent sources:
$ apt-get source modutils module-init-tools

Recent modutils sources need a small hack to compile on woody:

        dh_installman extra/modules*.5 extra/update-modules*.8 *.8 *.5
        sh -e debian/fixmanpages
-       dh_installinit --no-start --update-rcd-params="start 20 S ."
+       dh_installinit --update-rcd-params="start 20 S ."
        dh_strip
        dh_link bin/lsmod sbin/lsmod

Build the .deb packages:
$ cd module-init-* && fakeroot dpkg-buildpackage -d

$ cd ..; cd modutils-* && fakeroot dpkg-buildpackage -d

And install them:
$ dpkg -i modutil*.deb
$ dpkg -i module-init-tools*.deb

You're done.


Please note that Documentation/Changes gives a lengthy list of other
kernel-related utilities mandatory upgrades before using 2.6. However,
upgrading only modprobe & co was enough for me.


make config
-----------

From the (outdated) Documentation/initrd.txt:

"Second, the kernel has to be compiled with RAM disk support and with
support for the initial RAM disk enabled."

When the kernel boots, it needs to mount the initial ramdisk as its
root partition, and to read from it. As a consequence, the following
features need to be compiled _built-in_ (not as modules)

CONFIG_BLK_DEV_RAM=y     (section "Block Devices")
CONFIG_BLK_DEV_INITRD=y

CONFIG_ROMFS_FS=y        (section "Filesystems")

An alternative to the "ROMFS" filesystem above could be "CRAMFS"
(short for "Compressed ROM") used by default by the debian mkinitrd
script, but... the initrd+CRAMFS combination is not supported by
linux, unless you use a kernel source with debian patches.  Moreover, it
seemed to me that the mere presence of the CRAMFS code in the vanilla
linux kernel prevented a ROMFS initrd image to boot!? I suggest
avoiding built-in CRAMFS code for the moment, unless you are a
hardcore debian fan (compiling it as module is OK).

CONFIG_CRAMFS=m          (section "Miscellaneous filesystems")



mkinitrd
--------

After having installed your brand new 2.6 and its modules, you need to
create the initrd image.

# apt-get install initrd-tools genromfs

If you use ROMFS instead of CRAMFS (see above), you must edit
/etc/mkinitrd/mkinitrd.conf:

@@ -18,4 +18,4 @@
 UMASK=022
 
 # Command to generate the initrd image.
-MKIMAGE='mkcramfs %s %s > /dev/null'
+MKIMAGE='genromfs -d %s -f %s'


The mkinitrd machinery tries hard, when building the initrd image, to
guess what are the modules to preload from the ram disk, in
order to be able to access the real (hard drive) root partition.  But
unfortunately, it may sometimes fail. This is hard to blame, since we
are mixing software from various provenances.

If you find that your 2.6 kernel boots from the RAM disk, but has
later problems to mount the root partition of your hard drive,
then tweaking the RAM disk may help. Thanks to the file
/etc/mkinitrd/modules (see mkinitrd(8)), you can force the kernel to
load some modules from the RAM disk (e.g., "sd_mod") before trying to
mount the real root partition. Check also mkinitrd.conf(5)

If things still go wrong, you can insert "set -x" and other debugging
stuff into the two scripts that the kernel launches after initrd
boot and before mounting the real root:

/usr/share/initrd-tools/linuxrc
/usr/share/initrd-tools/init



LILO
----

As stated in Documentation/initrd.txt, do not forget to add an initrd
line in /etc/lilo.conf

  initrd=/boot/initrd-my2.6

DO NOT append="root=/dev/ram0 init=/linuxrc rw" to boot arguments,
contrary to stated in Documentation/initrd.txt, which seems outdated
wrt this.



What did you break?
-------------------

OK, your debian woody machine is now running a linux 2.6 kernel and is
almost intact, expect... you cannot create initrd images compatible
with 2.4 kernels anymore, because mkinitrd blindly stores
/sbin/modprobe etc. in the RAM disk, i.e., 2.6-modules utilities!

Again, if needed, you can solve this issue by upgrading initrd-tools
to a recent version that takes 2.4/2.6 differences into account.  The
good side-effect is that the new version of the mkinitrd script will 
probably be more clever when guessing the modules needed to mount the
real root. The nasty side-effect is that you may get some bugs...

As usual, type:
$ apt-get source initrd-tools
$ fakeroot dpkg-buildpackage
# dpkg -i initrd-tools*.deb

It seems you can safely ignore the failure of the configure step.



kernel-package
--------------

When everything above is working OK, then you can use the "make-kpkg"
tool to automate some parts and create a debian package with your 2.6
kernels, its modules, etc.  It seems the (old) woody version of
make-kpkg is able to manage (new) 2.6 kernels without problem.


