WSW HowTo
Aus M740 WikiWeb
Dieser Artikel beschreibt Schritt für Schritt, wie ich (Benutzer:Lemmi) eine eigene Firmware-Version erstelle. Dieses ganze funktioniert nur auf einem Unix-Rechner, da ein Windows-Rechner z.B. keine spieziellen Dateien (links, pipes, block-special, character special) unterstützt.
Insbesondere verwende ich ein selbsterstelltes Toolkit, welches nur unter Linux/i386 läuft.
Inhaltsverzeichnis |
Vorwort
Ich habe diesen Artikel nur geschrieben, weil ich immer wieder gefragt werde, wie man eine eigene Firmware erstellen kann.
Und hier ist die Anleitung:
- Diese Anleitung sollte nur von erfahrenen Nutzern verwendet werden.
- Außerdem gebe ich keinen Support für das Toolkit.
Daher gilt:
Die hier beschriebene Vorgehensweise ist nur eine grobe Zusammenfassung. Das Verstehen der einzelnen Schritte ist unbedingt erforderlich.
Die Verwendung dieser Programme geschieht auf eigene Gefahr!!
Analyse
Vor der Modifikation steht die Analyse. Ich schaue mir immer alles sehr genau an um Überraschungen zu vermeiden.
WSW Datei
Zuerst analysiere ich die WSW Datei. Die wichtigste Fragen sind dabei:
- Ist der WSW Header identisch zu den Vorversionen?
- Welche Teile des Flash-RAMs werden von dem Update überschrieben?
- root file system auf //dev/mtd1
- //data file system auf //dev/mtd2
- //var/etc auf //dev/mtd3
- boot sector auf //dev/mtd4
- vmlinux (kernel) auf //dev/mtd4 + 0x10000
- rescue system auf //dev/mtd5
Dazu schaue ich mir sehr genau das Mapping an. Ab FW 1.18 wurden bisher immer genau das root file system, //data und vmlinux aktualisiert. Bei FW 1.12.1 wurde zusätzlich der boot sector und das rescue system aktualisiert.
//data
Aus dem //data file system intressieren mich nur zwei Dinge:
- Die Dateigröße der wavebox verwende ich, damit das Script check-version.sh die Firmware-Version erkennen kann.
- Die Sprachdateien aus dem Verzeichnis /data/text werden modifiziert, so dass sie antatt 'Firmware Version' den Text 'FW-Lemmi-12 Version' enthalten.
Beide Dinge haben genaugenommen nur informellen Charakter. Auf beides kann man verzichten. In diesem Falle muss aber das Toolkit, falls verwendet, und die Datei fw-lemmi/etc/rc angepaßt werden.
Hierfür verwende ich das Tool: Tux Box Flash Tools (exe)
root file system
Mit dem Kommando
dd if=siemens-wsw-file of=cramfs ibs=1 obs=1M count=6M skip=1416
extrahiere ich das cramfs des Systems. Alternativ kann auch ein Hex-Editor verwendet werden. Wichtig ist hierbei nur, dass der Teil vor dem Dateisystem entfernt wird. Diesen modifizierten Teil kopiere ich in ein Verzeichnis, welches von der M740AV erreichbat ist (LAN oder USB).
Auf der Box führe ich dann die folgenden Befehle aus:
mount -o loop -t cramfs datei-name /mnt2 tar cjf root.tar.bz2 -C /mnt2 . umount /mnt2
Damit erhalte ich in der Datei root.tar.bz2 ein komplette Kopie des root file systems, die ich auf meinem Linux-Rechner entpacken und bearbeiten kann:
mkdir fw-lemmi tar xjf root.tar.bz2 -C fw-lemmi
Vergleich mit der Vorversion
Dieses Dateisystem vergleiche ich auch mit der Vorversion. Vom Verzeichnis /dev vergleiche ich nur das Datei-Listing. Alle anderen Verzeichnisse werden rekursiv mit 'diff' verglichen. So erkenne ich sehr schnell, was sich alles verändert hat.
Bei allen Dingen, die unverändert geblieben ist, kann ich meine Modifikationen aus der Vorversion 1:1 übernehmen.
Analyse mit extract-Script
Zur automatischen Analyse habe ich ein Script mit dem Namen extract.sh (extract.tgz, 4 KB) geschrieben:
#!/bin/sh
for wsw in *.wsw; do
name=`echo $wsw | sed 's/.wsw$//'`
echo ""
echo "----- $name -----"
mkdir -p $name
echo ""
echo "--> test mapping"
dd if=$wsw of=$name/mapping.bin bs=1 skip=1156 count=204
if ! diff -q $name/mapping.bin mapping.bin; then
echo "!!! mapping wrong !!!"
continue
fi
echo "mapping ok"
echo ""
echo "--> generate mini"
dd if=$wsw of=$name/$name-mini.wsw ibs=1 obs=1M count=6292872
echo -n '`' | dd of=$name/$name-mini.wsw obs=1 count=1 seek=1159 conv=notrunc
echo ""
echo "--> extract jffs"
dd if=$wsw of=$name/data.jffs2 ibs=1 obs=1M count=5888K skip=6292872
echo ""
echo "--> extract and swap cramfs"
dd if=$wsw of=$name/big-endian.cramfs ibs=1 obs=1M count=6M skip=1416
./cramfsswap $name/big-endian.cramfs $name/little-endian.cramfs
echo ""
echo "--> mount and save root file system"
mkdir -p root
mount -t cramfs -o loop 1.50.6/little-endian.cramfs root
tar czf $name/root.tgz root
umount root
rmdir root
echo ""
echo "--> chown & chmod"
chown -R gast.gast $name
chmod -R 644 $name
chmod 755 $name
done
Für jede WSW Datei im aktuellen Verzeichnis werden die folgenden Schritte durchgeführt, wobei Ergebnisse für jede WSW Datei getrennt in eigene Unterverzeichnis geschrieben werden.
- Zuerst wird überprüft, ob das Mapping unverändert geblieben ist. Denn nur dann sind die folgenden Extraktions-Schritte möglich.
- Aus dem Original-WSW wird eine Vorlage für eine Mini-Version erstellt.
- Das jffs2-Dateisystem (//data) wird extrahiert.
- Das cramfs-Dateisystem (root file system) wird extrahiert und anschließend in das Little-Endian-Format umgewandelt.
- Das cramfs-Dateisystem wird gemountet und als tgz-Datei archiviert.
- Die Rechte aller neuen Dateien werden gesetzt.
Modifikation
Nun modifiziere ich den Zweig fw-lemmi. Jeder meiner Distributionen liegen u.a zwei Dateien bei:
- Die info.txt enthält ine Beschreibung aller meiner Modifikationen. Dieses verwende ich als 2do-Liste.
- Die Datei x.xx.x.lemmi-nn.tar.gz enthält alle von mir modifizierten Dateien. Dieses Datei verwende ich 1:1 oder als Vorlage.
Synthese
Die Synthese zu einer neuen Firmware erfolgt in den folgenden Schritten:
- Erstellung des cramfs
- Das Verzeichnis fw-lemmi wird mit dem Kommando mkcramfs -bb fw-lemmi cramfs-file gepackt.
- Das enstandene Archiv darf nicht größer als 6.291.456 (==0x600000) Bytes sein.
- Ist es kleiner als 6.291.456 Bytes, dann wird es mit Nullen aufgefüllt.
- Von der Original-WSW wird eine Kopie erstellt. An die Passende Dateiposition wird das soeben erzeugte cramfs eingefügt.
- RSA Prüfsumme:
- Ab der Dateiposition 1024 (0x400) wird eine neu MD5-Prüfsumme berechnet.
- Dieses wird mittels 'rsaencode' kodiert.
- Der kodierte Teil wird in die WSW-Datei ab Position 8 eingetragen.
Diese Schritte könnten wie folgt aussehen: (ungeprüft)
./mkcramfs -bb fw-lemmi private.cramfs cp -p 1.37.4.wsw private.wsw dd if=private.cramfs of=private.wsw obs=8 seek=177 conv=notrunc dd if=private.wsw ibs=1K skip=1 obs=1M | md5sum > md5sum ./rsaencode private.rsa < md5sum | dd of=private.wsw obs=8 seek=1 conv=notrunc
Synthese mit Toolkit
Ich persönlich mache die Synthese vollständig mit einem selbstgeschriebenen Toolkit. Dieses Tool-Kit ist auf der Download-Seite verfügbar, erzeugt gleichzeitig die Dokumentation und muss an die aktuelle FW-Version angepaßt werden:
- Versionsnummern
- Liste der gelöschten Dateien
- Liste der modifizierten Dateien mit Erklärungen
- Liste der neuen Kommandos
- Geschichte.
Vor dem Aufruf müssen ein paar Dateien kopiert weden:
- Die Original WSW-Datei muß in das Verzeichnis Arbeitsverzeinis kopiert werden.
- Die Sprachdateien müssen in das Verzeichnis install kopiert weden.
Nach erfolgreichem Ablauf des Scriptes (Die Ausgabe mitlesen und verstehen!) erhält man eine ZIP-Datei, die genau meiner Distribution entspricht.
Die hier beschriebene Vorgehensweise ist nur eine grobe Zusammenfassung. Das Verstehen der einzelnen Schritte ist unbedingt erforderlich.
Die Verwendung dieser Programme geschieht auf eigene Gefahr!!
Firmware Links
- Firmware Übersicht, Firmware Downloads, Beta-Firmware
- Firmware 1.12.1
- Firmware 1.18, Firmware 1.18.lemmi
- Firmware 1.29.5, Firmware 1.29.5.lemmi
- Firmware 1.33_cf, Firmware 1.33.lemmi (spanische FW)
- Firmware 1.37.4, Firmware 1.37.4.lemmi
- Firmware 1.44.4_cf, Firmware 1.44.4.lemmi (spanische FW)
- Firmware 1.49.5, Firmware 1.49.5.lemmi
- Firmware 1.50.6, Firmware 1.50.6.lemmi
- Firmware 2.1, Firmware 2.01.0.lemmi
- Allgemeine Infos:
- Hintergrundwissen:
- Aufbau der Updates: WSW Dateien, WSW Header, RSA Verschlüsselung
- Flash-RAM, cramfs Dateisystem
- Portal »Linux Projekt«

