Da ich meinen VDR gerade auf diskless umgestellt habe (das vdr System bootet jetzt
komplett per Netzwerkkarte via TFTP und NFS vom Fileserver - Root over NFS), hier mal
ein kleines HOWTO, wie ich vorgegangen bin.
Update 2007-01-27: Anmerkungen -> c. Client per debootstrap installieren
Dazu passend:
[HOWTO] Debian Etch mit VDR von e-tobi installieren (Schritt für Schritt)
[HOWTO] VDR NFS Client auf Debian 5.0 lenny mit debootstrap Installation
Update 2006-10-22: Anmerkungen -> b. Wake on Lan (WoL) mit reboot OBSOLET!
Update 2006-02-22: Anmerkungen -> b. Wake on Lan (WoL) mit reboot - nvram-wakeup
Update 2006-01-30: Anmerkungen -> a. Kernel-Update
Ich habe:
- lauffähiges vdr System auf Festplatte
- AMD Geode NX 1750 auf PC-Chips M811 Motherboard
- 240 x 128 Grafik LCD mit T6963C - priatna (optional)
- PXE fähige Netzwerkkarte¹ im vdr (z.B. Intel Corp. 82541GI/PI Gigabit Ethernet Controller)
- Fileserver mit NFSd, DHCPd und TFTPd
¹ User mit älterer Hardware, bei denen das PXE booten Probleme macht, werfen bitte
auch einen Blick in dieses Posting ff.
Die folgenden Befehle sind grundsätzlich als User root auszuführen.
CLIENT
Im Kernel (ich nutze linux-2.6.20) des vdr Systems müssen folgende Optionen aktiviert sein:
-> Networking
-> Networking support (NET [=y])
-> Networking options
-> TCP/IP networking (INET [=y])
-> IP: kernel level autoconfiguration (CONFIG_IP_PNP=y)
-> IP: DHCP support (CONFIG_IP_PNP_DHCP=y)
-> File systems
-> Network File Systems
-> NFS file system support (CONFIG_NFS_FS=y)
-> Root file system on NFS (CONFIG_ROOT_NFS=y)
-> Device Drivers
-> Network device support
-> Network device support (NETDEVICES [=y])
-> Ethernet (1000 Mbit)
-> E1000 [=y]
Alles anzeigen
Netzwerkkartentreiber an die eigene Karte anpassen!
Zusätzlich baue ich z.B. auch ext2(3) fest in den Kernel ein, da ich initrd nicht mag.
Das System muß mit dem neuen Kernel wie gewohnt laufen, bevor man fortfährt.
SERVER
Auf dem Server (Debian sarge) sind folgende Dienste zu installieren (von mir genutze Version):
- NFS-Kernel-Server (1.0.6-3.1)
- DHCP-Server (V3.0.1)
- TFTP-Server (tftpd-hpa 0.40)
- Datei pxelinux.0 (z.B. aus dem syslinux Paket)
Aktuelle Linux-Distributionen sollten alles als fertige Pakete liefern. Derzeit nutze ich:
Auf dem Fileserver (hier 172.17.42.4) erstellt man ein Verzeichnis für das vdr System:
Statt client kann man einen beliebigen anderen Namen für das Verzeichnis festlegen.
Dies muß aber bei den anderen Konfigurationsdateien berücksichtigt werden.
Ein weiterer Vorteil ist, daß man nun relativ einfach ein komplettes Backup des vdr
Systems erstellen kann, indem man (z.B. mit tar, cp, ...) Das Verzeichnis
/netboot/nfsroot/client auf dem Server sichert.
Jetzt erfolgt die Freigabe des Verzeichnisses /netboot/nfsroot/client für den vdr Client
(hier 172.17.42.3) per NFS:
server:/# cat /etc/exports
#
/netboot/nfsroot/client 172.17.42.3/255.255.255.0(rw,no_root_squash,no_all_squash,sync)
nfsd HUPen oder restarten:
Der tftpd wird per inetd gestartet:
server:/# grep ^tftp /etc/inetd.conf
tftp dgram udp wait root /usr/sbin/tcpd /usr/sbin/in.tftpd -v -v -s /var/lib/tftpboot/
CLIENT
Um die Daten vom Client zum Server zu kopieren, mountet man das freigegebene
Verzeichnis auf dem Client:
Jetzt werden folgende Verzeichnisse (nach Bedarf) generiert:
- initrd
- media
- mnt
- proc
- sys
Für das Kopieren der restlichen Verzeichnisse nutzt man z.B. mc oder einfach cp (-a):
client:/# cp -a /bin /boot /dev /etc /home /lib /opt /root /sbin /srv /tmp /usr /var /mnt/server
Wer den Kopiervorgang verfolgen möchte, tippt cp -av ...
Jetzt muß noch die fstab den neuen Gegebenheiten angepaßt werden:
client:/# cat /mnt/server/etc/fstab
# /etc/fstab: static file system information.
#
/dev/loop/0 none swap sw,noauto 0 0
server:/netboot/nfsroot/client / nfs defaults,hard,intr,rsize=65536,wsize=65536 0 0
server:/video /video nfs auto,rw,nosuid,hard,intr,rsize=65536,wsize=65536 0 0
Vorgehenswesie zur swap Einrichtung siehe weiter unten.
SERVER
Auszug aus der /etc/dhcp3/dhcpd.conf des Servers:
subnet 172.17.42.0 netmask 255.255.255.0 {
option routers 172.17.42.42;
option subnet-mask 255.255.255.0;
option domain-name "domain.tld";
option domain-name-servers 172.17.42.4;
option time-offset 1;
option ntp-servers 172.17.42.4;
option netbios-name-servers 172.17.42.4;
range dynamic-bootp 172.17.42.43 172.17.42.254;
default-lease-time 21600;
max-lease-time 43200;
}
...
host client.domain.tld {
# Intel 1GBit
hardware ethernet 00:0E:xx:xx:xx:xx;
fixed-address 172.17.42.3;
# ggf. die nächste Zeile entkommentieren!
next-server 172.17.42.4;
filename "pxelinux.0";
}
Alles anzeigen
dhcpd HUPen oder restarten:
In das root Verzeichnis des tftpd gehören folgende Dateien:
server:/# ls -la /var/lib/tftpboot/*
-rw-r--r-- 1 root root 11826 Okt 31 15:15 /var/lib/tftpboot/pxelinux.0
-rw-r--r-- 1 root root 1407711 Okt 31 11:56 /var/lib/tftpboot/vmlinuz-2.6.15-client
/var/lib/tftpboot/pxelinux.cfg:
insgesamt 20
drwxr-xr-x 2 root root 4096 Okt 31 12:36 ./
drwxr-xr-x 3 root root 4096 Okt 31 15:13 ../
-rw-r--r-- 1 root root 332 Okt 31 12:36 AC112A03
-rw-r--r-- 1 root root 127 Okt 31 11:25 default
Alles anzeigen
vmlinuz-2.6.15-client ist eine Kopie von /netboot/nfsroot/client/boot/vmlinuz-2.6.15
AC112A03 ist die hexadezimale Schreibweise für 172.17.42.3 (s. a. dhcpd.conf):
server:/# cat /var/lib/tftpboot/pxelinux.cfg/AC112A03
# client 172.17.42.3
LABEL linux
KERNEL vmlinuz-2.6.15-client
APPEND root=/dev/nfs nfsroot=172.17.42.4:/netboot/nfsroot/client
IPAPPEND 1
Alternativ kann man statt der IP auch die MAC-Adresse in der Form
"01-00-0e-xx-xx-xx-xx" (wichtig ist das anfängliche 01-) als Dateinamen angeben.
In dem Thread Langsames NFS bei Diskless-Client gibt stl den Tip, darauf zu achten,
daß der Client explizit mit NFSv3 und nicht v2 arbeitet. Dieses läßt sich dadurch erreichen,
daß dem obigen Parameter nfsroot die Option v3 mitgegeben wird (s.a. /usr/src/linux/Documentation/nfsroot.txt).
APPEND root=/dev/nfs nfsroot=172.17.42.4:/netboot/nfsroot/client,v3
# ggf.
# APPEND root=/dev/nfs nfsroot=172.17.42.4:/netboot/nfsroot/client,v3,rsize=32768,wsize=32768
Überprüfen kann man die NFS Version mit dem Befehl "nfsstat -m".
Der Performancegewinn ist erheblich:
zaphod:~# nfsstat -m
/ from /dev/root
Flags: rw,vers=2,rsize=4096,wsize=4096,hard,nolock,proto=udp,timeo=11,retrans=2,sec=sys,addr=172.17.42.1
/dev/.static/dev from /dev/root
Flags: rw,vers=2,rsize=4096,wsize=4096,hard,nolock,proto=udp,timeo=11,retrans=2,sec=sys,addr=172.17.42.1
zaphod:~# dd if=/dev/zero of=/zeros.out bs=256k count=1024
1024+0 Datensätze ein
1024+0 Datensätze aus
268435456 Bytes (268 MB) kopiert, 132,852 Sekunden, 2,0 MB/s
zaphod:~# nfsstat -m
/ from /dev/root
Flags: rw,vers=3,rsize=4096,wsize=4096,hard,nolock,proto=udp,timeo=11,retrans=2,sec=sys,addr=172.17.42.1
/dev/.static/dev from /dev/root
Flags: rw,vers=3,rsize=4096,wsize=4096,hard,nolock,proto=udp,timeo=11,retrans=2,sec=sys,addr=172.17.42.1
zaphod:~# dd if=/dev/zero of=/zeros.out bs=256k count=1024
1024+0 Datensätze ein
1024+0 Datensätze aus
268435456 Bytes (268 MB) kopiert, 12,6867 Sekunden, 21,2 MB/s
Alles anzeigen
Jetzt den vdr Rechner herunterfahren und die Festplatte abklemmen. Dann booten und
Daumen drücken.
CLIENT
Ich nutze auch Swap über NFS:
erstellt die Datei /var/swap mit 128MB Größe.
Swapbereich initialisieren:
Ein Loopdevice generieren
und in die fstab eintragen:
Swap aktivieren:
Swap wird im normalen Betrieb per /etc/rc.local aktiviert:
chmod 755 /etc/rc.local
vi /etc/rc.local
# folgendes vor exit 0 einfügen
losetup /dev/loop/0 /var/swap
swapon /dev/loop/0
Mein vdr speichert die Aufnahmen im Verzeichnis /video, welches ebenfalls vom Server,
dort läuft dafür ein aus vier HDs bestehendes Software-RAID5, exportiert wird.
Anmerkungen
a. Kernel-Update
CLIENT
Einen neuen Kernel für den diskless vdr kompiliert man wie gewohnt. Mit "make
oldconfig" wird die alte Konfiguration auf den neuen Kernel übertragen.
client:/# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.16.tar.bz2
client:/# tar xjvf linux-2.6.16.tar.bz2 -C /usr/src
client:/# cd /usr/src
client:/usr/src# rm linux
client:/usr/src# ln -s linux-2.6.16 linux
client:/usr/src# cd linux
client:/usr/src/linux# make oldconfig
client:/usr/src/linux# make
client:/usr/src/linux# make modules_install install
Ggf. müssen bei einem Kernelwechsel auch die DVB Treiber und lirc (jeweils mit
make distclean) neu übersetzt werden.
SERVER
Nach dem "make install" des Kernels auf dem Client, muß man auf dem Server noch den
neuen Kernel in's tftpboot Verzeichnis kopieren:
server:/# cp /netboot/nfsroot/client/boot/vmlinuz-2.6.16 /var/lib/tftpboot/vmlinuz-2.6.16-client
und in die pxelinux.cfg Datei eintragen:
server:/# cat /var/lib/tftpboot/pxelinux.cfg/AC112A03
# client 172.17.42.3
LABEL linux
KERNEL vmlinuz-2.6.16-client
APPEND root=/dev/nfs nfsroot=172.17.42.4:/netboot/nfsroot/client,v3
IPAPPEND 1
b. Wake on Lan (WoL) mit reboot - nvram-wakeup
CLIENT
Das Motherboard PC-Chips M811 schaltet sich mit meiner Intel Netzwerkkarte nach einem
"shutdown -h now" derart ab, daß der Rechner nicht mehr per "Wake on Lan" (WoL)
aktiviert werden kann.
Dieses Manko existiert ab Kernel 2.6.18 nicht mehr (eventuell auch früher). Der Rechner
läßt sich nach einem "shutdown -h now" problemlos per WoL wecken. Der hier geschilderte
Workaround ist somit obsolet.
Mit ethtool ließ sich das Problem leider nicht beheben.
Durch einen Workaround läßt sich WoL aber trotzdem realisieren. Mittels des DOS
Programmes atxoff.com schaltet sich der Rechner jetzt so aus, daß er per WoL wieder
geweckt werden kann. Das Problem bei einem diskless System ist, daß sich diesem das
Programm nicht per Bootloader (lilo, grub,...) unterschieben läßt. Vielmehr muß dem
Server des diskless Rechners mitgeteilt werden, daß beim nächsten Booten atxoff.com
gestartet werden soll. Dieses wird nun dadurch realisiert, daß der Client per SSH ein Skript
auf dem Server startet, welches temporär die zu bootende Datei ändert.
Als User root wird ein SSH Schlüsselpaar mit leerer Passphrase generiert.
Anschließend kopiert man den öffentlichen Schlüssel auf den Server und fügt diesen der
Datei ".ssh/authorized_keys" des Nutzers user zu hinzu. Nun kann sich root vom Client auf
dem Server mittels SSH ohne Passwort einloggen. Im lokalen Netz ist diese
"Sicherheitslücke" vertretbar.
root@client:~$ ssh-keygen -t dsaroot@client:~$ scp .ssh/id_dsa.pub user@server:.root@client:~$ ssh user@server "[ ! -d .ssh ] && mkdir .ssh; cat id_dsa.pub >> .ssh/authorized_keys; chmod 600 .ssh/authorized_keys; rm id_dsa.pub"
SERVER
Auf dem Server wird der User, der vom Client per SSH genutzt wird, in die Gruppe "adm"
eingetragen. Ich nutze dies, damit ich auch als normaler User z.B. Logs lesen kann:
server:/# vigrserver:/# grep ^adm: /etc/groupadm:x:4:userserver:/# chgrp adm /var/lib/tftpboot/pxelinux.cfgserver:/# chmod 775 /var/lib/tftpboot/pxelinux.cfg
Nun wird die zuvor geladene Datei atxoff.com nach /var/lib/tftpboot/ kopiert:
server:/# cd /var/lib/tftpboot/server:/# ls -la atxoff.com-rw-r--r-- 1 root root 57 Feb 9 12:24 atxoff.com
Als nächstes erstellen wir zwei Konfigurationsdateien für das PXE booten:
server:/# cd /var/lib/tftpboot/pxelinux.cfg/server:/# ls -la-rw-rw-r-- 1 root adm 305 Feb 10 20:50 01-00-0e-xx-xx-xx-xx-rw-rw-r-- 1 root adm 212 Feb 9 12:27 01-00-0e-xx-xx-xx-xx.atxoff-rw-rw-r-- 1 root adm 305 Feb 10 20:49 01-00-0e-xx-xx-xx-xx.kernel
Die Zeichenfolge "00-0e-xx-xx-xx-xx" entspricht der MAC der Netzwerkkarte des diskless
Rechners. Die Dateien haben folgende Inhalte:
server:/# cat 01-00-0e-xx-xx-xx-xx# client 172.17.42.3LABEL linux KERNEL vmlinuz-2.6.15.5-client APPEND root=/dev/nfs nfsroot=172.17.42.4:/netboot/nfsroot/client IPAPPEND 1server:/# cat 01-00-0e-xx-xx-xx-xx.atxoff# client 172.17.42.3LABEL linux KERNEL atxoff.comserver:/# cat 01-00-0e-xx-xx-xx-xx.kernel# client 172.17.42.3LABEL linux KERNEL vmlinuz-2.6.15.5-client APPEND root=/dev/nfs nfsroot=172.17.42.4:/netboot/nfsroot/client IPAPPEND 1
"01-00-0e-xx-xx-xx-xx.kernel" ist die normale Bootconfiguration, die den Kernel lädt.
"01-00-0e-xx-xx-xx-xx.atxoff" veranlaßt die Netzwerkkarte atxoff.com zu booten und
auszuführen. Dies bewirkt das sofortige Abschalten des diskless Rechners. Dieser ist
dann problemlos per WoL aufweckbar. "01-00-0e-xx-xx-xx-xx" ist die jeweils aktuelle
Config-Datei und wird durch das gleich vorgestelle Skript eingestellt.
Jetzt wird die Datei " vdr_atxoff_workaround.sh" generiert, welche die Umschaltung
der PXE Configdateien vornimmt. Sie hat folgende Rechte und Inhalt:
server:/# ls -la /usr/local/sbin/vdr_atxoff_workaround.sh-rwxr-x--- 1 root adm 247 Feb 9 12:40 /usr/local/sbin/vdr_atxoff_workaround.shserver:/# cat /usr/local/sbin/vdr_atxoff_workaround.sh#!/bin/shcp /var/lib/tftpboot/pxelinux.cfg/01-00-0e-xx-xx-xx-xx.atxoff /var/lib/tftpboot/pxelinux.cfg/01-00-0e-xx-xx-xx-xxchmod 644 /var/lib/tftpboot/pxelinux.cfg/01-00-0e-xx-xx-xx-xxsleep 60cp /var/lib/tftpboot/pxelinux.cfg/01-00-0e-xx-xx-xx-xx.kernel /var/lib/tftpboot/pxelinux.cfg/01-00-0e-xx-xx-xx-xxchmod 644 /var/lib/tftpboot/pxelinux.cfg/01-00-0e-xx-xx-xx-xx
CLIENT
Jetzt kann der Client heruntergefahren werden, bootet automatisch atxoff.com und ist
per WoL aufweckbar:
nvram-wakeup mit reboot ist nach obiger Einrichtung nun problemlos möglich. Beispiel:
client:/# nvram-wakeup --directisa --configfile /etc/nvram-wakeup.conf --settime $((`date +%s` + 601))client:/# ssh user@server -f "/usr/local/sbin/vdr_atxoff_workaround.sh &"client:/# reboot
Zeile 1 setzt die Weckzeit des Motherboards 601 Sekunden in die Zukunft. Zeile 2 startet
auf dem Server das Skript vdr_atxoff_workaround.sh, welches nach dem reboot aus Zeile 3
den Client mittels atxoff.com abschaltet. Neustart erfolgt nun durch das nvram oder WoL.
Das oben erwähnte M811 von PC-Chips benötigt für nvram-wakeup keinen Reboot.
Siehe auch hier.
c. Client per debootstrap installieren
SERVER
Alternativ zur Installation des Clients auf eine Festplatte und das daran anschließende Umkopieren
auf den Server, kann man den Client mit debootstrap auch direkt auf dem Server installieren. Auf
dem (Debian) Server wird dazu das Paket debootstrap aufgespielt.
aptitude install debootstrap
mkdir /netboot/nfsroot/vdr_etch
debootstrap --arch i386 etch /netboot/nfsroot/vdr_etch/ http://ftp.de.debian.org/debian/
#
chroot /netboot/nfsroot/vdr_etch/
aptitude update
aptitude install locales console-common
#
dpkg-reconfigure console-data # de-latin1-nodeadkeys
dpkg-reconfigure locales # [*] de_DE@euro ISO-8859-15
# dpkg-reconfigure console-setup # Ubuntu 8.04
# /usr/share/locales/install-language-pack de_DE # Ubuntu 8.04
# /usr/share/locales/install-language-pack de_DE.UTF-8 # Ubuntu 8.04
# dpkg-reconfigure tzdata # Ubuntu 8.04
#
# uid und gid für Nutzer vdr wie auf Server festlegen
# Beispiel:
# /etc/passwd: vdr:x:103:104:VDR user,,,:/var/lib/vdr:/bin/false
# /etc/group : vdr:x:104:
#
vipw
vigr
#
aptitude install openssh-server anacron less vim mc portmap ntp rsync powernowd exim4 mutt bzip2 build-essential libncurses5-dev kernel-package
#
echo "127.0.0.1 localhost" > /etc/hosts
echo "vdr" > /etc/hostname
cat >> /etc/network/interfaces << EOF
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet manual
EOF
#
cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime
#
mkdir /video
echo "#" > /etc/fstab
cat >> /etc/fstab << EOF
# /etc/fstab: static file system information.
#
proc /proc proc defaults 0 0
server:/netboot/nfsroot/vdr_etch/ / nfs defaults 0 0
/dev/loop/0 none swap sw,noauto 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
server:/video /video nfs defaults 0 0
EOF
#
passwd
#
adduser kilroy
#
cd /usr/src/
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.23.8.tar.bz2
# wget http://www.on-luebeck.de/kilroy/debian_etch_howto/powernow-k7-manual-2.6.23_enev_kilroy.patch.gz # notwendig für AMD Geode NX 1750
tar xjf linux-2.6.23.8.tar.bz2
ln -s linux-2.6.23.8 linux
cd linux
# zcat ../powernow-k7-manual-2.6.23_enev_kilroy.patch.gz | patch -b -p0 # notwendig für AMD Geode NX 1750
make menuconfig # ich kompiliere i.A. alles Notwendige bis auf die DVB, powernow und lirc Treiber fest in den Kernel
# wget http://www.on-luebeck.de/kilroy/debian_etch_howto/config-2.6.23.zaphod -O .config # Achtung! Diese .config ist speziell für meinen diskless VDR
# make oldconfig
make-kpkg --revision=vdr1 kernel_image
dpkg -i ../linux-image-2.6.23.8_vdr1_i386.deb
exit # chroot verlassen
Alles anzeigen
Jetzt noch auf dem Server tftp passend konfigurieren (s.o.) und das neue System kann
vom diskless Client gebootet werden.
Hilfreiche Quellen:
http://syslinux.zytor.com/pxe.php
http://www.linuxdevices.com/articles/AT5834950453.html
http://www.faqs.org/docs/Linux…root-NFS-other-HOWTO.html
Optimizing NFS Performance
Tips von MAK:
Plattenloses Linux
HOWTO set up a Network with Diskless Workstations using Debian GNU/Linux
Dateien vorbereiten für TFTP-Netzwerk-Boot
Booten und Konfiguration im Netz
LTSP - Linux Terminal Server Project - v3.0
Links zu nvram-wakeup:
http://www.linux-magazin.de/Ar…004/08/wakeup/wakeup.html
http://www.vdr-wiki.de/wiki/index.php/NVRAM_WakeUp
http://www.hubertus-sandmann.h…-online.de/vdr_wakeup.htm