"Crosscompile" für Ubiquity EdgeRouter

Seit ein paar Jahren nutze ich einen EdgeRouter POE für mein Netzwerk zuhause, das Gerät tut ziemlich großartig alles was ich möchte komma-aber:

Als unterste Schicht im Router werkelt ein Debian auf mips64, an das man einfach per SSH kommt und Sachen nachrüsten kann. Das brauche ich auch, denn der Router unterstützt nativ kein tinc VPN. Bisher nutzte ich tinc 1.0, welches einfach per apt nachgezogen werden konnte. Jetzt stelle ich mein Netz aber auf tinc 1.1 um, welches in den Paketquellen nicht vorhanden ist. Dazu kommt das der EdgeRouter leider immernoch auf Debian Wheezy fusst. Wheezy auf mips ist inzwischen als EOL abgekündigt, was bedeutet das die Paketquellen langsam verschwinden (es gibt beispielsweise bereits keine Security Updates mehr). Deshalb lässt sich nicht mehr so leicht Software so nachinstallieren.

Ich habe deshalb vom PC aus "crosscompiled". Ich schreibe das immer in ", denn eigentlich emuliere ich mir einen mips in Qemu und compile einfach dort. So habe ich keinen Ärger mit Dependencies und ähnlichem.

Dazu braucht es zuerst die Qemu VM (nach diesem Post):

wget https://people.debian.org/~aurel32/qemu/mips/debian_wheezy_mips_standard.qcow2
wget https://people.debian.org/~aurel32/qemu/mips/vmlinux-3.2.0-4-5kc-malta
qemu-img create -f qcow2 -o backing_file=debian_wheezy_mips_standard.qcow2 disk.qcow2
qemu-system-mips64 -M malta -kernel vmlinux-3.2.0-4-5kc-malta -hda disk.qcow2 -append "root=/dev/sda1 console=ttyS0 mem=256m@0x0 mem=768m@0x90000000" -nographic -m 1024 -net nic,macaddr=52:54:00:fa:ce:07,model=virtio -net user,hostfwd=tcp:127.0.0.1:2022-:22
ssh -p 2022 root@localhost
## password ist "root"
apt-get install build-essential git autoconf libtool bison flex libapt-pkg-dev libboost-dev libperl-dev libboost-filesystem-dev libboost-system-dev libboost-thread-dev libpcre3-dev curl

Danach in der VM ein Verzeichnis in /opt als Ziel fürs ganze compilen anlegen, das Verzeichnis kommt dann später rüber auf den Router. Im Falle von tinc:

mkdir -p /opt/tinc
cat >/opt/tinc/config.site <<EOF
CPPFLAGS=-I/opt/tinc/include
LDFLAGS=-L/opt/tinc/lib
EOF
export CPLUS_INCLUDE_PATH=/opt/tinc/include:$CPLUS_INCLUDE_PATH
export C_INCLUDE_PATH=/opt/tinc/include:$C_INCLUDE_PATH
export LD_LIBRARY_PATH=/opt/tinc/lib:$LD_LIBRARY_PATH

Jetzt kann das übliche ./configure-make-makeinstall abgespult werden. Ich schreib es für tinc einmal runter:

Dependencies

apt-get install libncurses5-dev libreadline6-dev zlib1g-dev liblzo2-dev libssl-dev

tinc selbst:

tinc

curl -O https://www.tinc-vpn.org/packages/tinc-1.1pre15.tar.gz
tar xvzf tinc-1.1pre15.tar.gz
cd tinc-1.1pre15
./configure --prefix=/opt/tinc --with-curses=/opt/tinc
make; make install
mkdir -p /opt/tinc/var/run
mkdir -p /opt/tinc/etc/tinc

Danach einfach /opt/tinc packen, auf den Router schieben, entpacken, fertig.

Das resultierende tgz habe ich hier hochgeladen: tinc-mips-1.1pre15.tgz. Security-Software als Binary irgendwo runterladen ist natürlich keine gute Idee. ;)

Als letztes noch init: Die von tinc mitgelieferten service-files nutzen natürlich für Debian oldoldstable recht wenig - aber das init script von anno dazumal das Debian mit tinc 1.0 liefert funktioniert noch:

tinc.init (hart auf /opt/tinc verdrahtet)