Nov 272011
 

Dateisystemstruktur

OpenElec.tv ist sehr genügsam, was die Verzeichnisstruktur angeht. Es benötigt genau zwei Dateien und ein Ablageverzeichnis. Die Dateien sind einmal der Kernel und zum anderen die SYSTEM-Datei. Hierbei handelt es sich um ein Squashfs-Filesystem, dass das komplette root-Dateisystem beinhaltet. Die KERNEL Datei beinhaltet den Linux-Kernel an und für sich und eine XZ-gepackte Version des Initramfs. Im Initramfs werkelt eine kleine Busybox um für den späteren Betrieb alles vorzubereiten.

Um per PXE zu booten sind allerdings dann doch noch ein paar mehr Dateien und Einstellungen notwendig. Diese sind im folgenden:

[f] /etc/nbd-server/default
[f] /etc/exports
[f] /etc/default/tftpd-hpa
[d] /etc/tftpd
[f] /etc/tftpd/tftpd.remap
[d] /srv/media/tftp/xbmc
[f] /srv/media/tftp/xbmc/pxelinux.0
[f] /srv/media/tftp/xbmc/pxelinux.cfg/default
[f] /srv/media/tftp/xbmc/pxelinux.cfg/KERNEL
[f] /srv/media/tftp/xbmc/pxelinux.cfg/SYSTEM
[d] /srv/media/storage

Einstellungen für den DHCP-Server

Ich betreibe bei mir 2 DHCP-Server im gleichen Subnetz. Einer ist meine Fritz-Box und liefert einem einfach frech und munter eine IP mit der man dann loslegen kann zu surfen. Den zweiten DHCP-Server habe ich auf meinem Debian-Server aufgesetzt und er ist nur dafür zuständig TFTP-Boot-Informationen zu verteilen.

Warum das funktioniert und sich nicht in die Quere kommt? Das liegt am PXE-Boot-Protokoll. Versucht ein Gerät über PXE zu booten setzt es beim DHCP-Discover die DHCP-Option 60 auf den Wert “PXEClient”. Das Protokoll wartet daraufhin auf entsprechende DHCP-Offers. Sowohl meine Fritz-Box als auch mein Debian-Server schicken jetzt eine Antwort.Das Gerät das per PXE booten will nimmt jetzt die Offer an, bei der sie die Optionen filename und next-server (optional) findet.

Nachdem meine Fritz-Box diese Parameter nicht kennt und setzen kann, wird das Angebot vom Client nicht angenommen und die zugewiesene IP des Servers per DHCP-Request und DHCP-ACK zugewiesen.

Ist der Client danach per PXE gestartet führt er einen neuen DHCP-Request durch und setzt dieses Mal die Option 60 nicht. Jetzt würden wieder beide DHCP-Server antworten und ich wüsste nicht, welcher gewinnt. Um hier deterministisch zu sein habe ich meinen Debian-Server so eingestellt, dass er nur und ausschliesslich antwortet, wenn DHCP-Option 60 gesetzt ist.

Das funktioniert über die “allow members” Regeln

meine /etc/dhcp/dhcpd.conf sieht wie folgt aus

class "pxe" {
  match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
}
 
subnet 10.16.1.0 netmask 255.255.255.0 {
  option routers fritz.box;
  option broadcast-address 10.16.1.255;
  pool {
    filename "pxelinux.0";
    allow members of "pxe";
    next-server 10.16.1.15;
    range 10.16.1.65 10.16.1.70;
  }
  host xmbc {
    hardware ethernet 00:1c:85:40:24:14;
    filename "xbmc/pxelinux.0";
  }
}

Einstellungen für den NFS-Server

Der NFS-Server benötigt bei mir folgende Shares:

/srv/media/tftp/xbmc  10.16.1.0/24(no_root_squash,rw,async,no_subtree_check)
/srv/media/tftp/xbmc/sys  10.16.1.0/24(no_root_squash,rw,async,no_subtree_check)
/srv/media/storage  10.16.1.0/24(no_root_squash,rw,async,no_subtree_check)

Einstellungen für den NBD-Server

Falls jemand einen NBD-Server einsetzen will benötigt er folgende Einstellungen:

Settings für NBD muss ich noch ergänzen

Einstellungen des TFTP-Servers

erstmal die /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/media/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -m /etc/tftpd/tftpd.remap -vvv --secure"

Die Datei /etc/tftpd/tftpd.remap kann leer sein, muss aber zumindest existieren. Ich habe sie schon mal vorgesehen, da ich als nächstes noch mein Windows 7 per PXE booten möchte, und da sind ein paar mehr Anpassungen notwendig.

Ganz wichtig ist auch noch der Inhalt der Datei /srv/media/tftp/xbmc/pxelinux.cfg/default. In dieser Datei wird eingestellt, welchen Kernel das System laden soll und welches Root-Dateisystem im Anschluss daran gestartet werden soll. Das hängt ab davon, ob man den Export per NFS oder per NBD-Server machen möchte. Hier das Beispiel für NFS

DEFAULT linux
LABEL linux
kernel /KERNEL
append ip=dhcp boot=NFS=10.16.1.15:/srv/media/tftp/xbmc/sys i8042.noaux disk=NFS=10.16.1.15:/srv/media/storage vga=792 quiet console=tty1 vt.cur_default=1 video=uvesafb:ywrap,mtrr:3,1280x720-32
# video=uvesafb:ywrap,mtrr:3,1280x720-32 splash=silent,theme:xbmc-confluence-shiny console=tty1 fastboot loglevel=0 acpi_enforce_resources=lax vt.cur_default=1

Wichtig ist tatsächlich die doppelte Formulierung boot=NFS=. Alternativ dazu kann man auch boot=NBD= wählen. Das gleiche gilt auch für den Storage Bereich von OpenElec, der ebenfalls entweder per NFS oder per NBD zur Verfügung gestellt werden kann.

Diese Einstellungen sind nur für den Kernel gültig der unter oben genannten Link heruntergeladen werden kann. Andere Kernel enthalten vermutlich ein anderes initramfs und verwenden hier teils andere Bezeichnungen. Leider sind hier die verschiedenen Versionen von OpenElec.TV bislang nicht konsistent zueinander. Das mag auch daran liegen, dass das PXE-Feature nicht so viel Verbreitung findet.

Was mir bislang leider noch nicht gelungen ist, ist das richtige darstellen des Splash-Screens. Das ist aber ein generelles Problem zwischen dem NVIDIA-Kernel Treiber und der Umsetzung von Plymouth und dem Framebuffer. Es gibt hierzu einige Workarounds, die vorallem darauf basieren Grub2 als PXE-Loader anstelle von Syslinux zu verwenden. Ehrlich gesagt haben mir hierzu aber noch die Nerven gefehlt.