Objectif
Obtenir une distribution Debian tournant sur le routeur WRT1900AC, la pièce central de mon réseau. Ici, je souhaite faire un pont entre toutes les cartes réseaux disponibles sur cette appareil (pas de NAT). Pour que ça fonctionne, il faut un firmware Linux et un system de fichier.
Pour le nouveau système de fichier, j’ai besoin d’un disque dur ou d’une clef usb. Cependant, la clef est à déconseiller à part si un contrôleur effectuant un wear levelling est incorporé à la clef. En effet, certains secteurs s’useront beaucoup plus rapidement à cause des différents journaux, fichier temporaire et fichier de pid.
Préparation du système
- Prévoyez au moins 10GB d’espace disque disponible.
- Le nombre de cœur et la vitesse du disque dur ont un impact direct sur le temps de compilation.
Installation des paquets
apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc liblz4-tool kernel-package
1er Partie: Préparation du système de fichier
Créer un système de fichier pour Debian avec pour architecture ARM.
2er Partie: Préparation du firmware
Je vous propose 3 scripts, prebuild, build, afterbuild qui demande qu’une seule variable VER, le nom du kernel.
prebuid: Download le kernel du futur firmware Linux, les patches pour le ventilateur et pour le wifi et le .config.
[code lang= »shell »]
if [ -z "$VER" ]
then
echo -e
echo -e "\t\tVER not define. Please fix kernel version"
echo -e "\t\texample:"
echo -e "\t\t\t\texport VER=4.5.2"
echo -e
exit
fi
wget http://cdn.kernel.org/pub/linux/kernel/v4.x/linux-${VER}.tar.xz
tar xvfJ linux-${VER}.tar.xz
cd linux-${VER}/drivers
wget https://github.com/kaloz/mwlwifi/archive/master.zip
unzip master
mv mwlwifi-master/bin/firmware ../firmware/mwlwifi
mv mwlwifi-master/ mwlwifi
cd ..
wget https://raw.githubusercontent.com/jbsky/McDebian/kernel/kernel/config
wget https://raw.githubusercontent.com/jbsky/McDebian/kernel/kernel/patch.fan
wget https://raw.githubusercontent.com/jbsky/McDebian/kernel/kernel/patch.wifi
patch -p0 < patch.wifi
patch -p1 < patch.fan
mv config .config
make ARCH=arm CROSS_COMPILE=arm-none-eabi- menuconfig
[/code]
Le deuxieme script est tout simple, seulement 3 lignes .
[code lang= »shell »]
make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j4 zImage
make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j4 dtbs
make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j4 modules
[/code]
Le troisième script génère les modules, modifier la ligne du make, après INSTALL_MOD_PATH pour spécifier le fs(1er partie).
Ensuite, il génère le fameux firmware Linux pour faire fonctionner le routeur!
[code lang= »shell »]
if [ -z "$VER" ]
then
echo -e
echo -e "\t\tVER not define. Please fix kernel version"
echo -e "\t\texample:"
echo -e "\t\t\t\texport VER=4.5.2"
echo -e
exit
fi
mkdir modules
make ARCH=arm CROSS_COMPILE=arm-none-eabi- INSTALL_MOD_PATH=modules modules_install
cat arch/arm/boot/zImage arch/arm/boot/dts/armada-xp-linksys-mamba.dtb > ./zImage-linksys-mamba
mkimage -A arm -O linux -T kernel -C none -a 0x100000 -e 0x100000 -n "Kernel ${VER}" -d ./zImage-linksys-mamba ./firmware-WRT1900AC-V1
echo -e
echo -e "\t\tFirmware V1 ready!"
echo -e "\t\tmodules copied to modules/"
echo -e
exit
[/code]
- En 1 script :
#!/bin/bash VER=4.9.30 wget http://cdn.kernel.org/pub/linux/kernel/v4.x/linux-${VER}.tar.xz tar xvfJ linux-${VER}.tar.xz rm linux ln -s linux-${VER} linux cd linux-${VER}/ wget https://github.com/kaloz/mwlwifi/archive/master.zip unzip master rm master.zip mv mwlwifi-master/bin/firmware firmware/mwlwifi mv mwlwifi-master/Makefile.kernel mwlwifi-master/Makefile mv mwlwifi-master/ drivers/net/wireless/marvell/mwlwifi wget https://raw.githubusercontent.com/jbsky/Debian-On-WRT1900AC-V1/master/kernel/patch/fan.patch wget https://raw.githubusercontent.com/jbsky/Debian-On-WRT1900AC-V1/master/kernel/patch/mwlwifi.patch wget https://raw.githubusercontent.com/jbsky/Debian-On-WRT1900AC-V1/master/kernel/patch/add_mamba_powertables.patch patch -p0 < mwlwifi.patch patch -p1 < fan.patch patch -p1 < add_mamba_powertables.patch # make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j16 make menuconfig # bypass wget https://raw.githubusercontent.com/jbsky/Debian-On-WRT1900AC-V1/master/kernel/.config make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j16 zImage make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j16 dtbs make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j16 modules mkdir modules make ARCH=arm CROSS_COMPILE=arm-none-eabi- INSTALL_MOD_PATH=modules modules_install cat arch/arm/boot/zImage arch/arm/boot/dts/armada-xp-linksys-mamba.dtb > ./zImage-linksys-mamba mkimage -A arm -O linux -T kernel -C none -a 0x100000 -e 0x100000 -n "Kernel ${VER}" -d ./zImage-linksys-mamba ./firmware-WRT1900AC-V1 cd modules #Suppression des liens en vue de la copie vers le routeur rm ./lib/modules/${VER}/build rm ./lib/modules/${VER}/source # Attention, connexion en ssh par clé partager scp -r * wrt:/
Mise à jour
Prérequis :
- un server tftp
- Un cable USB/serie TTL ou RS-232, 3.3V.
En fonction de la taille de votre firmware, il est nécessaire de modifier les variable environnement de U Boot, accessible par minicom.
[code lang= »shell »]
marvell>>setenv pri_kern_size 0x2800000
marvell>>setenv alt_kern_size 0x2800000
marvell>>setenv flash_alt_image ‘tftp ${default_load_addr} ${firmware_name}; nand erase ${alt_kern_addr} ${alt_kern_size};nand write ${default_load_addr} ${alt_kern_addr} ${filesize};’
marvell>>setenv flash_pri_image ‘tftp ${default_load_addr} ${firmware_name}; nand erase ${pri_kern_addr} ${pri_kern_size};nand write ${default_load_addr} ${pri_kern_addr} ${filesize};’
marvell>>saveenv
[/code]