Hi,

weil ich gefragt worden bin, wie ich die Container gebaut habe, hier eine kurze 
"Anleitung":

* auf einem beliebigem System Docker installieren (oder ein System nutzen wo 
Docker bereits installiert ist)
  * z.B. auf Debian https://docs.docker.com/engine/install/debian/
* vom https://hub.docker.com/r/openwrtorg/rootfs/tags das OpenWRT rootfs ziehen:
  * z.B. für mipsbe: docker pull openwrtorg/rootfs:mips_24kc-21.02.0
  * z.B. für arm: docker pull 
openwrtorg/rootfs:arm_cortex-a15_neon-vfpv4-21.02.0
  * z.B. für arm64: docker pull openwrtorg/rootfs:armvirt-64-openwrt-21.02
* das Docker image
  * in einem eigenen Ordner: mkdir openwrtorg; cd openwrtorg
  * speichern: docker save openwrtorg/rootfs > openwrtorg.tar
  * entpacken: tar xf openwrtorg.tar
* dann gibt es darin einen Unterordner mit langem kryptischen Namen worin ein 
layer.tar liegt, welches das ganze OpenWRT rootfs beinhaltet, dieses entpacken:
  * tar xf layer.tar
* das rootfs nach Belieben modifizieren
* ein Docker image aus dem rootfs bauen: (den Punkt am Ende für das aktuelle 
Verzeichnis nicht vergessen)
  * docker build -t olsrdmipsbe .
* das eben gebaute image speichern:
  * docker save olsrdmipsbe > dockerolsrdmipsbe.tar
* die tar Datei auf das Mikrotik Gerät laden und wie bereits beschrieben starten

LG Christoph

Am 18.10.2021 um 19:43 schrieb Christoph Loesch:
Hi,

bei Reboot geht leider der container-store verloren, daher muss nach Reboot der 
Container neu eingespielt werden. Damit das nicht manuell gemacht werden muss, 
habe ich ein Script gebaut, womit sicher gestellt wird, dass der Container nach 
Reboot wieder wie gewohnt läuft:

für den OLSRd Container:

/system script add dont-require-permissions=yes name=run_olsrd owner=admin 
policy=read,write source="# script to automatically run OLSRd container\r\
    \n:global OLSRdContainerInterface;\r\
    \n#\r\
    \n# SET THE INTERFACE\r\
    \n:set \$OLSRdContainerInterface \"veth1\";\r\
    \n#\r\
    \n:global myarch\r\
    \n:global OLSRdContainerName;\r\
    \n:global OLSRdContainerFile;\r\
    \n:set \$myarch [/system/resource/get architecture-name]\r\
    \n:set \$OLSRdContainerName \"olsrd\";\r\
    \n:set \$OLSRdContainerFile [/file/find name~\"*olsrd\$myarch.tar\"];\r\
    \n:if ([:len [/container/find hostname=\"\$OLSRdContainerName\"]] > 0) 
do={\r\
    \n  :log debug \"OLSRd container is configured.\"\r\
    \n  :if ([/container/get number=[/container/find hostname=\"\$OLSRdContainerName\"] 
status]=\"stopped\") do={\r\
    \n    :if ([:len [/file find name=[/container/get number=[/container/find 
hostname=\"\$OLSRdContainerName\"] name]]] > 0) do={\r\
    \n    :log debug \"OLSRd container store exists, starting container.\"\r\
    \n      /container/start number=[/container/find 
hostname=\"\$OLSRdContainerName\"]\r\
    \n    } else={\r\
    \n      :log error \"OLSRd container store does NOT exist, re-adding 
container.\"\r\
    \n      /container/remove numbers=[/container/find 
hostname=\"\$OLSRdContainerName\"]\r\
    \n      /container/add file=\$OLSRdContainerFile 
interface=\$OLSRdContainerInterface logging=yes hostname=\$OLSRdContainerName 
envlist=\$OLSRdContainerName\r\
    \n    }\r\
    \n  }\r\
    \n} else={\r\
    \n  :log debug \"OLSRd container is NOT configured.\"\r\
    \n  :if ([:len [/container/envs/find list=\$OLSRdContainerName name=OLSRD_IP]] 
> 0) do={\r\
    \n    :log debug \"Environment variable OLSRD_IP is set.\"\r\
    \n  } else={\r\
    \n  :log error \"Container environment variable OLSRD_IP missing!\"\r\
    \n  :log error \"Please add:\"\r\
    \n  :log error \"/container/envs/add list=\$OLSRdContainerName name=OLSRD_IP 
value=\\\"193.238.158.13/32\\\"\"\r\
    \n  :log info \"Optionally add:\"\r\
    \n  :log info \"/container/envs/add list=\$OLSRdContainerName name=OLSRD_LQMULT 
value=\\\"192.168.1.234:0.1 192.168.1.223:0.2\\\"\"\r\
    \n  :log info \"/container/envs/add list=\$OLSRdContainerName name=OLSRD_HNA4 
value=\\\"193.238.156.23-255.255.255.255\\\"\"\r\
    \n  :quit\r\
    \n  }\r\
    \n  :log debug \"Adding OLSRd container.\"\r\
    \n  /container/add file=\$OLSRdContainerFile 
interface=\$OLSRdContainerInterface logging=yes hostname=\$OLSRdContainerName 
envlist=\$OLSRdContainerName\r\
    \n}"


für den OLSRd V2 Container:

/system script add dont-require-permissions=yes name=run_olsrd2 owner=admin 
policy=read,write source="# script to automatically run OLSRd V2 container\r\
    \n:global OLSRd2ContainerInterface;\r\
    \n#\r\
    \n# SET THE INTERFACE\r\
    \n:set \$OLSRd2ContainerInterface \"veth1\";\r\
    \n#\r\
    \n:global myarch\r\
    \n:global OLSRd2ContainerName;\r\
    \n:global OLSRd2ContainerFile;\r\
    \n:set \$myarch [/system/resource/get architecture-name]\r\
    \n:set \$OLSRd2ContainerName \"olsrd2\";\r\
    \n:set \$OLSRd2ContainerFile [/file/find name~\"*olsrd2\$myarch.tar\"];\r\
    \n:if ([:len [/container/find hostname=\"\$OLSRd2ContainerName\"]] > 0) 
do={\r\
    \n  :log debug \"OLSRd V2 container is configured.\"\r\
    \n  :if ([/container/get number=[/container/find hostname=\"\$OLSRd2ContainerName\"] 
status]=\"stopped\") do={\r\
    \n    :if ([:len [/file find name=[/container/get number=[/container/find 
hostname=\"\$OLSRd2ContainerName\"] name]]] > 0) do={\r\
    \n    :log debug \"OLSRd V2 container store exists, starting container.\"\r\
    \n      /container/start number=[/container/find 
hostname=\"\$OLSRd2ContainerName\"]\r\
    \n    } else={\r\
    \n      :log debug \"OLSRd V2 container store does NOT exist, re-adding 
container.\"\r\
    \n      /container/remove numbers=[/container/find 
hostname=\"\$OLSRd2ContainerName\"]\r\
    \n      /container/add file=\$OLSRd2ContainerFile 
interface=\$OLSRd2ContainerInterface logging=yes hostname=\$OLSRd2ContainerName 
envlist=\$OLSRd2ContainerName\r\
    \n    }\r\
    \n  }\r\
    \n} else={\r\
    \n  :log debug \"OLSRd V2 container is NOT configured.\"\r\
    \n  :if ([:len [/container/envs/find list=\$OLSRd2ContainerName 
name=OLSRD2_IP]] > 0) do={\r\
    \n    :log debug \"Environment variable OLSRD2_IP is set.\"\r\
    \n  } else={\r\
    \n  :log error \"Container environment variable OLSRD2_IP missing!\"\r\
    \n  :log error \"Please add:\"\r\
    \n  :log error \"/container/envs/add list=\$OLSRd2ContainerName name=OLSRD2_IP 
value=\\\"2a02:61:d64::1/128\\\"\"\r\
    \n  :quit\r\
    \n  }\r\
    \n  :log debug \"Adding OLSRd V2 container.\"\r\
    \n  /container/add file=\$OLSRd2ContainerFile 
interface=\$OLSRd2ContainerInterface logging=yes hostname=\$OLSRd2ContainerName 
envlist=\$OLSRd2ContainerName\r\
    \n}"

Um laufend (und auch nach Reboot) zu prüfen, dass alles passt, werden die 
beiden Scripte per scheduler jede Minute ausgeführt:

/system/scheduler/add interval=1m name=schedule1 on-event="/system/script/run 
run_olsrd; /system/script/run run_olsrd2" policy=read,write

LG Christoph

Am 14.10.2021 um 21:31 schrieb Christoph Loesch:
Hi,

hier nun auch die Container für ARM64 Architektur:
dockerolsrdarm64.tar - 
https://forum.funkfeuer.at/uploads/short-url/sAb1H6F0roEnbQw70CqPrp7dZ3b.tar
dockerolsrd2arm64.tar - 
https://forum.funkfeuer.at/uploads/short-url/jyngUA2EY3TV1siQFtoakqiazAG.tar

Danke an Julian für die Leihgabe der wireless_wire_nray damit ich die Container 
bauen konnte!
Falls jemand ein Gerät der folgenden Architekturen hat, kann ich gerne auch 
dafür Container bauen.

SMIPS:
hAP mini, hAP lite

TILE:
CCR1xxx

PPC:
RB3xx, RB600, RB8xx, RB1100AHx2, RB1100AH, RB1100, RB1200

MMIPS:
hEX (RB750Gr3), hEX S, RBMxx

LG Christoph

Am 14.10.2021 um 00:27 schrieb Christoph Loesch:
Hi,

da ich schon dabei bin, habe ich auch gleich Container für OLSRd V2 (auf Basis des 
OpenWRT Pakets "oonf-olsrd2 - v0.15.1 - Build Olsrd V2 Routing Agent") gebaut.

Hier die Container-Images: (die env Variable für die IP ist hierbei OLSRD2_IP )
dockerolsrd2mipsbe.tar - 
https://forum.funkfeuer.at/uploads/short-url/iIE1w5zDqrmd3k6m87VuBUqZsCW.tar
dockerolsrd2arm.tar - 
https://forum.funkfeuer.at/uploads/short-url/rB2fQxcqKPZ9CSB0nmNLfacXOI3.tar

LG Christoph

Am 13.10.2021 um 01:27 schrieb Christoph Loesch:
Hi,

nachdem ich einen OLSRd Container für den RB960PGS auf MIPSBE gebaut habe, 
konnte ich es nicht lassen und habe auch einen Container für die lhg_60g auf 
ARM gebaut.
Möglich wäre natürlich auch ein Container auf ARM64 (z.B. wireless_wire_nray) 
aber dazu fehlt mir momentan ein Gerät zum Testen.
Mit den MIPSBE und ARM Architekturen sollten bereits die meisten Mikrotik 
Geräte abgedeckt sein, laut Mikrotik Download Seite [1].

MIPSBE:
CRS1xx, CRS2xx, CRS312-4C+8XG, CRS326-24S+2Q+, CRS354, Cube Lite60, DISC, 
FiberBox, hAP, hAP ac, hAP ac lite, LDF, LHG, LHG Lite60, ltAP mini, mANTBox, 
mANTBox 2, mAP, mAP lite, NetBox, NetMetal, PowerBox, PWR-Line, QRT, RB9xx, 
SXTsq, cAP, hEX Lite, RB4xx, wAP, BaseBox, DynaDish, RB2011, SXT, OmniTik, 
Groove, Metal, Sextant, RB7xx, hEX PoE

ARM64:
nRAY, CCR2004, LHGGR

ARM:
arm64, cAP ac, CRS305-1G-4S+, CRS309-1G-8S+, CRS317-1G-16S+, CRS318, 
CRS326-24G-2S+, CRS328-24P-4S+, CRS328-4C-20S-4S+, Cube 60G ac, DISC AC, hAP 
ac², hAP ac³, LDF ac, LHG ac, mANTBox 52, NetMetal ac², RB4011, SXTsq (ac 
series), wAP 60G series, Chateau, RB3011, RB1100AHx4, Audience, RB450Gx4, wAP ac

Für Interessierte hier die beiden Container-Images zum ausprobieren: (Achtung: 
die tar-Dateinamen dürfen keine Sonderzeichen haben, wenn sie auf das Mikrotik 
Gerät geladen werden)
dockerolsrdmipsbe.tar - 
https://forum.funkfeuer.at/uploads/short-url/xxWb0xbC9mmM82lZqXRDgN2cd1X.tar
dockerolsrdarm.tar - 
https://forum.funkfeuer.at/uploads/short-url/nHomyKl5hyUeicB5a3UenkNeqqx.tar

LG Christoph

[1] https://mikrotik.com/download

Am 11.10.2021 um 00:28 schrieb Christoph Loesch:
Hi,

mittlerweile habe ich es (mit Unterstützung[1] aus dem Mikrotik Forum) 
geschafft einen Docker Container mit OLSRd für den RB960PGS (mipsbe) zu bauen.

Vorerst muss, wie in der Dokumentation beschrieben[2], auf dem Mikrotik Gerät mindestens 
RouterOS Version 7.1rc3 laufen und das "container" package installiert sein.
Dann braucht es eine bridge und ein virtuelles ethernet interface:
/interface/bridge/add name=docker
/ip/address/add address=172.17.0.1/16 interface=docker
/interface/bridge/port add bridge=docker interface=veth1

Grundsätzlich habe ich dafür ein OpenWRT rootfs für mipsbe [3] genommen, OLSRd 
darauf installiert/konfiguriert und die olsrd-binary samt config davon für 
einen eigenen Container kopiert.
(In der /etc/olsrd/olsrd.conf muss auf jeden fall das Interface eth0 definiert 
werden.)

Das Dockerfile sieht wie folgt aus:
FROM scratch
ADD ./ /
EXPOSE 698
USER root
CMD ["/bin/sh","/init.sh"]

Das init.sh Script zum Starten sieht so aus:
#!/bin/sh
# Docker automatically assignes an IP address on eth0 but OLSRd requires the
# user-wanted IP address to be used as first primary main IP address.
# So remove the Docker assigned IP and set the user-wanted IP/mask.
# But because Docker will not start the container without its IP, we have to
# add it back again later on after setting the user-wanted IP/mask.
DOCKER_ASSIGNED_IP=$(/bin/busybox ip -4 addr show eth0 | /bin/busybox awk 
'/inet/{print $2}')
/bin/busybox ip addr del $DOCKER_ASSIGNED_IP dev eth0
/bin/busybox ip addr add $OLSRD_IP dev eth0
/bin/busybox ip addr add $DOCKER_ASSIGNED_IP dev eth0
/usr/sbin/olsrd

Bauen kann man so den Container aus dem OpenWRT rootfs, auf jedem beliebigen 
System wo Docker installiert ist (der Architektur-Tag wird von RouterOS 
offensichtlich ignoriert):
docker build -t olsrd . && docker save olsrd > olsrd.tar

Das tar-file kann man dann auf den Mikrotik Router kopieren und mit folgenden 
Befehlen starten:
/container/envs/add list=olsrd name=OLSRD_IP value=193.238.158.13/32
/container/add file=olsrd.tar interface=veth1 logging=yes envlist=olsrd
/container/start number=0

/container/print
 0 file=olsrd.tar name="6147d0b5-5c9e-43b1-be42-76b735ec2939" tag="olsrd:latest" os="linux" arch="amd64" 
interface=veth1 envlist="olsrd" mounts="" dns="" logging=yes status=running

Auf Basis dieser Informationen lassen sich somit OLSRd-Container für jedes 
beliebige Mikrotik Gerät bauen...

LG Christoph

[1] https://forum.mikrotik.com/viewtopic.php?p=884326#p883341
[2] https://help.mikrotik.com/docs/display/ROS/Container
[3] https://hub.docker.com/r/openwrtorg/rootfs/tags?name=mips_24kc-21.02.0

Am 01.10.2021 um 01:28 schrieb Christoph Loesch:
Hi,

Mikrotik hat kürzlich Docker support in ihre aktuellste RouterOS 
(development-)version hinzugefügt! [1]
Da liegt es doch Nahe, einen container mit OLSR dafür zu bauen.. ;)

Soweit mir bekannt ist, sind die RB960PGS(-PB) [2] die einzigen beiden Mikrotik 
*Router*, die Gigabit fähig sind und PoE Out auf mehreren Ports bieten. [3]
Nachdem der RB960PGS (bzw. RB960PGS-PB) dem Ubiquiti EdgeRouter-X-SFP (bzw. 
EdgePoint-R6) ähnlich ist, versuche ich daher einen docker container mit OLSR 
dafür zu bauen.
Dieser Router arbeitet auf MIPS (big endian) Architektur und braucht somit 
einen passenden container für mipsbe.

OLSRd für mipsbe crosscompilen ist offensichtlich (relativ einfach) machbar und 
rennt bereits auf so manchen MIPSBE-EdgeRoutern in unserem Netz.
Aber einen MIPSBE Host mit Docker zu realisieren scheint derzeit nicht so 
einfach zu sein, bzw. sind Informationen dazu spärlich um container für MIPSBE 
zu bauen.
Ich konnte zwar auf einem ER-X-SFP (MIPS little endian) mit OpenWRT 21.02 
Docker installieren und habe darauf einen container mit OLSRd gebaut aber das 
rennt eben nur auf MIPSEL/MIPSLE.
Habe daher versucht den gleichen container, nur eben mit MIPSBE binaries/libs, 
zu bauen aber dieser container startet leider nicht im RouterOS.
Leider gibt es weder Fehlermeldung noch irgendeine Log-Ausgabe, ich habe meine 
Erfahrungen auch im Mikrotik Forum [4] beschrieben.

Vielleicht interessiert das Thema hier noch jemanden bzw. hat jemand Erfahrung 
mit dem Bau von docker containern für MIPS(be) und hat Ideen wie man das 
debuggen oder sogar zum Laufen bringen könnte.
Würde mich sehr freuen wenn wir es schaffen OLSR in einem docker container auf 
RouterOS zum Laufen zu bringen!

LG Christoph

[1] https://forum.mikrotik.com/viewtopic.php?t=178341 bzw. 
https://forum.mikrotik.com/viewtopic.php?f=1&t=178342
[2] https://mikrotik.com/product/RB960PGS bzw. 
https://mikrotik.com/product/RB960PGS-PB
[3] 
https://mikrotik.com/products?filter&s=c&r={%22poe_out_ports%22:{%22s%22:%224%22,%22e%22:%2248%22}}#!
[4] https://forum.mikrotik.com/viewtopic.php?f=1&t=178342&p=882645#p882645









--
Wien mailing list
Wien@lists.funkfeuer.at
https://lists.funkfeuer.at/mailman/listinfo/wien

Antwort per Email an