System aktualisieren
Auch bei OpenWrt muss ich mir Gedanken machen, wie ich mein System aktuell halte. Habe ich die Firmware aus dem Entwicklerzweig (Snapshot) genommen, kommt das häufiger vor, bei einem stabilen Zweig seltener.
Grundsätzlich muss ich dabei zwei Seiten betrachten: das Firmware-Image
selbst und nachträglich mit opkg installierte Software.
Hier gehe ich kurz auf beide ein.
Firmware-Image aktualisieren
Zum Aktualisieren der Firmware gibt es das Skript sysupgrade, welches die
notwendigen Schritte ausführt.
Im Wiki gibt es eine Anleitung, die beschreibt,
wie man das System von der Kommandozeile oder von der Webschnittstelle LuCI
aktualisiert.
Das Skript sysupgrade sichert dabei die Konfigurationsdateien über die
Aktualisierung, die in der Textdatei /etc/sysupgrade.conf aufgeführt sind.
Ich muss mich allerdings selbst informieren, ob die alten
Konfigurationsdateien noch mit der neuen Version der Firmware funktionieren.
Will ich mich nicht auf sysupgrade verlassen, kann ich diese Dateien
auch selbst auf einem anderen Rechner sichern.
Dazu schreibe ich mit folgendem Befehl eine Archiv-Datei, die ich
anschließend mit scp auf einen anderen Rechner kopiere:
# tar czf /tmp/sysupgrade.tar.gz -T /etc/sysupgrade.conf
Bei LuCI bekomme ich eine Liste mit Vorschlägen, welche Dateien gesichert werden sollten. Auf der Kommandozeile muss ich mir diese Liste selbst zusammenstellen.
Ein Blick in den Lua-Source-Code von LuCI verrät, woher es diese Vorschläge bezieht:
- die Dateien, die bereits in /etc/sysupgrade.conf aufgeführt sind,
- Dateien, die in den Textdateien unter /lib/upgrade/keep.d/ verzeichnet sind,
- die Ausgabe von
opkg list-changed-conffiles.
Damit kann ich mir selbst eine aktuelle Liste zusammenstellen. Konkret verwendet LuCI bei der Version Chaos Calmer die folgenden Shell-Befehle, um die Vorschlagsliste zu erstellen:
1 (
2 find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \
3 /etc/sysupgrade.conf /lib/upgrade/keep.d/* \
4 2>/dev/null) -type f 2>/dev/null; \
5 opkg list-changed-conffiles
6 ) | sort -u
Um die Befehle zu verstehen, betrachtet man sie am Besten von außen nach innen.
Die Klammern in der ersten und letzten Zeile umfassen eine Subshell, deren
Ausgabe an sort geschickt wird, welches die Ausgabe sortiert und dabei
Duplikate entfernt.
In der Subshell haben wir einen find Befehl in den Zeilen 2-4 und den
Befehl opkg list-changed-conffiles in Zeile 5, die die zu sortierenden
Zeilen bereitstellen.
Der find Befehl gibt nur gefundene Dateien aus (-type f).
Wo find nach den Dateien sucht, bestimmt der Ausdruck $(sed ...) in den
Zeilen 2-4, der als Dateiliste an find übergeben wird.
Der dabei aufgerufene sed Befehl gibt den Inhalt der in Zeile 3
angegebenen Dateien aus, wobei er leere Zeilen und solche, die
mit '#' beginnen, auslässt.
Die sortierte Liste, die das Skript ausgibt, kann ich in eine Datei schreiben, nachbereiten und dann zum Sichern der Konfigurationsdateien verwenden.
Die eigentliche Aktualisierung läuft wie folgt ab:
- Ich prüfe, ob genügend Speicher (RAM) zur Verfügung steht und schaffe, wenn nötig, Platz.
- Ich kopiere das Upgrade-Image nach /tmp und prüfe die Integrität der Datei.
- Ich starte
sysupgrademit dem Namen der heruntergeladenen Datei als Argument.
Sollte sysupgrade mein Gerät noch nicht unterstützen, kann ich auf das
Programm mtd (Memory Technology Device) zurückgreifen, um das neue Image in
die Firmware zu schreiben.
Die Details dazu stehen im Wiki von OpenWrt.
Mit dem Programm mtd kann ich, bei extremem Speichermangel auch das Image
via Netzwerk mit netcat (nc) bereitstellen.
Diese Methode ist jedoch sehr riskant, weil hierbei mehr
Störstellen vorhanden sind (Netzkabel, Switch, Rechner, der das Image
sendet), so dass die Gefahr, ein defektes Image zu schreiben,
höher ist.
Speicher frei räumen
Etwas Speicher kann ich freigeben, indem ich die Listen von opkg lösche:
# rm -rf /tmp/opkg-lists
Da Linux automatisch verfügbaren Speicher als Cache verwendet, kann ich saubere Cache-Seiten freigeben um noch etwas Speicher zu bekommen:
# echo 3 > /proc/sys/vm/drop-caches
Bei einem normalen Linux-System, kann ich vorher sync aufrufen, so dass
weitere Cache-Seiten freigegeben werden können.
Ob das bei OpenWrt wirksam ist, hängt davon ab, ob ich Dateisysteme
read-write eingehängt habe (zum Beispiel USB-Sticks).
Details dazu finden sich in der Kernel-Dokumentation, konkret in der Datei
Documentation/sysctl/vm.txt.
Zusätzlich installierte Software aktualisieren
Mit opkg kann ich zusätzliche Software auf einem OpenWrt-System
installieren.
Diese Software ist nicht Bestandteil des Firmware-Images und belegt
extra Platz auf dem Gerät.
Um sie zu aktualisieren, muss ich als erstes die Paketlisten von opkg
aktualisieren:
# opkg update
Danach kann ich mir anzeigen lassen, welche Pakete aktualisiert werden können:
# opkg list-upgradable
Und genau diese schließlich aktualisieren:
# opkg upgrade $(opkg list-upgradable|cut -d\ -f1)
Alternativ kann ich die Pakete auch einzeln aktualisieren.