Rechercher sur ce site...

Mois : mai 2016

WRT1900AC : Créez un firmware Linux

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]

WRT1900AC : Créer un système de fichier linux

Objectif

En vue de faire tourner Debian sur le WRT1900AC, en plus de créer un firmware, j'ai du créer un système de fichier linux dont je liste les étapes.

/!\

Stocké le système de fichier linux sur une clef USB est déconseillée sauf si le contrôleur incorpore la technologie du "wear levelling" comme la Sandisk Extrem ou la Corsair voyager GTX. En effet, certains secteurs de stockage s'useront beaucoup trop rapidement à cause des différents fichiers journaux (/var/log), fichier temporaire(/tmp), fichier de pid, etc... Gardez une chose à l'esprit, plus la clef est petite, plus une partie de la clef va s'user rapidement par rapport à l'autre.

Préparation du système

La construction d'un système de fichier se décompose en 2 phases par l'intermediaire du programme debootstrap.

Installation des paquets

apt-get install debootstrap  qemu-user-static arm-none-eabi*
  • Liste des architectures disponible :
alpha amd64 arm arm64 armel armhf hppa hurd-i386 i386 ia64 kfreebsd-amd64 kfreebsd-i386 m68k mipsel mips powerpc ppc64el s390 s390x sh sparc

Phase 1

  • Par exemple :

Pour un routeur WRT1900AC d'architecture armhf :

mkdir  -p /home/WRT1900AC/jessie-armhf
cd /home/WRT1900AC/jessie-armhf
debootstrap --foreign --no-check-gpg --arch=armhf jessie /home/WRT1900AC/jessie-armhf ftp://ftp.debian.org/debian/
cp /usr/bin/qemu-arm-static /home/WRT1900AC/jessie-armhf/usr/bin/
cp /etc/resolv.conf /home/WRT1900AC/jessie-armhf/etc/

Phase 2

  • Avec chroot, on rentre dans le nouveau system de fichier et on exécute la 2e phase.
chroot /home/WRT1900AC/jessie-armhf
echo WRT1900AC > /etc/hostname

/debootstrap/debootstrap --second-stage
  • tweak
passwd -d root

cat << EOF > /etc/apt/sources.list
deb http://ftp.de.debian.org/debian jessie main contrib non-free
deb http://ftp.de.debian.org/debian jessie-updates main contrib non-free
deb http://security.debian.org/debian-security jessie/updates main contrib non-free
EOF

apt-get update
apt-get install ca-certificates  locales localepurge dialog openssh-server ntpdate debconf

dpkg-reconfigure locales # configure la zone
dpkg-reconfigure tzdata #configure la time zone
 
apt-get dist-upgrade

cat << EOF >> /etc/network/interfaces
allow-hotplug br-lan0
iface br-lan0 inet static
address 192.168.10.10
gateway 192.168.10.1
netmask 255.255.255.0
bridge_ports eth0 eth1
EOF
 
apt-get clean
exit

En 1 script

  • Si on factorise, execution des 2 phases en 1 script :
#!/bin/bash
MACHINE=WRT1900AC
ARCH=armhf
DIR=/home/${MACHINE}
DEPOT=http://ftp.debian.org/debian/
CODE=jessie
IP=192.168.0.1
MASK=255.255.255.0
GW=192.168.0.254
PWD_ROOT=MotDePasse

mkdir  -p ${DIR}/${CODE}-${ARCH}
cd ${DIR}/${CODE}-${ARCH}
echo "1e phase..."
debootstrap --foreign --no-check-gpg --arch=${ARCH} ${CODE} ${DIR}/${CODE}-${ARCH} ${DEPOT}
cp /usr/bin/qemu-arm-static ${DIR}/${CODE}-${ARCH}/usr/bin/
cp /etc/resolv.conf ${DIR}/${CODE}-${ARCH}/etc/
echo ${MACHINE} > ${DIR}/${CODE}-${ARCH}/etc/hostname

cat << EOF > ${DIR}/${CODE}-${ARCH}/startup
echo "2e phase..."
/debootstrap/debootstrap --second-stage

echo "root:${PWD_ROOT}" | chpasswd
cat << FILE > /etc/apt/sources.list
deb ${DEPOT} ${CODE} main contrib non-free
deb ${DEPOT} ${CODE}-updates main contrib non-free
deb http://security.debian.org/debian-security ${CODE}/updates main contrib non-free
FILE
apt-get update
apt-get install ca-certificates  locales localepurge dialog openssh-server ntpdate debconf -y
apt-get dist-upgrade -y
cat << FILE >> /etc/network/interfaces
allow-hotplug eth0
iface eth0 inet static
address ${IP}
gateway ${GW}
netmask ${MASK}
FILE
apt-get clean
exit
EOF
chmod +x ${DIR}/${CODE}-${ARCH}/startup
chroot ${DIR}/${CODE}-${ARCH} /startup
echo "Si besoin :
Pour configurer les variables LC   : dpkg-reconfigure locales
Pour configurer la time zone Paris : dpkg-reconfigure tzdata"


Après le firmware, il faut un système de fichier pour le WRT1900AC.