- 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
none / aufs defaults 0 0
none /tmp tmpfs defaults 0 0
none /var/run tmpfs defaults 0 0
none /var/lock tmpfs defaults 0 0
none /var/tmp tmpfs defaults 0 0
none /media tmpfs defaults 0 0
192.168.2.2:/home /home nfs defaults 0 0 ##optional
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
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
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
deb ftp://ftp.freenet.de/debian/ lenny main non-free contrib
deb-src ftp://ftp.freenet.de/debian/ lenny main non-free contrib
deb http://security.debian.org/ lenny/updates main contrib
deb-src http://security.debian.org/ lenny/updates main contrib
und unter Ubuntu
deb http://de.archive.ubuntu.com/ubuntu hardy main restricted universe multiverse
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
#
# initramfs.conf
# Configuration file for mkinitramfs(8). See initramfs.conf(5).
#
#
# MODULES: [ most | netboot | dep | list ]
#
# most - Add all framebuffer, acpi, filesystem, and harddrive drivers.
#
# dep - Try and guess which modules to load.
#
# netboot - Add the base modules, network modules, but skip block devices.
#
# list - Only include modules from the 'additional modules' list
#
MODULES=netboot
# BUSYBOX: [ y | n ]
#
# Use busybox if available.
#
BUSYBOX=y
#
# NFS Section of the config.
#
#
# BOOT: [ local | nfs ]
#
# local - Boot off of local media (harddrive, USB stick).
#
# nfs - Boot using an NFS drive as the root of the drive.
#
BOOT=nfs
#
# DEVICE: ...
#
# Specify the network interface, like eth0
#
DEVICE=eth0
#
# NFSROOT: [ auto | HOST:MOUNT ]
#
NFSROOT=auto
Alles anzeigen
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
# List of modules that you want to include in your initramfs.
#
# Syntax: module_name [args ...]
#
# You must run update-initramfs(8) to effect this change.
#
# Examples:
#
# raid1
# sd_mod
aufs
Alles anzeigen
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
/var/lib/netboot/root *(ro,no_root_squash,no_all_squash,sync,no_subtree_check)
/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
# be the master
authoritative;
# some common options
default-lease-time 600;
max-lease-time 7200;
option domain-name "kron.homeftp.net";
option domain-name-servers 192.168.2.1;
# our subnet
subnet 192.168.2.0 netmask 255.255.255.0 {
range 192.168.2.20 192.168.2.100;
option subnet-mask 255.255.255.0;
option netbios-name-servers 192.168.2.2;
option broadcast-address 192.168.2.255;
option routers 192.168.2.1;
option root-path "192.168.2.2:/var/lib/netboot/root";
next-server 192.168.2.2;
filename "pxelinux.0";
}
Alles anzeigen
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/
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
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
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
LABEL linux
KERNEL vmlinuz-2.6.24-16-generic
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
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