Meine Erfahrungen mit Diskless Linux, oder wie boote und arbeite ich per Netz.
29.01.2010 Da ich nun über mehre leistungsstarke Server verfüge frage ich mich ob ich nicht einen Client komplett übers Netz booten und betreiben sollte. Da ich aufgrund meine verzweifleten Versuche die Power 265 per tftp zu booten mich nun gut in der Konfiguration von dhcp und tftp auskenne sollte das nicht zu schwer sein.
Zum Verständnis, der Client soll per pxe gebootet werden und dann per NFS sein Root-Filesystem zugewiesen bekommen. Wir müssen also zwei Dateidienste konfigurieren. Fangen wir mal von vorne an.
Ausgangslage
Name |
Maschine |
OS |
IP |
Rin |
Sever |
Debian Lenny |
10.128.1.80 |
Motoko |
Client |
Debian Lenny |
DHCP |
Router & Gateway |
Netgear |
- |
10.128.1.1 |
DNS |
Netgear |
- |
10.128.1.1 |
Zuerst die Kombination aus dhcp und tftfpd. Ich installiere zuerst die beiden Pakte:
apt-get install dhcp3-server tftpd-hpa
Noch einen kleinen Hinweis: Die Debian-Variante des tftpd-hpa verwendet den Standard inetd die Ubuntu-Version den openbsd-inetd. Nach der Installation gibt es ein Verzeichnis /vat/lib/tftpboot in dem der tftfpd nach seinen Files sucht. Alle Dateinamen sind relativ zu /var/lib/tftfboot zu setzten.
Nun kommt die Konfiguration des DHCP-Servers. Er weist den Client seine IP, die Adresse des DNS, und sein Gateway. Und dann weist er Ihm auch die vom tftpd zu liefernde Datei zu. Die Konfigurationsdatei ist also sehr sehr wichtig.
Hier eine funktionierende /etc/dhcp3/dhcp.conf
# DHCP-Config von Rin
option domain-name "brainwash.com";
option domain-name-servers 10.128.1.1;
option subnet-mask 255.255.255.0;
default-lease-time 600;
max-lease-time 7200;
server-name "rin";
subnet 10.128.1.0 netmask 255.255.255.0 {
range 10.128.1.150 10.128.1.250; option routers 10.128.1.1; deny unknown-clients;
}
group pxe {
server-name "rin" ; next-server 10.128.1.80 ;
host motoko {
hardware ethernet 00:d0:59:13:68:5C ;
fixed-address 10.128.1.155 ;
filename "/debian/motoko/pxelinux.0";
}
}In diesem Beispiel wird der Maschinen Motoko die feste IP 10.128.1.155 zugewiesen und das Bootfile /var/lib/tftboot/debian/motoko/pxelinux.0 (Der Pfad in der config ist relativ zum TFTP-Boot verzeichnis.
Noch ein Wort zu TFTP. Das Protokoll ist recht mimosenhaft, und kann bei grösseren Dateien von Arp-Request unterbrochen werden. In diesem Falle müsste man manuell eine /etc/ethers Datei anlegen in der man die MAC-Adresse des Client mit seiner IP reinschreibt, und dann das ganze mit arp -f einliest. Zur Kontrolle noch mit apr -v überprüfen.
Wenn man nun den dhcp-server konfiguriert hat, noch ein Neustart mit
/etc/init.d/dhcp3-server restart
Nun testen wir in dem wir den Laptop (Motoko) von der Platte booten und dann als Superuser
dhclient eth0
eingaben. Nun sollte uns der DHCP die IP 10.128.1.155 zuweisen .
Also DHCP geht schon mal. Und wenn ich mich nicht beim Filename verschrieben habe dann klappt auch der TFTP-Transfer.
Nun muss noch der PXE konfigurienen. Auch dieser verfügt über eine Konfigurationsdatei diese liegt unter /debian/motoko/pxelinux.cfg/default (wieder relativ zu /var/lib/tftboot/)
Hier eine kleine funktionierende Konfiguration.
#motokos pxe-config LABEL motoko . kernel vmlinuz-2.6.18-4-486 append root=/dev/nfs nfsroot=10.128.1.80:/nfsroot/sarge ip=dhcp initrd=initrd.img-2.6.18-4-486 rw -- PROMPT 1 TIMEOUT 0
Erklärung: Der Kernel liegt im Verzeichnis /var/lib/tftpboot/debian/motoko/ (absolut gesehen). Das gleiche gilt für das initrd.img. Nach dem Boot up muss man nach dem Boot-Prompt nur motoko eingeben und schon sollte das System booten , aber langsam , denn wir haben jetzt erst mal eine Konfiguration, aber noch keinen Kernel etc...
Zum Verständnis: Wir wollen das bereits vorhanden Debian des Clients Motokos von dessen Festplatte auf den Server übertragen. Also keine Neuinstallation sonder quasi einen Clon des bereits vorhanden Systems. Als erstes müssen wir dafür aus dem Server den NFS einrichten, damit wir die benötigten Dateien rüberkopieren können.
Also auf dem Server :
apt-get install nfs-kernel-server syslinux
Dazu gibt’s ein gutes Wiki unter http://wiki.ubuntuusers.de/PXE-Boot https://help.ubuntu.com/community/DisklessUbuntuHowto Das Verzeichnis nfsroot auf dem Server anlegen mit
mkdir /nfsroot
Jetzt noch die Konfiguration des NFS Servers anpassen:
z.B in /etc/exports folgendes eintragen :
/nfsroot 10.128.1..0/255.255.255.0(rw,no_root_squash,async)
und den NFS-Server dies mitteilen mit :
exportfs -rv
Nun testen wir ob der NFS-Server funktioniert: Wir versuchen das NFS-Filesystem vom Laptop (Motoko) aus einzuhängen mit :
mount 10.128.1.80:/nfsroot -t nfs /mnt
Wenn gutdann haben wir den zweiten Datendienst konfiguriert und müssen nun noch die Daten kopieren, und ein paar Kleinigkeiten anpassen.
Und hier noch ein Quelle: http://lars-schenk.com/pxe-netzwerk-boot-mit-ubuntu-client-und-debian-server/60 und noch eine : http://developer.novell.com/wiki/index.php/HOWTO:_Convert_Ubuntu_to_Diskless
Die letzte scheint mir wichtig: Nun den aktuellen Kernel des Clients kopieren. Da ich auf das Zielverzeichnis /vat/lib/tftboot/debian/motoko/ nicht direkt schreiben kann muss ich sie per scp kopiren.
Also weiter (vom Client aus):
scp /boot/vmlinuz-* root@10.128.1.80:/var/lib/tftpboot/debian/motoko/
Die RamdiskFs-Ordner kopieren.....
sudo cp -Rp /etc/mkinitramfs /etc/mkinitramfs-pxe
und die Datei /etc/mkinitramfs/initramfs.conf anpassen und BOOT=local in BOOT=nfs umwandeln.
Und initrd.img neu bauen lassen .......
mkinitramfs -d /etc/mkinitramfs-pxe -o /tmp/initrd.img-2.6.18-4-486
und in das Verzeichnis kopieren.
scp /tmp/initrd.img-2.6.18-4-486 root@10.128.1.80 :/var/lib/tftpboot/debian/motoko/
Jetzt haben wir also den Kernel und die angepasste Ramdisk im Verzeichnis des TFTP-Servers. Nun müssen wir noch die PlatteHier eine des Clients auf das NFS-Verzeichnis kopieren.
Zur Erinnerung: Wir befinden uns auf dem Client (Motoko) und haben das NFS-Verzeichnis per
mount 10.128.1.80:/nfsroot -t nfs /mnt
auf das Verzeichnis /mnt eingehängt.
Also kopieren wir nun die Client Platte auf das NFS-Verzeichnis mit :
mkdir /mnt/sarge sudo cp -ax /. /mnt/sarge/. sudo cp -ax /dev/. /mnt/sarge/dev/.
Nun sind alle Dateien wo sie sein sollen. Ich fasse zusammen: Die Bootrelevanten Datreien, sprich der Kernel die Ramdisk und die pxelinux.0 und die dazgehörige Config liegen in /var/lib/tftpboot/debian/motoko/
Dort wird zuerst die PXElinux-Datei an den Client übergeben. Der lädt dann über das Label motoko Kernel und Ramdisk und hängt dann sein Root-Dateisystem per NFS ein. Die NFS-Dateinen liegen in /nfsroot/sarge/
Dabei kann es sein, daß der NFS-Server beim ersten Mal noch nicht gleich erkannt wird, das System aber beim zweiten Versuch das NFS-Share erkennt und einhängt. Ein kleine Besnderheit noch. Nach dem das System per NFS gebootet hat kann man nicht mehr per su sich als Superuser anmelden. Die Fehlermeldung besagt: setgid: Die Operation ist nicht erlaubt.