WSW HowTo

Aus M740 WikiWeb

Wechseln zu: Navigation, Suche

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:

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