Sie sind hier : Homepage →  > Linux (12) Technik des NAS-540→  Versuch 4 auf einem NAS-542

Diese Seiten sind unsere internen Protokolle aus dem Labor.

Aufgrund der fortlaufenden Protokollierung der Ergänzungen sowie der Verbesserungen ist die Reihenfolge / Chronologie der Seiten aus dem Ruder gelaufen - leicht durcheinander geraten.

.

Es geht so nicht ! Worüber habe ich nachgedacht ?

Die Hauptplatine eines "embedded" Systems von Zyxel - ein NAS-Server

Die erste Installation von "entware" mit dem Vorschlag aus dem "entware" Forum bzw. dem Repository ist nach dem Step 3 abgebrochen. Die letzte Kommandozeile führte nicht zm Erfolg. (Das steht hier.)

Daraufhin hatte ich auf diesem NAS (unserem Test-1 NAS-540) einen Installations-Vorschlag aus dem Zyxel Forum versucht. (Also nicht einzelne Kommadozeilen von Hand aufrufen, sondern ein fertiges Script benutzen.) Ich benenne das mal als Versuch 2 und dieser Versuch 2 auf dem Test-1-Server führte (teilweise) zum Erfolg.

Ich bekam eine Menge neuer App-Icons in den App-Bereich - erfreulich.

.

.
Den dringend benötigten "mc" konnte ich aber mit seinem eigenen Icon nicht installlieren. Aufgrund dessen vermutete ich ein Mißmatch der Reste der abgebrochenen Installation (aus Versuch 1) und startete neu auf einem weiteren NAS 540 Test-2- Server mit funkel nagel neuer leerer Platte, also völlig leer mit Default- Werkseinstellungen und allerletzter Firmware. Das ganze ist hier - Versuch-3 - protokolliert und beschrieben.

Dieser Shell-Script, der auf unserem Test-1 NAS erstaunlicherweise komplett durchgelaufen war, wollte hier auf dem neuen Test-2-Server so gut wie gar nicht laufen. Also gab es auf dem Test-1 Server doch wichtige Restbestände (Überbleibsel) aus der versuchten Erstinstallation, die der 2. Installation auf die Beine geholfen hatten.

Die Fehlermeldung war merkwürdig :
.

  • Collected errors:
  •  * verify_pkg_installable:
        Only have 0kb available on filesystem /opt, pkg entware-opt needs 2
  •  * opkg_install_cmd: Cannot install package entware-opt.

.

Der Fehler liegt also bei dem hier angelegten /opt/ Verzeichnis

Wenn das Script meldet :
.
Only have 0 kb available on filesystem /opt, pkg entware-opt needs 2
.
.... dann wurde dieses Verzeichnis in der RAM-Disk angelegt und eben nicht auf der Festplatte (das wäre "/opt/" mit einem Link auf dieses "/i-data/"UUID"/opt/" auf der Festplatte).

Das wäre aus meiner Sicht ein typischer Scriptfehler. Das Script muß !! abfragen, wie die "Volume-ID" der ersten Platte heißt. Direkt nach einem Neustart zeigt der Pfad "/i-data/.system/" bereits direkt auf die erste Festplatte. Die "Volume-ID" sieht man sofort im Klartext. Dort könnte man weiter verzweigen und weitere Verzeichnisse anlegen. Also schaun wir erst mal in dieses install-Script rein.
.

Was man vorher noch wissen sollte :

Die originale Zyxel Firmware von ca. 58 Megabyte (eine dicht gepackte "Binärdatei" - zum Beispiel "521AATB7C0.bin" für unser NAS-540) ist auf dem Prozessorboard im 256MB großen Flash-Speicher "aufbewahrt" und wird während des Boot-Vorganges in eine 143 MB große im Hauptspeicher (RAM) angelegte System-Disk (Ram-Disk) installiert.

Eine lokale Festplatte ist zum "Booten" des NAS-Servers erstmal gar nicht notwendig. Die typische Linux- Verzeichnis-Struktur wird im ausreichend großen 1 Gigabyte RAM angelegt. Beim Neustart wird daher immer wieder das gleiche Boot-Image expandiert und installiert. Was dort in den virtuellen Verzeichnissen später geändert oder ergänzt wird, ist daher nach jedem Neustart wieder weg !!!

Darum ist dort eine Art von "Verzweigung" auf Pfade und Verzeichnisse auf eine (mögliche) lokale Festplatte eingebaut, um die dort abgelegten Änderungen in die Boot-Prozedur einzubinden.

Wie und wo das genau funktioniert, habe ich noch nicht gefunden, kommt aber noch. Eine Anfrage im Zyxel Forum ist "pending". Jedenfalls muß das bei allen ergänzenden Installations-Scripten und Programmen berücksichtigt werden, sonst sind die Änderungen nach einem Neustart wieder weg.

Verschiedene genau vordefinierte Verzeichnisse (eine Liste ist in Arbeit) auf der Festplatte können ausführbare Scripte enthalten, die dann beim Neu-Start auch ausgeführt werden. Die Reihenfolge ist bislang unklar.

Wie das alles abläuft, habe ich hier zu erklären versucht.

.

Hier das aus dem Zyxel "Repo" geholte "entware_install.sh"

Das ist eine typische Linux Batch-Datei, eine ausführbare Textdatei, die mit dieser Zeile beginnt :

#!/bin/sh
echo "Info: Checking for prerequisites and creating folders..."

if [ -d /opt ]
then
    echo "Warning: Folder /opt (im root) exists!"
else
    mkdir /opt
fi

# Anlage eines virtuellen Verzeichnisses in der RAM-Disk !!!!

for folder in bin etc/init.d lib/opkg sbin share tmp usr var/log var/lock var/run
do
  if [ -d "/opt/$folder" ]
  then
    echo "Warning: Folder /opt/$folder exists!"
    echo "Warning: If something goes wrong please clean /opt folder and try again."
  else
    mkdir -p /opt/$folder
  fi
done

  • # Anmerkung :
  • # also hier hakt es schon, denn das neue Verzeichnis /opt/ wird in der RAM-Disk angelegt
  • # und noch nicht auf die lokale Festplatte Disk-0 verlinkt. Ein dicker Fehler.
  • # Es fehlt etwas Ähnliches wie
    "mkdir -p /i-data/.system/opt > /dev/null 2>&1"
  • # wobei hier übes Ziel hinaus geschossen würde,
  • # weil man in diesem Pfad eine Ebene zu hoch ankommt,
  • # ok, man könnte im Script mit "cd .." wieder eine Ebene tiefer runter kommen und weiter machen
  • # cd /i-data/.system - dann landet man zum Beispiel in /i-data/aa6cb00c/.system
  • # jetzt eine Ebene wieder zurück wäre man in /i-data/aa6cb00c/
  • # hier kann man das notwendige (verlangte) Verzeichnis /opt/ anlegen
  • # zusätzlich muß natürlich der Link von /opt/ auf /i-data/aa6cb00c/ dauerhaft in irgend einen Boot-Script eingetragen werden,
  • # also muss unsere Volume-ID im Klartext sowieso im Script extrahiert werden


echo "Info: Opkg package manager deployment..."

CURARCH="armv5"
DLOADER="ld-linux.so.3"

URL=http://pkg.entware.net/binaries/$CURARCH/installer

wget $URL/opkg -O /opt/bin/opkg

# in dieser Version würde das in die RAM-Disk geladen, die aber nicht unendlich gross ist

chmod +x /opt/bin/opkg

wget $URL/opkg.conf -O /opt/etc/opkg.conf
wget $URL/ld-2.23.so -O /opt/lib/ld-2.23.so
wget $URL/libc-2.23.so -O/opt/lib/libc-2.23.so
wget $URL/libgcc_s.so.1.2.23 -O /opt/lib/libgcc_s.so.1

cd /opt/lib

chmod +x ld-2.23.so
ln -s ld-2.23.so $DLOADER
ln -s libc-2.23.so libc.so.6

echo "Info: Basic packages installation..."
/opt/bin/opkg update
/opt/bin/opkg install entware-opt

if [ ! -f /opt/usr/lib/locale/locale-archive ]
then
        wget pkg.entware.net/binaries/other/locale-archive.2.23 -O /opt/usr/lib/locale/locale-archive
fi

echo "Info: Congratulations!"
echo "Info: If there are no errors above then Entware-ng was successfully initialized."
echo "Info: Add /opt/bin & /opt/sbin to your PATH variable"
echo "Info: Add '/opt/etc/init.d/rc.unslung start' to startup script for Entware-ng services to start"
echo "Info: Found a Bug? Please report at https://github.com/Entware-ng/Entware-ng/issues"
.
# Ergebnis und Erkenntnis : Auf einem jungfräulichen NAS-540/542 funktioniert das mit diesem Script aber nicht, weil die RAM-Disk voll ist bzw. überläuft.
.

Es muß also doch handisch vorgearbeitet werden

Will man also völlig verquere verschachtelte "Konstrukte" in dem install-script vermeiden, nimmt man den funktionierenden Teil der Einzelzeilen-Installation aus dem "entware Forum" von unserer einführenden Seite - hier nachfolgend nochmal ergänzt.

.

Step (1) und (2) - hier also nochmal ausgeführt

(1) First create a new file named

"USRPKG_DEPS_START" .....   under /i-data/.system/zy-pkgs ...... and make it executable. Put a line in that file called "entware". This is the name of the script that the system will run when it boots.

# Mit diesem Pfad hat man sich den ganzen Zirkus mit dem Klartext-Pfad der "UUID" auf der ersten Festplatte gespart, weil das von den originalen Firmware -Scripten (wo stehen die ?) gleich so eingerichtet wird.

Hier unser Beispiel : Diese beiden Pfade sind nämlich auf einem NAS-540/542 identisch
.

  • /i-data/.system/zy-pkgs ist identisch mit
  • /i-data/aa6cb00c/.system/zy-pkgs

.
weiter geht es mit :

  1. touch /i-data/.system/zy-pkgs/USRPKG_DEPS_START
  2. chmod +x /i-data/.system/zy-pkgs/USRPKG_DEPS_START
  3. echo entware > /i-data/.system/zy-pkgs/USRPKG_DEPS_START

.
(2) Next, you need to find the name of your volume (die UUID). This can be determined by running the following command:

cd /i-data/.system (das zeigt die "Volume-ID" oder "UUID" an - das ist der Name der Partition auf der Platte)
.

Step (3) - und auch hier nochmal ....

(3) Now create the bash-script that creates the directories /opt, starts "entware" and includes opkg in your path.

This script has to be called 'entware' and has to be placed (auf der Festplatte) in "/i-data/.system/zy-pkgs/" in order to be executed. - Die Datei muss natürlich ausführbar gemacht werden.

The content of the script is as follows
(with "YOUR_VOLUME_ID_HERE" substituted with the unique value you got in step 2)

=============================================================
!/bin/sh

# Setze die Variable / Define the ID of your volume VOL="YOUR_VOLUME_ID_HERE"
# Bei unserem Muster-Server wäre das zum Beispiel "VOL=aa6cb00c"

VOL=aa6cb00c

mkdir -p /i-data/$VOL/opt > /dev/null 2>&1

mkdir -p /opt mount -o bind /i-data/$VOL/opt /opt

#diese Zeile könnte nur in diesem Script "entware" starten -
aus dem jetzt verlinkten / gemounteten root-Verzeichnis /opt/ heraus

/opt/etc/init.d/rc.unslung start

#Add opkg to your path

echo 'export PATH=$PATH:/opt/bin:/opt/sbin' >> /etc/profile

exit 0
==============================================================

Dieses Script würde also - wenn es funktioniert - bei jedem Neustart wieder ausgeführt und legt das /opt/ Verzeichnis im root wieder an und mountet es auf das gleiche Verzeichnis auf der ersten Festplatte.

Will ich diese obigen Zeilen von unserem Beispiel-Server hilfsweise einzeln von Hand auf der Kommandozeile ausführen, muß ich natürlich die Script-Variable "VOL" (die UUID der Festplatte) vorher in den Zeilen händisch ersetzen.

Die (Beispiel-) Kommando-Zeilen würden dann so lauten :

mkdir -p /i-data/aa6cb00c/opt > /dev/null 2>&1
mkdir -p /opt
mount -o bind /i-data/aa6cb00c/opt /opt

Erst jetzt kann ich diese Zeile mit dem rc.unslung aufrufen :


/opt/etc/init.d/rc.unslung start
.
es kommt aber immer noch ein Fehler

/opt/etc/init.d/rc.unslung: line 38: /opt/bin/find: not found
.
Und meine händischen Kommandozeilen werden nirgendwo gesichert und beim Neustart ist das /opt/ Verzeichnichnis nicht mehr da.
.

Es geht nicht - was nun ???????????????

Die erste Erkenntnis ist, daß in der Zyxel Firmware bereits Vorbereitungen getroffen wurden, zusätzliche Shell-Scripte oder andere ausführbare Dateien in einem ganz bestimmten Verzeichnis auf der Festplatte auszuführen. - Dafür steht ein Pfad zur Verfügung, der nach dem minimalen Bootvorgang fertig eingerichtet ist :

/i-data/.system/zy-pkgs

In diesem Verzeichnis können also ausführbare Scripte oder Dateien dauerhaft abgelegt werden.

Der Autor des Install-Scriptes hat dafür die Erstellung der ausführbaren Datei "USRPKG_DEPS_START" vorgesehen / vorbereitet.

In dieser Text-Datei wird als einzige Zeile ein Shell-Script eingetragen ("entware"). Die Datei enthält die Erstellung des /opt/ Verzeichisses in der RAM-Disk sowie nochmal auf der Festplatte sowie Verlinkung von /opt/ auf den korrekten Pfad auf der Festplatte.
.

Fangen wir nochmal von vorne an .....

Unser Testserver 3 (NAS-542) wird noch nicht auf die Werkseinstellungen zurück gesetzt, bekommt aber ein neue leere Platte. Die Netzwerk Adresse samt "wake-on-lan" und das Benutzer Passwort verbleiben. Die Platte wird neu formatiert. Die aktuelle Firmware (V5.21(ABAG.7) wohnt im Flash-Speicher und die letzte Konfiguration auch im Flash-Speicher (oder in einem E-Eprom ?). Die neue Platte müsste nach der Initialisierung eigentlich völlig leer sein, ist sie aber nicht. Mehr dazu kommt noch - Der SSH Server ist auch noch eingeschaltet. Damit funktionieren "putty" und "winscp".
.
Der Zyxel Web-Dateibrowser ist ein sehr bescheidenes Werkzeug, eigentlich ist er (für unsere Zwecke) unbrauchbar.
.

Ein Blick auf die RAM-Disk sowie die 1. Platte

Beim Neustart des NAS wird eine RAM-Disk angelegt und dort im root "/" die typische Linux Verzeichnisstruktur erstellt. Im Verzeichnis /bin/ sind aber nur wenige echte Programme enthalten sowie die busybox mit 494 Kilobyte Größe. Die ganzen angezeigten Programmnamem sind lediglich 7 Byte lange symbolische Links.

Das Verzeichnis /etc/ ist extrem abgespeckt gegenüber opensuse. Hier findet sich vermutlich nur die init Konfiguration (bei jedem Neustart).

Ein wichtiges originales Startup-Script "rcS" ist in /etc/init.d/ zu finden, welches die Start-Shritte enthält. Es bginnt mit :

# NOTE:
# The main job of this script is ...
# 1. Prepare the root file system.
# 2. Mount system disk image from HDD.
# 3. Handle the condition that there is not valid system disk image.

. /etc/profile
.........................
.
das Script ist (bislang) gut dokumentiert - nur ein paar Kommentar-Auszüge :

  • # which kernel and system image partitions
  • prepare_config_partition()
  • check_and_run_usbkey()
  • rescan_lost_scsi_device()
  • #Initialize Fan control
  • # Mount NAND for System Disk image.
  • # check sysdisk.img md5sum
  • export BOOTDEV - "Boot from RAM disk"
  • # Mount System Disk image for copying files from it.
  • # Mount some read-only directories
  • # Mount /etc/zyxel from NAND flash
  • prepare_config_partition

.
am Ende steht "${IMG_PATH}/etc/init.d/rcS2"
.
In /etc/profile werden die Such-Pfade festgelegt sowie einzelne settings. Auch die Linux-Standard Kommandos sind hier mit ihren absoluten Links eingetragen.
.
Den weiteren Boot-Prozess evaluiere ich auch noch.
.

Was bisher aus der Zyxel Firmware extrahiert wurde:

Zuerst ein paar Informationen von einer NAS-542 Erst-Installation auf einer neuen leeren 500 GB Platte :

~ # df -h
Filesystem                Size      Used      Available  Use%    Mounted on
ubi7:ubi_rootfs2         90.7M     48.1M     38.0M  56%     /firmware/mnt/nand

/dev/loop0              138.5M    121.8M     16.6M  88%      /ram_bin
/dev/loop0              138.5M    121.8M     16.6M  88%       /usr
/dev/loop0              138.5M    121.8M     16.6M  88%       /lib/security
/dev/loop0              138.5M    121.8M     16.6M  88%       /lib/modules
/dev/loop0              138.5M    121.8M     16.6M  88%       /lib/locale

/dev/md2                454.6G    224.8M    454.4G   0%        /i-data/e1e0ed3c
.
Das Prozessorboard der 540/542 Server verfügt laut dieser Liste - wie hier zu sehen, über
.

  1. einen 256 MB großen (NAND) Flash-Speicher.
  2. einen Hauptspeicher von 1 Gigabyte und
  3. eine 500 Gigabyte Testplatte als Disk-0

.
Die obige Liste ist aber nur ein Ausschnitt aus der Device-Liste. Von der Ram-Disk mit brutto 138MB sind 121 MB belegt und auf der 1. Festplatte mit brutto 454 MB sind bereits 224 MB aus dem Firmware-Image untergebracht.

In der Liste fehlt auch ein weiterer für die Boot-Funktion wichtiger flash-Speicher, der spi-flash mit 1 MB Größe.

Das bedeutet, während des Bootvorganges haben wir es mit 5 Speicherbreichen zu tun,

  1. dem spi-flash, (1 Megabyte)
  2. dem NAND-flash, (250 Megabyte)
  3. der RAM-Disk 81 Gigabyte) und
  4. der Festplatte (ab 500 Gigabyte aufwärts) und evtl
  5. einem USB-Stick (ab 4 Gigabyte aufwärts) .

.

.

Startseite -- © 2001/2022 - Copyright by Dipl.-Ing. Gert Redlich / Germany - D-65191 Wiesbaden - Telefon-Nummer - Impressum