Netzwerk-Boot

Diskussionen um Bootloader, Kernel, Busybox
mhier
Interessierter
Interessierter
Beiträge: 66
Registriert: Montag 2. Januar 2006, 11:42

Netzwerk-Boot

Beitrag von mhier »

Hallo!

Bei meiner DBox ist leider der Flash kaputt gegangen, deswegen muss ich die Box vom Netz booten. Aus verschiedenen Gründen würde ich gerne erreichen, dass die Box das NFS-Root-Verzeichnis von einem anderen Server holt als der DHCP/BOOTP-Server. Leider scheint u-boot die "Server-Name"-Option vom DHCP komplett zu ignorieren (benutzt u-boot eigentlich DHCP oder BOOTP?), wäre das überhaupt die richtige Option?

Laut Konsole-Log versucht die Box immer den Kernel (per TFTP) und das NFS-Root von der IP-Adresse zu laden, auf der der DHCP (von ISC) läuft. Ich verwende als DHCP-Server ein Gentoo-System, das Booten funktioniert einwandfrei, wenn das NFS-Root auf dem DHCP liegt. Von mir aus kann er den Kernel auch vom DHCP-Rechner kriegen, ich möchte den nur danach ausschalten können (deswegen soll das Root-FS woanders sein).

Kann ich irgendwie die Kernel-Optionen direkt beeinflussen? Das wäre vermutlich noch am besten (wg. spezieller Mount-Optionen fürs NFS...).

Grüße und Danke schon mal allen
Martin
ChakaZulu
Developer
Beiträge: 457
Registriert: Sonntag 23. März 2003, 00:39

Beitrag von ChakaZulu »

hi,

evtl. ist dafür next-server in der dhcp-config zuständig. Das wurde mir hier http://forum.tuxbox-cvs.sourceforge.net ... nextserver
mal zum Verhängnis :)

ciao,

ChakaZulu
mhier
Interessierter
Interessierter
Beiträge: 66
Registriert: Montag 2. Januar 2006, 11:42

Beitrag von mhier »

Danke, das werde ich heute abend mal probieren. Kann man denn irgendwie die Kernel-Kommandozeile beeinflussen? Muss ich dazu u-boot neu compilieren (gibts da eigentlich ein gutes Howto für)? Ich müsste nämlich noch die Portnummern vom NFS angeben, weil leider der portmap auf dem NFS-Server nicht erreichbar ist (Firewall dazwischen sperrrt Port 111, und da hab ich keinen Einfluss drauf...).
Grüße
M@rtin
Npq
Senior Member
Beiträge: 1339
Registriert: Donnerstag 24. April 2003, 12:12

Beitrag von Npq »

Ja, das geht. In der u-boot.config (das ist ein Symlink, der beim ersten Durchlauf des CDK gesetzt wird, falls er noch nicht existiert, aber später nicht mehr angerührt wird, so daß man hier auch eigene Configs hinzufügen kann) im Verzeichnis "boot/u-boot-config" wird die Kernel Kommandozeile innerhalb des CONFIG_BOOTCOMMAND-Defines als "bootargs"-Umgebungsvariable definiert.

Für eine Änderung muß u-boot allerdings neu gebaut werden.

Daß er den Root auf dem DHCP-Server erwartet, will liegt daran, daß in der Config: "nfsroot=$(serverip):$(rootpath)" steht und die Umgebungsvariable "serverip" beim u-boot eben die IP des DHCP-Servers enthält. Warum das mal so angelegt wurde weiß ich nicht.

Laß einfach das "$(serverip):" weg und gib in der dhcp.conf dann den gewünschten Server als IP an, dann kann man den root auch auf einem anderen Rechner anlegen.

Also in der u-boot.config:

Code: Alles auswählen

"nfsroot=$(rootpath)"
und in der dhcp.conf dann (als Beispiel):

Code: Alles auswählen

"option root-path "192.168.1.10:/home/tuxbox/cdkroot"
mhier
Interessierter
Interessierter
Beiträge: 66
Registriert: Montag 2. Januar 2006, 11:42

Beitrag von mhier »

Die "next-server"-Option scheint auch keine Wirkung zu haben. Dann muss ich mich jetzt wohl mal damit beschäftigen, das U-Boot neu zu bauen. Wollt ich mir eh schonmal angeschaut haben ;) Gibt es da eine straight-forward Doku?
Houdini
Developer
Beiträge: 2183
Registriert: Mittwoch 10. Dezember 2003, 07:59

Beitrag von Houdini »

uboot selber ist gut dokumentiert (http://www.denx.de/wiki/view/DULG/UBoot)
Das cdk selber ist eigentlich auch straight forward, einfach im tuxbox-cvs/cdk/doc und tuxbox-cvs/cdk/Makefile{.am} anfangen :-)
Wichtig sind die configure optionen, damit du das richtige uboot baust (sprich fürs Flash)

Houdini
Barf
Developer
Beiträge: 1475
Registriert: Dienstag 4. Februar 2003, 22:02

Beitrag von Barf »

nextserver beschreibt den TFTP-Server, nicht den NFS-Server.

Irgendwie muss es eine vernünftige Lösung geben (also so dass u-boot den NFS-rootserver dynamisch, != DHCP-server, setzt). Z.B. hat der man-seite für dhcpd.conf(5) ein Beispiel

Code: Alles auswählen

      subclass "allocation-class-2" 1:08:00:2b:a1:11:31 {
         option root-path "samsara:/var/diskless/alphapc";
         filename "/tftpboot/netbsd.alphapc-diskless";
       }
mhier
Interessierter
Interessierter
Beiträge: 66
Registriert: Montag 2. Januar 2006, 11:42

Beitrag von mhier »

Barf hat geschrieben:nextserver beschreibt den TFTP-Server, nicht den NFS-Server.
Theoretisch sollte es das, zumindest meine u-boot-Version lässt sich aber nicht davon beeindrucken...
Barf hat geschrieben:

Code: Alles auswählen

      subclass "allocation-class-2" 1:08:00:2b:a1:11:31 {
         option root-path "samsara:/var/diskless/alphapc";
         filename "/tftpboot/netbsd.alphapc-diskless";
       }
das habe ich auch schon (als erstes) probiert, dann versucht er als Rootpath "dhcpserver:samsara:/var/diskless/alphapc" zu mounten, und das geht natürlich schief...

Ich denke, ich versuche mir erstmal einen u-boot selbst zu bauen (er kompiliert immernoch am CDK... ich sollte ihn mal die nacht durchlaufen lassen :wink: ), vielleicht kann ich mir dann den DHCP sogar sparen (mit einer statischen IP-Konfiguration)?
Houdini hat geschrieben:Wichtig sind die configure optionen, damit du das richtige uboot baust (sprich fürs Flash)
Ich will doch gar nicht fürs Flash bauen... Ich krieg das aber schon hin! :)
mhier
Interessierter
Interessierter
Beiträge: 66
Registriert: Montag 2. Januar 2006, 11:42

Beitrag von mhier »

Wie erreiche ich denn, dass er (nur) den u-boot neu baut, nachdem ich die Konfiguration geändert habe? rm .deps/u-boot bewirkt da nichts...
Houdini
Developer
Beiträge: 2183
Registriert: Mittwoch 10. Dezember 2003, 07:59

Beitrag von Houdini »

make .deps/u-boot?
mhier
Interessierter
Interessierter
Beiträge: 66
Registriert: Montag 2. Januar 2006, 11:42

Beitrag von mhier »

Code: Alles auswählen

mhier@pegasus cdk $ make .deps/u-boot
make: `.deps/u-boot' is up to date.
wäre das nicht das selbe wie rm .deps/u-boot && make all ?

EDIT:

Code: Alles auswählen

mhier@pegasus tuxbox $ cd boot/u-boot-config/
mhier@pegasus u-boot-config $ touch u-boot.config
mhier@pegasus tuxbox $ cd ../../cdk/
mhier@pegasus cdk $ make .deps/u-boot
make: `.deps/u-boot' is up to date.
Müsste er das u-boot dann nicht neu bauen?
Houdini
Developer
Beiträge: 2183
Registriert: Mittwoch 10. Dezember 2003, 07:59

Beitrag von Houdini »

ich guck heute abend mal bei mir daheim...
Npq
Senior Member
Beiträge: 1339
Registriert: Donnerstag 24. April 2003, 12:12

Beitrag von Npq »

Code: Alles auswählen

rm .deps/u-boot && make u-boot
Wenn das bei dir nicht geht, stimmt was nicht.
mhier
Interessierter
Interessierter
Beiträge: 66
Registriert: Montag 2. Januar 2006, 11:42

Beitrag von mhier »

gestern gings nicht... jetzt schon... :gruebel:
Naja, danke für die Hilfe!
Barf
Developer
Beiträge: 1475
Registriert: Dienstag 4. Februar 2003, 22:02

Beitrag von Barf »

Kehren wir zu Ursprungsproblem zurück: Das u-boot nimmt an, dass der NFS-Server = TFTP/DHCP-Server ist. Dies ist ein Ärgerlichkeit, die durchaus ein Fix verdient. Hier hat schon Npq folgende Lösung (korrekterweise) vorgeschalgen:
Npq hat geschrieben:Laß einfach das "$(serverip):" weg und gib in der dhcp.conf dann den gewünschten Server als IP an, dann kann man den root auch auf einem anderen Rechner anlegen.

Also in der u-boot.config:

Code: Alles auswählen

"nfsroot=$(rootpath)"
und in der dhcp.conf dann (als Beispiel):

Code: Alles auswählen

"option root-path "192.168.1.10:/home/tuxbox/cdkroot"
Frage ist natürlich, falls etwas Altes (z.B. vorhandene dhcpd.conf-Setups) kaputtgehen. Dazu in File ...linux-2,4,32/Documentation/nfsroot.txt:
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]

If the `nfsroot' parameter is NOT given on the command line, the default
"/tftpboot/%s" will be used.

<server-ip> Specifies the IP address of the NFS server. If this field
is not given, the default address as determined by the
`ip' variable (see below) is used. One use of this
parameter is for example to allow using different servers
for RARP and NFS. Usually you can leave this blank.
Also: rootpaths ohne Doppelpunkte werden also wie früher funktionieren. Einzige "Catch" ist dass der server mit IP-Adress angegeben sein muss. (also nicht Name, Name resolution ist ausgeschaltet. Das "samsara"-Beispiel wird also nicht funktionieren.)

Da also die Änderung keine Nachteile hat, schlage ich vor, sie zu committen. Falls niemand protestiert mache ich es.
petgun
Tuxboxer
Tuxboxer
Beiträge: 5001
Registriert: Montag 11. November 2002, 15:26

Re: Netzwerk-Boot

Beitrag von petgun »

hi,
mhier hat geschrieben:Bei meiner DBox ist leider der Flash kaputt gegangen, deswegen muss ich die Box vom Netz booten. Aus verschiedenen Gründen würde ich gerne erreichen, dass die Box das NFS-Root-Verzeichnis von einem anderen Server holt als der DHCP/BOOTP-Server.
sorry, habe den Thread eben erst entdeckt und weiss nicht so genau ob es das ist was Du moechtest: Ich benutze auch nicht den NFS-Server des Bootmanager..allerdings um eine Yadd zu booten. Es reicht bei mir '/yadd/yaddroot' als 'yaddroot' mit einem SFU-NFS-Server zu exportieren....den Bootmanager kann ich nach dem booten beenden. sorry, wenn das eine Loesung ist die nicht zum Problem passt.
Ich wuensche mir auch eine Moeglichkeit eine Yadd/beliebige/spezielle (besser entpackte?) Images von einem NFS-Server zu booten. So wie ich jetzt ein NFS-Aufnahmeverzeichnis auf der DBox angeben kann, wuerde ich gerne ein Boot-Verzeichnis angeben koennen...das waere super...zB. jedes NAS-Device/PC mit Windows/Linux _nur_ mit NFS-Server wuerde funktionieren...ist wahrscheinlich viel zu einfach gedacht und sicher kein Standard. Was passiert beim booten mit einem normalen geflashten hochkomprimierten Image? Wird doch komplett in's Ram entpackt, oder?

cu,
peter
gmo18t
Erleuchteter
Erleuchteter
Beiträge: 553
Registriert: Freitag 27. Februar 2004, 14:30

Beitrag von gmo18t »

Barf hat geschrieben:nextserver beschreibt den TFTP-Server, nicht den NFS-Server.

Irgendwie muss es eine vernünftige Lösung geben (also so dass u-boot den NFS-rootserver dynamisch, != DHCP-server, setzt). Z.B. hat der man-seite für dhcpd.conf(5) ein Beispiel

Code: Alles auswählen

      subclass "allocation-class-2" 1:08:00:2b:a1:11:31 {
         option root-path "samsara:/var/diskless/alphapc";
         filename "/tftpboot/netbsd.alphapc-diskless";
       }
Das Kernelloading des durch newmake erzeugten 'u-boot' sieht ja wie folgt aus:

Code: Alles auswählen

bootcmd=dhcp; tftp "$(bootfile)"; protect off 10020000 107fffff; setenv
bootargs root=/dev/nfs rw nfsroot=$(rootpath)
ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname)::off
console=$(console); bootm
also gilt es, '$(rootpath)' mit sowas wie "nfsserver-ip:/das/ist/yaddroot"
und '$(bootfile)' mit "kernel-cdk" auffüllen zu lassen.
Die 'dhcpd.conf' sollte also in etwa so aussehen:

Code: Alles auswählen

...
subnet 192.168.0.0 netmask 255.255.255.0 {
 
  host dbox {
    fixed-address 192.168.0.2;
    hardware ethernet 00:50:9c:xx:xx:xx;
    allow bootp;

    next-server dhcp-server-ip;  # ohne next-server Eintrag geht es nicht !

    if exists vendor-class-identifier {
      filename "kernel-cdk";
      option root-path "nfsserver-ip:/das/ist/yaddroot";
    } else {
      filename "u-boot";
    }
  }
}
...
Beim Bootvorgang wird der dhcp Server ja mehrmals kontaktiert:
Zuerst vom br-bootlader per bootp (daran läßt sich nix ändern).
Mit obiger Konfiguration wird dann erst 'u-boot' per tftp angeboten,
weil in diesem Fall kein 'vendor-class-identifier' present ist.

Wenn dann das 'u-boot' geladen ist kommt von ihm die nächste
dhcp-Anfrage, aber nun wird 'kernel-cdk' per tftp angeboten und
außerdem korrekt '$(rootpath)' für die commandline des Kernels
gesetzt, weil u-boot selbst offenbar 'vendor-class-identifier' liefert
und (dhcp eine Fallunterscheidung durchführen kann).

Das sollte reichen einen anderen nfs-Server zu spezifizieren und
mit 'next-server' kann man evtl. sogar noch einen anderen tftp-server
auswählen (was aber in der Regel) nicht so dringend benötigt wird.

So jedenfalls hab ich's mit einer meiner Boxen hinbekommen.
Ihr könnt's ja mal ausprobieren ...
- GMo -
gmo18t
Erleuchteter
Erleuchteter
Beiträge: 553
Registriert: Freitag 27. Februar 2004, 14:30

Beitrag von gmo18t »

Hi,

hab noch festgestellt, daß der Parameter "next-server" unbedingt
in dhcpd.conf drin stehen muß, sonst funktioniert das ganze nicht.

Hab mein letztes Posting dahingehen angepasst und

Code: Alles auswählen

    ...
    next-server dhcp-server-ip;
    ....
eingefügt -> Für "dhcp-server-ip" hab ich halt eben die IP meines dhcp-Servers
(der auch tftp-Server ist) eingetragen. Ob da was anderes geht,
weiß ich nicht ...

- GMO -
Barf
Developer
Beiträge: 1475
Registriert: Dienstag 4. Februar 2003, 22:02

Beitrag von Barf »

Ein Paar Bemerkungen dazu:

Die Änderungen in u-boot sind in HEAD, nicht in newmake.

Das Thema next-server war früher hier http://forum.tuxbox.org/forum/viewtopic.php?t=38668 und http://forum.tuxbox.org/forum/viewtopic.php?t=27288 diskutiert worden. Frühere Versionen des dhcp-servers von ISC brauchte es nicht (besser ausgedrückt: als default war next-server das gleiche als DHCP-Server). Die Benutzung eines ComputerNAME statt IP ist möglich.

Die information steht auch in einem guide von mir. Sollte nur aktualisieren bzgl. NFS-Server...

Jemand sollte ..cdk/doc/README.u-boot-via-net in CVS aktualisieren ... :wink: