ATTENTION
Cette manipulation est de loin la plus dangereuse pour votre routeur.
Si vous n'avez jamais customisé/recompilé de noyau linux,
alors je vous déconseille fortement de vous lancer directement sur la recompilation du kernel pour le DG834G.
Pour les autres, dans la plupart des cas, la modification du kernel n'est pas nécessaire.
Elle n'est nécessaire que pour l'ajout d'une fonctionnalité nécessitant un support au niveau du noyau.

Préparation des sources

  1. Renommage du repertoire source

    Lors de la compilation du noyau le nom d'origine (DG834(G).V2.10.17_src) pose problème à cause des parenthèses.

    On peut le renommer par exemple en V2.10.17_src, ou tout autre nom ne comportant pas de caractères spéciaux.
    mv DG834(G).V2.10.17_src V2.10.17_src
  2. Application du patch patch-knl

    Depuis le repertoire source du firmware (maintenant V2.10.17) , les sources du noyau se trouvant dans le repertoire linux-2.4.17_mvl21

    [root@evectra V2.10.17_src]# ls
    apps
    DG834B_V2.10.17.img
    linux-2.4.17_mvl21
    patch-apps
    README
    target.tar.bz2
    uClibc-0.9.19
    build.sh
    fs.bin
    MonFirmwareCustom.img
    patch-knl
    target
    tools
    [root@evectra V2.10.17_src]# patch -p0 < patch-knl
    sortie tronquée******************
    patching file linux-2.4.17_mvl21/net/Makefile.ipsecmd5
    patching file linux-2.4.17_mvl21/net/Makefile.preipsec
    patching file linux-2.4.17_mvl21/net/Makefile.wipsec
    patching file linux-2.4.17_mvl21/net/atm/Makefile
    patching file linux-2.4.17_mvl21/net/atm/br2684.c
    patching file linux-2.4.17_mvl21/net/atm/common.c
    patching file linux-2.4.17_mvl21/net/atm/pppoatm.c
    patching file linux-2.4.17_mvl21/net/atm/pppoatm.c.3.5
    patching file linux-2.4.17_mvl21/net/atm/pvc.c
    patching file linux-2.4.17_mvl21/net/ax25/ax25_ds_in.c
    patching file linux-2.4.17_mvl21/net/ax25/ax25_ds_subr.c
    patching file linux-2.4.17_mvl21/net/bluetooth/af_bluetooth.c
    patching file linux-2.4.17_mvl21/net/bluetooth/hci_core.c
    ***********

    Le patch modifie les sources du noyau original de montavista, il ajoute le support des éléments spécifiques à la plateforme du routeur.
    Point important, le patch créé aussi le fichier .config qui contient toute la configuration pour la compilation par défaut.
    En clair, on peut dire qu'après l'application du patch, le noyau serait prêt à être compilé.

Modification/personalisation

Que vous dire ici, sinon que cela se passe exactement comme pour un noyau linux :D.
Mais à moins de savoir exactement ce que vous faites, je vous déconseille de modifier le paramètrage d'origine... (retrait d'option / modification de valeur pour la flash...)

Que faire alors ?A vous de voir pourquoi vous voulez recompiler ce noyau ;)

Quelques idées:Ajout de fonction au niveau ipsec, ajout de modules iptables pour profiter de toute la puissance de ce parefeu, etc...

Compilation

Vos modifications sont faites ?
il ne reste plus qu'à compiler et générer une image intégrable dans le firmware.
Pour cette partie, vous aurez besoin de l'utilitaire dgfirmware qui va permettre de fusionner le noyau avec l'image du firmware.
De plus, j'ai utilisé une toolchain différente: mips-fp-le, issue du previewkit de montavista.
Malheureusement, je n'ai plus le lien :(, mais comptez sur moi pour le mettre en ligne dès que possible.

Les étapes de la compilation:

  • make dep
  • make ram_zimage_pad
  • make modules

Voila, on peut trouver maintenant dans le repertoire des sources du noyau un fichier nommé ram_zimage_pad.bin.
C'est ce fichier que nous allons fusionner dans l'image du firmware, et ce, à l'aide de dgfirmware
Voici la syntaxe de cet utilitaire:

[root@evectra DG834G.V2.10.09_src]# ./dgfirmware -husage: dgfirmware [|opts|] |img|  |img|               firmware image filename  |opts|  -h          print this message          -f          fix the checksum          -x  |file|  extract the rootfs file to |file|          -xk |file|  extract the kernel to |file|          -m  |file|  merge in rootfs filrom |file|          -k  |file|  merge in kernel from |file|          -w  |file|  write back the modified firmware

La commande sera donc de la forme: ./dgfirmware -f -k ram_zimage_pad.bin -w MonfirmwareCustom.img DG834G_V2.10.17.img
Ou:

-f => fixe le checksum de la nouvelle image (calcul du CRC)
-k ram_zimage_pad.bin => image du noyau à fusionner
-w MonfirmwareCustom.img => Nom de la nouvelle image intégrant notre kernel
DG834G_V2.10.17.img => Image du firmware original.

[root@evectra DG834G.V2.10.09_src]# ./dgfirmware -f -k ram_zimage_pad.bin -w MonfirmwareCustom.img DG834G_V2.10.17.img
Read firmware file
Firmware product: DG834
Firmware version: 1.42.09
Read kernel file
image checksum = 1f86
real checksum = ab3c
Bad Checksum, fix it
Write image file

Bien que la sortie indique un Bad Checksum, dgfirmware a bien corrigé le checksum.Pour en être sur:

[root@evectra DG834G.V2.10.09_src]# ./dgfirmware -f MonfirmwareCustom.img
Read firmware file
Firmware product: DG834
Firmware version: 1.42.09
image checksum = ab3c
real checksum = ab3c
Checksum is correct, good

Ben on dirait que ça y est :D
Il ne reste plus qu'à tester en flashant le routeur.

Mais n'oublie pas que l'utilitaire de recovery est ton ami :)