Skip to content


Backport et intégration d'un module pour un ancien noyau Linux (module megaraid_sas pour une Mandriva 2009.0)

Introduction

Mon entreprise a rencontré un souci concernant les drivers utilisés dans la Mandriva 2009.0 (distribution utilisée dans notre solution).

En effet il y a un an environ, Dell changeait leur carte contrôleur RAID depuis 6i/SAS en Perc H200/H700. Aujourd'hui, le matériel utilisant les Perc H200 et H700, ne se vend plus.

Nous avons été obligé de passer nos séries RX10 (R510, R310, R210) en série RX20 (R420, R320. ..). Ceux-ci utilisant les cartes contrôleurs RAID Perc H710... Aille !

Nous avons, comme dans l'article suivant http://monblog.system-linux.net/blog/2011/12/12/modifier-linstallation-du-cdrom-mandriva-2009-0-pour-integrer-le-pilote-du-controleur-raid-mpt2sas-perc-h200h700/

, dû adapter le CDROM d'auto-installation afin que le noyau puisse intégrer le module megaraid_sas gérant les Perc H710. Pour cela et contrairement indiqué dans le tuto précédent nous avons backporté (rétroporté) le module pour ce noyau !

Je remercie au passage Loïc et Sam pour leur aide précieuse. 😉

Le Backport

1.1 Installation d'une Mandriva Linux 2009.0 32 bits

Le présent tuto est réalisé pour le système d'exploitation Mandriva Linux 2009.0 en version 32 bits.

Le travail de backport se fera donc sur une installation propre de ce système de façon physique ou dans une machine virtuelle (VM). Une installation minimale est recommandée.
Une fois ce système installé, créer un utilisateur autre que root et utilisez le pour toutes les étapes où il ne sera pas précisé d'être administrateur (# au lieu de $).

Ajouter les sources réseaux pour cet OS et appliquer toutes les mises à jour disponibles. Redémarrer.

1.2 Installation des dépendances nécessaires

  • Ouvrir un terminal et se loguer en root afin d'installer les paquets suivants :
  • kernel­-server­-latest (puis s'assurer de redémarrer sur ce kernel)
  • kernel­-server­-devel-­latest
  • rpm­build, make, ncurses-­devel, bm
  • git
  • drakx-­installer­-images
  • wget
  • diffstat
  • p7zip
  • genhdlist2, rpmtools, cdrkit-­genisoimage

1.3 Préparation de l'environnement de compilation

Se placer dans le répertoire de l'utilisateur créé (appelé $USER) et y télécharger les sources du dernier kernel 2.6.33. Ici, le 2.6.33.7.
La Mandriva Linux 2009.0 est basée sur un kernel 2.6.27.45. Afin d'éviter le plus grand nombre d'effets de bords et de soucis à prendre un kernel trop récent pour le backport, prendre le plus récent kernel de la première branche qui intègre le module megaraid_sas gérant la carte RAID Perc H710.

$ wget -­P /home/$USER http://www.kernel.org/pub/linux/kernel/v2.6/linux­2.6.33.7.tar.bz2

Copier les sources du kernel installé sur notre système, dans le home de notre utilisateur :
$ cp ­-R /usr/src/linux­2.6.27.45-­server­-1mnb /home/$USER/

Afin de préparer la compilation de notre nouveau module, préparer l'environnement de travail en quelques étapes rapides :

  • 1. détarer les sources du kernel précédemment téléchargées :
$ tar xvf linux­2.6.33.7.tar.bz2
$ cd /home/$USER/linux­2.6.27.45­-server­-1mnb
$ cp ­-f /boot/config­2.6.27.45­-server­-1mnb .config
  • 2. se placer dans le répertoire des sources du kernel installé sur notre machine précédemmentcopié dans le home de notre utilisateur :
$ cd /home/$USER/linux­2.6.27.45-­server­-1mnb
  • 3. copier la configuration du kernel afin de ne pas introduire de régression avec une configuration différente de celle d'origine :
$ cp -f /boot/config-2.6.27.45-server-1mnb .config
  • 4. préparer le répertoire courant à la compilation du kernel et vérifier que cela fonctionne avec le.config copié dans les étapes ci­dessus :
$ make menuconfig
$ make prepare
$ make scripts

 

5. Télécharger les sources du drivers megaraid_sas dans le home de notre utilisateur :

$ wget -P /home/$USER ­http://downloads.dell.com/FOLDER22354M/1/R282636-megaraid_sas-00.00.04.31.2-1.tar.gz
$ cd /home/$USER
$ tar xzf R282636-megaraid_sas-00.00.04.31.2-1.tar.gz
$ cd megaraid_sas-00.00.04.31-2-1
$ tar xzf megaraid_sas-v00.00.04.31.2-src.tgz
$ cd megaraid_sas-v00.00.04.31.2/
$ ls -l
-rw-r--r-- 1 $USER $USER   1819 2010-07-12 10:29 dkms.conf
-rw-r--r-- 1 $USER $USER  17987 2010-07-11 14:00 gpl-2.0.txt
-rwxr--r-- 1 $USER $USER     24 2010-07-11 14:00 Makefile*
-rw-r--r-- 1 $USER $USER 140472 2010-07-11 14:00 megaraid_sas.c
-rw-r--r-- 1 $USER $USER  34158 2010-07-11 14:00 megaraid_sas.h
-rw-r--r-- 1 $USER $USER     22 2010-07-11 14:00 Module.supported
drwxr-xr-x 2 $USER $USER   4096 2010-07-11 14:01 patches/
drwxr-xr-x 2 $USER $USER   4096 2010-07-12 10:09 redhat_driver_disk/

On va copier le dossier dans l'environnement et renommer le dossier megaraid_sas-v00.00.04.31.2 en megaraid_sas_backport.

$ cp -R megaraid_sas-00.00.04.31-2-1/megaraid_sas-v00.00.04.31.2/ .
$ mv megaraid_sas-v00.00.04.31.2 megaraid_sas_backport

L'environnement de travail est maintenant en place. Passer à l'étape suivant, à savoir la préparation du patch et de la compilation du nouveau module megaraid_sas.

 

1.4 Préparation pour le patch et la compilation du nouveau module

  • 1. éditer le Makefile de notre module afin de le mettre en module kernel et non en built­in :
$ cp -R /home/$USER/megaraid_sas-v00.00.04.31.2 /home/$USER/megaraid_sas_backport ; cd /home/$USER/megaraid_sas_backport
$ vi Makefile

> modifier la deuxième ligne afin d'avoir : obj­m += megaraid_sas.o
> sauvegarder et quitter

  • 2. cloner les sources du kernel 2.6.33.7 afin de pouvoir ensuite accéder à tout l'historique des commits et comprendre les patchs à appliquer à notre module megaraid_sas pour le kernel 2.6.27.45 :
$ cd /home/$USER/
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

 

2 Patch et compilation du module megaraid_sas

2.1 Compiler afin de voir les erreurs à patcher

Pour cela, on va lancer une compilation du kernel en lui précisant qu'il faut aller chercher des modules dans le répertoire donné :

$ make -­C /home/$USER/linux­2.6.27.45-­server­-1mnb/ M=/home/$USER/megaraid_sas_backport

Ici :

  • C= compile le kernel donné en argument
  • M= prévient qu'il y a un module à aller chercher dans le répertoire indiqué.

Les erreurs de compilation sont à analyser, une à une, et à résoudre, une à une, grâce à l'arbre git préalablement cloné qui va fournir tous les commits effectués avec leur historique.

2.2 Utilisation du git clone pour préparer les patchs

Une fois le make effectué, les erreurs de compilation s'affichent. Il convient de regarder le fichier source impacté et de regarder dans l'historique des commits à quel moment des modifications ont été faites sur le kernel 2.6.33 et les annuler ou les modifier pour revenir à une API ou des fonctions compatibles avec le kernel 2.6.27.45.
La fonction git log va permettre de parcourir les logs du kernel et de retirer les modifications pour permettre la compilation d'un patch récent sur un kernel plus ancien.

$ cd linux
$ git log -­p drivers/scsi/$MODULE/le_fichier.extension

Information : l'option -­p permet d'avoir les diffs. Il convient de regarder la première modification apportée sur la variable ou fonction bloquante et de l'annuler en revenant à au code d'origine. Exemple :

make -C /home/$USER/build/linux-2.6.27.45-1mnb/ M=/home/$USER/build/megaraid_sas_backport/
make: entrant dans le répertoire « /home/$USER/build/linux-2.6.27.45-1mnb »
 
  WARNING: Symbol version dump /home/$USER/build/linux-2.6.27.45-1mnb/Module.symvers
           is missing; modules will have no dependencies and modversions.
 
  LD      /home/$USER/build/megaraid_sas_backport/built-in.o
  CC [M]  /home/$USER/build/megaraid_sas_backport/megaraid_sas.o
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c: In function ‘megasas_slave_configure’:
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1444: erreur: implicit declaration of function ‘blk_queue_rq_timeout’
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c: Hors de toute fonction :
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1817: erreur: le type du retour est incomplet
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c: In function ‘megasas_reset_timer’:
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1824: erreur: ‘BLK_EH_NOT_HANDLED’ undeclared (first use in this function)
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1824: erreur: (Each undeclared identifier is reported only once
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1824: erreur: for each function it appears in.)
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1824: attention : ‘return’ with a value, in function returning void
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1838: erreur: ‘BLK_EH_RESET_TIMER’ undeclared (first use in this function)
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1838: attention : ‘return’ with a value, in function returning void
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c: Hors de toute fonction :
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1977: attention : initialization from incompatible pointer type
make[1]: *** [/home/$USER/build/megaraid_sas_backport/megaraid_sas.o] Erreur 1
make: *** [_module_/home/$USER/build/megaraid_sas_backport] Erreur 2
make: quittant le répertoire « /home/$USER/build/linux-2.6.27.45-1mnb »

Ici nous avons les erreurs qui sont rencontrées. Afin de corriger celles-ci nous allons voir en premier lieu les commits qu'il y a eu entre la version 2.6.27 et 2.6.32 pour le fichier megaraid_sas.c.

Nous prenons comme référence la version du noyau qui a été la première à intégrer les bonnes modifications qui prennent en compte notre matériel Perc H710 : le noyau v2.6.32.

Nous allons donc dans le dossier git linux et faisons un checkout de la version v2.6.32.

$ cd linux
$ git checkout v2.6.32
 
Checking out files: 100% (41776/41776), done.
Note: moving to "v2.6.32" which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at 22763c5... Linux 2.6.32

Dans l'erreur rencontrée, la fonction "blk_queue_rq_timeout" semble ne pas être déclarée dans pour la version de notre noyau 2.6.27.

Nous allons grâce à git log -p , énumérer les commits ayant introduit cette fonction et faire l'inverse. (enlever l'ajout ! 🙂 )

git log -p driver/scsi/megaraid/megaraid_sas.c
if (sdev->channel >= MEGASAS_MAX_PD_CHANNELS)
-               sdev->timeout = MEGASAS_DEFAULT_CMD_TIMEOUT * HZ;
+               blk_queue_rq_timeout(sdev->request_queue,
+                                    MEGASAS_DEFAULT_CMD_TIMEOUT * HZ);

On relance la compilation afin de noter les différences obtenues :

$ make -C /home/$USER/build/linux-2.6.27.45-server-1mnb/ M=/home/$USER/build/megaraid_sas_backport/
make: entrant dans le répertoire « /home/$USER/build/linux-2.6.27.45-1mnb »
 
  WARNING: Symbol version dump /home/$USER/build/linux-2.6.27.45-1mnb/Module.symvers
           is missing; modules will have no dependencies and modversions.
 
  CC [M]  /home/$USER/build/megaraid_sas_backport/megaraid_sas.o
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1817: erreur: le type du retour est incomplet
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c: In function ‘megasas_reset_timer’:
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1824: erreur: ‘BLK_EH_NOT_HANDLED’ undeclared (first use in this function)
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1824: erreur: (Each undeclared identifier is reported only once
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1824: erreur: for each function it appears in.)
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1824: attention : ‘return’ with a value, in function returning void
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1838: erreur: ‘BLK_EH_RESET_TIMER’ undeclared (first use in this function)
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1838: attention : ‘return’ with a value, in function returning void
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c: Hors de toute fonction :
/home/$USER/build/megaraid_sas_backport/megaraid_sas.c:1977: attention : initialization from incompatible pointer type
make[1]: *** [/home/$USER/build/megaraid_sas_backport/megaraid_sas.o] Erreur 1
make: *** [_module_/home/$USER/build/megaraid_sas_backport] Erreur 2
make: quittant le répertoire « /home/$USER/build/linux-2.6.27.45-1mnb »

Ainsi nous voyons que l'erreur rencontrée précédemment sur la fonction "blk_queue_rq_timeout" n'existe plus ou ne portait pas le même nom.

Nous avons une erreur identique :

/home/$USER/build/megaraid_sas_backport/megaraid_sas.c: In function ‘megasas_reset_timer’:

Trouvons la à travers git log -p driver/scsi/megaraid/megaraid_sas.c

-scsi_eh_timer_return megasas_reset_timer(struct scsi_cmnd *scmd)
+blk_eh_timer_return megasas_reset_timer(struct scsi_cmnd *scmd)
 {
        struct megasas_cmd *cmd = (struct megasas_cmd *)scmd->SCp.ptr;
        struct megasas_instance *instance;
@@ -1175,7 +1175,7 @@ scsi_eh_timer_return megasas_reset_timer(struct scsi_cmnd *scmd)
 
        if (time_after(jiffies, scmd->jiffies_at_alloc +
                                (MEGASAS_DEFAULT_CMD_TIMEOUT * 2) * HZ)) {
-               return EH_NOT_HANDLED;
+               return BLK_EH_NOT_HANDLED;
        }
 
        instance = cmd->instance;
@@ -1189,7 +1189,7 @@ scsi_eh_timer_return megasas_reset_timer(struct scsi_cmnd *scmd)
 
                spin_unlock_irqrestore(instance->host->host_lock, flags);
        }
-       return EH_RESET_TIMER;
+       return BLK_EH_RESET_TIMER;

Nous constatons que trois changement ont été opérés.
Le nom de la fonction est passée de "scsi_eh_timer_return" à "blk_eh_timer_return".
Que les variables sont passées de "EH_NOT_HANDLED" à "BLK_EH_NOT_HANDLED" "EH_RESET_TIMER" à "BLK_EH_RESET_TIMER"...
Nous allons revenir en arrière...
Nous renommons donc la fonction "blk_eh_timer_return" en "scsi_eh_timer_return"
Puis les variables : "BLK_EH_NOT_HANDLED" à "EH_NOT_HANDLED" et "BLK_RESET_TIMER" à "EH_EH_RESET_TIMER"

Nous relançons la compilation :

$ make -C /home/$USER/build/linux-2.6.27.45-server-1mnb/ M=/home/$USER/build/megaraid_sas_backport/
make: entrant dans le répertoire « /home/$USER/build/linux-2.6.27.45-1mnb »
 
  WARNING: Symbol version dump /home/$USER/build/linux-2.6.27.45-server-1mnb/Module.symvers
           is missing; modules will have no dependencies and modversions.
 
  Building modules, stage 2.
  MODPOST 1 modules
make: quittant le répertoire « /home/$USER/build/linux-2.6.27.45-1mnb »

Nous voyons que cela compile correctement ! (Youhou ! 😉 )

Une petite alerte reste cependant :

WARNING: Symbol version dump /home/$USER/build/linux-2.6.27.45-server-1mnb/Module.symvers is missing; modules will have no dependencies and modversions.

Il existe pour le noyau installé, un fichier Module.symvers qui se trouve dans le répertoire : /lib/modules/2.6.27.45-server-1mnb/build/Module.symvers.

Il suffit de le copier à l'endroit indiqué !

cp /lib/modules/2.6.27.45-server-1mnb/build/Module.symvers /home/$USER/build/linux-2.6.27.45-server-1mnb/Module.symvers

On re-compile :

$ make -C /home/$USER/build/linux-2.6.27.45-server-1mnb/ M=/home/$USER/build/megaraid_sas_backport/
make: entrant dans le répertoire « /home/$USER/build/linux-2.6.27.45-server-1mnb »
  Building modules, stage 2.
  MODPOST 1 modules
make: quittant le répertoire « /home/$USER/build/linux-2.6.27.45-server-1mnb »

 

Voilà la partie backport de ce module est faite.... Il reste à intégrer ce module au noyau et construire tout ce dont la distribution à besoin :

  • rpm, vmlinuz, stage2, all.rdz, etc.

Test du module créé

Nous allons au par avant voir les dépendances de ce module afin de les pré-charger.

# modinfo /home/$USER/build/megaraid_sas_backport/megaraid_sas.ko
filename:       /home/$USER/build/megaraid_sas_backport/megaraid_sas.ko
description:    LSI MegaRAID SAS Driver
author:         megaraidlinux@lsi.com
version:        00.00.04.31.2
license:        GPL
srcversion:     26C5C8D3127E8B595BC6D94
alias:          pci:v00001028d00000015sv*sd*bc*sc*i*
alias:          pci:v00001000d00000413sv*sd*bc*sc*i*
alias:          pci:v00001000d00000071sv*sd*bc*sc*i*
alias:          pci:v00001000d00000073sv*sd*bc*sc*i*
alias:          pci:v00001000d00000079sv*sd*bc*sc*i*
alias:          pci:v00001000d00000078sv*sd*bc*sc*i*
alias:          pci:v00001000d0000007Csv*sd*bc*sc*i*
alias:          pci:v00001000d00000060sv*sd*bc*sc*i*
alias:          pci:v00001000d00000411sv*sd*bc*sc*i*
depends:        scsi_mod
vermagic:       2.6.27.45-1mnbcustom SMP mod_unload 686
parm:           poll_mode_io:Complete cmds from IO path, (default=0) (int)
parm:           max_sectors:Maximum number of sectors per IO command (int)

Nous voyons que le module megaraid_sas dépend de scsi_mod.

Voyons si celui-ci est déjà chargé !

# lsmod | grep scsi
scsi_mod              138444  4 sg,sr_mod,libata,sd_mod

Nous voyons que celui-ci est chargé, assurons-nous que le module megaraid_sas ne le soit pas déjà (avec une ancienne version).

# lsmod | grep sas

Non.

Insérons le module créé :

# insmod /home/$USER/build/megaraid_sas_backport/megaraid_sas.ko

Voyons si cela charge correctement le module, puis voyons si c'est la bonne version 4.31.2

# lsmod | grep sas
megaraid_sas           48316  0
scsi_mod              138444  5 megaraid_sas,sg,sr_mod,libata,sd_mod

Puis avec

# dmesg | grep mega
 
megasas: 00.00.04.31.2 Thur July 08 14:13:02 EST 2010

Puis encore :

cat /sys/module/megaraid_sas/version
00.00.04.31.2

🙂 🙂 🙂

Intégration

1.1 Installation des pré-requis

# urpmi bm

1.2 Création de l'environnement de travail pour l'intégration du module précédemment créé.

  • On va créer un dossier tmp dans /home/$USER
  • Et mettre le contenu de build dans tmp/SOURCES.

Au par avant nous allons télécharger le source rpm du noyaux, pour cela le télécharger :

$ wget ftp://ftp.proxad.net/mirrors/ftp.mandriva.com/MandrivaLinux/official/2009.0/SRPMS/main/updates/kernel-2.6.27.45-1mnb2.src.rpm
--2012-11-18 10:54:27--  ftp://ftp.proxad.net/mirrors/ftp.mandriva.com/MandrivaLinux/official/2009.0/SRPMS/main/updates/kernel-2.6.27.45-1mnb2.src.rpm
           => `kernel-2.6.27.45-1mnb2.src.rpm'
Résolution de ftp.proxad.net... 212.27.60.27, 2a01:e0c:1:1598::1
Connexion vers ftp.proxad.net|212.27.60.27|:21...connecté.
Ouverture de session en anonymous...Session établie!
==> SYST ... complété.    ==> PWD ... complété.
==> TYPE I ... complété.  ==> CWD /mirrors/ftp.mandriva.com/MandrivaLinux/official/2009.0/SRPMS/main/updates ... complété.
==> SIZE kernel-2.6.27.45-1mnb2.src.rpm ... 54845320
==> PASV ... complété.    ==> RETR kernel-2.6.27.45-1mnb2.src.rpm ... complété.
Longueur: 54845320 (52M)
 
100%[===========================================================================================================================================================================>] 54 845 320  1,58M/s   in 36s     
 
2012-11-18 10:55:04 (1,47 MB/s) - « kernel-2.6.27.45-1mnb2.src.rpm » sauvegardé [54845320]

Installer le paquet :

rpm -vih kernel-2.6.27.45-1mnb2.src.rpm
 
   1:kernel                 attention: utilisateur qateam inexistant - utilisation de root
attention: groupe qateam inexistant - utilisation de root
attention: utilisateur qateam inexistant - utilisation de root
attention: groupe qateam inexistant - utilisation de root
attention: utilisateur qateam inexistant - utilisation de root
attention: groupe qateam inexistant - utilisation de root
attention: utilisateur qateam inexistant - utilisation de root
attention: groupe qateam inexistant - utilisation de root
attention: utilisateur qateam inexistant - utilisation de root
attention: groupe qateam inexistant - utilisation de root
attention: utilisateur qateam inexistant - utilisation de root
attention: groupe qateam inexistant - utilisation de root
attention: utilisateur qateam inexistant - utilisation de root
attention: groupe qateam inexistant - utilisation de root
########################################### [100%]
attention: utilisateur qateam inexistant - utilisation de root
attention: groupe qateam inexistant - utilisation de root
attention: utilisateur qateam inexistant - utilisation de root
attention: groupe qateam inexistant - utilisation de root
attention: utilisateur qateam inexistant - utilisation de root
attention: groupe qateam inexistant - utilisation de root

Voyons ce qui a été créé

$ ls tmp/
SOURCES/  SPECS/

Puis dans tmp/SOURCES

$ ls tmp/SOURCES/
disable-mrproper-in-devel-rpms.patch                 linux-2.6.27.45-mnb1.tar.bz2  linux-2.6.27.tar.bz2.sign  patch-2.6.27.45.bz2.sign  README.MandrivaLinux
disable-prepare-scripts-configs-in-devel-rpms.patch  linux-2.6.27.tar.bz2          patch-2.6.27.45.bz2        README.kernel-sources

1.3 Construction préliminaire

$ cd tmp/
$ bm -lp
creating package list
processing package kernel-2.6.27-%{rpmrel}
running prep stage
Exécution_de(%prep): /bin/sh -e /home/$USER/tmp/BUILDROOT/rpm-tmp.46731
+ umask 022
+ cd /home/$USER/tmp/BUILD
+ '[' 1 -eq 1 ']'
+ '[' 1 -eq 1 ']'
+ '[' 1 -eq 1 ']'
+ cd /home/$USER/tmp/BUILD
+ rm -rf kernel-i386
+ /bin/mkdir -p kernel-i386
+ cd kernel-i386
+ /usr/bin/bzip2 -dc /home/$USER/tmp/SOURCES/linux-2.6.27.tar.bz2
+ tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd /home/$USER/tmp/BUILD
+ cd kernel-i386
+ /usr/bin/bzip2 -dc /home/$USER/tmp/SOURCES/linux-2.6.27.45-mnb1.tar.bz2
+ tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd /home/$USER/tmp/BUILD/kernel-i386/linux-2.6.27
+ echo 'Patch #1 (patch-2.6.27.45.bz2):'
Patch #1 (patch-2.6.27.45.bz2):
+ /usr/bin/bzip2 -d
+ patch -p1 -s
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ ../2.6.27.45-mnb1//scripts/apply_patches
+ ../2.6.27.45-mnb1//scripts/create_configs --no-debug --user_cpu=i386
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/docproc
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/kxgettext.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/lex.zconf.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
pushd /home/$USER/tmp/BUILD/kernel-i386/linux-2.6.27/3rdparty ; perl ./mkbuild.pl ; popd
~/tmp/BUILD/kernel-i386/linux-2.6.27/3rdparty ~/tmp/BUILD/kernel-i386/linux-2.6.27
~/tmp/BUILD/kernel-i386/linux-2.6.27
scripts/kconfig/conf -o arch/x86/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/x86/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/x86/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/powerpc/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/powerpc/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/sparc64/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/sparc64/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/x86/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/x86/Kconfig
#
# configuration written to .config
#
+ LC_ALL=C
+ perl -p -i -e 's/^SUBLEVEL.*/SUBLEVEL = 27/' Makefile
+ find . -name '*~' -o -name '*.orig' -o -name '*.append'
+ xargs -P 2 rm -f
+ exit 0
succeeded!
ls
BUILD/  BUILDROOT/  RPMS/  SOURCES/  SPECS/  SRPMS/

1.4 Choix de la solution d'intégration

Ici il existe un choix à réaliser afin d'intégrer ce module megaraid_sas. En effet ce module, dans le noyau 2.6.27.45, existe déjà mais ne gèrent pas

encore le matériel attendu. Nous pouvons soit simplement le remplacer. Soit l'ajouter. Cependant le module que nous avons télécharger ne contient

pas des fichiers existant dans l'ancien comme le fichier megaraid_mbox...

Il semble pourtant que le fichier megaraid_sas.c ou megaraid_sas.h ne fasse pas appel à d'autres et se trouvent ainsi un peu isolés.

Voici donc les solutions :

1 - Nous pouvons remplacer le .c et .h par ceux de Dell (choisie par mon entreprise)
2 - Nous pouvons ajouter le module comme un module nouveau et complémentaire, en faisant bien attention à le nommer
différemment pour le noyau à travers les Kconfig interdépendants (ma préférée) et en supprimant le .c et .h d'origine.
3 - Ou supprimer l'ancien module et le remplacer par celui de Dell (peu recommendé)

Nous allons prendre la solution 2.

1.5 Préparation du kernel à patcher

Déplacement de l'ancien environnement dans le tmp/SOURCES

cp -R build/* tmp/SOURCES/

On crée le fichier .rpmmacros

vi .rpmmacros
%_topdir /home/$USER/tmp
%_tmppath /tmp

1.6 Modification des sources du noyau 2.6.27

$ cd BUILD/kernel-i386/
$ cp -R linux-2.6.27/ linux-2.6.27-megaraid_sas_backport
$ cd linux-2.6.27-megaraid_sas_backport/
$ cp -R /home/$USER/build/megaraid_sas_backport/ drivers/scsi/
$ rm drivers/scsi/megaraid/ -fr

On édite le Kconfig du répertoire driver/scsi afin d'indiquer le pointage effectif sur megaraid_sas

vi drivers/scsi/Kconfig

En indiquant :

source "drivers/scsi/megaraid/Kconfig.megaraid"

en

source "drivers/scsi/megaraid_sas_backport/Kconfig.megaraid"

On copie le Kconfig du megaraid du noyau : linux-2.6.27.45-server-1mnb

cp ../../../../build/linux-2.6.27.45-server-1mnb/drivers/scsi/megaraid/Kconfig.megaraid drivers/scsi/megaraid_sas_backport/

On édite le Makefile

vi drivers/scsi/megaraid_sas_backport/Makefile

On s'assure que les lignes suivantes existent.

obj-$(CONFIG_SCSI_MEGARAID_SAS) += megaraid_sas.o

On édite le Kconfig.megaraid

vi drivers/scsi/megaraid_sas_backport/Kconfig.megaraid
config MEGARAID_SAS
tristate "LSI Logic MegaRAID SAS RAID Module hacked by PMSIpilot (lolo)"
depends on PCI && SCSI
help
Module for LSI Logic's SAS based RAID controllers.
To compile this driver as a module, choose 'm' here.
Module will be called megaraid_sas

On vérifie que le module soit bien déclaré pour le noyau, puis on s'assure de le cocher en tant que module actif.

On sort et on valide.

cp /home/$USER/build/linux-2.6.27.45-server-1mnb/.config .

 

Device Drivers  --->
 
       SCSI device support  --->
 
            SCSI low-level drivers  --->
 
            <M>   LSI Logic MegaRAID SAS RAID Module hacked by PMSIpilot (lolo)

 

1.7 Préparation du noyau à construire

$ cd /home/$USER/tmp/BUILD/kernel-i386/
 
$ diff -Nurp -X linux-2.6.27/Documentation/dontdiff linux-2.6.27/drivers/scsi/ linux-2.6.27-megaraid_sas_backport/drivers/scsi/ > megaraid_sas.patch
 
$ diffstat -p1 megaraid_sas.patch
 
$ mv linux-2.6.27-megaraid_sas_backport 2.6.27.45-mnb1
 
$ cd 2.6.27.45-mnb1/
 
$ cp /home/$USER/build/linux-2.6.27.45-server-1mnb/.config .config

Vérifiez la présence du module créé

$ make menuconfig

validez

cp ../megaraid_sas.patch patches/

On édite le fichier patches/series afin d'indiquer le fichier patch à jouer.

vi patches/series
# Ajout PMSIpilot
megaraid_sas.patch

 

1.7 Construction préliminaire

On se place dans le bon répertoire tmp/SOURCES, on crée un tar.bz2, puis on pré-compile :

[$USER@pmsipilot SOURCES]$ cp -R ../BUILD/kernel-i386/2.6.27.45-mnb1/ .
 
tar cjf linux-2.6.27.45-mnb1.tar.bz2 2.6.27.45-mnb1/
 
[$USER@pmsipilot SOURCES]$ bm -lp ../SPECS/kernel.spec
creating package list
processing package kernel-2.6.27-%{rpmrel}
running prep stage
Exécution_de(%prep): /bin/sh -e /home/$USER/tmp/BUILDROOT/rpm-tmp.92541
+ umask 022
+ cd /home/$USER/tmp/BUILD
+ '[' 1 -eq 1 ']'
+ '[' 1 -eq 1 ']'
+ '[' 1 -eq 1 ']'
+ cd /home/$USER/tmp/BUILD
+ rm -rf kernel-i386
+ /bin/mkdir -p kernel-i386
+ cd kernel-i386
+ tar -xf -
+ /usr/bin/bzip2 -dc /home/$USER/tmp/SOURCES/linux-2.6.27.tar.bz2
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd /home/$USER/tmp/BUILD
+ cd kernel-i386
+ tar -xf -
+ /usr/bin/bzip2 -dc /home/$USER/tmp/SOURCES/linux-2.6.27.45-mnb1.tar.bz2
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd /home/$USER/tmp/BUILD/kernel-i386/linux-2.6.27
+ echo 'Patch #1 (patch-2.6.27.45.bz2):'
Patch #1 (patch-2.6.27.45.bz2):
+ /usr/bin/bzip2 -d
+ patch -p1 -s
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ ../2.6.27.45-mnb1//scripts/apply_patches
+ ../2.6.27.45-mnb1//scripts/create_configs --no-debug --user_cpu=i386
HOSTCC  scripts/basic/fixdep
HOSTCC  scripts/basic/docproc
HOSTCC  scripts/kconfig/conf.o
HOSTCC  scripts/kconfig/kxgettext.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/lex.zconf.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC  scripts/kconfig/zconf.tab.o
HOSTLD  scripts/kconfig/conf
pushd /home/$USER/tmp/BUILD/kernel-i386/linux-2.6.27/3rdparty ; perl ./mkbuild.pl ; popd
~/tmp/BUILD/kernel-i386/linux-2.6.27/3rdparty ~/tmp/BUILD/kernel-i386/linux-2.6.27
~/tmp/BUILD/kernel-i386/linux-2.6.27
scripts/kconfig/conf -o arch/x86/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/x86/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/x86/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/powerpc/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/powerpc/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/sparc64/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/sparc64/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/x86/Kconfig
#
# configuration written to .config
#
scripts/kconfig/conf -o arch/x86/Kconfig
#
# configuration written to .config
#
+ LC_ALL=C
+ perl -p -i -e 's/^SUBLEVEL.*/SUBLEVEL = 27/' Makefile
+ find . -name '*~' -o -name '*.orig' -o -name '*.append'
+ xargs -P 2 rm -f
+ exit 0
succeeded!

Comme cela fonction, on modifie le fichier SPEC/kernel.spec en trouvant "%define mnbrel 1" que l'on met à "%define mnbrel 1.2"

 

1.8 Construction du noyau

Pour cela on renomme le répertoire 2.6.27.45-mnb1 en 2.6.27.45-mnb1.2

$ mv 2.6.27.45-mnb1 2.6.27.45-mnb1.2

tar cjf linux-2.6.27.45-mnb1.2.tar.bz2 2.6.27.45-mnb1.2/

Puis on lance la compilation.... cela peut-être long ! 🙂

$ bm -l ../SPECS/kernel.spec

Exécution_de(%prep): /bin/sh -e /home/$USER/tmp/BUILDROOT/rpm-tmp.50680
+ umask 022
+ cd /home/$USER/tmp/BUILD
+ '[' 1 -eq 1 ']'
+ '[' 1 -eq 1 ']'
+ '[' 1 -eq 1 ']'
+ cd /home/$USER/tmp/BUILD
+ rm -rf kernel-i386
+ /bin/mkdir -p kernel-i386
+ cd kernel-i386
+ /usr/bin/bzip2 -dc /home/$USER/tmp/SOURCES/linux-2.6.27.tar.bz2
+ tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd /home/$USER/tmp/BUILD
+ cd kernel-i386
+ /usr/bin/bzip2 -dc /home/$USER/tmp/SOURCES/linux-2.6.27.45-mnb1.2.tar.bz2
+ tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd /home/$USER/tmp/BUILD/kernel-i386/linux-2.6.27
+ echo 'Patch #1 (patch-2.6.27.45.bz2):'
Patch #1 (patch-2.6.27.45.bz2):
+ /usr/bin/bzip2 -d
+ patch -p1 -s
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ ../2.6.27.45-mnb1.2//scripts/apply_patches
+ ../2.6.27.45-mnb1.2//scripts/create_configs --no-debug --user_cpu=i386
HOSTCC  scripts/basic/fixdep
 
[...]
 
  LD      net/netlink/built-in.o
LD      net/netrom/built-in.o
CC [M]  net/netrom/af_netrom.o
CC [M]  drivers/net/tulip/media.o
CC [M]  net/netrom/nr_dev.o
CC [M]  drivers/net/tulip/timer.o
CC [M]  drivers/net/tulip/tulip_core.o
CC [M]  net/netrom/nr_in.o
CC [M]  net/netrom/nr_loopback.o
CC [M]  drivers/net/tulip/21142.o
CC [M]  net/netrom/nr_out.o
CC [M]  drivers/net/tulip/pnic.o
CC [M]  net/netrom/nr_route.o
CC [M]  drivers/net/tulip/pnic2.o
CC [M]  drivers/net/tulip/de4x5.o
CC [M]  net/netrom/nr_subr.o
CC [M]  net/netrom/nr_timer.o
CC [M]  net/netrom/sysctl_net_netrom.o
LD [M]  net/netrom/netrom.o
LD      net/packet/built-in.o
CC [M]  net/packet/af_packet.o
CC [M]  drivers/net/tulip/uli526x.o
 
[...]
 
  LD      drivers/scsi/megaraid_sas_backport/built-in.o
 
[...]
 
Vérification des fichiers non empaquetés: /usr/lib/rpm/check-files /home/$USER/tmp/BUILDROOT/kernel-2.6.27.45-i386-build
Ecrit: /home/$USER/tmp/SRPMS/kernel-2.6.27.45-1.2mnb2.src.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-2.6.27.45-1.2mnb-1-1mnb2.i586.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-desktop586-2.6.27.45-1.2mnb-1-1mnb2.i586.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-desktop586-devel-2.6.27.45-1.2mnb-1-1mnb2.i586.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-desktop586-latest-2.6.27.45-1.2mnb2.i586.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-desktop586-devel-latest-2.6.27.45-1.2mnb2.i586.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-desktop-2.6.27.45-1.2mnb-1-1mnb2.i586.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-desktop-devel-2.6.27.45-1.2mnb-1-1mnb2.i586.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-desktop-latest-2.6.27.45-1.2mnb2.i586.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-desktop-devel-latest-2.6.27.45-1.2mnb2.i586.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-server-2.6.27.45-1.2mnb-1-1mnb2.i586.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-server-devel-2.6.27.45-1.2mnb-1-1mnb2.i586.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-server-latest-2.6.27.45-1.2mnb2.i586.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-server-devel-latest-2.6.27.45-1.2mnb2.i586.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-source-2.6.27.45-1.2mnb-1-1mnb2.i586.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-source-latest-2.6.27.45-1.2mnb2.i586.rpm
Ecrit: /home/$USER/tmp/RPMS/i586/kernel-doc-2.6.27.45-1.2mnb2.i586.rpm
Exécution_de(%clean): /bin/sh -e /home/$USER/tmp/BUILDROOT/rpm-tmp.26640
+ umask 022
+ cd /home/$USER/tmp/BUILD
+ cd kernel-i386
+ rm -rf /home/$USER/tmp/BUILDROOT/kernel-2.6.27.45-i386-build
+ exit 0
succeeded!

Cela est fait !!!

1.9 Installation du noyau

[root@pmsipilot SOURCES]# urpmi ../RPMS/i586/kernel-server-2.6.27.45-1.2mnb-1-1mnb2.i586.rpm
 
installation de kernel-server-2.6.27.45-1.2mnb-1-1mnb2.i586.rpm depuis ../RPMS/i586
Préparation ...                  ##################################################################################################################################################################################
      1/1: kernel-server-2.6.27.45-1.2mnb
                                 ##################################################################################################################################################################################
Vous devriez relancer système pour glibc, kernel-server-2.6.27.45-1.2mnb

Nous redémarrons sur le nouveau noyau. Puis vérifions son status.

$ uname -a
Linux pmsipilot 2.6.27.45-server-1.2mnb #1 SMP Sun Nov 18 16:21:37 CET 2012 i686 Intel(R) Core(TM)2 Duo CPU     E8200  @ 2.66GHz GNU/Linux

Il reste à créer le CDROM d'installation démarrant sur le nouveau module !

- Fin -

Print Friendly, PDF & Email

Posted in Important, Linux, Mandriva, Technique, Toutes. Tagged with , , , , .

0 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

Some HTML is OK

(required)

(required, but never shared)

or, reply to this post via trackback.

Time limit is exhausted. Please reload CAPTCHA.


/* */
Creative Commons License
Cette création par Laurent Besson est mise à disposition selon les termes de la licence Creative Commons Paternité-Partage des Conditions Initiales à l'Identique 2.0 France.