Container
AllgemeinesAuf dem Router können Linux-Container (LXC) installiert und ausgeführt werden. Ein Container ist eine Virtualisierung eines eigenes Systems, er "fühlt" sich an, wie ein eigener Rechner mit eigener
Die Container nutzen den Linux-Kernel und Treiber der Firmware. Der direkte Zugriff auf die Hardware ist nicht gestattet, so dass die Funktionalität des Routers nicht kompromittiert werden kann. Es können theoretisch unbegrenzt viele Container auf dem Router gespeichert und gestartet werden. Begrenzt wird die Anzahl durch endlichen RAM- und Flash-Speicher (siehe Ressourcen). Der Inhalt von Containern wird behandelt wie Firmware-Images. Das root-Dateisystem von Containern wird im Flash-Speicher gespeichert und im Web-Interface aufgelistet. Jeder Container benötigt
Funktionalität von ContainernJeder Container kann über das Web-Interface auf den Router geladen werden. Wird ein Container auf den Router geladen, der den gleichen Bezeichner hat wie ein schon vorhandener Container, überschreibt der neue den alten Container. Soll ein und derselbe Container in mehreren Instanzen auf dem Router vorhanden sein, beispielsweise eine zweite Instanz der icom Data Suite, muss der Bezeichner des ersten Containers geändert werden, bevor der nächste Container geladen wird. Jeder Container kann vom Router gelöscht werden. In dem Fall werden auch alle Daten gelöscht, die im Container erzeugt wurden, wie z.B. Log-Dateien. Der Container wird aus dem Profil des Routers entfernt. Jeder Container kann in der Konfiguration aktiviert oder deaktiviert werden. Beim Systemstart werden alle aktiven Container selbständig hochgefahren. Über Ereignisse und Aktionen können aktive Container gestartet oder gestoppt werden. Jeder Container kann in Form eines Update-Pakets wieder vom Router heruntergeladen werden. Optional kann ein Container vom Download ausgeschlossen werden, indem die Datei "/usr/share/downloadable" gelöscht wird. Somit ist ein einfacher Kopierschutz realisierbar. Jeder Container verfügt über ein eigenes Netzwerk-Interface, dass über das Web-Interface konfiguriert werden muss. Es wird über eine Bridge mit einem der IP-Netze des Routers verbunden. Verbindungen können mit den Netzfilterregeln genauso berücksichtigt werden wie ein eigenständiges Gerät im Netzwerk. Im Container müssen Routen angelegt werden, wenn mit Maschinen in anderen Netzen kommuniziert werden soll. Jeder Container kann Meldungen via MCIP erhalten und versenden. Dadurch wird eine Schnittstelle zur Firmware-Funktionalität geschaffen (Ereignisse und Aktionen). Jeder Container bekommt ein Verzeichnis ("/data") gemountet, in dem eigene Daten gespeichert werden können, die ein Update des Containers überdauern (Konfiguration, Logs). Dieses Verzeichnis wird nur dann gelöscht, wenn der ganze Container gelöscht wird.
Jeder Container verfügt über die Konfigurationsoption, das spezielle Unterverzeichnis "/data/etc" als Konfiguration für Container-Applikationen zu betrachten. Dann wird beim Herunterladen eines Profil diese Konfiguration als Anhang mit in das Update-Paket aufgenommen, so dass das Router-Profil und die Einstellungen der Applikationen in einem Container gesammelt gespeichert werden können. Im Manifest wird der Bezeichner des Containers mit angegeben, so dass das Profil diesem Container beim Upload wieder zugeordnet werden kann, ohne abhängig vom internen Containernamen (z.B. container1) zu sein. Die Konfigurationsdatei des Containers kann ein beliebiges Format haben, kann also z.B. aus einer Datenbank bestehen oder auch nur ein einfaches ASCII-File darstellen. Jeder Container erhält die freigegebenen Hardware-Ressourcen als Device-Nodes angelegt, unabhängig davon, welche Dienste diese Device-Nodes schon benutzen. Ressourcen sind z.B. serielle Schnittstellen. Jeder Container kann seine Konsolenausgaben in ein Log schreiben. Damit kann eventuell der Grund für einen nicht startenden Container herausgefunden werden. Jedem Container kann optional eine auf dem Router gespeicherte Lizenz zugeordnet werden, die von der Applikation im Container verwendet werden kann, um Funktionalität freizuschalten. Zur Verfügung stehende Ressourcen und ApplikationenDie Firmware des Routers reserviert für sich 64 MByte RAM. Der Rest wird gleichteilig auf die zu startenden Container-Instanzen aufgeteilt. Die Hälfte der CPU-Rechenzeit wird der Router-Firmware garantiert. Die restliche Rechenzeit erhalten anteilig die Container-Instanzen. Die Anteile an Rechenzeit sind jedoch nur dann begrenzt, wenn sie von den einzelnen Berechtigten auch angefordert werden. Führen die Firmware und alle gestarteten Container-Instanzen keine Berechnungen aus, steht die komplette Rechenzeit zur Verfügung. Der Flash-Speicher ist nicht limitiert. Die Firmware und alle Container-Instanzen müssen sich den verfügbaren Speicherplatz teilen. Es gibt kein Quota, da eine Aufteilung wie bei den flüchtigen Ressourcen RAM oder CPU-Rechenzeit nicht nachträglich verändert werden kann, sollte ein weiterer Container hinzugefügt werden. Erzeugte ContainerContainer, die von der Firmware erstellt wurden, stellen eine minimale Umgebung zur Verfügung, die als Ausgangsbasis für eigene Anwendungen genutzt werden kann. In den Containern existiert ein Benutzer "root", dessen Passwort "root" lautet. Aus Sicherheitsgründen soll das Passwort nach dem Erstellen des Containers sofort geändert werden. Es können beliebige neue Benutzer und Gruppen erstellt werden. Ein von der Firmware erstellter Container enthält:
Ein Container enthält folgende Verzeichnisse und Dateien:
Diese Tools haben eine eingebaute Hilfe, die mit dem Parameter "-h" abgerufen wird. Die Tools helfen beim Empfang von SMS (sms-tool), Ereignissen bei den Eingängen ("get-input" für Pegel-Änderungen und "get-pulses" für Pulse an den Eingängen). Mit "mcip-tool" können Nachrichten über MCIP gesendet und empfangen werden und so zwischen Prozessen innerhalb eines oder unterschiedlicher Container Nachrichten austauschen. Mit "set-output" können Ausgänge geschaltet werden, wenn der Zugriff auf die CLI des Routers im Container ohne Authentifizierung erlaubt ist. Mit "cli-cmd" kann die Konfiguration des Routers ausgelesen und verändert werden. Status-Informationen des Routers können abgefragt werden. Mit "container" können Container gestartet, gestoppt oder neu gestartet werden, wenn der Zugriff auf die CLI des Routers im Container ohne Authentifizierung erlaubt ist.
Container-StorageDer Container-Storage ermöglicht das Hochladen von Dateien in Form eines Update-Pakets auf den Router.
Einzelne Pfade des Container-Storage können dann jedem Container in einem konfigurierbaren Pfad mit Lese- oder Lese- und Schreibrechten zur Verfügung gestellt werden.
In nicht-herunterladbaren Containern müssen die Pfade im Container in der oben erklärten Datei /usr/share/mount_allow (Positivliste) explizit erlaubt werden.
Die beiden Update-Paket-Dateitypen unterscheiden sich in ihrem Verhalten bei Verzeichnissen, die sowohl im Container-Storage als auch im Update-Paket enthalten sind.
Bei "Full Storage" werden die Ordner und ihr Inhalt zuerst gelöscht.
Bei "Incremental Storage" werden die Inhalte der Verzeichnisse zusammengeführt, vorhandene Dateien, die nicht im Update-Paket sind, bleiben somit erhalten.
Die im Update-Paket gespeicherten Dateiberechtigungen werden übernommen. Dateien mit einem Container austauschenUm abgesehen vom Container-Storage Dateien vom Container oder in den Container zu kopieren, bietet sich "scp" an, da in erstellten Containern bereits ein SSH-Server installiert ist. Es wird ein SSH-Client wie z.B. "openssh" oder "putty" benötigt. Ein möglicher Aufruf lautet: "scp root@192.168.1.1:/root/readme.txt ./". Im Container ist auch wget installiert, so dass Dateien von Web-Servern in den Container geholt werden können. Dazu loggt man sich via ssh im Container ein und ruft dann wget auf: "wget http://webserver_domain_oder_IP/applikation". Ist die heruntergeladene Datei ein Binary und soll ausgeführt werden, muss noch die Berechtigung "execute" gesetzt werden: "chmod 755 application". Es stehen im Container u.a. die busybox-Applets zur Verfügung:
Eigene Container erstellenAls Ausgangsbasis kann ein von der Firmware erstellter Container dienen. Nach dem Herunterladen als Update-Paket muss dieses Paket mit "tar -xf <Dateiname"> in ein neues Verzeichnis entpackt werden. Das Manifest und der eigentliche Container liegen nun vor. Der Container ist ebenfalls ein tar-Archiv. Um einen Container lokal entpacken und modifizieren zu können, ist es zwingend erforderlich, das tar-Archiv
Nach dem Modifizieren der Dateien muss das root-Dateisystem wieder als tar-Archiv gepackt werden (tar cvf ../<Dateiname.tar>). Die neue MD5-Summe des neuen tar-Archivs muss in das Manifest eingetragen werden. Wenn sich der Dateiname verändert hat, muss auch dieser im Manifest angepasst werden. Das Manifest und die neue tar-Datei ergeben in einem neuen, gemeinsamen tar-Archiv das neue Update-Paket. |