Das mit der Existenz von "/var/flash/data" bei Dir ist mir neu und das ist ja tatsächlich der Punkt, an dem dieses "check_and_store_yaffs_to_tffs_node" in S01-head ansetzt.
So wie ich das beim Lesen interpretiere, werden da in die S01-head zwei Funktionen eingefügt:
Code:
########### prepare config on nand before accessing /var/flash anyway ############
#! /bin/sh
check_and_store_tffs_node_to_yaffs() {
[...]
}
check_and_store_yaffs_to_tffs_node() {
[...]
}
#########################################
## ADDITIONAL Config-space hosted on NAND
Das "Einfügen" aus einer anderen Quelle ist Spekulation, leite ich aus dem überflüssigen SheBang mitten in der Datei her und aus der Tatsache, daß die erste Funktion (tffs_node_to_yaffs) bei mir nicht aufgerufen wird in der S01-head ... auch wenn die restlichen Meldungen innerhalb der Datei das suggerieren wollen:
Code:
########### tffs node to yaffs ########
## echo "[COLOR="#FF0000"][tffs_node_to_yaffs] start.[/COLOR]"
## ls -al /var/flash
for conv_node in ${tffs_nodes_list} ; do
conv_node_id=${conv_node%%,*} # bis zum ersten komma
conv_node_name=${conv_node##*,} # ab dem letzten komma
[COLOR="#006400"]check_and_store_yaffs_to_tffs_node[/COLOR] ${conv_node_id} ${conv_node_name}
done
## ls -al /var/flash
## echo "[COLOR="#FF0000"][tffs_node_to_yaffs] done.[/COLOR]"
###########
, so wird doch nur der entgegengesetzte Weg (yaffs_to_tffs) aufgerufen, jedenfalls in der S01-head und nur dort stehen ja diiese internen Funktionen zur Verfügung.
Diese aufgerufene Funktion sieht dann so aus:
Code:
check_and_store_yaffs_to_tffs_node() {
local prefix=/var/flash
local minor=$1
local name=$2
local major=`grep tffs /proc/devices`
local tffs_major=${major%%tffs}
local converted=""
if [ -z "${tffs_major}" ] ; then echo "[yaffs_to_tffs_node] ERROR: can't get TFFS Major-ID"; fi
if [ -z "$1" ] || [ -z "$2" ] ; then echo "Usage: check_and_store_yaffs_to_tffs_node 141 calllog" ; fi
if [ "$minor" -lt "$((0x64))" ] || [ "$minor" -gt "$((0xFF))" ] ; then echo "[yaffs_to_tffs_node] ignoring TFFS Node (minor: $minor)" ; fi
################
## old location basedir
if [ -d "${prefix}/data" ]; then
echo "[yaffs_to_tffs_node] INFO: found basedir ${prefix}/data"
fi
## new conversion of file to node needed?
if [ ! -c "${prefix}/$name" ]; then
if [ -f "${prefix}/data/${name}" ] ; then
if ! checkempty ${prefix}/data/${name} ; then
## create node for new location (at first, remove hardlink at this place)
rm ${prefix}/${name}
mknod ${prefix}/${name} c ${tffs_major} ${minor} || echo "[yaffs_to_tffs_node] ERROR: can't create TFFS Device file ${name} (minor: $minor)"
## save data to new location
cat ${prefix}/data/${name} >${prefix}/${name}
## remove regular file in 'old location basedir'
rm ${prefix}/data/${name}
echo "[yaffs_to_tffs_node] Regular file '${name}' converted to TFFS Device file ${name} (minor: $minor) and cleared"
converted=yes
else
## create node for new location (at first, remove hardlink at this place)
rm ${prefix}/${name}
mknod ${prefix}/${name} c ${tffs_major} ${minor} || echo "[yaffs_to_tffs_node] ERROR: can't create TFFS Device file ${name} (minor: $minor)"
## create empty file in new location
cat /dev/null >${prefix}/${name}
## remove regular file in 'old location basedir'
rm ${prefix}/data/${name}
echo "[yaffs_to_tffs_node] Regular file '${name}' is empty, TFFS Device file ${name} (minor: $minor) cleared"
converted=yes
fi
else
echo "[yaffs_to_tffs_node] Regular file '${name}' already converted? (missing regular file and TFFS Device file ${name} (minor: $minor)) "
fi
fi
## file must be replaced by node file
if [ -c "${prefix}/${name}" ] && [ ! -f "${prefix}/data/${name}" ] && [ "${converted}" == "yes" ]; then
echo "[yaffs_to_tffs_node] Regular file '${name}' replaced by TFFS Device file ${name} (minor: $minor)"
fi
}
Das Spannende daran ist es aber, daß vor dieser Funktion noch ein paar weitere Schritte kommen, die eigentlich dazu führen müßten, daß es kein /var/flash/data-Verzeichnis gibt - jedenfalls sehe ich (bei der 7490, den Vergleich mit der Firmware der 7362SL mache bitte selbst) nicht, wo das Verzeichnis herkommen sollte, wenn der Ablauf der folgende ist:
1. der Inhalt der kompletten "config"-Partition wird gelöscht, wenn da "recovered=[0-9]" in "firmware_info" im Environment gefunden wurde
2. die Partition wird gemountet und dabei werden die yaffs2-Strukturen erstellt (hier müßte jetzt "data" erzeugt werden, wenn das irgendwie Sinn ergeben sollte) - nachdem die bei Dir ja gemountet ist, kann es auch nicht so richtig sein, daß dieses Mounten das Problem ist und sich unter /var/flash immer noch "tmpfs" finden läßt
3. es wird in "tffs_update_major_in_nodes" geprüft, ob sich die Major-ID des TFFS-Drivers (bei Dir wohl die 243, dem Listing nach zu urteilen) geändert hat ... wenn ja, werden die vorhandenen char-Devices (aus einem früheren Lauf der Box, denn nach Recovery oder Reset ist die Partition ja noch leer) gelöscht und mit der neuen Major-ID wieder angelegt - hier gibt es Potential für ein Problem, wenn "tffs_major" nicht gesetzt sein sollte, weil zwar eine entsprechende Meldung erfolgt, die restlichen Kommandos aber trotzdem ausgeführt werden anstatt die Funktion zu verlassen ... aber das kann es bei "leerer Partition" ja auch nicht sein, da gibt es kein char-Device, was konvertiert werden müßte
4. die Liste der möglichen Konfigurationsdateien (tffs_nodes_list) wird aufgebaut
5. für jeden Eintrag der Liste wird geprüft, ob eine reguläre Datei gleichen Namens in der (leeren!) config-Partition vorhanden ist (unter dem Pfad in $tffs_node_prefix, was fest auf /var/flash eingestellt ist) - wenn nicht, wird das entsprechende char-Device mit "mknod" erstellt
6. und jetzt kommt auch (schon?) der Aufruf des oben gezeigten "check_and_store_yaffs_to_tffs_node"
Woher da jetzt das Verzeichnis "data" kommen soll, damit die Bedingung
Code:
if [ -f "${prefix}/data/${name}" ] ; then
erfüllt wird oder wohin da das char-Device verschwindet, damit
Code:
if [ ! -c "${prefix}/$name" ]; then
"wahr" wird (beides in dieser Funktion oben zu sehen), ist mir (ohne die passende Hardware) ein Rätsel.
Bleibt halt die Frage, wie es anderen Besitzern einer 7362SL so ergeht ... vielleicht ist das tatsächlich "normal" und AVM macht da eine gesonderte Behandlung für die 7362SL. Warum das bisher nie aufgefallen sein sollte, weiß ich dann auch nicht.
Damit kann man diesen Mechanismus aber wahrscheinlich trotzdem benutzen (zumindest in der Theorie sollte das gehen, probiert habe ich es auch noch nicht), um nach einem Neustart der Box die Daten im TFFS zu überschreiben. Dazu (wie gesagt, Theorie und nicht getestet) müßte man wohl nur ein Unterverzeichnis "data" unterhalb von /var/flash selbst erzeugen und dort die Dateien ablegen, die nach dem Neustart in die TFFS-Nodes kopiert werden sollen. Dann noch den Node für das char-Device gelöscht und an dessen Stelle ein reguläres File gleichen Namens angelegt (der Inhalt wäre egal) und beim nächsten Start sollte die reguläre Datei das Anlegen des char-Devices im ersten Schritt verhindern, während dann in der Funktion oben das fehlende char-Device und die Existenz der Datei unter dem Pfad /var/flash/data dafür sorgt, daß deren Inhalt in den TFFS-Node kopiert wird.
Wenn jetzt nicht ausgerechnet nach dem Wiederherstellen der Einstellungen bei Dir die char-Devices vorhanden wären, würde ich ja fast vermuten wollen, daß AVM beim Wiederherstellen der Einstellungen so vorgeht, wie ich es beschrieben habe ... aber das Listing vor dem Neustart spricht ja nun deutlich dagegen - insofern wird es eher mysteriöser als klarer.
Das Anlegen von /var/flash/data in der S01-head wird jedenfalls bei mir gar nicht aufgerufen (das wäre dann in "check_and_store_tffs_node_to_yaffs" und einen solchen Aufruf gibt es nicht, sagt mir "grep") .. wie gesagt, ich würde jetzt als nächstes erst einmal den Unterschied zwischen der 7490 und der 7362SL in den Dateien in /etc/init.d versuchen festzustellen. Gibt es keinen, fehlt mir die Erklärung, woher das "data"-Verzeichnis kommen sollte. Gibt es dort einen Aufruf von "tffs_node_to_yaffs", wäre die Frage, welche Umstände zu einem Aufruf führen.