Difference between revisions of "HowTo Build Your Own Custom Kernel"

From NAS-Central Buffalo - The Linkstation Wiki
Jump to: navigation, search
(english)
(unpacking, patching, and configuring kernel sources)
Line 78: Line 78:
 
Of course, that's only an example.  Download the source package that matches your device.
 
Of course, that's only an example.  Download the source package that matches your device.
  
=== Step 2 ===
+
=== Unpack and Fix Sources ===
 +
 
 +
Once you have the kernel sources, you should unpack them somewhere convenient.  For the sake of example, we'll use '''/usr/src/linux'''.
 +
  cd /usr/src
 +
  tar -xvjf /wherever/i/downloaded/linux-2.6.22_lsp.3.0.5.tar.bz2
 +
  ln -s linux-2.6.22_lsp.3.0.5.tar.bz2 linux
 +
(That '''ln -s''' is option, of course, and just for convenience.)
 +
 
 +
Now that you've unpacked the source, a small change needs to be made to the main Makefile.  Since the Makefile was written for cross-compilation, you need to comment out some lines and uncomment others.
 +
  #ARCH          ?= $(SUBARCH)
 +
  CROSS_COMPILE  ?=
 +
  ARCH            ?= arm
 +
  #CROSS_COMPILE=arm-none-linux-gnueabi-
 +
 
 +
There's also a small bug in '''arch/arm/mach-feroceon/Board/boardEnv/mv88F5182BoardEnv.c''' that you'll want to fix:
 +
  //#if 0
 +
  #ifdef CONFIG_BUFFALO_LINKSTATION_LSGL
 +
(Why did they put ''#if0'' in there?  Who knows?  Just comment it out.)
 +
 
 +
=== Configuring the Kernel ===
 +
 
 +
Next, you'll want to pre-configure the kernel with the defaults for your device.  Assuming you have an LS-GL or LS-CL, which are based on the mv88f5182 chip:
 +
  cd /usr/src/linux
 +
  make mv88f5182_defconfig
 +
That will copy the default Buffalo config file (arch/arm/configs/mv88f5182_defconfig) to '''.config'''.
 +
 
 +
Now, we have to configure the kernel.
 +
  make menuconfig
 +
For some reason, the default config has CONFIG_BLK_DEV_INITRD and CONFIG_BLK_DEV_RAM disabled, and CONFIG_SYSFS_DEPRECATED and CONFIG_LEGACY_PTYS enabled.  So, poke around for those options and change them.
 +
  CONFIG_BLK_DEV_INITRD=y
 +
  CONFIG_BLK_DEV_RAM=y
 +
  # CONFIG_SYSFS_DEPRECATED is not set
 +
  # CONFIG_LEGACY_PTYS is not set
 +
You may also want to set a "local version" for your kernel:
 +
  CONFIG_LOCALVERSION="my_cool_custom_kernel_2009-08-13"
 +
 
 +
=== Compiling the Kernel and Modules ===
 +
 
 +
Now, start compiling the kernel:
 +
  make uImage
 +
Then, if you configured any code to load as modules, build the modules:
 +
  make modules
  
 
[[Category:Development]]
 
[[Category:Development]]

Revision as of 23:41, 13 August 2009

Contents

Two Ways to Compile a Kernel

There are two ways to build a custom kernel for the LinkStation/Kurobox. If you have access to an i686 host running some flavor of Linux, you can cross-compile a kernel for ARM9 on an i686 host. Alternatively, if your NAS has enough RAM, you could compile the kernel on the NAS itself, using the system's native gcc. Both ways of these approaches to building a custom kernel are described in the instructions that follow.

Cross-compiling a Custom Kernel

Download All the Required Tarballs

To use the cross toolchain to compile a kernel for ARM9, you'll need access to an i686 host running some flavor of Linux. First, download the cross toolchain (arm-2005q3-2-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2), mkimage, and the source archive (linux-2.6.12_lsp.1.7.8.tgz):

$ cd /some_directory
$ wget -H -c http://downloads.nas-central.org/LSPro_ARM9/DevelopmentTools/CrossToolchains/CodeSourcery/arm-2005q3-2-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ wget -H -c http://downloads.nas-central.org/LSPro_ARM9/DevelopmentTools/CrossToolchains/mkimage
$ wget -H -c http://downloads.nas-central.org/LSPro_ARM9/GPL/gpl_ls-gl/linux-2.6.12_lsp.1.7.8.tgz

If the files were not at the locations indicated above, fear not! Just look in every directory on the server (like I did).

Prepare the Environment

Then, install (i.e., untar) the toolchain and mkimage:

$ cd /some_path
$ tar -xjf /some_directory/arm-2005q3-2-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ cd bin
$ export PATH=`pwd`:$PATH
$ cp -p /some_directory/mkimage .
$ chmod a+rx mkimage

Strictly speaking mkimage should not go into /some_path/bin. But, hey...

Now untar the source of the kernel in some directory:

$ cd /some_directory
$ tar -xzf linux-2.6.12_lsp.1.7.8.tgz
$ cd linux-2.6.12_lsp.1.7.8

Ready, Get Set, Build!

In some_directory you can find the configs Buffalo used to build the kernels shipped with their various firmwares:

$ ls buffalo/

and choose one to use as a template for yours.

$ cp buffalo/buffalo_lsgl_arm_110.config .config

Then you can modify the configuration as you want:

$ make menuconfig

and start up the build!

$ make uImage

If you selected some features to be built as modules, they need to be prepared too.

$ make modules

The kernel and modules will be ready at arch/arm/boot/uImage.

Enjoy!

Compiling a Native Kernel

Software and Source Code Requirements

If the distribution you have installed on your NAS has gcc, and enough RAM to compile a kernel, you should be able to build a custom kernel directly on the box itself. To do this, you will need gcc, a utility called mkimage, and the Buffalo kernel sources for your device. Those using GenLink will already have sys-devel/gcc on their system. mkimage is part of the dev-embedded/u-boot-tools package:

 emerge --getbinpkg --usepkg dev-embedded/u-boot-tools

If you're running a different distribution, you should use the commands appropriate to your distribution to install gcc and u-boot-tools.

In case you're wondering, mkimage is a utility used to create kernel and/or initrd images for use with u-boot. u-boot is the standard bootloader used on the LS. The mkimage utility is run by the Makefile during the kernel build process, and is needed to package the kernel so it can later be loaded by u-boot.

The Buffalo kernel sources for your NAS should be available on the Buffalo Source Code Download page. Just look for the model device that you have, follow the link for the firmware version you want, look for a package name starting with "linux-", and download it.

For example, if you have a LS-CL, you would surf to this page and download linux-2.6.22_lsp.3.0.5.tar.bz2.

Of course, that's only an example. Download the source package that matches your device.

Unpack and Fix Sources

Once you have the kernel sources, you should unpack them somewhere convenient. For the sake of example, we'll use /usr/src/linux.

 cd /usr/src
 tar -xvjf /wherever/i/downloaded/linux-2.6.22_lsp.3.0.5.tar.bz2
 ln -s linux-2.6.22_lsp.3.0.5.tar.bz2 linux

(That ln -s is option, of course, and just for convenience.)

Now that you've unpacked the source, a small change needs to be made to the main Makefile. Since the Makefile was written for cross-compilation, you need to comment out some lines and uncomment others.

 #ARCH           ?= $(SUBARCH)
 CROSS_COMPILE   ?=
 ARCH            ?= arm
 #CROSS_COMPILE=arm-none-linux-gnueabi-

There's also a small bug in arch/arm/mach-feroceon/Board/boardEnv/mv88F5182BoardEnv.c that you'll want to fix:

 //#if 0
 #ifdef CONFIG_BUFFALO_LINKSTATION_LSGL

(Why did they put #if0 in there? Who knows? Just comment it out.)

Configuring the Kernel

Next, you'll want to pre-configure the kernel with the defaults for your device. Assuming you have an LS-GL or LS-CL, which are based on the mv88f5182 chip:

 cd /usr/src/linux
 make mv88f5182_defconfig

That will copy the default Buffalo config file (arch/arm/configs/mv88f5182_defconfig) to .config.

Now, we have to configure the kernel.

 make menuconfig

For some reason, the default config has CONFIG_BLK_DEV_INITRD and CONFIG_BLK_DEV_RAM disabled, and CONFIG_SYSFS_DEPRECATED and CONFIG_LEGACY_PTYS enabled. So, poke around for those options and change them.

 CONFIG_BLK_DEV_INITRD=y
 CONFIG_BLK_DEV_RAM=y
 # CONFIG_SYSFS_DEPRECATED is not set
 # CONFIG_LEGACY_PTYS is not set

You may also want to set a "local version" for your kernel:

 CONFIG_LOCALVERSION="my_cool_custom_kernel_2009-08-13"

Compiling the Kernel and Modules

Now, start compiling the kernel:

 make uImage

Then, if you configured any code to load as modules, build the modules:

 make modules