Dbox2:CDK (YADD) Bootvorgang

Aus TuxBoxWIKI
Version vom 16. Mai 2018, 11:57 Uhr von Dbt (Diskussion | Beiträge) (zu Archiv Development verschoben)
Wechseln zu: Navigation, Suche

Flagge en.jpg English: CDK YADD Boot Procedure


Allgemeines

Voraussetzung

Im Netz befindet sich ein DHCP-, ein NFS- und ein TFTP-Server, die natürlich entsprechend konfiguriert sein müssen.

DHCP ist der Nachfolger von BOOTP, daher kann der dhcpd bei Linux auch das Bootstrap-Protokoll (BOOTP).


So funktioniert es

Zunächst läuft der Bmon los, initialisiert die nötige (CPU, LCD etc.). Danach folgt die Kommunikation, hier der Übersicht halber mit Angabe der Richtung wie folgt.


Bmon

Bmon: gesamtes Netzwerk<-DBox2

Der Bmon sendet einen BOOTP-Request ins Netz


Bmon: DHCP->DBox2

Der DHCP-Server anwortet mit der IP-Adresse der DBox2, der IP-Adresse des Servers und dem Namen der Bootdatei (z.Bsp: "dbox2/tftpboot/u-boot"). Die Bootdatei ist der 2.Phase-Bootloader (der Bmon ist der erste, genaueres hier). Damit weiß der Bmon nun alle nötigen Daten.


Bmon: TFTP<-DBox2

Der Bmon erfragt per ARP die zur TFTP-Server-IP zugehörige MAC (Standardvorgang, Ethernet-Pakete werden an eine MAC-Adresse adressiert, nicht an eine IP). Anschließend fordert er mit einem TFTP-Read Request die Bootdatei an.


Bmon: TFTP->DBox2

Die Bootdatei wird nun an die DBox2 übertragen. Der Bmon legt diese Datei im Speicher ab. Ist die Bootdatei komplett übertragen berechnet er die Signatur. Wenn der Bmon nun nicht im Debug-Mode ist, dann verweigert er an dieser Stelle die weitere Zusammenarbeit falls die Signatur nicht gültig ist und bootet neu. Mit aktiviertem Debug-Mode gibt er zwar eine Fehlermeldung aus, startet aber anschließend die Bootdatei, in unserem Fall also den u-boot.


Der U-boot ist wesentlich intelligenter als der Bmon, er weiß aber nichts von den Dingen, die bis zu diesem Punkt passiert sind. Für ihn hat die DBox2 zunächst wieder keine IP.


Eine Sache ist noch wichtig zu wissen. Der U-boot führt nacheinander die Kommandos aus, die man ihm beim Kompilieren eingebaut hat. Daher ist die nachfolgende Beschreibung nur für die CDK-Konfiguration gültig.


Theoretisch kann man den Autostart des U-boots auch abbrechen und alle Befehle von Hand eingeben. Wer es individuell haben möchte, sollte sich das Verzeichnis u-boot-config im CDK ansehen. Dort sind die einzelnen Konfigurationen abgelegt.


Welche dieser Konfigurationen beim Kompilieren verwendet wird legt der Symlink u-boot.config in diesem Verzeichnis fest, welcher nur bei Nicht-Existenz automatisch auf die CDK-Config angelegt wird. Dadurch kann jeder ohne großen Aufwand seine persönliche Konfiguration erstellen.


U-Boot

U-boot: DHCP<-DBox2:

Der U-boot kennt zwar auch das Bootp-Protokoll, das DHCP-Protokoll erlaubt aber noch einige Dinge mehr, so dass dieses verwendet wird. Zunächst fragt der U-boot per DHCP Discover nach seiner IP.


U-boot: DHCP->DBox2:

Der DHCP bietet dem U-boot eine IP an und weil der U-boot nicht wählerisch ist, akzeptiert er diese.


Da wir einen Bootstrap machen sagt der DHCP dem U-boot auch noch seine Bootdatei. Also genauso wie bei der IP-Vergabe für den Bmon. Das Problem ist natürlich, dass wir nicht nochmal den U-boot laden wollen. Damit der DHCP-Server nun weiß, welche Bootdatei wir möchten, sendet der U-boot ein optionales Feld mit, den sogenannten "Vendor Class Identifier".


Dieser Identifier wird beim DHCP-Server in die DHCP-Konfiguration eingetragen und somit ist es möglich, den Bmon vom U-boot zu unterscheiden.


Der Windows-Bootmanager kennt diese Option nicht, daher wird er immer wieder den U-boot senden. Deswegen braucht man für den Bootmanager auch einen speziell angepassten U-boot.


Als nächstes versucht der U-boot nun die Datei "logo-lcd" und "logo-fb" über das TFTP-Protokoll zu laden. Dies hat keine Bewandnis für den eigentlichen Bootvorgang, sondern dient nur der Bootlogo-Anzeige.


U-boot: TFTP<-DBox2:

Als vorletzter Schritt wird nun die Bootdatei angefordert, es handelt sich um den Linux-Kernel.


U-boot: TFTP->DBox2:

Der Linux-Kernel wird in den Hauptspeicher der DBox2 geladen. Da der Kernel im Prinzip wie ein ausführbares Programm ist kann man ihm auch Parameter übergeben. In der U-boot-Konfiguration werden diese in der Umgebungsvariable "bootargs" gespeichert.


Die CDK-Bootargumente sehen so aus:

root=/dev/nfs rw 
nfsroot=$(serverip):$(rootpath) ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname)::off 
console=$(console); 


Über diese Parameter erfährt der Kernel auch alle für ihn wichtigen Dinge.

Die Variablen serverip,rootpath,ipaddr,gatewayip,netmask und hostname werden per DHCP erfragt.


Als letztes führt der U-boot das Kommando "bootm" aus. Dieses startet den Linux-Kernel und übergibt ihm die in bootargs gespeicherten Optionen.


Der Linux-Kernel weiß durch den Parameter "root", dass er über NFS booten soll. Den genauen Pfad entnimmt er dem nfsroot und dieser Pfad wird dann noch während des Bootvorgangs als root-Verzeichnis ("/") gemountet. Anschließend wird das Programm "init" gestartet womit der eigentliche Kernel-Boot abgeschlossen ist. Danach folgt der normale Startvorgang für die Anwendungsumgebung.


Das Booten aus dem Flash funktioniert ähnlich, natürlich wird hier der Root nicht als NFS sondern als das entsprechende MTD-Device angegeben.

U-Boot (ohne DHCP / TFTP)

Bei Zugriff auf die serielle Konsole des U-boot ist das Booten auch ohne DHCP-Server möglich. Zunächst wird der Autoboot unterbrochen. Die IP-Adressen des TFTP / NFS - Servers sowie der Box müssen manuell vergeben werden:

setenv serverip 192.168.1.10
setenv ipaddr 192.168.1.11
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv hostname dbox

Anschließend wird der Kernel auf die Box geladen:

tftpboot 200000 kernel-cdk

oder

nfs 200000 $(serverip):/pfad-zum/tftpboot/kernel-cdk

Nun müssen noch die Bootargumente gesetzt werden:

setenv nfsroot $(serverip):/pfad-zum/cdkroot/
setenv kernelip $(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname)::off
setenv bootargs console=$(console),$(baudrate) root=/dev/nfs rw nfsroot=$(nfsroot) ip=$(kernelip)

Abschließend wird der Kernel gestartet:

bootm