I. Cross-Compilation: Création du noyau

Tentative d’installation d’un Debian sur un serveur NAS Buffalo LS-XL

Il y a quatre étapes pour l’installation d’un système Debian sur un serveur NAS Buffalo LS-XL. Je précise que j’utilise aussi Debian sur le système hôte.

Dans un premier temps, il faut créer deux modules, un noyau et un initramfs (ou initrd), pour pouvoir démarrer le serveur NAS avec nos propres configurations. Ceux installés sur le serveur ne nous permet pas d’installer un autre système d’exploitation que celui livré par défaut.

Ensuite il nous faut un serveur TFTP pour y placer tout ce dont on a besoin pour l’amorçage du serveur à partir du réseau. Bien entendu, il y aura besoin d’un système hôte pour accéder à distance au contenu du serveur, et y installer le système d’exploitation.

En dernier, il nous faut de nouveau créer un nouveau noyau pour pouvoir commencer cette fois ci, l’installation de Debian sur le serveur NAS puisqu’il n’y en a pas de noyau sur mesure pour les serveurs LS-XL sur le site officiel de Debian.

Avant de commencer les manipulations, je vous propose de lire entièrement cet article, puis de comprendre ce qu’il faut faire et ensuite. Les étapes intermédiaires, comme par exemple accéder à un dossier, ne seraient pas toujours affichés dans la liste des commandes à taper. Cependant, pour vous aider à vous situer dans les différents répertoires, j’ai placé leurs noms avant chaque commande (ex. /opt/nasbuild# ). Le dièse “#” implique que les commandes doivent être effectuées en mode root.

Je tiens à préciser qu’on ne partira pas d’un construction d’un noyau à partir de rien. Le noyau sur lequel on va se baser serait la version 3.3.4 disponible sur le site officiel de Buffalo, et qui devrait être compatible avec les serveurs LS-XL.

I. Cross-Compilation: compilation du noyau

Dans cet article, je vais parler de la préparation d’un noyau linux compatible ARM9, à lancer lors du démarrage du serveur NAS.

Avant de parler de cross-compilation, il faut comprendre ce que c’est qu’une compilation. Si je peux le résumer ainsi, une compilation est le fait de transformer un langage compréhensible par l’homme en un langage compréhensible par une machine, en utilisant un Compilateur. Un compilateur transforme les codes sources en codes exécutables spécifique à une machine.

On parle de cross-compilation quand la machine cible, celle qui va recevoir les instructions de compilation, n’a pas la même architecture que la machine hôte, celle sur laquelle vous effectuez la compilation. Ici, je vais compiler un noyaux linux à partir d’un ordinateur MAC Intel (hôte), avec la version 3.3.4 du noyau linux, pour architecture ARM.

Dans ce qui suit, on va plutôt parler de Toolchain (chaîne de compilation), dont le compilateur n’en est qu’un élément.

Etape 1: Téléchargement de tous les tarballs nécessaire à la compilation

Les logiciels tierces, c’est à dire ceux qui ne font pas parties des logiciels par défaut dans Debian, devraient être placés dans /opt.

Note: J’ai du rajouter un tiret devant les liens en http pour éviter d’avoir des hyperliens dans les commandes à exécuter.

# cd /opt
/opt# mkdir nasbuild
/opt/nasbuild# wget _http://buffalo.jp/php/los.php?to=gpl/storage/ls-x/165/linux-3.3.4.tar.gz -O linux-3.3.4.tar.gz

Le noyaux linux fourni par Buffalo ne peut démarrer qu’avec le cross-compilateur gcc CodeSourcery arm-2007q3.

/opt/nasbuild# wget _http://downloads.nas-central.org/LSPro_ARM9/DevelopmentTools/CrossToolchains/CodeSourcery/arm-2007q3-53-arm-none-eabi-i686-pc-linux-gnu.tar.bz2

Téléchargement de Mkimage, qui est un utilitaire pour nous permettre de créer les images du noyau et de l’initrd dont on aura besoin pour la suite. On en reparlera dans un autre chapitre.

/opt/nasbuild# wget _http://downloads.nas-central.org/LSPro_ARM9/DevelopmentTools/CrossToolchains/mkimage

Etape 2: Préparation de l’environnement

Préparer l’environement en installant le compilateur et le mkimage.

/opt/nasbuild# tar -jxvf arm-2007q3-53-arm-none-eabi-i686-pc-linux-gnu.tar.bz2

/opt/nasbuild# cd arm-2007q3

/opt/nasbuild/arm-2007q3# ls -a
. .. arm-none-eabi bin include lib libexec share

/opt/nasbuild/arm-2007q3# cd bin

/opt/nasbuild/arm-2007q3/bin# cp ../../mkimage .

/opt/nasbuild/arm-2007q3/bin# chmod a+x mkimage

Copier mkimage dans /bin, rendez ce fichier exécutable, puis ajouter à la variable PATH le chemin pour y accéder.

/opt/nasbuild/arm-2007q3/bin# ls
arm-none-eabi-addr2line arm-none-eabi-gcov arm-none-eabi-readelf
arm-none-eabi-ar arm-none-eabi-gdb arm-none-eabi-run
arm-none-eabi-as arm-none-eabi-gdbtui arm-none-eabi-size
arm-none-eabi-c++ arm-none-eabi-gprof arm-none-eabi-sprite
arm-none-eabi-c++filt arm-none-eabi-ld arm-none-eabi-strings
arm-none-eabi-cpp arm-none-eabi-nm arm-none-eabi-strip
arm-none-eabi-g++ arm-none-eabi-objcopy mkimage
arm-none-eabi-gcc arm-none-eabi-objdump
arm-none-eabi-gcc-4.2.1 arm-none-eabi-ranlib

/opt/nasbuild/arm-2007q3/bin# echo “$PATH”
“/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin”

/opt/nasbuild/arm-2007q3/bin# export PATH=$PATH:`pwd`

On peut avoir le même résultat avec la commande: export PATH=$PATH:$PWD.

/opt/nasbuild/arm-2007q3/bin# echo “$PATH”
“/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/nasbuild/arm-2007q3/bin

Vérifier que l’on peut lancer n’importe quelle commande située de /opt/nasbuild/arm-2007q3/bin, ceci afin de nous assurer qu’on peut lancer directement la commande mkimage plus tard dans l’article.

# arm-none-eabi-gcc –version
arm-none-eabi-gcc (CodeSourcery Sourcery G++ Lite 2007q3-53) 4.2.1
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Note: il y a deux tirets « — » devant « version ».

/opt/nasbuild# wget http://buffalo.jp/php/los.php?to=gpl/storage/ls-x/165/linux-3.3.4.tar.gz -O linux-3.3.4.tar.gz

/opt/nasbuild# tar -zxvf linux-3.3.4.tar.gz

Etape 3: Compilation du Noyau

C’est le moment de créer l’image de boot (uImage) qu’on utilisera pour démarrer le serveur NAS via le réseau.

/opt/nasbuild# cd linux-3.3.4

Dans le fichier Makefile, remplacer arm-none-linux-gnueabi- par le préfixe du compilateur arm-2007q3-53-arm-none-eabi-i686-pc-linux-gnu.tar.bz2, puis vérifier bien que “arm” est la valeur associée à ARCH.

/opt/nasbuild/linux-3.3.4# vim Makefile
!——–Tronquée————!
ARCH ?= arm
#CROSS_COMPILE ?= arm-none-linux-gnueabi-
CROSS_COMPILE ?= arm-none-eabi-
!——–Tronquée————!

Comme valeur associée au CROSS_COMPILE, on peut aussi lui donner le chemin absolue vers le toolchain ARM Linux comme suit:

CROSS_COMPILE ?= /opt/nasbuild/linux-3.3.4/bin/arm-none-eabi-

Importer, puis si nécessaire éditer les scripts Configure (./config). Deux options pour le faire:

1. Copier le fichier de configuration du noyau buffalo_nas_fw_88f6281.config dans le dossier /opt/nasbuild/linux-3.3.4.

/opt/nasbuild/linux-3.3.4# ls buffalo/configs/
buffalo_hswdhtgl_arm_100.config buffalo_nas_fw_88f6281.config
buffalo_lsgl_arm_100.config buffalo_nas_fw_88f6281_tsxel.config
buffalo_lsgl_arm_101.config buffalo_nas_fw_atom_d510_101.config
buffalo_lsgl_arm_102.config buffalo_nas_fw_atom_d510.config
buffalo_lsgl_hs_arm_100.config buffalo_nas_fw_kiri.config
buffalo_lsqgl_arm_200.config buffalo_tshtgl_arm_100.config
buffalo_lswsgl_arm_100.config buffalo_tshtgl_arm_110.config
buffalo_lswsgl_arm_200.config buffalo_tsxl_arm_100.config
buffalo_lswtgl_arm_100.config kirkwood.config
buffalo_lswtgl_arm_200.config marvell_config100.config
buffalo_lswwn_arm_200.config marvell_lsgl_100.config
buffalo_nas_fw_200.config marvell_tshtgl_100.config

Le choix du fichier de configuration buffalo_nass_fw_88f6281 n’est pas anodin. Les deux processeurs Marvell Kirkwood 88F6192 (celui de notre serveur NAS) et 88F6281, sont de la même famille et ont pratiquement les mêmes caractéristiques.

/opt/nasbuild/linux-3.3.4# cp buffalo/configs/buffalo_nas_fw_88f6281.config .config
/opt/nasbuild/linux-3.3.4# vim .config

Ci-dessous les informations qui devraient être dans le script configure, en rouge le plus important.

#CONFIG_CMDLINE
CONFIG_CMDLINE= »console=ttyS0,115200 root=/dev/ram0 panic=5 lowmem=1″
# CONFIG_CMDLINE_FROM_BOOTLOADER is not set
# CONFIG_CMDLINE_EXTEND is not set
CONFIG_CMDLINE_FORCE=y

#CONFIG_DEVTMPFS
CONFIG_DEVTMPFS=y

#CONFIG_PHONE
# CONFIG_PHONE is not set

#CONFIG_LEGACY_PTYS
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=16

#CONFIG_IP_ROUTE_CLASSID
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_ROUTE_CLASSID=y

#CONFIG_HID_SUPPORT
# CONFIG_HID_SUPPORT is not set

#CONFIG_USB_SUPPORT
# CONFIG_USB_SUPPORT is not set

Metter en commentaire tout ce qui suit, c’est à dire, aux lignes contenant CONFIG_USB, il faut y ajouter un # devant:

# CONFIG_USB_

#CONFIG_RTC_CLASS
CONFIG_RTC_CLASS=y
CONFIG_RTC_HCTOSYS=y
CONFIG_RTC_HCTOSYS_DEVICE= »rtc0″

CONFIG_RTC_DRV_MV=y

Mettez en commentaire les autres lignes contenant CONFIG_RTC_* , et même ceux cités ci-dessus, si vous n’en voyez pas l’utilité.

En option, vous pouvez aussi ajouter les informations ci-dessous dans le même ficher .config.

#CONFIG_TEXTSEARCH
CONFIG_TEXTSEARCH=y
CONFIG_TEXTSEARCH_KMP=m
CONFIG_TEXTSEARCH_BM=m
CONFIG_TEXTSEARCH_FSM=m

2. Une autre option, au lieu d’éditer le fichier buffalo_nas_fw_88f6281.config, serait d’importer les scripts Configure disponibles ici (lsxl-install.config) ou (kernel_.config_for_ls-xl.txt ).

/opt/nasbuild/linux-3.3.4# mv lsxl-install.config .config
/opt/nasbuild/linux-3.3.4# make oldconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/zconf.lex.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
scripts/kconfig/conf –oldconfig Kconfig
#
# configuration written to .config
#

La commande MAKE s’utilise généralement avec l’option -jN (N = nombres de processeurs/core sur la machine hôte x 2), afin d’optimiser la compilation en utilisant tous les processeurs de la machine hôte.

La commande LSPCU permet d’afficher le nombre de processeurs présent sur l’ordinateur (CPU = 4). On a donc, N = 8 (4CPU x 2).

$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 37
Model name: Intel(R) Core(TM) i5 CPU M 520 @ 2.40GHz
Stepping: 5
CPU MHz: 1197.000
CPU max MHz: 2395.0000
CPU min MHz: 1197.0000
BogoMIPS: 4788.41
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 3072K
NUMA node0 CPU(s): 0-3

/opt/nasbuild/linux-3.3.4# make -j8 uImage
(durée de la compilation: 3 minutes)

uImage est l’image du noyau dans un format compatible u-boot.

/opt/nasbuild/linux-3.3.4# make -j8 modules
CHK include/linux/version.h
CHK include/generated/utsrelease.h
make[1]: ‘include/generated/mach-types.h’ is up to date.
CALL scripts/checksyscalls.sh
!——–Tronquée————!
Building modules, stage 2.
MODPOST 67 modules
!——–Tronquée————!
(durée de la compilation: 1 minute)

Ces deux dernières commandes permettent de compiler le noyau ainsi que ces modules, et que l’on peut fusionner en une seule commande “make -j8 uImage modules”.

Le noyau et module nouvellement créés, sont maintenant disponible dans /opt/nasbuild/linux-3.3.4/arch/arm/boot.

/opt# tree -L 3
.
├── nasbuild
│   ├── arm-2007q3
│   │   ├── arm-none-eabi
│   │   ├── bin
│   │   ├── include
│   │   ├── lib
│   │   ├── libexec
│   │   └── share
│   ├── arm-2007q3-53-arm-none-eabi-i686-pc-linux-gnu.tar.bz2
│   ├── linux-3.3.4
│   │   ├── arch
│   │   ├── binaries
│   │   ├── block
│   │   ├── buffalo
│   │   ├── cesa
│   │   ├── COPYING
│   │   ├── CREDITS
│   │   ├── crypto
│   │   ├── Documentation
│   │   ├── drivers
│   │   ├── firmware
│   │   ├── fs
│   │   ├── include
│   │   ├── init
│   │   ├── ipc
│   │   ├── Kbuild
│   │   ├── Kconfig
│   │   ├── kernel
│   │   ├── lib
│   │   ├── LspReadme.txt
│   │   ├── LspReleaseNotes_KW.txt
│   │   ├── MAINTAINERS
│   │   ├── Makefile
│   │   ├── Makefile.88f6281
│   │   ├── Makefile.atom_d510
│   │   ├── Makefile.mv78100
│   │   ├── mm
│   │   ├── modules.builtin
│   │   ├── modules.order
│   │   ├── Module.symvers
│   │   ├── net
│   │   ├── README
│   │   ├── REPORTING-BUGS
│   │   ├── samples
│   │   ├── scripts
│   │   ├── security
│   │   ├── sound
│   │   ├── System.map
│   │   ├── tools
│   │   ├── usr
│   │   ├── virt
│   │   ├── vmlinux
│   │   └── vmlinux.o
│   ├── linux-3.3.4.tar.gz
│   └── mkimage

La prochaine étape serait de configurer initrd (initramfs) afin d’avoir les pilotes nécessaire au démarrage du serveur NAS.

 Résumé des différentes étapes de la création du Noyau

Etape 1: Téléchargement de tous les tarballs nécessaire à la compilation

/opt/nasbuild# wget _http://buffalo.jp/php/los.php?to=gpl/storage/ls-x/165/linux-3.3.4.tar.gz -O linux-3.3.4.tar.gz

/opt/nasbuild# wget _http://downloads.nas-central.org/LSPro_ARM9/DevelopmentTools/CrossToolchains/CodeSourcery/arm-2007q3-53-arm-none-eabi-i686-pc-linux-gnu.tar.bz2

/opt/nasbuild# wget _http://downloads.nas-central.org/LSPro_ARM9/DevelopmentTools/CrossToolchains/mkimage

Etape 2: Préparation de l’environnement

/opt/nasbuild# tar -jxvf arm-2007q3-53-arm-none-eabi-i686-pc-linux-gnu.tar.bz2

/opt/nasbuild/arm-2007q3/bin# cp ../../mkimage .

/opt/nasbuild/arm-2007q3# chmod a+x mkimage

/opt/nasbuild/arm-2007q3# export PATH=$PATH:`pwd`

/opt/nasbuild# wget _http://buffalo.jp/php/los.php?to=gpl/storage/ls-x/165/linux-3.3.4.tar.gz -O linux-3.3.4.tar.gz

/opt/nasbuild# tar -zxvf linux-3.3.4.tar.gz

Etape 3: Compilation du Noyau

/opt/nasbuild/linux-3.3.4# vim Makefile
!——–Tronquée————!
ARCH ?= arm
#CROSS_COMPILE ?= arm-none-linux-gnueabi-
CROSS_COMPILE ?= arm-none-eabi-
!——–Tronquée————!

Copier les scripts Configure disponibles ici (lsxl-install.config) ou (kernel_.config_for_ls-xl.txt) dans .config.

/opt/nasbuild/linux-3.3.4# mv lsxl-install.config .config
/opt/nasbuild/linux-3.3.4# make oldconfig

/opt/nasbuild/linux-3.3.4# make -j8 uImage modules

Annexe: commande MAKE

Ci-dessous, en non-grisée, la liste des options utilisées pour construire notre noyau.

# make help
Cleaning targets:
clean – Remove most generated files but keep the config and
enough build support to build external modules
mrproper – Remove all generated files + config + various backup files
distclean – mrproper + remove editor backup and patch files

Configuration targets:
config – Update current config utilising a line-oriented program
nconfig – Update current config utilising a ncurses menu based program
menuconfig – Update current config utilising a menu based program
xconfig – Update current config utilising a QT based front-end
gconfig – Update current config utilising a GTK based front-end
oldconfig – Update current config utilising a provided .config as base
localmodconfig – Update current config disabling modules not loaded
localyesconfig – Update current config converting local mods to core
silentoldconfig – Same as oldconfig, but quietly, additionally update deps
defconfig – New config with default from ARCH supplied defconfig
savedefconfig – Save current config as ./defconfig (minimal config)
allnoconfig – New config where all options are answered with no
allyesconfig – New config where all options are accepted with yes
allmodconfig – New config selecting modules when possible
alldefconfig – New config with all symbols set to default
randconfig – New config with random answer to all options
listnewconfig – List new options
oldnoconfig – Same as silentoldconfig but set new symbols to n (unset)

Other generic targets:
all – Build all targets marked with [*]
* vmlinux – Build the bare kernel
* modules – Build all modules
modules_install – Install all modules to INSTALL_MOD_PATH (default: /)
firmware_install- Install all firmware to INSTALL_FW_PATH
(default: $(INSTALL_MOD_PATH)/lib/firmware)
dir/ – Build all files in dir and below
dir/file.[oisS] – Build specified target only
dir/file.lst – Build specified mixed source/assembly target only
(requires a recent binutils and recent build (System.map))
dir/file.ko – Build module including final link
modules_prepare – Set up for building external modules
tags/TAGS – Generate tags file for editors
cscope – Generate cscope index
gtags – Generate GNU GLOBAL index
kernelrelease – Output the release version string
kernelversion – Output the version stored in Makefile
headers_install – Install sanitised kernel headers to INSTALL_HDR_PATH
(default: /opt/nasbuild/linux-3.3.4/usr)
!——–Tronquée————!
Architecture specific targets (arm):
* zImage – Compressed kernel image (arch/arm/boot/zImage)
Image – Uncompressed kernel image (arch/arm/boot/Image)
* xipImage – XIP kernel image, if configured (arch/arm/boot/xipImage)
uImage – U-Boot wrapped zImage
bootpImage – Combined zImage and initial RAM disk
(supply initrd image via make variable INITRD=)
dtbs – Build device tree blobs for enabled boards
install – Install uncompressed kernel
zinstall – Install compressed kernel
uinstall – Install U-Boot wrapped compressed kernel
Install using (your) ~/bin/installkernel or
(distribution) /sbin/installkernel or
install to $(INSTALL_PATH) and run lilo
!——–Tronquée————!

Si vous avez oublié de rajouter au $PATH le chemin vers les binaires que vous avez crées, vous allez avoir un messages

# make help
make: arm-none-eabi-gcc: Command not found

Notes:

Kernel Compilation
Introduction to cross-compiling for Linux
Linux Kernel in a Nutshell
Linux Kernel Driver DataBase
Compiling a new Kernel (and Reiser4)Debian : Compiler un noyau avec « kernel-package »
Noyau Linux, modules, et initrd

Publicités