[HOWTO] Diskless NFS-Clienten unter Debian mit eigenen Confdir und standartkernel

    • UPDATE 03.06.08: Es wurden einige Fehler behoben danke an heinzelrumpel, pbriesch u. NemoN
    • UPDATE 04.06.08: Das Verzeichnis /var/lib/netboot/config wird erstellt. Proc und sysfs wird gemounted bevor man in die chroot Umgebung einsteigt verhindert Fehler beim erstellen der initrd. Neue Formatierung zur besseren Übersicht.
    • UPDATE 04.06.08: Die Scripte nochmal überarbeitet und vereinfacht. Außerdem habe ich mal ne Versionnummer hinzugefügt zur besseren Übersicht wenn es was neues gibt.
    • UPDATE 04.06.08: in der Datei /etc/initramfs-tools/modules im clientsystem muß das Modul aufs drinnen stehen
    • UPDATE 20.06.08: die scripte für die initrd werden ausführbar gemacht danke an NemoN


    !!! ACHTUNG !!! leider geht debian z.Z. nicht als CLientsystem weil dem Standartkernel anpassungen fehlen für nfs. Ich empfehle daher für den Clienten Ubuntu zu nutzen.


    Allgemeines

    Dieses HowTo beschreibt wie man unter Debian bzw. Ubuntu mehrere Diskless-Clienten einrichtet die über das Netzwerk booten und dabei die Änderungen im Dateisystem in einen eigenen Verzeichnis speichern. Somit bleiben alle Änderungen beim neustart erhalten. Wir nutzen dafür die initramfs-tools um die Initrd anzupassen. Desweiteren nutzt dieses Howto aufs um die Änderungen von den jeweiligen Clienten zu speichern. Jeder Client erhält dafür auf dem Server ein eigenes Verzeichnis. Hier wird allerdings (noch) nicht beschrieben wie man VDR zum laufen bekommt es enthält nur eine Beschreibung wie man ein minimales System übers Netz bootet.
    Zusammengefasst:


    [list=1]
    [*]Jeder Client hat sein eigenes Verzeichnis wo geänderte Dateien gespeichert werden. Es ist so möglich jedes Gerät einzeln auf die Bedürfnisse abzustimmen.
    [*]Verwendung von den Debian bzw. Ubuntu Standart-Kernel. Man braucht keinen eigenen Kernel zu kompilieren.
    [*]Updates und neue Pakete werden nur auf den Server installiert
    [/list=1]


    Ich benutze für alle Befehle "sudo" so kann man auch als nicht root das HOWTO verfolgen. Mehr dazu findet ihr in "man sudo"


    Vorrausetzung Hardware


    Alle Clienten müßen die Fähigkeit haben übers Netzwerk zu booten. Dafür wird ein PXE-Bootrom benötigt, bei den meisten onboard-Netzwerkkarten ist die Funktion im BIOS intergriert. Der Server sollte eine schnelle Anbindung zum lokalen LAN haben. Außerdem sollte er über genügend freien Plattenplatz verfügen da hier das komplette Betriebssystem für die Clienten zusätzlich installiert wird.


    Vorrausetzung Software


    Ein lauffähiges Debian oder Ubuntu auf den Server. Mein Server läuft unter Debian etch. Das Howto sollte sich aber Problemlos auf Ubuntu übertragen lassen.


    Benötigte Pakete auf Server installieren

    Als erstes installieren wir die benötigten Dienste auf den Server die später unsere Clienten benötigen.


    sudo apt-get install tftpd-hpa nfs-kernel-server dhcp3-server debootstrap syslinux nano


    tftpd-hpa: sorgt dafür das unsere Clienten den Kernel und das Initrd-Image bekommen
    nfs-kernel-server: stellt das Dateisystem zur Verfügung
    dhcp3-server: verteilt IP-Adressen und enthält informationen wo der Client den Kernel und das Initrd-Image findet.
    syslinux: enthält den Bootloader
    debootstrap(optional): damit könnt ihr das Grundsystem für die Clienten leicht installieren.
    nano(optional): der hie benutzte editor


    Client Grundsystem in ein Verzeichnis auf den Server installieren


    Dafür gibt es viele Möglichkeiten die einfachste ist wahrscheinlich mit debootstrap. Wichtig ist das ihr eine Distro nutzt die aufs zur Verfügung stellt, das ist leider bei debian erst ab lenny der Fall.


    sudo mkdir -p /var/lib/netboot/root
    sudo mkdir -p /var/lib/netboot/config
    Für Debian.
    sudo debootstrap lenny /var/lib/netboot/root
    Für Ubuntu
    sudo debootstrap hardy /var/lib/netboot/root

    Grundlegende Konfiguration von dem clientsystem


    Als erstes passen wir die fstab an. Wichtig ist hier das ihr die Einträge für sysfs, proc und alle zusätzlich NFS shares reinschreibt(z.B. Homeverzeichnisse, Aufnahmen). Das Root Dateisystem muß hier nicht drinnen stehen, ist bei mir nur der Vollständigkeit halber. Es ist auch empfehlenswert temporäre Dateien im RAM zu speichern. Das ganze sollte dann ungefähr so aussehen


    sudo nano /var/lib/netboot/root/etc/fstab

    Code
    1. none / aufs defaults 0 0
    2. none /tmp tmpfs defaults 0 0
    3. none /var/run tmpfs defaults 0 0
    4. none /var/lock tmpfs defaults 0 0
    5. none /var/tmp tmpfs defaults 0 0
    6. none /media tmpfs defaults 0 0
    7. 192.168.2.2:/home /home nfs defaults 0 0 ##optional
    8. 192.168.2.3:/var/lib/video.00 /var/lib/video.00 nfs rw,soft 0 0 ##optional


    Als nächstes sind die Netzwerkkarten dran. Wichtig hier ist das alle Zeilen mit "auto eth0" auskommentiert sind da wir ja nicht wollen das beim hochfahren die Netzwerkkarte resettet wird und somit unser root-Dateisystem verloren geht. Localhost sollte auch nicht fehlen da es sonst zu Problemen mit Diensten kommen kann


    sudo nano /var/lib/netboot/root/etc/network/interfaces

    Code
    1. auto lo
    2. iface lo inet loopback
    3. iface eth0 inet dhcp


    Die resolv.conf nicht vergessen für das I-Net, hier steht der Namesserver drinnen. In den meisten Fällen wird das die IP von euren Router sein.


    sudo nano /var/lib/netboot/root/etc/resolv.conf

    Code
    1. search kron.homeftp.net
    2. nameserver 192.168.2.1


    zum Schluß Konfigurieren wir noch apt damit wir auf unseren Client-system software installieren können. Natürlich könnt ihr auch andere Mirrors benutzen.


    sudo nano /var/lib/netboot/root/etc/apt/sources.list
    unter Debian mit folgenden Inhalt

    Code
    1. deb ftp://ftp.freenet.de/debian/ lenny main non-free contrib
    2. deb-src ftp://ftp.freenet.de/debian/ lenny main non-free contrib
    3. deb http://security.debian.org/ lenny/updates main contrib
    4. deb-src http://security.debian.org/ lenny/updates main contrib


    und unter Ubuntu

    Code
    1. deb http://de.archive.ubuntu.com/ubuntu hardy main restricted universe multiverse
    2. deb-src http://de.archive.ubuntu.com/ubuntu hardy main restricted universe multiverse


    um die grundlegende Konfiguration vom Clientsystem abzuschließen müßen wir die virtuellen Dateisysteme mounten und uns mittels chroot in das system einklinken



    sudo mount -t proc proc /var/lib/netboot/root/proc
    sudo mount -t sysfs sysfs /var/lib/netboot/root/sys
    sudo chroot /var/lib/netboot/root
    sudo mount -t devpts -o gid=4,mode=620 none /dev/pts
    sudo mount -t tmpfs none /dev/shm

    wenn wir mittels chroot im system sind holen wir zunächst die Paketlisten vom server


    sudo apt-get update


    nun installieren wir einen Kernel mit aufs und die initramfs-tools.


    Debian:
    sudo apt-get install aufs-modules-2.6-686 linux-image-2.6-686 initramfs-tools


    Ubuntu:
    sudo apt-get install linux-image-2.6.24-16-generic linux-ubuntu-modules-2.6.24-16-generic nano


    Jetzt kommen wir zum wichtigsten Teil dieses Howto's das erstellen der angepassten initrd. Dazu kopieren wir zunächst meine beiden angehängten scripte an die richtige position.


    tar -xzvf netboot_scripts-0.3.tar.gz
    sudo cp netboot /etc/initramfs-tools/hooks
    sudo chmod a+x /etc/initramfs-tools/hooks/netboot
    sudo cp rootaufs /etc/initramfs-tools/scripts/init-bottom
    sudo chmod a+x /etc/initramfs-tools/scripts/init-bottom/rootaufs

    dann stellen wir die configurationsdatei für die initramfs-tools ein folgende Punkte müssen geändert werden
    MODULES=most nach MODULES=netboot
    BOOT=local nach BOOT=nfs
    das ganze sollte zum schluß ungefähr so aussehen


    sudo nano /etc/initramfs-tools/initramfs.conf


    und in der datei /etc/initramfs-tools/modules muß das Modul aufs ergänzt werden damit es in die initrd kopiert wird
    sudo nano /etc/initramfs-tools/modules


    jetzt nur noch die initrd erstellen


    sudo update-initramfs -u


    Jetzt sind wir mit dem Clientsystem fertig und können mit "exit" die chrootumgebung verlassen


    Grundlegende Konfiguration vom server


    Zeit um den server zu konfigurieren
    der NFS Server braucht genau 2 shares. Ein share für das Grundsystem was nicht verändert wird (das haben wir soeben Konfiguriert) und ein share wo die Änderungen von den jeweiligen Clienten gespeichert werden. Dazu wird beim Start eines Clienten wenn nicht vorhanden ein Verzeichnis mit seiner MAC-Adresse automatisch angelegt. Bei unseren Fall ist das Grundystem in /var/lib/netboot/root und die Änderungen werden in /var/lib/netboot/config gespeichert demzufolge muß der NFS-Server folgender Massen Konfiguriert werden.
    sudo nano /etc/exports

    Code
    1. /var/lib/netboot/root *(ro,no_root_squash,no_all_squash,sync,no_subtree_check)
    2. /var/lib/netboot/config *(rw,no_root_squash,no_all_squash,sync,no_subtree_check)


    Einstellungen mit /etc/init.d//nfs-kernel-server restart übernehmen


    als nächtes ist der dhcp-Server dran. Ich möchte hier nur auf die wichtigsten optionen eingehen. Eine gute Beschreibung zu allen optionen findet ihr hier http://www.tuxhausen.de/software_dhcpd.html Mit "next-server" gebt ihr die ipadresse vom tftp-server an, "filename" gibt den bootloader an und mit "option root-path" stellt man normalerweise den nfsroot zum booten ein wir nutzen später dafür den Kernel-Kommandolinie


    sudo nano /etc/dhcp3/dhcpd.conf


    Einstellungen mit /etc/init.d/dhcp3-server restart übernehmen


    Jetzt ist der tftp Server dran. Dafür brauchen wir den kernel und das initrdfile aus dem Clientsystem bei in diesem Beispiel ist dies ein hardy ubuntu. Das folgendermassen aussieht


    ls /var/lib/netboot/root/boot/

    Code
    1. abi-2.6.24-15-generic config-2.6.24-16-generic initrd.img-2.6.24-16-generic System.map-2.6.24-15-generic vmlinuz-2.6.24-16-generic
    2. abi-2.6.24-16-generic initrd.img-2.6.24-15-generic initrd.img-2.6.24-16-generic.bak System.map-2.6.24-16-generic
    3. config-2.6.24-15-generic initrd.img-2.6.24-15-generic.bak memtest86+.bin vmlinuz-2.6.24-15-generic


    daraus müßen wir nun den Kernel und das dazugehörige Initrdfile kopieren hier sollte ihr umbedingt auch die version acht geben in diesem Beispiel ist das "2.6.24-16-generic"


    sudo cp /var/lib/netboot/root/boot/vmlinuz-2.6.24-16-generic /var/lib/tftpboot/
    sudo cp /var/lib/netboot/root/boot/initrd.img-2.6.24-16-generic /var/lib/tftpboot/


    außerdem brauchen wir noch aus dem syslinux die Datei "pxelinux.0" ein Bootloader fürs Netzwerk.


    sudo cp /usr/lib/syslinux/pxelinux.0 /var/lib/tftpboot/


    jetzt noch bootloader einstellen. rwnfs gibt an in welchen Verzeichniss die Änderungen gespeichert werden und nfsroot das grundsystem


    sudo mkdir /var/lib/tftpboot/pxelinux.cfg
    sudo nano /var/lib/tftpboot/pxelinux.cfg/default

    Code
    1. LABEL linux
    2. KERNEL vmlinuz-2.6.24-16-generic
    3. APPEND initrd=initrd.img-2.6.24-16-generic rwnfs=192.168.2.2:/var/lib/netboot/config aufs=nfs nfsroot=192.168.2.2:/var/lib/netboot/root ro
    4. IPAPPEND


    zum Schluß müßt ihr den tftp-Server aktivieren dazu stellt ihr in der Datei /etc/default/tftpd-hpa RUN_DAEMON von "no" auf "yes" anschließen neu starten mit /etc/init.d/tftpd-hpa restart.


    Das sollte es im großen und ganzen gewesen sein. Ihr brauch jetzt nur auf den Clienten das Netzwerkbooten zu aktivieren und alles sollte laufen.


    Alle zusätzlich Software sollte in der chrootumgebung auf den server installiert werden dazu müßen immer die virtuellen Dateissteme vorhanden sein.


    sudo mount -t proc none /var/lib/netboot/root/proc
    sudo mount -t sysfs none /var/lib/netboot/root/sys
    sudo chroot /var/lib/netboot/root
    mount -t devpts -o gid=4,mode=620 none /dev/pts
    mount -t tmpfs none /dev/shm


    Ich bitte um Tips was man an den howto noch verbessern könnte.


    am 01.06.08 überarbeitet

    Files

    "Wir kehren unsere miesen Lieder nicht unter dem Teppich, wir spielen sie als Zugabe." Zitat die Ärzte

    The post was edited 27 times, last by Kron ().

  • Ich weiß das es knapp ist....


    Wenn du es ausprobierst würde ich mich über feedback freuen. Wenn du zu irgendwas fragen hast werde ich versuchen sie zu beantworten.


    Kron

    "Wir kehren unsere miesen Lieder nicht unter dem Teppich, wir spielen sie als Zugabe." Zitat die Ärzte

  • Quote

    die netzwerk karte vom client stelle ich auf netboot bzw pxe boot oder
    benötige ich einen usb stick oder ähnliches mit einem kernel?



    Ja du mußt die Netzwerkkarte auch PXE-Boot einstellen. Du benötigst keinen USB-Stick.
    Bei den meisten Onboard-Netzwerkkarten geht das im BIOS. Dort sollte mann dann auch die richtige Bootreinfolge einstellen.



    Kron

    "Wir kehren unsere miesen Lieder nicht unter dem Teppich, wir spielen sie als Zugabe." Zitat die Ärzte

  • das wie in dem howto geschriebende


    Code
    1. apt-get install aufs-modules-2.6-686 kernel-image-2.6-686 initramfs-tools


    wollte nicht bei mir. ich musste folgende packete installieren:



    Code
    1. apt-get install aufs-modules-2.6-686 linux-image-2.6-686 initramfs-tools
  • Jo aufgenommen bin ehh gerade dabei das howto zu ein bissel zu überarbeiten.

    "Wir kehren unsere miesen Lieder nicht unter dem Teppich, wir spielen sie als Zugabe." Zitat die Ärzte

  • so habe nochmal alles überarbeitet und den Fehler rausgemacht. Ich hatte außerdem vergessen anzugeben das man noch syslinux braucht um an den bootloader ranzukommen sorry.


    Ich hoffe jetzt ist es ein bissel übersichtlicher und besser erklärt.


    Viel Spaß beim ausprobieren freue mich weiterhin über feedback

    "Wir kehren unsere miesen Lieder nicht unter dem Teppich, wir spielen sie als Zugabe." Zitat die Ärzte

  • Hallo Kron,


    danke für die Anleitung. Bin gerade dabei, dieser zu folgen. Sollte


    Code
    1. nano /var/lib/netboot/root/apt/sources.list

    nicht


    Code
    1. nano /var/lib/netboot/root/etc/apt/sources.list

    heissen?


    Gruß


    Paul

    Server: Raspberry Pi, Acer Aspire easyStore H340, DIGIBIT R1 SAT>IP

    Clients: Hauppauge MediaMVP, Raspberry Pi mit Vomp-Client und SAT>IP, BananaPi Pro, Mele M5




  • check

  • Mir sind noch ein paar Dinge aufgefallen:


    In der URL ist der Punkt am Ende mit drin. Der muss weg.
    http://www.tuxhausen.de/software_dhcpd.html.


    Bei Ubuntu "sudo" nicht vergessen. Nur in der chroot-Umgebung brauch man es nicht.


    Folgendes habe ich soweit bei Ubuntu 8.05 festgestellt:


    sudo apt-get install linux-image-2.6-16-generic linux-ubuntu-modules-2.6.24-16-generic initramfs-tools


    -16-generic muss ergänzt werden

    initramfs-tools kann wegfallen, da dies bei der Erstellung der chroot-Umgebung bereits installiert wurde.


    nano muss noch expliziert installiert werden:

    Code
    1. sudo apt-get install nano


    /var/lib/netboot/config muss vorhanden sein, sonst mault der NFS-Server beim Start (Sollte nicht nur bei Ubuntu so sein). Also:


    Code
    1. sudo mkdir -p /var/lib/netboot/config


    Gruß


    PB

    Server: Raspberry Pi, Acer Aspire easyStore H340, DIGIBIT R1 SAT>IP

    Clients: Hauppauge MediaMVP, Raspberry Pi mit Vomp-Client und SAT>IP, BananaPi Pro, Mele M5


  • vor


    Code
    1. sudo nano /var/lib/tftpboot/pxelinux.cfg/default


    muss noch das Verzeichnis angelegt werden:


    Code
    1. sudo mkdir /var/lib/tftpboot/pxelinux.cfg/

    Server: Raspberry Pi, Acer Aspire easyStore H340, DIGIBIT R1 SAT>IP

    Clients: Hauppauge MediaMVP, Raspberry Pi mit Vomp-Client und SAT>IP, BananaPi Pro, Mele M5


  • Hi,


    bin gerade am Ausprobieren, doch leider tauchen da ein paar Fehler am Client bezüglich nfs-mount auf. Könntest Du bitte nochmal alle nfs Freigaben überprüfen und auch den betreffenden Abschnitt in der dhcpd.conf. Du hast in dem Howto geschreiben, dass in /var/lib/netboot/root/etc/fstab 192.168.2.2:/home /home nfs gemountet werden soll. Dies ist aber auf Serverseite gar nicht exportiert.



    Gruß, Heinzelrumpel


    p.s


    habe mal


    Code
    1. option root-path "192.168.99.16:/var/lib/netboot/root";


    angepasst. Jetzt bootet der Client auch bis zum login hoch. Dort gebe ich root ein und siehe da, es wird kein Passwort verlangt. Ist das normal?

  • Quote

    bin gerade am Ausprobieren, doch leider tauchen da ein paar Fehler am Client bezüglich nfs-mount auf. Könntest Du bitte nochmal alle nfs Freigaben überprüfen und auch den betreffenden Abschnitt in der dhcpd.conf. Du hast in dem Howto geschreiben, dass in /var/lib/netboot/root/etc/fstab 192.168.2.2:/home /home nfs gemountet werden soll. Dies ist aber auf Serverseite gar nicht exportiert.


    das home war eigendlich nur als beispiel gedacht wenn du z.B. die Clienten auch als Desktop benutzen möchtest zur Funktion brauchst gar keine nfs-shares in der fstab anzugeben. Die wichtigen nfs mounts werden von der initrd erledigt also noch bevor die fstab überhaupt ausgewerdet wird.


    Quote

    Jetzt bootet der Client auch bis zum login hoch. Dort gebe ich root ein und siehe da, es wird kein Passwort verlangt. Ist das normal?


    Ja das ist normal mit "passwd" kannste dir ein root passwort geben.



    Überprüfe ob die NFS-Pfade in der /var/lib/tftpboot/pxelinux.cfg/default stimmen. Habe gerade mal wieder ein fehler im Howto endeckt scheint beim copy-paste passiert zu sein. Irgendie scheint da ein zeilenumbruch reingerutscht zu sein sorry.


    es muß so heißen:

    Code
    1. APPEND initrd=initrd.img-2.6.24-16-generic rwnfs=192.168.2.2:/var/lib/netboot/config aufs=nfs nfsroot=192.168.2.2:/var/lib/netboot/root ro

    "Wir kehren unsere miesen Lieder nicht unter dem Teppich, wir spielen sie als Zugabe." Zitat die Ärzte

    The post was edited 1 time, last by Kron ().

  • Hi,


    o.k danke. Das mit dem Zeilenumbruch prüfe ich morgen mal. Wenn ich in /etc/exports auf dem Server das /var/lib/netboot/root nur ro exportiere, dann klappt es nicht mit passwd und auch andere Änderungen gehn dann nicht. Ich habe es jetzt auf rw gesetzt. Mir ist nur das Verzeichnis /var/lib/netboot/config nicht klar. Woher weiß der pxeclient etwas damit anzufangen. M.E wird es nirgendwo deklariert.


    Gruß, Heinzelrumpel

  • doch es wird schon deklariert und zwar auch in der Zeile wo der Umbruch zu viel war. Da gibts "rwnfs=192.168.2.2:/var/lib/netboot/config" dies gibt an in welchen nfs share die Änderungen gespeichert werden. Die initrd ließt dann die mac-adresse der Netzwerkkarte und legt ein Verzeichniss in /var/lib/netboot/config an.


    Du solltest umbedingt /var/lib/netboot/root auf ro lassen da sonst die anderen clienten keine eigenen configs speichern können.


    Wenn es nicht funktioniert könntest du bitte mal proc und sysfs auf den server in das system mounten


    mount -t proc none /var/lib/netboot/root/proc
    mount -t sysfs none /var/lib/netboot/root/sys


    danach in der chroot-Umgebung das initrdfile neu erstellen.
    chroot /var/lib/netboot/root
    update-initramfs -u


    dann mit "exit" die chroot Umgebung verlassen und das erstellte initrd file wie im howto beschrieben nach /var/lib/tftpboot kopieren und nochmal probieren.


    Danke

    "Wir kehren unsere miesen Lieder nicht unter dem Teppich, wir spielen sie als Zugabe." Zitat die Ärzte

  • habe den zeilenumbruch entfernt. jetzt funktioniert alles gut, bis auf die tatsache, dass beim booten ne fehlermeldung erscheint, dass der nfs-server nicht erreichbar wäre. das muss ich gleich mal überprüfen.



    der fehler erscheint, aber nicht bei jedem boot. naja.


    hier mal ein screenshot


    http://www.tippex.net/bilder/netboot_client.jpg

  • Naja habe als Server Debian und für die Clienten Ubuntu und unter Ubuntu erscheine keine Fehlermeldungen aber wenn es geht dann ist ja gut.


    Quote

    habe den zeilenumbruch entfernt. jetzt funktioniert alles gut, bis auf die tatsache, dass beim booten ne fehlermeldung erscheint, dass der nfs-server nicht erreichbar wäre. das muss ich gleich mal überprüfen.


    Schreib bitte was du gefunden hast.


    Danke

    "Wir kehren unsere miesen Lieder nicht unter dem Teppich, wir spielen sie als Zugabe." Zitat die Ärzte


  • habe meine obige nachricht gerade mal editiert, da ich etwas von dir überlesen hatte, nämlich vor dem chroot noch sys mounten etc.


    jetzt läuft das erstellen auch ohne fehler. werde gleich mal den client neu booten. evt. läuft jetzt alles rund.


    p.s


    beim booten hängt der client ein paar minuten an dieser stelle


    http://www.tippex.net/bilder/netboot2.jpg