Diskless Workstation: Unterschied zwischen den Versionen

Aus wiki.archlinux.de
Wolgeorg (Diskussion | Beiträge)
Wolgeorg (Diskussion | Beiträge)
 
(301 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Artikelstil}}
{{inuse|[[Benutzer:Wolgeorg|Wolgeorg]] ([[Benutzer Diskussion:Wolgeorg|Diskussion]])}}
''„Diskless-Workstation“ bezeichnet einen Computer, der über keine eigenen Festplatten verfügt und sowohl Betriebssystem als auch Daten von einem oder mehreren Servern über ein Netzwerk bezieht.'' (Wikipedia)
''„Diskless-Workstation“ bezeichnet einen Computer, der über keine eigenen Festplatten verfügt und sowohl Betriebssystem als auch Daten von einem oder mehreren Servern über ein Netzwerk bezieht.'' (Wikipedia)


== Vorbemerkungen ==
Um die in der Wikipedia Einleitung genannte Funktionalität zu erreichen wird u. a. von der Technik [[Preboot_eXecution_Environment|('''P''')reboot e('''X''')ecution ('''E''')nvironment]] (''PXE'') Gebrauch gemacht.<br />In dem ''PXE''-Artikel wird die ''Funktionsweise'' beschrieben.
Auf Grund der Einführung von [[Wechsel_von_Sysvinit_zu_systemd|systemd]] {{Sprache|de}} und [[Netctl|netctl]] {{Sprache|de}} sind einige Anleitungen zu dem oben genannten Thema nicht mehr aktuell.


Einige Hinweise zu der [[Preboot_eXecution_Environment#Funktionsweise|Funktionsweise]] {{Sprache|de}} von ('''P''')reboot e('''X''')ecution ('''E''')nvironment ('''PXE''') findet sich in dem entsprechenden Beitrag.
Der Artikel nennt auch Einsatzmöglichkeiten:


'''NFSv4''': Bei dem Beitrag '''Mkinitcpio''' unter dem Punkt [https://wiki.archlinux.org/index.php/Mkinitcpio#Using_net Mkinitcpio#Using_net] {{Sprache|en}} bringt dieses Ergebnis:
* Ein Notfallsystem auszuliefern
{{Achtung|NFSv4 is not yet supported.}}
* Ein Installationsmedium auszuliefern
(Stand: 28.06.2013)
* '''Eine komplette Systemumgebung über das Netzwerk auszuliefern'''


Somit bleibt dieser Punkt unberücksichtigt, bis eine Änderung eingetreten ist. Wenn jemand '''NFSv4''' einsetzen will, auch wenn das Paket '''mkinitcpio-nfs-utils''' für {{ic|1=net}} installiert ist, wird spätestens beim Bau von ''initramfs-linux.img'' und ''initramfs-linux-fallback.img'' mit '''Mkinitcpio''' Probleme bekommen.
Um eine „Diskless-Workstation“ zu betreiben wird die letztgenannte Möglichkeit genutzt. Ebenso müssen mehrere Dienste auf dem Server gestartet und konfiguriert werden. Auf Grund des Wechsels von Sysvinit zu systemd und Einführung von [[Netctl|netctl]] sind einige Artikel, die sich meist ausführlicher mit hier genannten Programmen oder Diensten beschäftigen, nicht mehr aktuell. Dieser Artikel trägt dem Umstand Rechnung.


'''mkarchroot''' wird genauer erläutert. Von diesem Befehl gibt es keine manpage nur die "'''-h'''" Hilfeausgabe.
Die folgenden Punkte sollten vor einer Installation beachtet werden:


'''pacstrap''': Hier gilt das gleiche wie für mkarchroot.  
{{hinweis|Für die Umsetzung dieses Artikel sollte beim Anwender eine größere Erfahrung mit Linux vorhanden sein.}}


'''Verzeichnisstruktur''': Beim anlegen sollte folgendes beachtet werden:
* '''NFSv4''': Bei dem Artikel '''Mkinitcpio''' unter dem Punkt [https://wiki.archlinux.org/index.php/Mkinitcpio#Using_net #Using_net] bringt dieses Ergebnis:
{{Achtung|NFSv4 is not yet supported.}}* (Stand: 28.06.2013)<br />Somit bleibt dieser Punkt unberücksichtigt, bis eine Änderung eingetreten ist. Wenn jemand ''NFSv4'' einsetzen will, auch wenn das Paket ''mkinitcpio-nfs-utils'' für {{ic|1=net}} installiert ist, wird spätestens beim Bau von ''initramfs-linux.img'' und ''initramfs-linux-fallback.img'' mit ''Mkinitcpio'' Probleme bekommen.


"'''Viele ziehen es vor, das Boot-System in {{ic|1=/var/lib/tftpboot}} anzulegen, und unter {{ic|1=/srv/nfs}} anschließend die Dateisysteme der Ziel-Rechner anzulegen, allerdings hat dies den Nachteil, das vom Clientsystem aus anschließend kein Kernelupdate durchgeführt werden kann. Der Vorteil ist eine erhöhte Sicherheit, da man via TFTP auf sämtliche Unterverzeichnisse Zugriff hat! Dies ist abzuwägen anhand der eigenen Paranoia. Sollten in einem Netz viele Fremde unterwegs sein, ist es im Interesse der Sicherheit anzuraten, nicht {{ic|1=/srv/nfs}} auch für den Bootloader zu verwenden!'''"
* '''mkarchroot''' wird genauer erläutert. Von diesem Befehl gibt es keine manpage nur die &bdquo;'''-h'''&ldquo; Hilfeausgabe.


Quelle: [[Preboot_eXecution_Environment|Preboot eXecution Environment]] {{Sprache|de}}
* '''pacstrap''': Hier gilt das gleiche wie für ''mkarchroot''.
 
* '''Verzeichnisstruktur''': Beim Anlegen sollte folgendes beachtet werden:<br />&bdquo;'''Viele ziehen es vor, das Boot-System in {{ic|1=/var/lib/tftpboot}} anzulegen, und unter {{ic|1=/srv/nfs}} anschließend die Dateisysteme der Ziel-Rechner anzulegen, allerdings hat dies den Nachteil, das vom Clientsystem aus anschließend kein Kernelupdate durchgeführt werden kann. Der Vorteil ist eine erhöhte Sicherheit, da man via TFTP auf sämtliche Unterverzeichnisse Zugriff hat! Dies ist abzuwägen anhand der eigenen Paranoia. Sollten in einem Netz viele Fremde unterwegs sein, ist es im Interesse der Sicherheit anzuraten, nicht {{ic|1=/srv/nfs}} auch für den Bootloader zu verwenden!'''&ldquo;<br />Das Zitat stammt aus dem '''PXE'''-Artikel
 
*'''Rechner-Architektur''': Für jede (i686, x86_64, PowerPC, AMD ....) empfiehlt es sich ein eigenes Verzeichnis für die Ziel-Rechner anzulegen. Es wird gezeigt wie dies mit einer entsprechend angepassten pacman.conf erreicht werden kann. Aufgrund der obigen Informationen wird das '''Boot'''-System im Verzeichnis {{ic|1=/srv/tftp}} installiert. Die Dateisysteme für die Ziel-Rechner werden im '''Root'''-Verzeichnis {{ic|1=/srv/arch/linux_i686}} für die i686-Architektur installiert.
-----


'''Rechner-Architektur''': Für jede (i686, x86_64, PowerPC, AMD ....) empfiehlt es sich ein eigenes Verzeichnis für die Ziel-Rechner anzulegen. Es wird gezeigt wie dies mit einer entsprechend angepassten pacman.conf erreicht werden kann. Aufgrund der obigen Informationen wird das '''Boot'''-System im Verzeichnis {{ic|1=/srv/tftp}} installiert. Die Dateisysteme für die Ziel-Rechner werden im '''Root'''-Verzeichnis {{ic|1=/srv/arch/linux_i686}} für die i686-Architektur installiert.


== Die Server Konfiguration ==
== Die Server Konfiguration ==
Zunächst einmal müssen wir die folgenden Komponenten installieren:
Zunächst einmal muss man die folgenden Komponenten installieren:


Einen [[Dhcpd|DHCP]] Server {{Sprache|de}} um den Ziel-Rechnern IP Adressen zuweisen zu können.
Einen [[Dhcpd|DHCP]] Server um den Ziel-Rechnern IP Adressen zuweisen zu können.


Einen [[Tftp-hpa|TFTP]] Server {{Sprache|de}} um die Bootimages zu den Ziel-Rechnern übertragen zu können. (Eine optionale Voraussetzung für alle PXE ROMs).
Einen [[Tftp-hpa|TFTP]] Server um die Bootimages zu den Ziel-Rechnern übertragen zu können. (Eine optionale Voraussetzung für alle PXE ROMs).


Eine Art von Netzwerkspeicher (entweder [[Network_File_System|NFS]] {{Sprache|de}} oder NBD) um die Arch Installation zu den Ziel-Rechnern exportieren zu können.
Eine Art von Netzwerkspeicher (entweder [[Network_File_System|NFS]] oder [[Verschl%C3%BCsseltes_Verzeichnis|NBD]]) um die Arch Installation zu den Ziel-Rechnern exportieren zu können.
{{Hinweis|{{Paket|dnsmasq}} [[Bild:Arch_Paket.png]] kann gleichzeitig sowohl als DHCP- und als TFTP-Server eingesetzt werden. Weitere Informationen finden Sie im [[Dnsmasq|dnsmasq]] Artikel. {{Sprache|de}}}}
{{Hinweis|{{Paket|dnsmasq}} kann gleichzeitig sowohl als DHCP- und als TFTP-Server eingesetzt werden. Weitere Informationen sind im Artikel [[Dnsmasq|dnsmasq]] zu finden.}}
=== DHCP Server ===
=== DHCP Server ===
Installiere ISC {{Paket|dhcp}} [[Bild:Arch_Paket.png]] auf dem Server und konfiguriere ihn.
ISC {{Paket|dhcp}} muss auf dem Server installiert und konfiguriert werden.


{{hc|# vim /etc/dhcpd.conf|2=
{{hc|# vim /etc/dhcpd.conf|2=
<nowiki>allow booting;
allow booting;
allow bootp;
allow bootp;


Zeile 49: Zeile 51:


group {
group {
     next-server 10.0.0.1;
     <span style{{=}}"background-color:lightgrey;">next-server</span> 10.0.0.1;


     if option architecture = 00:07 {
     if option architecture = 00:07 {
Zeile 61: Zeile 63:
         range 10.0.0.128 10.0.0.254;
         range 10.0.0.128 10.0.0.254;
     }
     }
}</nowiki>}}
}}


{{Hinweis|{{ic|next-server}} sollte die IP-Adresse des TFTP Servers sein; alles andere sollte entsprechend geändert werden, um zu Ihrem Netzwerk zu passen.}}
{{Hinweis|{{ic|next-server}} sollte die IP-Adresse des TFTP-Servers sein; alles andere sollte entsprechend geändert werden, damit es zum eigenen Netzwerk passt.}}


{{Hinweis|{{ic|filename "/grub/i386-pc/core.0";}} Diese Zeile kann sich in Bezug auf den Boot-Loader syslinux noch verändern.}}
{{Hinweis|{{ic|filename "/grub/i386-pc/core.0";}} Diese Zeile kann sich in Bezug auf den Boot-Loader [[Diskless_Workstation#Pxelinux|#Pxelinux]] noch verändern.}}


RFC 4578 definiert die "Art der System Architektur des Ziel-Rechners" in der dhcp Option. In der obigen Konfiguration, sollte der PXE Ziel-Rechner ein x86_64-efi Bootimage (Typ 0x7) anfordern, wir ihm das passende übertragen, ansonsten wird auf ein i686 Bootimage zurück gegriffen. Dies erlaubt beides, sowohl einem UEFI Ziel-Rechner als auch einem Ziel-Rechner mit älterem BIOS simultan über das selbe Netwerksegment zu booten.
RFC 4578 definiert die &bdquo;Art der System Architektur des Ziel-Rechners&ldquo; in der DHCP Option. In der obigen Konfiguration, sollte der PXE Ziel-Rechner ein x86_64-efi Bootimage (Typ 0x7) anfordern, wird ihm das passende übertragen, ansonsten wird auf ein i686 Bootimage zurück gegriffen. Dies erlaubt beides, sowohl einem UEFI Ziel-Rechner als auch einem Ziel-Rechner mit älterem BIOS simultan über das selbe Netzwerksegment zu booten.


Starte den ISC DHCP per [[Wechsel_von_Sysvinit_zu_systemd|systemd]] Service. {{Sprache|de}}
Man muss den ISC DHCP per [[systemd]] starten.


  # systemctl start dhcpd4.service
  # systemctl start dhcpd4.service
Zeile 77: Zeile 79:
  # systemctl status dhcpd4.service
  # systemctl status dhcpd4.service


Hier sollte alles im grünen Bereich sein. (Wie das Beispiel zeigt:)
Hier sollte alles im <span style="color:green;">grünen</span> Bereich sein. (Wie das Beispiel zeigt:)


{{shell|# systemctl status dhcpd4.service|2=dhcpd4.service - IPv4 DHCP server
{{hc|# systemctl status dhcpd4.service|2=dhcpd4.service - IPv4 DHCP server
   Loaded: loaded (/usr/lib/systemd/system/dhcpd4.service; disabled)
   Loaded: loaded (/usr/lib/systemd/system/dhcpd4.service; disabled)
   Active: active (running) since Fr 2013-06-28 23:03:06 CEST; 17s ago
   Active: <span style{{=}}"color:green;">active (running)</span> since Fr 2013-06-28 23:03:06 CEST; 17s ago
   Process: 419 ExecStart=/usr/sbin/dhcpd -4 -q -pf /run/dhcpd4.pid (code=exited, status=0/SUCCESS)
   Process: 419 ExecStart=/usr/bin/dhcpd -4 -q -pf /run/dhcpd4.pid (code=exited, status=0/SUCCESS)
  Main PID: 420 (dhcpd)
  Main PID: 420 (dhcpd)
   CGroup: name=systemd:/system/dhcpd4.service
   CGroup: name=systemd:/system/dhcpd4.service
           └─420 /usr/sbin/dhcpd -4 -q -pf /run/dhcpd4.pid}}
           └─420 /usr/bin/dhcpd -4 -q -pf /run/dhcpd4.pid}}


=== TFTP Server ===
=== TFTP-Server ===
Installiere {{Paket|tftp-hpa}}-hpa [[Bild:Arch_Paket.png]] auf dem Server und konfiguriere ihn.
{{Paket|tftp-hpa}} muss auf dem Server installiert und konfiguriert werden.


Der TFTP Server wird gebraucht um den Bootloader, den Kernel, und das Initramfs zum Ziel-Rechner zu übertragen.
Der TFTP-Server wird gebraucht um den Bootloader, den Kernel, und das initramfs zum Ziel-Rechner zu übertragen.


Erstelle die Datei entsprechend diesem Muster:
Die Datei sollte entsprechend diesem Muster erstellt werden:


{{hc||2=[Unit]
{{hc||2=[Unit]
Zeile 98: Zeile 100:


[Service]
[Service]
ExecStart=/usr/sbin/in.tftpd -s /srv/tftp/
ExecStart=/usr/bin/in.tftpd -s /srv/tftp/
StandardInput=socket
StandardInput=socket
StandardOutput=inherit
StandardOutput=inherit
StandardError=journal}}
StandardError=journal}}
Weitere Informationen befinden sich im [[Tftp-hpa|Tftpd]] Server Artikel {{Sprache|de}} zur Installation und Konfiguration.


Die erstellte Datei wird auf dem Server im Pfad {{ic|/etc/systemd/system/}} unter dem Namen {{ic|tftpd.service}} gespeichert.
Die erstellte Datei wird auf dem Server im Pfad {{ic|/etc/systemd/system/}} unter dem Namen {{ic|tftpd.service}} gespeichert.


Starte den TFTP Server per [[Wechsel_von_Sysvinit_zu_systemd|systemd]] Service. {{Sprache|de}}
Der TFTP-Server muss per systemd gestartet werden.


  # systemctl start tftpd.socket tftpd.service
  # systemctl start tftpd.socket tftpd.service
Zeile 117: Zeile 118:
Das ganze sollte so ausssehen:
Das ganze sollte so ausssehen:


{{shell|tftpd.socket|2=
{{hc|tftpd.socket|2=
         Loaded: loaded (/usr/lib/systemd/system/tftpd.socket; disabled)
         Loaded: loaded (/usr/lib/systemd/system/tftpd.socket; disabled)
         Active: active (listening) since Fr 2013-06-28 23:09:01 CEST; 27s ago
         Active: <span style{{=}}"color:green;">active (listening)</span> since Fr 2013-06-28 23:09:01 CEST; 27s ago
         Listen: [::]:69 (Datagram)
         Listen: [::]:69 (Datagram)
}}
}}


{{shell|tftpd.service - hpa's original TFTP daemon|2=
{{hc|tftpd.service - hpa's original TFTP daemon|2=
         Loaded: loaded (/etc/systemd/system/tftpd.service; static)
         Loaded: loaded (/etc/systemd/system/tftpd.service; static)
         Active: active (running) since Fr 2013-06-28 23:09:01 CEST; 14s ago
         Active: <span style{{=}}"color:green;">active (running)</span> since Fr 2013-06-28 23:09:01 CEST; 14s ago
         Main PID: 425 (in.tftpd)
         Main PID: 425 (in.tftpd)
         CGroup: name=systemd:/system/tftpd.service
         CGroup: name=systemd:/system/tftpd.service
                 └─425 /usr/sbin/in.tftpd -s /srv/arch/boot
                 └─425 /usr/bin/in.tftpd -s /srv/arch/boot


}}
}}


=== Netzwerkspeicher ===
=== Netzwerkspeicher ===
Der primäre Unterschied zwischen der Verwendung von NFS und NBD ist, während es mit beiden in der Tat möglich ist, das mehrere Ziel-Rechner die selbe Installation nutzen können, mit NBD jedoch (aufgrund der direkten Art der Manipulation des Dateisystems) benötigen Sie den {{ic|copyonwrite}} Modus um dies zu erreichen, was zum verwerfen jeglichen Schreibzugriffes führt, wenn sich der Ziel-Rechner abmeldet. In einigen Situationen könnte dies jedoch sehr wünschenswert sein.
Der primäre Unterschied zwischen der Verwendung von NFS und NBD ist, während es mit beiden in der Tat möglich ist, das mehrere Ziel-Rechner die selbe Installation nutzen können, mit NBD jedoch (aufgrund der direkten Art der Manipulation des Dateisystems) wird der {{ic|copyonwrite}} Modus benötigt, um dies zu erreichen, was zum Verwerfen jeglicher Schreibzugriffe führt, wenn sich der Ziel-Rechner abmeldet. In einigen Situationen könnte dies jedoch gewünscht sein.
==== NFS Server ====
==== NFS Server ====


Installiere {{Paket|nfs-utils}} [[Bild:Arch_Paket.png]] auf dem Server. {{Sprache|de}}
{{Paket|nfs-utils}} muss auf dem Server installiert und konfiguriert werden.


===== NFSv3 =====
===== NFSv3 =====


Das Root-Verzeichnis der jeweiligen arch-Installation muss in in die [[Network_File_System|NFS]] exports-Datei eintragen werden. {{Sprache|de}}
Das Root-Verzeichnis der jeweiligen arch-Installation muss in die '''NFS''' exports-Datei eintragen werden.


{{hc|# vim /etc/exports|2=
{{hc|# vim /etc/exports|2=
/srv/arch *(rw,no_root_squash,no_subtree_check,sync)}}
/srv/arch/linux_i686 *(rw,no_root_squash,no_subtree_check,<span style{{=}}"background-color:lightgrey;">sync</span>)}}


{{hinweis|Wenn Du nicht über Datenverlust im Falle von Netzwerk- und / oder Server-Ausfällen besorgt bist, ersetze sync durch async --zusätzliche Optionen finden sich im [[Network_File_System|NFS]] Artikel. {{Sprache|de}}}}
{{hinweis|Ist man nicht über Datenverlust im Falle von Netzwerk- und / oder Server-Ausfällen besorgt, ersetzt man <span style{{=}}"background-color:lightgrey;">sync</span> durch <span style{{=}}"background-color:lightgrey;">async</span> --zusätzliche Optionen finden sich im ''NFS'' Artikel. Die Option <span style{{=}}"background-color:lightgrey;">sync</span> bietet sich an wenn man bei Schreibzugriffen sicher stellen möchte, das die Daten korrekt gespeichert werden, diese Einstellung geht jedoch zu Lasten der Geschwindigkeit. Die Option <span style{{=}}"background-color:lightgrey;">async</span> sollte bei ausschließlich lesenden Zugriffen benutzt werden, da dies die Geschwindigkeit steigert, die Sicherheit kann in diesem Fall vernachlässigt werden.}}


Als Nächstes starte den [https://wiki.archlinux.org/index.php/NFSv3 NFSv3] Server: {{Sprache|en}}
Als Nächstes muss man den [https://wiki.archlinux.org/index.php/NFSv3 NFSv3] Server starten: {{Sprache|en}}


  # systemctl start rpc-mountd rpc-statd
  # systemctl start rpcbind.service
# systemctl start nfs-server.service
# systemctl start rpc-statd.service


Die Überprüfung:
Die Überprüfung:


  # systemctl status rpc-mountd
  # systemctl status rpcbind.service
  # systemctl status rpc-statd
# systemctl status nfs-server.service
  # systemctl status rpc-statd.service


Das Ergebnis:
Das Ergebnis:


{{shell|rpc-mountd.service - NFS Mount Daemon|2=
{{hc|● rpcbind.service - RPC bind service|2=
   Loaded: loaded (/usr/lib/systemd/system/rpc-mountd.service; disabled)
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: disabled)
   Active: active (running) since Fr 2013-06-28 23:22:03 CEST; 18s ago
   Active: <span style{{=}}"color:green;">active (running)</span> since Ta Jahr-Mo-Ta YY:ZZ:VV CEST; 2h 33min ago
  Process: 461 ExecStart=/usr/bin/rpc.mountd $MOUNTD_OPTS (code=exited, status=0/SUCCESS)
  Main PID: 446 (rpcbind)
  Main PID: 462 (rpc.mountd)
   CGroup: /system.slice/rpcbind.service
   CGroup: name=systemd:/system/rpc-mountd.service
           └─446 /usr/bin/rpcbind -w
           └─462 /usr/bin/rpc.mountd}}


{{shell|rpc-statd.service - NFSv2/3 Network Status Monitor Daemon|2=
Mon XX YY:ZZ:VV server.local systemd[1]: Starting RPC bind service...
   Loaded: loaded (/usr/lib/systemd/system/rpc-statd.service; disabled)
Mon XX YY:ZZ:VV server.local systemd[1]: Started RPC bind service.}}
   Active: active (running) since Fr 2013-06-28 23:22:03 CEST; 36s ago
 
  Process: 435 ExecStart=/usr/bin/rpc.statd $STATD_OPTS (code=exited, status=0/SUCCESS)
{{hc|● nfs-server.service - NFS server and services|2=
  Main PID: 437 (rpc.statd)
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
   CGroup: name=systemd:/system/rpc-statd.service
   Active: <span style{{=}}"color:green;">active (exited)</span> since Ta Jahr-Mo-Ta YY:ZZ:VV CEST; 2h 40min ago
           └─437 /usr/bin/rpc.statd}}
Main PID: 452 (code=exited, status=0/SUCCESS)
  CGroup: /system.slice/nfs-server.service
 
Mon XX YY:ZZ:VV server.local systemd[1]: Starting NFS server and services...
Mon XX YY:ZZ:VV server.local systemd[1]: Started NFS server and services.}}
 
{{hc|● rpc-statd.service - NFS status monitor for NFSv2/3 locking.|2=
  Loaded: loaded (/usr/lib/systemd/system/rpc-statd.service; static; vendor preset: disabled)
  Active: <span style{{=}}"color:green;">active (running)</span> since Ta Jahr-Mo-Ta YY:ZZ:VV CEST; 2h 43min ago
  Main PID: 448 (rpc.statd)
   CGroup: /system.slice/rpc-statd.service
           └─448 /usr/sbin/rpc.statd --no-notify
 
Mon XX YY:ZZ:VV server.local systemd[1]: Starting NFS status monitor for NFSv2/3 locking....
Mon XX YY:ZZ:VV server.local rpc.statd[448]: Version 1.3.2 starting
Mon XX YY:ZZ:VV server.local rpc.statd[448]: Flags: TI-RPC
Mon XX YY:ZZ:VV server.local rpc.statd[448]: Running as root. chown /var/lib/nfs to choose different user
Mon XX YY:ZZ:VV server.local systemd[1]: Started NFS status monitor for NFSv2/3 locking..}}


===== NBD =====
===== NBD =====


Installiere {{Paket|nbd}} [[Bild:Arch_Paket.png]] auf dem Server und konfiguriere ihn.
{{Paket|nbd}} muss auf dem Server installiert und konfiguriert werden.


{{hc|# vim /etc/nbd-server/config|2=
{{hc|# vim /etc/nbd-server/config|2=
Zeile 186: Zeile 206:
     copyonwrite = false
     copyonwrite = false
}}
}}
{{hinweis|Setze {{ic|copyonwrite}} auf "wahr" falls Sie möchten das mehrere Ziel-Rechner das NBD Verzeichnis gleichzeitig nutzen; geben Sie man 5 nbd-server für mehr Details auf der Konsole ein.}}
{{hinweis|Man muss {{ic|copyonwrite}} auf &bdquo;true&ldquo; setzen falls mehrere Ziel-Rechner das NBD Verzeichnis gleichzeitig nutzen sollen; man gebe {{ic|1=man 5 nbd-server}} ein für mehr Details zur Ausgabe auf der Konsole.}}


Starte [[Verschl%C3%BCsseltes_Verzeichnis|nbd]] {{Sprache|de}} per [[Wechsel_von_Sysvinit_zu_systemd|systemd]] {{Sprache|de}} Service.
nbd muss per systemd gestartet werden.


  # systemctl start nbd.service
  # systemctl start nbd.service
Zeile 197: Zeile 217:


Das Ergebnis:
Das Ergebnis:
{{shell||2=
{{hc||2=
(Wer NBD benutzt trage bitte hier die entsprechende Konsolenausgabe nach den obigen Beispielen ein.)}}
(Wer NBD benutzt trage bitte hier die entsprechende Konsolenausgabe nach den obigen Beispielen ein.)}}
Bisher wurden die Server/Dienste erst ein Mal &bdquo;nur&ldquo; gestartet. Damit diese beim Booten aktiviert werden muss man &bdquo;start&ldquo; durch &bdquo;enable&ldquo; ersetzen. Um dieses Setup zu testen reicht ein starten zunächst aus. Läuft alles wie gewünscht können die Server/Dienste dann beim Booten aktiviert werden.


== Zielrechner Installation / Konfiguration ==
== Zielrechner Installation / Konfiguration ==
Als nächstes werden wir eine komplette Arch Linux Installation in einem Unterverzeichnis auf dem Server einrichten. Während der Startphase wird der Ziel-Rechner eine IP-Adresse vom DHCP-Server erhalten, dann booten Sie von dem Rechner mit '''PXE''' und mounten diese Installation als das Root-Verzeichnis.
Als nächstes muss eine komplette Arch Linux Installation in einem Unterverzeichnis auf dem Server einrichten werden. Während der Startphase wird der Ziel-Rechner eine IP-Adresse vom DHCP-Server erhalten, dann wird von diesem mit '''PXE''' ein Kernel gebootet und mountet diese Installation als '''Root'''-Verzeichnis.
=== Root-Verzeichnis für Ziel-Rechner einrichten ===
=== Root-Verzeichnis für Ziel-Rechner einrichten ===
Informationen zum nachfolgend genannten [https://wiki.archlinux.org/index.php/Btrfs btrfs] Dateisystem gibt es auf der entsprechenden Site. {{Sprache|en}}
Informationen zum nachfolgend genannten [https://wiki.archlinux.org/index.php/Btrfs btrfs] Dateisystem {{Sprache|en}} gibt es auf der entsprechenden Site.


Demnach werden viele Anwender dieses Dateisystem zuerst auf Ihren Systemen installieren müssen, da es erst ab Anfang 2013 in den Standard-Kernel eingeflossen ist. Wenn Du gerne dieses neu in Arch-Linux eingeführte Dateisystem nutzen möchten
Demnach werden viele Anwender dieses Dateisystem zuerst auf Ihren Systemen installieren müssen, da es erst ab Anfang 2013 in den Standard-Kernel eingeflossen ist. Wenn man gerne dieses neu in ArchLinux eingeführte Dateisystem nutzen möchten.


Erstelle eine {{wikipedia|Sparse-Datei}} von mindestens 1 Gigabyte, und erschaffe ein btrfs Filesystem darauf.
Man muss eine {{wikipedia|Sparse-Datei}} von mindestens 1 Gigabyte erstellen, und diese dann mit einem '''btrfs''' Dateisystem formatieren.


(Es kann natürlich auch ein echtes Block-Device oder ein [[LVM|LVM]] {{Sprache|de}} einrichten, wenn dies gewünscht wird).
(Es kann natürlich auch ein echtes Block-Device oder ein [[LVM|LVM]] einrichtet werden, wenn dies gewünscht wird).


'''Des weiteren soll hier von der Einrichtung auf einem Block-Device ausgegangen werden.'''
'''Des weiteren soll hier von der Einrichtung auf einem Block-Device ausgegangen werden.'''
Zeile 219: Zeile 241:
  # mount -o loop,discard,compress=lzo /srv/arch.img "$root"
  # mount -o loop,discard,compress=lzo /srv/arch.img "$root"


{{hinweis|Das Erstellen eines separaten Dateisystems ist für NBD zwingend nötig aber dies ist optional für NFS und kann übersprungen / ignoriert werden.}}
{{hinweis|Das Erstellen eines separaten Dateisystems ist für '''NBD''' zwingend nötig aber optional für '''NFS''' und kann übersprungen / ignoriert werden.}}


Wie oben schon unter '''Rechner-Architektur''' erwähnt soll das '''Root'''-System im Verzeichnis {{ic|/srv/arch/linux_i686}} installiert werden.
Wie oben unter '''Rechner-Architektur''' erwähnt, soll das '''Root'''-System im Verzeichnis {{ic|/srv/arch/linux_i686}} installiert werden.


=== Bootstrapping Installation ===
=== Bootstrapping Installation ===
Installiere {{Paket|devtools}} [[Bild:Arch_Paket.png]] und {{Paket|arch-install-scripts}}, [[Bild:Arch_Paket.png]] und führe {{ic|mkarchroot}} aus.
Es müssen die {{Paket|devtools}} und {{Paket|arch-install-scripts}} Pakete installiert werden und {{ic|mkarchroot}} ausgeführt werden.


Es folgt die Ausgabe des Befehls mkarchroot '''-h''':
Es folgt die Ausgabe des Befehls mkarchroot '''-h''':
{{shell|# mkarchroot -h|2=
{{hc|# mkarchroot -h|2=
Usage: mkarchroot [options] working-dir [package-list | app]
Usage: mkarchroot [options] working-dir [package-list {{!}} app]
  options:
  options:
     -C <file>    Location of a pacman config file
     -C <file>    Location of a pacman config file
Zeile 236: Zeile 258:
}}
}}


Hier ist die Option -C bedeutend: Damit lässt sich eine alternative {{ic|pacman.conf}} angeben. In dieser kann eine für den oder die Ziel-Rechner passende Architektur angeben werden. Gerade wenn die Ziel-Rechner eine andere Architektur als der Server aufweist.
Hier ist die Option -C bedeutend: Damit lässt sich eine alternative {{ic|pacman.conf}} angeben. In dieser kann eine für den oder die Ziel-Rechner passende Architektur angeben werden. Gerade wenn die Ziel-Rechner eine andere Architektur als der Server aufweist Die jeweilige Zeile ist farblich hinterlegt.


Ein Ausschnitt aus der {{ic|pacman.conf}}:
{{hc|Ein Ausschnitt aus der pacman.conf:|2=
{{hc||2=
#
#
# /etc/pacman.conf
# /etc/pacman.conf
Zeile 261: Zeile 282:
#CleanMethod = KeepInstalled
#CleanMethod = KeepInstalled
#UseDelta    = 0.7
#UseDelta    = 0.7
Architecture = auto
<span style{{=}}"background-color:lightgrey;">Architecture = auto</span>


# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
Zeile 269: Zeile 290:
#NoUpgrade  =
#NoUpgrade  =
#NoExtract  =
#NoExtract  =
.....
[...]
}}
}}


Zeile 276: Zeile 297:
Hier die angepasste Datei:
Hier die angepasste Datei:


{{hc||2=
{{hc|Der Ausschnitt aus der pacman.conf:|2=
#
#
# /etc/pacman.conf
# /etc/pacman.conf
Zeile 298: Zeile 319:
#CleanMethod = KeepInstalled
#CleanMethod = KeepInstalled
#UseDelta    = 0.7
#UseDelta    = 0.7
Architecture = i686
<span style{{=}}"background-color:lightgrey;">Architecture = i686</span>


# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
Zeile 306: Zeile 327:
#NoUpgrade  =
#NoUpgrade  =
#NoExtract  =
#NoExtract  =
.....
[...]
}}
}}


Dann wird in das Verzeichnis {{ic|/srv/arch/}} gewechselt.
Dann muss man in das Verzeichnis {{ic|/srv/arch/}} wechseln.


Der Aufruf von "mkarchroot" lautet:
Der Aufruf von {{ic|mkarchroot}} lautet:


  # mkarchroot -C pacman_arch_i686.conf linux_i686
  # mkarchroot -C pacman_arch_i686.conf linux_i686


Mit diesem Befehl wird das Verzeichnis {{ic|linux_i686}} angelegt und die Pakete aus der Gruppe "base" für die Architektur i686 installiert. Diese Gruppe ist der default Wert für mkarchroot. Sollte das Verzeichnis bereits existieren wird der Befehl mit einer entsprechenden Meldung abgebrochen. Es ist auch folgender Aufruf möglich in Anbetracht der obigen Zeile {{ic|export root{{=}}/srv/arch/linux_i686}}:
Mit diesem Befehl wird das Verzeichnis {{ic|linux_i686}} angelegt und die Pakete aus der Gruppe &bdquo;'''base'''&ldquo; für die Architektur i686 installiert. Diese Gruppe ist der default Wert für {{ic|mkarchroot}}. Sollte das Verzeichnis bereits existieren wird der Befehl mit einer entsprechenden Meldung abgebrochen. Es ist auch folgender Aufruf möglich in Anbetracht der obigen Zeile {{ic|export root{{=}}/srv/arch/linux_i686}}:


  # mkarchroot -C pacman_arch_i686.conf "$root"
  # mkarchroot -C pacman_arch_i686.conf "$root"
Zeile 321: Zeile 342:
Je nachdem von welchem Verzeichnis aus man gerne installiert.
Je nachdem von welchem Verzeichnis aus man gerne installiert.


Zunächst einige Infos zu dem Befehl "pacstrap":
Zunächst einige Infos zu dem Befehl {{ic|pacstrap}}:


{{shell|# pacstrap -h|2=
{{hc|# pacstrap -h|2=
usage: pacstrap [options] root [packages...]
usage: pacstrap [options] root [packages...]


Zeile 340: Zeile 361:
}}
}}


Auch hier, wie auch bei dem Befehl "mkarchroot" ist es möglich mit der Option -C eine alternativ pacman.conf an zu geben. Somit kann die schon vorhandene Datei {{ic|pacman_arch_i686.conf}} wieder verwendet werden.
Da die Pakete aus der Gruppe &bdquo;''base''&ldquo; schon mit dem Befehl {{ic|mkarchroot}} installiert wurde, sollte sie ausgelassen werden. Auch hier, wie beim vorherigen Befehl ist es möglich mit der Option -C eine Alternative pacman.conf an zu geben. Somit kann die vorhandene Datei {{ic|pacman_arch_i686.conf}} wieder verwendet werden.


Der Befehl setzt sich wie folgt zusammen:
Der Befehl setzt sich wie folgt zusammen:
Zeile 346: Zeile 367:
  # pacstrap -C pacman_arch_i686.conf -d "$root" mkinitcpio-nfs-utils nfs-utils
  # pacstrap -C pacman_arch_i686.conf -d "$root" mkinitcpio-nfs-utils nfs-utils


Es wird die genannte {{ic|*.conf}} Datei verwendet, die dafür sorgt das Pakete für die i686-Architektur herunter geladen werden, diese in ein nicht gemountetes Verzeichnis installiert werden. Zum Schluß werden die beiden Pakete genannt. Sollte das Installationsverzeichnis schon gemountet sein, entfällt die Option -d.
Es wird die genannte {{ic|*.conf}} Datei verwendet, die dafür sorgt das Pakete für die i686-Architektur herunter geladen werden, damit diese dann in ein nicht gemountetes Verzeichnis installiert werden. Zum Schluss werden die beiden Pakete genannt. Sollte das Installationsverzeichnis schon gemountet sein, entfällt die Option -d.


{{hinweis|In allen Fällen ist das Paket {{Paket|mkinitcpio-nfs-utils}} [[Bild:Arch_Paket.png]] weiterhin erforderlich. {{ic|ipconfig}} wird im frühen Bootprozess nur verwendet wenn dies vorgesehen ist.}}
{{hinweis|In allen Fällen ist das Paket {{Paket|mkinitcpio-nfs-utils}} weiterhin erforderlich. {{ic|ipconfig}} wird im frühen Bootprozess nur verwendet wenn dies vorgesehen ist.}}


Nun wird das initramfs aufgebaut. Die kürzeste Konfiguration, #NFSv3, dient als "Basis", auf der alle nachfolgenden Abschnitten, falls nötig, angepasst werden.
Nun wird das initramfs aufgebaut.


==== NFSv3 ====
==== NFSv3 ====


Konfiguriere die Datei {{ic|mkinitcpio.conf}}.
Die Datei {{ic|mkinitcpio.conf}} muss konfiguriert werden.


{{hc|# vim "$root/etc/mkinitcpio.conf"|2=
{{hc|# vim "$root/etc/mkinitcpio.conf"|2=
Zeile 362: Zeile 383:
}}
}}


{{hinweis|Außerdem müssen Sie die entsprechenden benötigten [https://wiki.archlinux.org/index.php/Network#Device_Driver module] {{Sprache|en}} für Ihren Ethernet-Controller dem {{ic|1=MODULES}} Feld hinzufügen.}}
{{hinweis|Außerdem müssen die entsprechend benötigten [https://wiki.archlinux.org/index.php/Network#Device_Driver module] {{Sprache|en}} für den Ethernet-Controller dem {{ic|1=MODULES}} Feld hinzufügen werden.}}


Die Datei {{ic|mkinitcpio.conf}} mit den entsprechenden Einträgen. Die relevanten Bereiche sind farblich hervorgehoben.  
Die Datei {{ic|mkinitcpio.conf}} mit den entsprechenden beispielhaften Einträgen. Die relevanten Bereiche sind farblich hervorgehoben.  


'''Äußerst wichtig''': Die Module, die hinter {{ic|1=MODULES{{=}}}} eingetragen werden, sind für den Ziel-Rechner und nicht für den Server!!!
'''Äußerst wichtig''': Die Module, die hinter {{ic|1=MODULES{{=}}}} eingetragen werden, sind für den Ziel-Rechner und nicht für den Server!!!


{{hc||2=
{{hc|mkinitcpio.conf|2=
# vim:set ft=sh
# vim:set ft=sh
# MODULES
# MODULES
# The following modules are loaded before any boot hooks are
# The following modules are loaded before any boot hooks are
# run.  Advanced users may wish to specify all system modules
# run.  Advanced users may wish to specify all system modules
# in this array. For instance:
# in this array. For instance:
#    MODULES="piix ide_disk reiserfs"
#    MODULES="piix ide_disk reiserfs"
'''MODULES="nfsv3 8139too ipw2200"'''
<span style{{=}}"background-color:lightgrey;">MODULES="nfsv3 8139too ipw2200"</span> # bitte entsprechend anpassen.


# BINARIES
# BINARIES
# This setting includes any additional binaries a given user may
# This setting includes any additional binaries a given user may
# wish into the CPIO image. This is run last, so it may be used to
# wish into the CPIO image. This is run last, so it may be used to
# override the actual binaries included by a given hook
# override the actual binaries included by a given hook
# BINARIES are dependency parsed, so you may safely ignore libraries
# BINARIES are dependency parsed, so you may safely ignore libraries
'''BINARIES=""'''
<span style{{=}}"background-color:lightgrey;">BINARIES=""</span>


# FILES
# FILES
# This setting is similar to BINARIES above, however, files are added
# This setting is similar to BINARIES above, however, files are added
# as-is and are not parsed in any way. This is useful for config files.
# as-is and are not parsed in any way. This is useful for config files.
FILES=""
FILES=""


# HOOKS
# HOOKS
# This is the most important setting in this file. The HOOKS control the
# This is the most important setting in this file. The HOOKS control the
# modules and scripts added to the image, and what happens at boot time.
# modules and scripts added to the image, and what happens at boot time.
# Order is important, and it is recommended that you do not change the
# Order is important, and it is recommended that you do not change the
# order in which HOOKS are added. Run 'mkinitcpio -H ' for
# order in which HOOKS are added. Run 'mkinitcpio -H ' for
# help on a given hook.
# help on a given hook.
# 'base' is _required_ unless you know precisely what you are doing.
# 'base' is _required_ unless you know precisely what you are doing.
Zeile 405: Zeile 426:
##  This setup will autodetect all modules for your system and should
##  This setup will autodetect all modules for your system and should
##  work as a sane default
##  work as a sane default
'''HOOKS="base udev autodetect net filesystems keyboard"'''
<span style{{=}}"background-color:lightgrey;">HOOKS="base udev autodetect '''net''' filesystems keyboard"</span>
#
#
##  This setup will generate a 'full' image which supports most systems.
##  This setup will generate a 'full' image which supports most systems.
Zeile 436: Zeile 457:
}}
}}


Das initramfs wird nun installiert. Der einfachste Weg dies zu tun ist mit dem Befehl {{ic|[[Chroot|arch-chroot]]}}. {{Sprache|de}}
Das initramfs wird nun installiert. Der einfachste Weg dies zu tun ist mit dem Befehl {{ic|[[Chroot|arch-chroot]]}}.  
 
Wie oben schon unter '''Rechner-Architektur''' erwähnt soll das '''Boot'''-System im Verzeichnis {{ic|/srv/tftp/}} installiert werden.


  # arch-chroot "$root" /bin/bash
  # arch-chroot "$root" /bin/bash
Zeile 444: Zeile 463:
  (chroot) # exit
  (chroot) # exit


Hier eine mögliche Ausgabe:
Wie oben schon unter '''Rechner-Architektur''' erwähnt soll das '''Boot'''-System im Verzeichnis {{ic|/srv/tftp/}} installiert werden.


{{shell|# mkinitcpio -g /srv/tftp/linux_i686|
{{hc|Hier eine mögliche Ausgabe des build-Prozesses:|2=
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default'
<span style{{=}}"color:green;">{{=}}{{=}}></span> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default'
   -> -k /srv/tftp/vmlinuz-linux_i686 -c /etc/mkinitcpio.conf -g /srv/tftp/initramfs-linux_i686.img
   <span style{{=}}"color:blue;">-></span> -k /srv/tftp/vmlinuz-linux_i686 -c /etc/mkinitcpio.conf -g /srv/tftp/initramfs-linux_i686.img
==> Starting build: 3.9.7-1-ARCH
<span style{{=}}"color:green;">{{=}}{{=}}></span> Starting build: 3.9.7-1-ARCH
   -> Running build hook: [base]
   <span style{{=}}"color:blue">-></span> Running build hook: [base]
   -> Running build hook: [udev]
   <span style{{=}}"color:blue">-></span> Running build hook: [udev]
   -> Running build hook: [autodetect]
   <span style{{=}}"color:blue">-></span> Running build hook: [autodetect]
   -> Running build hook: [net]
   <span style{{=}}"color:blue">-></span> Running build hook: [net]
   -> Running build hook: [filesystems]
   <span style{{=}}"color:blue">-></span> Running build hook: [filesystems]
   -> Running build hook: [keyboard]
   <span style{{=}}"color:blue">-></span> Running build hook: [keyboard]
==> Generating module dependencies
<span style{{=}}"color:green;">{{=}}{{=}}></span> Generating module dependencies
==> Creating gzip initcpio image: /srv/tftp/initramfs-linux_i686.img
<span style{{=}}"color:green;">{{=}}{{=}}></span> Creating gzip initcpio image: /srv/tftp/initramfs-linux_i686.img
==> Image generation successful
<span style{{=}}"color:green;">{{=}}{{=}}></span> Image generation successful
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'fallback'
<span style{{=}}"color:green;">{{=}}{{=}}></span> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'fallback'
   -> -k /srv/tftp/vmlinuz-linux_i686 -c /etc/mkinitcpio.conf -g /srv/tftp/initramfs-linux-fallback_i686.img -S autodetect
   <span style{{=}}"color:blue">-></span> -k /srv/tftp/vmlinuz-linux_i686 -c /etc/mkinitcpio.conf -g /srv/tftp/initramfs-linux-fallback_i686.img -S autodetect
==> Starting build: 3.9.7-1-ARCH
<span style{{=}}"color:green;">{{=}}{{=}}></span> Starting build: 3.9.7-1-ARCH
   -> Running build hook: [base]
   <span style{{=}}"color:blue">-></span> Running build hook: [base]
   -> Running build hook: [udev]
   <span style{{=}}"color:blue">-></span> Running build hook: [udev]
   -> Running build hook: [net]
   <span style{{=}}"color:blue">-></span> Running build hook: [net]
==> WARNING: Possibly missing firmware for module: bna
<span style{{=}}"color:yellow;">{{=}}{{=}}> WARNING:</span> Possibly missing firmware for module: bna
==> WARNING: Possibly missing firmware for module: b43legacy
<span style{{=}}"color:yellow;">{{=}}{{=}}> WARNING:</span> Possibly missing firmware for module: b43legacy
==> WARNING: Possibly missing firmware for module: b43
<span style{{=}}"color:yellow;">{{=}}{{=}}> WARNING:</span> Possibly missing firmware for module: b43
==> WARNING: Possibly missing firmware for module: atmel
<span style{{=}}"color:yellow;">{{=}}{{=}}> WARNING:</span> Possibly missing firmware for module: atmel
==> WARNING: Possibly missing firmware for module: at76c50x_usb
<span style{{=}}"color:yellow;">{{=}}{{=}}> WARNING:</span> Possibly missing firmware for module: at76c50x_usb
==> WARNING: Possibly missing firmware for module: prism54
<span style{{=}}"color:yellow;">{{=}}{{=}}> WARNING:</span> Possibly missing firmware for module: prism54
==> WARNING: Possibly missing firmware for module: zd1201
<span style{{=}}"color:yellow;">{{=}}{{=}}> WARNING:</span> Possibly missing firmware for module: zd1201
==> WARNING: Possibly missing firmware for module: zd1211rw
<span style{{=}}"color:yellow;">{{=}}{{=}}> WARNING:</span> Possibly missing firmware for module: zd1211rw
==> WARNING: Possibly missing firmware for module: orinoco_usb
<span style{{=}}"color:yellow;">{{=}}{{=}}> WARNING:</span> Possibly missing firmware for module: orinoco_usb
==> WARNING: Possibly missing firmware for module: wl1251
<span style{{=}}"color:yellow;">{{=}}{{=}}> WARNING:</span> Possibly missing firmware for module: wl1251
==> WARNING: Possibly missing firmware for module: rtl8723ae
<span style{{=}}"color:yellow;">{{=}}{{=}}> WARNING:</span> Possibly missing firmware for module: rtl8723ae
==> WARNING: Possibly missing firmware for module: ipw2100
<span style{{=}}"color:yellow;">{{=}}{{=}}> WARNING:</span> Possibly missing firmware for module: ipw2100
==> WARNING: Possibly missing firmware for module: ipw2200
<span style{{=}}"color:yellow;">{{=}}{{=}}> WARNING:</span> Possibly missing firmware for module: ipw2200
==> WARNING: Possibly missing firmware for module: p54pci
<span style{{=}}"color:yellow;">{{=}}{{=}}> WARNING:</span> Possibly missing firmware for module: p54pci
==> WARNING: Possibly missing firmware for module: p54usb
<span style{{=}}"color:yellow;">{{=}}{{=}}> WARNING:</span> Possibly missing firmware for module: p54usb
   -> Running build hook: [filesystems]
   <span style{{=}}"color:blue">-></span> Running build hook: [filesystems]
   -> Running build hook: [keyboard]
   <span style{{=}}"color:blue">-></span> Running build hook: [keyboard]
==> Generating module dependencies
<span style{{=}}"color:green;">{{=}}{{=}}></span> Generating module dependencies
==> Creating gzip initcpio image: /srv/tftp/initramfs-linux-fallback_i686.img
<span style{{=}}"color:green;">{{=}}{{=}}></span> Creating gzip initcpio image: /srv/tftp/initramfs-linux-fallback_i686.img
==> Image generation successful
<span style{{=}}"color:green;">{{=}}{{=}}></span> Image generation successful}}
}}


==== NBD ====
==== NBD ====


{{AUR|mkinitcpio-nbd}} [[Bild:Arch_Paket.png]] muss auf dem Ziel-Rechner installiert werden. Baue es mit '''makepkg''' und installiere es:
{{AUR|mkinitcpio-nbd}} muss auf dem Ziel-Rechner installiert werden. Man muss es mit '''makepkg''' bauen und installieren:


  # pacman --root "$root" --dbpath "$root/var/lib/pacman" -U mkinitcpio-nbd-0.4-1-any.pkg.tar.xz
  # pacman --root "$root" --dbpath "$root/var/lib/pacman" -U mkinitcpio-nbd-0.4-1-any.pkg.tar.xz
Zeile 499: Zeile 517:
== Zielrechner Konfiguration (auf dem Server) ==
== Zielrechner Konfiguration (auf dem Server) ==


Zusätzlich zu dem hier genannten Setup, sollte auch [https://wiki.archlinux.org/index.php/HOSTNAME#Set_the_host_name hostname] {{Sprache|en}}, [https://wiki.archlinux.org/index.php/Timezone#Time_Zone timezone] {{Sprache|en}}, die [[Locale|locale]] {{Sprache|de}}, und [https://wiki.archlinux.org/index.php/KEYMAP keymap] {{Sprache|en}}, konfiguriert werden, befolge alle anderen relevanten Teile der [[Arch_Install_Scripts|Arch Install Scripts]]. {{Sprache|de}} Eine ausführlichere Alternative ist der [https://wiki.archlinux.org/index.php/Installation_Guide#Connect_to_the_internet Installation Guide]. {{Sprache|en}}
Zusätzlich zu dem hier genannten Setup sollte
* [https://wiki.archlinux.org/index.php/HOSTNAME#Set_the_host_name hostname] {{Sprache|en}},
* [https://wiki.archlinux.org/index.php/Timezone#Time_Zone timezone] {{Sprache|en}},
* [[Locale|locale]],
* [https://wiki.archlinux.org/index.php/KEYMAP keymap] {{Sprache|en}},
konfiguriert werden, man befolge alle anderen relevanten Teile der [[Arch_Install_Scripts|Arch Install Scripts]].
 
Eine ausführlichere Alternative ist der [https://wiki.archlinux.org/index.php/Installation_Guide#Connect_to_the_internet Installation Guide]. {{Sprache|en}}
 
Ebenfalls ist die {{ic|1=fstab}} zu erwähnen. Diese sollte so ähnlich aussehen:
 
{{hc|/etc/fstab|#
# /etc/fstab: static file system information
#
# <file system>        <dir>                          <type>  <options>                      <dump>  <pass>
tmpfs                  /tmp                            tmpfs  nodev,nosuid                    0      0
 
proc                    /proc                          proc    defaults                        0      0
 
none / none
              # <-- hier ist die Leerzeile wichtig!
}}
 
Mit dem Befehl {{ic|genfstab}} sollte man in diesem Fall äußerst vorsichtig sein. Dies kann einer der Gründe sein warum der  Ziel-Rechner nicht bootet. Dazu sieht man am [[Diskless_Workstation#Das Ergebnis|#Ende]] des Wikis nach, genauer bei &bdquo;Im Fehlerfall...&ldquo;.
 
Nun ist eine gute Gelegenheit zu erwähnen, dass die Konfiguration für '''eine''' Architektur beendet ist. Sollen noch weitere Ziel-Rechner mit einer anderen Architektur von diesem Server booten, sollte dafür ein eigenes '''Root'''-Verzeichnis angelegt werden und die dazu passenden Kernel mit aussagekräftigen Namen im '''Boot'''-Verzeichnis gespeichert werden. Dazu ist es notwendig zu dieser Stelle [[Diskless_Workstation#Zielrechner Installation / Konfiguration|#Zielrechner Installation / Konfiguration]] zurück zu gehen, um die Schritte dafür zu wiederholen.


=== Die verschiedenen Bootloader ===
=== Die verschiedenen Bootloader ===
==== GRUB ====
==== GRUB ====


Obwohl schlecht dokumentiert, unterstützt GRUB auch das Laden über PXE. Aufgrund eines [https://savannah.gnu.org/bugs/?36755 Fehlers in Endian] in der {{ic|1=grub-core/net/tftp.c}} Datei der nicht in der bzr Revision [http://bzr.savannah.gnu.org/lh/grub/trunk/grub/revision/4548 4548] behoben wurde ({{Paket|grub-gfx}} 2.00 [[Bild:Arch_Paket.png]] ist Revision [http://bzr.savannah.gnu.org/lh/grub/trunk/grub/revision/4542 4542]), musst Du das {{AUR|burg-bios-bzr}} aus dem AUR selber bauen; macht es am meisten Sinn, dies in der Ziel-Rechner-Installation zu tun. Darüber hinaus ist es aufgrund eines Fehlers in {{ic|1=grub-core/net/drivers/efi/efinet.c}} der nicht behoben wurde bis zur bzr Revision [http://bzr.savannah.gnu.org/lh/grub/trunk/grub/revision/4751 4751], muss {{AUR|burg-efi-x86_64-bzr}} [[Bild:Arch_Paket.png]] ebenfalls erstellt werden. Der [ https://wiki.archlinux.org/index.php/Arch_User_Repository Arch-User-Repository] {{Sprache|en}} Artikel beschreibt, wie AUR Pakete gebaut werden.
Obwohl schlecht dokumentiert, unterstützt '''[[GRUB|GRUB]]''' auch das Laden über ''PXE''. Aufgrund eines [https://savannah.gnu.org/bugs/?36755 Fehlers in Endian] in der {{ic|1=grub-core/net/tftp.c}} Datei der nicht in der bzr Revision [http://bzr.savannah.gnu.org/lh/grub/trunk/grub/revision/4548 4548] behoben wurde ({{Paket|grub-gfx}} 2.00 ist Revision [http://bzr.savannah.gnu.org/lh/grub/trunk/grub/revision/4542 4542]), muss man das {{AUR|burg-bios-bzr}} aus dem AUR selber bauen; es macht am meisten Sinn, dies in der Ziel-Rechner-Installation zu tun. Darüber hinaus ist es aufgrund eines Fehlers in {{ic|1=grub-core/net/drivers/efi/efinet.c}} der nicht behoben wurde bis zur bzr Revision [http://bzr.savannah.gnu.org/lh/grub/trunk/grub/revision/4751 4751], muss {{AUR|burg-efi-x86_64-bzr}} ebenfalls erstellt werden. Der [https://wiki.archlinux.org/index.php/Arch_User_Repository Arch-User-Repository] {{Sprache|en}} Artikel beschreibt, wie diese Pakete gebaut werden.
 
# pacman --root "$root" --dbpath "$root/var/lib/pacman" -U grub-bios-bzr-4751-1-x86_64.pkg.tar.xz
 
{{hinweis|Die Pfad-Variable {{ic|1="$root"}} muss hier auf {{ic|1=/srv/arch/linux_i686}} gesetzt sein.}}
 
Es soll die {{ic|1=burg-bios-bzr}} Installation auf dem Ziel-Rechner genutzt werden, daher macht man ein {{ic|1=arch-chroot}} in die Ziel-Rechner Installation damit man den Befehl {{ic|1=grub-mknetdir}} benutzen kann.
 
# arch-chroot /srv/tftp grub-mknetdir --subdir=grub
 
Als nächstes wird zu {{AUR|burg-efi-x86_64-bzr}} gewechselt das eben gebaut wurde, und es wird {{ic|1=grub-mknetdir}} ausgeführt, genau so wie oben, nur zum zweiten Mal.


  # pacman --root "$root" --dbpath "$root/var/lib/pacman" -U grub-bios-bzr-4751-1-x86_64.pkg.tar.xz
  # pacman --root "$root" --dbpath "$root/var/lib/pacman" -U grub-bios-bzr-4751-1-x86_64.pkg.tar.xz
{{hinweis|Die Pfad-Variable {{ic|1="$root"}} muss hier auf {{ic|1=/srv/arch/linux_i686}} gesetzt sein.}}
Nun erstelle man eine einfache GRUB-Konfiguration:
{{hc|# vim "/srv/tftp/grub/grub.cfg"|2=
menuentry "Arch Linux" {
    linux tftp/vmlinuz-linux_i686 quiet add_efi_memmap ip=:::::eth0:dhcp nfsroot=10.0.0.1:/srv/arch/linux_i686
    initrd tftp/initramfs-linux_i686.img
}
}}
''GRUB'' wird das Root-Verzeichnis {{ic|1=root=(tftp,10.0.0.1)}} automatisch eintragen, so das der Kernel und das initramfs per TFTP übertragen werden, ohne zusätzliche Angaben zur Konfiguration, jedoch sollte man diese ausdrücklich angeben, wenn man weitere Nicht-TFTP Menü-Einträge machen möchtest.
{{hinweis|Die Kernel Zeile sollte man anpassen wie es erforderlich ist, in Bezug auf [https://wiki.archlinux.org/index.php/PXE #Pxelinux] {{Sprache|en}} für NBD-relevante Optionen.}}


==== Pxelinux ====
==== Pxelinux ====
{{hinweis|''Syslinux'' besitzt derzeit keinen UEFI-Netzwerk-Stack, so dass man nicht in der Lage sein wird {{AUR|syslinux-firmware-git}} zu benutzen. Es ist noch immer möglich mit [[Diskless_Workstation#GRUB|#GRUB]] und TFTP den Kernel und das initramfs zu übertragen; ''pxelinux'' funktioniert gut mit älteren PXE Boot ROMs.}}
[[Syslinux|Pxelinux]] wird bereitgestellt durch {{Paket|syslinux}}.
Der ''pxelinux'' Bootloader (aus dem Paket ''syslinux'') wird in das Boot-Verzeichnis des Ziel-Rechners kopiert.
# cp /usr/lib/syslinux/pxelinux.0 "/srv/tftp"
# mkdir "/srv/tftp/pxelinux.cfg"
Zugleich legt man auch das pxelinux.cfg Verzeichnis an, wo '''pxelinux''' standardmäßig nach seinen Konfigurationsdateien sucht. Es soll nicht zwischen verschiedenen Host-MAC-Adressen unterscheiden werden, daher erstellen wir die Standardkonfiguration.
{{hc|# vim "/srv/tftp/pxelinux.cfg/default"|2=
DEFAULT linux
LABEL linux
  MENU LABEL Arch Linux i686
  KERNEL vmlinuz-linux_i686
  APPEND initrd=initramfs-linux_i686.img quiet ip=:::::eth0:dhcp nfsroot=10.0.0.1:/arch
}}
''NFSv3'' Mountpoints sind relativ zum Root des Servers nicht {{ic|1=fsid=0}}. ({{ic|1=fsid=0}} wird nur bei dem noch nicht unterstützten NFSv4 angegeben.)
Wenn ''NFSv3'' verwendet wird, ist es notwendig {{ic|1=10.0.0.1:/arch}} durch {{ic|1=10.0.0.1:/srv/arch/linux_i686}} bei {{ic|1=nfsroot{{=}}}} zu ersetzen.
Oder wenn ''NBD'' verwendet wird, wird die folgende &bdquo;append&ldquo;-Zeile benötigt:
append ro initrd=initramfs-linux_i686.img ip=:::::eth0:dhcp nbd_host=10.0.0.1 nbd_name=arch/linux_i686 root=/dev/nbd0
{{hinweis|Es muss {{ic|1=nbd_host}} und/oder {{ic|1=nfsroot}} geändert werden, auf die jeweils passende Netzwerk-Konfiguration (die Adresse des NFS / NBD-Servers)}}
Die ''pxelinux'' Konfigurationssyntax ist identisch mit der von ''syslinux''; man ziehe die obige Dokumentation für weitere Informationen zu Rate.
Die einzelnen Parameter werden in dem ''PXE''-Artikel beschrieben.
Der Kernel und das initramfs wird per TFTP übertragen, so dass die Pfade zu diesen relativ sein werden, bezogen auf das TFTP Root-Verzeichnis. Andernfalls wird das Root-Dateisystem zum NFS mount selbst werden, also relativ zum Root-Verzeichnis des NFS-Servers.
Um tatsächlich ''pxelinux'' zu laden, ersetzt man {{ic|1=filename "/grub/i386-pc/core.0";}} in der Datei {{ic|1=/etc/dhcpd.conf}} durch {{ic|1=filename "/pxelinux.0";}}
=== zusätzliche Mountpunkte ===
=== zusätzliche Mountpunkte ===
==== NBD Root-Verzeichnis ====
==== NBD Root-Verzeichnis ====
== Client Boot ==
Im späteren Bootvorgang ist es nötig das Root-Dateisystem zu beidem zu ändern, um es sowohl schreibbar zu machen {{ic|1=rw}} und die Aktivierung von {{ic|1=compress=lzo}} für eine deutlich verbesserte Festplatten-Performance im Vergleich zu ''NFS''.
=== NBD ===
 
{{hinweis|Die Pfad-Variable {{ic|1="$root"}} muss hier auf {{ic|/srv/arch/linux_i686}} gesetzt sein.}}
 
== Das Ergebnis ==
Bei einem ersten Test des obigen Setups sollte eine ähnliche Ausgabe zu sehen sein:
 
Der ganz normale Konsolen-Login.
 
{{hc||2=
Arch Linux 3.9.8-1-ARCH (tty1)
 
(Rechner Name) login:
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
}}
 
Im Fehlerfall gibt es eine solche Ausgabe:
 
{{hc|(MAC- und IP-Adressen geändert)|2=
Intel UNDI, PXE-2.0 (build 082)
Copyright (C) 1997-2000 Intel Corporation
For Realtek RTL8139(X)/8130/810X PCI Fast Ethernet Controller u2.13 (020326)
CLIENT MAC ADDR: 00 00 00 00 00 00 GUID: (gelöscht)
CLIENT IP: 192.000.000.000 MASK: 255.255.255.0 DHCP IP: 192.000.000.000
GATEWAY IP: 192.000.000.000
PXELINUX 4.06 2012-10-23 Copyright (C) 1991-2012 H. Peter Anvin et al
!PXE entry point found (we hope) at 9E1A:00F9 via plan 0
UNDI code segment at 9E1A len 132B
UNDI data segment at 9877 len 5A30
Getting cached packet 01 02 03
My IP address seems to be (gelöscht) 192.000.000.000
ip=192.000.000.000:192.000.000.000:192.000.000.000:255.255.255.0
BOOTIF=01-(gelöscht)
SYSUUID=(gelöscht)
TFTP prefix:
Trying to load: pxelinux.cfg/default                                    ok
early console in decompress_kernel
Decompressing Linux... Parsing ELF... done.
Booting the kernel.
IP-Config: eth0 hardware address 00:00:00:00:00:00 mtu 1500 DHCP
IP-Config: eth0 guessed broadcast address 192.000.000.000
IP-Config: eth0 complete (from 192.000.000.000):
address: 192.000.000.000 broadcast: 192.000.000.000 netmask: 255.255.255.0
gateway: 192.000.000.000 dns0    : 0.0.0.0        dns1  : 0.0.0.0
rootserver: 192.000.000.000 rootpath:
filename: pxelinux.0
NFS-Mount: 192.000.000.000:/srv/arch/linux_i686
[ 16.635244] irq 18: nobody cared (try booting with the "irqpoll" option)
[ 16.635786] handlers:
[ 16.635865] [] usb_hcd_irq [usbcore]
[ 16.635967] Disabling IRQ #18
Welcome to emergency mode! After logging in. type "journalctl -xb to view
system logs. "systemctl reboot" to reboot, "systenctl default" to try again
to boot into default node.
Giue root password for maintenance
(or type Control-D to continue):
}}
 
Um die Zeilen mit dem IRQ #18 zu eliminieren wird die angegebene Option {{ic|1=irqpoll}} der passendem Zeile beim jeweiligen Bootloader eingefügt.
 
Bei ''GRUB'' ist dies:
 
linux tftp/vmlinuz-linux_i686 quiet add_efi_memmap ip=:::::eth0:dhcp irqpoll nfsroot=10.0.0.1:/srv/arch/linux_i686
 
also der Kernel-Zeile.
 
Bei ''Pxelinux'' ist dies:
 
append initrd=initramfs-linux_i686.img quiet ip=:::::eth0:dhcp irqpoll nfsroot=10.0.0.1:/arch
 
also die &bdquo;append&ldquo;-Zeile.
 
In diesem konkreten Fall lag der Fehler in einer falschen {{ic|1=fstab}}. Siehe dazu: [[Diskless_Workstation#Zielrechner Konfiguration (auf dem Server)|#Zielrechner Konfiguration (auf dem Server)]]. Kann diese Möglichkeit ausgeschlossen werden ist es ratsam man loggt sich im &bdquo;emergency mode&ldquo; ein und schaut sich gründlich das Log an welches man durch Eingabe, wie oben zu sehen, {{ic|journalctl -xb}} erhält. Dieses Log hatte eine Größe von ca. 72K, somit recht umfangreich, so das eine Fehlerbehebung möglich sein sollte.
 
== Siehe auch ==
== Siehe auch ==
[https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt kernel.org: Mounting the root filesystem via NFS (nfsroot)]
[https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt kernel.org: Mounting the root filesystem via NFS (nfsroot)] {{Sprache|en}}
[http://www.syslinux.org/wiki/index.php/PXELINUX syslinux.org: pxelinux FAQ]
----


[http://www.syslinux.org/wiki/index.php/PXELINUX syslinux.org: pxelinux FAQ] {{Sprache|en}}
{{ÜberFDL||Seite=http://wiki.archlinux.org|Name=ArchLinux.org Wiki|Original=http://wiki.archlinux.org/?title=Diskless_System}}  
{{ÜberFDL||Seite=http://wiki.archlinux.org|Name=ArchLinux.org Wiki|Original=http://wiki.archlinux.org/?title=Diskless_System}}  


[[Kategorie:Installation]]
[[Kategorie:Installation]]
[[en:Diskless System]]
[[en:Diskless System]]

Aktuelle Version vom 31. August 2015, 23:10 Uhr

„Diskless-Workstation“ bezeichnet einen Computer, der über keine eigenen Festplatten verfügt und sowohl Betriebssystem als auch Daten von einem oder mehreren Servern über ein Netzwerk bezieht. (Wikipedia)

Um die in der Wikipedia Einleitung genannte Funktionalität zu erreichen wird u. a. von der Technik (P)reboot e(X)ecution (E)nvironment (PXE) Gebrauch gemacht.
In dem PXE-Artikel wird die Funktionsweise beschrieben.

Der Artikel nennt auch Einsatzmöglichkeiten:

  • Ein Notfallsystem auszuliefern
  • Ein Installationsmedium auszuliefern
  • Eine komplette Systemumgebung über das Netzwerk auszuliefern

Um eine „Diskless-Workstation“ zu betreiben wird die letztgenannte Möglichkeit genutzt. Ebenso müssen mehrere Dienste auf dem Server gestartet und konfiguriert werden. Auf Grund des Wechsels von Sysvinit zu systemd und Einführung von netctl sind einige Artikel, die sich meist ausführlicher mit hier genannten Programmen oder Diensten beschäftigen, nicht mehr aktuell. Dieser Artikel trägt dem Umstand Rechnung.

Die folgenden Punkte sollten vor einer Installation beachtet werden:

Hinweis: Für die Umsetzung dieses Artikel sollte beim Anwender eine größere Erfahrung mit Linux vorhanden sein.

  • NFSv4: Bei dem Artikel Mkinitcpio unter dem Punkt #Using_net bringt dieses Ergebnis:

Achtung: NFSv4 is not yet supported.

  • (Stand: 28.06.2013)
    Somit bleibt dieser Punkt unberücksichtigt, bis eine Änderung eingetreten ist. Wenn jemand NFSv4 einsetzen will, auch wenn das Paket mkinitcpio-nfs-utils für net installiert ist, wird spätestens beim Bau von initramfs-linux.img und initramfs-linux-fallback.img mit Mkinitcpio Probleme bekommen.
  • mkarchroot wird genauer erläutert. Von diesem Befehl gibt es keine manpage nur die „-h“ Hilfeausgabe.
  • pacstrap: Hier gilt das gleiche wie für mkarchroot.
  • Verzeichnisstruktur: Beim Anlegen sollte folgendes beachtet werden:
    Viele ziehen es vor, das Boot-System in /var/lib/tftpboot anzulegen, und unter /srv/nfs anschließend die Dateisysteme der Ziel-Rechner anzulegen, allerdings hat dies den Nachteil, das vom Clientsystem aus anschließend kein Kernelupdate durchgeführt werden kann. Der Vorteil ist eine erhöhte Sicherheit, da man via TFTP auf sämtliche Unterverzeichnisse Zugriff hat! Dies ist abzuwägen anhand der eigenen Paranoia. Sollten in einem Netz viele Fremde unterwegs sein, ist es im Interesse der Sicherheit anzuraten, nicht /srv/nfs auch für den Bootloader zu verwenden!
    Das Zitat stammt aus dem PXE-Artikel
  • Rechner-Architektur: Für jede (i686, x86_64, PowerPC, AMD ....) empfiehlt es sich ein eigenes Verzeichnis für die Ziel-Rechner anzulegen. Es wird gezeigt wie dies mit einer entsprechend angepassten pacman.conf erreicht werden kann. Aufgrund der obigen Informationen wird das Boot-System im Verzeichnis /srv/tftp installiert. Die Dateisysteme für die Ziel-Rechner werden im Root-Verzeichnis /srv/arch/linux_i686 für die i686-Architektur installiert.


Die Server Konfiguration

Zunächst einmal muss man die folgenden Komponenten installieren:

Einen DHCP Server um den Ziel-Rechnern IP Adressen zuweisen zu können.

Einen TFTP Server um die Bootimages zu den Ziel-Rechnern übertragen zu können. (Eine optionale Voraussetzung für alle PXE ROMs).

Eine Art von Netzwerkspeicher (entweder NFS oder NBD) um die Arch Installation zu den Ziel-Rechnern exportieren zu können.

Hinweis: dnsmasq kann gleichzeitig sowohl als DHCP- und als TFTP-Server eingesetzt werden. Weitere Informationen sind im Artikel dnsmasq zu finden.

DHCP Server

ISC dhcp muss auf dem Server installiert und konfiguriert werden.

# vim /etc/dhcpd.conf
allow booting;
allow bootp;

authoritative;

option domain-name-servers 10.0.0.1;

option architecture code 93 = unsigned integer 16;

group {
    next-server 10.0.0.1;

    if option architecture = 00:07 {
        filename "/grub/x86_64-efi/core.efi";
    } else {
        filename "/grub/i386-pc/core.0";
    }

    subnet 10.0.0.0 netmask 255.255.255.0 {
        option routers 10.0.0.1;
        range 10.0.0.128 10.0.0.254;
    }

Hinweis: next-server sollte die IP-Adresse des TFTP-Servers sein; alles andere sollte entsprechend geändert werden, damit es zum eigenen Netzwerk passt.

Hinweis: filename "/grub/i386-pc/core.0"; Diese Zeile kann sich in Bezug auf den Boot-Loader #Pxelinux noch verändern.

RFC 4578 definiert die „Art der System Architektur des Ziel-Rechners“ in der DHCP Option. In der obigen Konfiguration, sollte der PXE Ziel-Rechner ein x86_64-efi Bootimage (Typ 0x7) anfordern, wird ihm das passende übertragen, ansonsten wird auf ein i686 Bootimage zurück gegriffen. Dies erlaubt beides, sowohl einem UEFI Ziel-Rechner als auch einem Ziel-Rechner mit älterem BIOS simultan über das selbe Netzwerksegment zu booten.

Man muss den ISC DHCP per systemd starten.

# systemctl start dhcpd4.service

Um zu überprüfen, ob der Service erfolgreich gestartet werden konnte wird folgende Eingabe benötigt:

# systemctl status dhcpd4.service

Hier sollte alles im grünen Bereich sein. (Wie das Beispiel zeigt:)

# systemctl status dhcpd4.service
dhcpd4.service - IPv4 DHCP server
   Loaded: loaded (/usr/lib/systemd/system/dhcpd4.service; disabled)
   Active: active (running) since Fr 2013-06-28 23:03:06 CEST; 17s ago
  Process: 419 ExecStart=/usr/bin/dhcpd -4 -q -pf /run/dhcpd4.pid (code=exited, status=0/SUCCESS)
 Main PID: 420 (dhcpd)
   CGroup: name=systemd:/system/dhcpd4.service
           └─420 /usr/bin/dhcpd -4 -q -pf /run/dhcpd4.pid

TFTP-Server

tftp-hpa muss auf dem Server installiert und konfiguriert werden.

Der TFTP-Server wird gebraucht um den Bootloader, den Kernel, und das initramfs zum Ziel-Rechner zu übertragen.

Die Datei sollte entsprechend diesem Muster erstellt werden:


[Unit]
Description=hpa's original TFTP daemon

[Service]
ExecStart=/usr/bin/in.tftpd -s /srv/tftp/
StandardInput=socket
StandardOutput=inherit
StandardError=journal

Die erstellte Datei wird auf dem Server im Pfad /etc/systemd/system/ unter dem Namen tftpd.service gespeichert.

Der TFTP-Server muss per systemd gestartet werden.

# systemctl start tftpd.socket tftpd.service

Eine Überprüfung lohnt sich immer:

# systemctl status tftpd.socket
# systemctl status tftpd.service

Das ganze sollte so ausssehen:

tftpd.socket
Loaded: loaded (/usr/lib/systemd/system/tftpd.socket; disabled)
         Active: active (listening) since Fr 2013-06-28 23:09:01 CEST; 27s ago
         Listen: [::]:69 (Datagram)
tftpd.service - hpa's original TFTP daemon
Loaded: loaded (/etc/systemd/system/tftpd.service; static)
         Active: active (running) since Fr 2013-06-28 23:09:01 CEST; 14s ago
         Main PID: 425 (in.tftpd)
         CGroup: name=systemd:/system/tftpd.service
                 └─425 /usr/bin/in.tftpd -s /srv/arch/boot

Netzwerkspeicher

Der primäre Unterschied zwischen der Verwendung von NFS und NBD ist, während es mit beiden in der Tat möglich ist, das mehrere Ziel-Rechner die selbe Installation nutzen können, mit NBD jedoch (aufgrund der direkten Art der Manipulation des Dateisystems) wird der copyonwrite Modus benötigt, um dies zu erreichen, was zum Verwerfen jeglicher Schreibzugriffe führt, wenn sich der Ziel-Rechner abmeldet. In einigen Situationen könnte dies jedoch gewünscht sein.

NFS Server

nfs-utils muss auf dem Server installiert und konfiguriert werden.

NFSv3

Das Root-Verzeichnis der jeweiligen arch-Installation muss in die NFS exports-Datei eintragen werden.

# vim /etc/exports
/srv/arch/linux_i686 *(rw,no_root_squash,no_subtree_check,sync)

Hinweis: Ist man nicht über Datenverlust im Falle von Netzwerk- und / oder Server-Ausfällen besorgt, ersetzt man sync durch async --zusätzliche Optionen finden sich im NFS Artikel. Die Option sync bietet sich an wenn man bei Schreibzugriffen sicher stellen möchte, das die Daten korrekt gespeichert werden, diese Einstellung geht jedoch zu Lasten der Geschwindigkeit. Die Option async sollte bei ausschließlich lesenden Zugriffen benutzt werden, da dies die Geschwindigkeit steigert, die Sicherheit kann in diesem Fall vernachlässigt werden.

Als Nächstes muss man den NFSv3 Server starten:

# systemctl start rpcbind.service
# systemctl start nfs-server.service
# systemctl start rpc-statd.service

Die Überprüfung:

# systemctl status rpcbind.service
# systemctl status nfs-server.service
# systemctl status rpc-statd.service

Das Ergebnis:

● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: disabled)
   Active: active (running) since Ta Jahr-Mo-Ta YY:ZZ:VV CEST; 2h 33min ago
 Main PID: 446 (rpcbind)
   CGroup: /system.slice/rpcbind.service
           └─446 /usr/bin/rpcbind -w

Mon XX YY:ZZ:VV server.local systemd[1]: Starting RPC bind service...
Mon XX YY:ZZ:VV server.local systemd[1]: Started RPC bind service.
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
   Active: active (exited) since Ta Jahr-Mo-Ta YY:ZZ:VV CEST; 2h 40min ago
 Main PID: 452 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service

Mon XX YY:ZZ:VV server.local systemd[1]: Starting NFS server and services...
Mon XX YY:ZZ:VV server.local systemd[1]: Started NFS server and services.
● rpc-statd.service - NFS status monitor for NFSv2/3 locking.
Loaded: loaded (/usr/lib/systemd/system/rpc-statd.service; static; vendor preset: disabled)
   Active: active (running) since Ta Jahr-Mo-Ta YY:ZZ:VV CEST; 2h 43min ago
 Main PID: 448 (rpc.statd)
   CGroup: /system.slice/rpc-statd.service
           └─448 /usr/sbin/rpc.statd --no-notify

Mon XX YY:ZZ:VV server.local systemd[1]: Starting NFS status monitor for NFSv2/3 locking....
Mon XX YY:ZZ:VV server.local rpc.statd[448]: Version 1.3.2 starting
Mon XX YY:ZZ:VV server.local rpc.statd[448]: Flags: TI-RPC
Mon XX YY:ZZ:VV server.local rpc.statd[448]: Running as root. chown /var/lib/nfs to choose different user
Mon XX YY:ZZ:VV server.local systemd[1]: Started NFS status monitor for NFSv2/3 locking..
NBD

nbd muss auf dem Server installiert und konfiguriert werden.

# vim /etc/nbd-server/config
[generic]
    user = nbd
    group = nbd
[arch]
    exportname = /srv/arch.img
    copyonwrite = false

Hinweis: Man muss copyonwrite auf „true“ setzen falls mehrere Ziel-Rechner das NBD Verzeichnis gleichzeitig nutzen sollen; man gebe man 5 nbd-server ein für mehr Details zur Ausgabe auf der Konsole.

nbd muss per systemd gestartet werden.

# systemctl start nbd.service

Die Prüfung:

# systemctl status nbd.service

Das Ergebnis:


(Wer NBD benutzt trage bitte hier die entsprechende Konsolenausgabe nach den obigen Beispielen ein.)

Bisher wurden die Server/Dienste erst ein Mal „nur“ gestartet. Damit diese beim Booten aktiviert werden muss man „start“ durch „enable“ ersetzen. Um dieses Setup zu testen reicht ein starten zunächst aus. Läuft alles wie gewünscht können die Server/Dienste dann beim Booten aktiviert werden.

Zielrechner Installation / Konfiguration

Als nächstes muss eine komplette Arch Linux Installation in einem Unterverzeichnis auf dem Server einrichten werden. Während der Startphase wird der Ziel-Rechner eine IP-Adresse vom DHCP-Server erhalten, dann wird von diesem mit PXE ein Kernel gebootet und mountet diese Installation als Root-Verzeichnis.

Root-Verzeichnis für Ziel-Rechner einrichten

Informationen zum nachfolgend genannten btrfs Dateisystem gibt es auf der entsprechenden Site.

Demnach werden viele Anwender dieses Dateisystem zuerst auf Ihren Systemen installieren müssen, da es erst ab Anfang 2013 in den Standard-Kernel eingeflossen ist. Wenn man gerne dieses neu in ArchLinux eingeführte Dateisystem nutzen möchten.

Man muss eine Sparse-Datei von mindestens 1 Gigabyte erstellen, und diese dann mit einem btrfs Dateisystem formatieren.

(Es kann natürlich auch ein echtes Block-Device oder ein LVM einrichtet werden, wenn dies gewünscht wird).

Des weiteren soll hier von der Einrichtung auf einem Block-Device ausgegangen werden.

# truncate -s 1G /srv/arch.img
# mkfs.btrfs /srv/arch.img
# export root=/srv/arch/linux_i686
# mkdir -p "$root"
# mount -o loop,discard,compress=lzo /srv/arch.img "$root"

Hinweis: Das Erstellen eines separaten Dateisystems ist für NBD zwingend nötig aber optional für NFS und kann übersprungen / ignoriert werden.

Wie oben unter Rechner-Architektur erwähnt, soll das Root-System im Verzeichnis /srv/arch/linux_i686 installiert werden.

Bootstrapping Installation

Es müssen die devtools und arch-install-scripts Pakete installiert werden und mkarchroot ausgeführt werden.

Es folgt die Ausgabe des Befehls mkarchroot -h:

# mkarchroot -h
Usage: mkarchroot [options] working-dir [package-list | app]
 options:
    -C <file>     Location of a pacman config file
    -M <file>     Location of a makepkg config file
    -c <dir>      Set pacman cache
    -h            This message

Hier ist die Option -C bedeutend: Damit lässt sich eine alternative pacman.conf angeben. In dieser kann eine für den oder die Ziel-Rechner passende Architektur angeben werden. Gerade wenn die Ziel-Rechner eine andere Architektur als der Server aufweist Die jeweilige Zeile ist farblich hinterlegt.

Ein Ausschnitt aus der pacman.conf:
#
# /etc/pacman.conf
#
# See the pacman.conf(5) manpage for option and repository directives

#
# GENERAL OPTIONS
#
[options]
# The following paths are commented out with their default values listed.
# If you wish to use different paths, uncomment and update the paths.
#RootDir     = /
#DBPath      = /var/lib/pacman/
#CacheDir    = /var/cache/pacman/pkg/
#LogFile     = /var/log/pacman.log
#GPGDir      = /etc/pacman.d/gnupg/
HoldPkg     = pacman glibc
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
#UseDelta    = 0.7
Architecture = auto

# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg   =
#IgnoreGroup =

#NoUpgrade   =
#NoExtract   =
[...]

Hier ist die Zeile mit Architecture = auto relevant. Mit dem Wert auto wird die selbe Architektur verwendete wie auf dem Server auch. Die Datei wird in einen Editor geladen und die Architektur für den Ziel-Rechner eingetragen. Im Falle einer i686-Architektur lautet der Eintrag: Architecture = i686. Die Datei sollte unter dem Name abspeichern werden, der die Architektur trägt, z. B. pacman_arch_i686.conf.

Hier die angepasste Datei:

Der Ausschnitt aus der pacman.conf:
#
# /etc/pacman.conf
#
# See the pacman.conf(5) manpage for option and repository directives

#
# GENERAL OPTIONS
#
[options]
# The following paths are commented out with their default values listed.
# If you wish to use different paths, uncomment and update the paths.
#RootDir     = /
#DBPath      = /var/lib/pacman/
#CacheDir    = /var/cache/pacman/pkg/
#LogFile     = /var/log/pacman.log
#GPGDir      = /etc/pacman.d/gnupg/
HoldPkg     = pacman glibc
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
#UseDelta    = 0.7
Architecture = i686

# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg   =
#IgnoreGroup =

#NoUpgrade   =
#NoExtract   =
[...]

Dann muss man in das Verzeichnis /srv/arch/ wechseln.

Der Aufruf von mkarchroot lautet:

# mkarchroot -C pacman_arch_i686.conf linux_i686

Mit diesem Befehl wird das Verzeichnis linux_i686 angelegt und die Pakete aus der Gruppe „base“ für die Architektur i686 installiert. Diese Gruppe ist der default Wert für mkarchroot. Sollte das Verzeichnis bereits existieren wird der Befehl mit einer entsprechenden Meldung abgebrochen. Es ist auch folgender Aufruf möglich in Anbetracht der obigen Zeile export root=/srv/arch/linux_i686:

# mkarchroot -C pacman_arch_i686.conf "$root"

Je nachdem von welchem Verzeichnis aus man gerne installiert.

Zunächst einige Infos zu dem Befehl pacstrap:

# pacstrap -h
usage: pacstrap [options] root [packages...]

  Options:
    -C config      Use an alternate config file for pacman
    -c             Use the package cache on the host, rather than the target
    -d             Allow installation to a non-mountpoint directory
    -G             Avoid copying the host's pacman keyring to the target
    -i             Avoid auto-confirmation of package selections
    -M             Avoid copying the host's mirrorlist to the target

    -h             Print this help message

pacstrap installs packages to the specified new root directory. If no packages
are given, pacstrap defaults to the "base" group.

Da die Pakete aus der Gruppe „base“ schon mit dem Befehl mkarchroot installiert wurde, sollte sie ausgelassen werden. Auch hier, wie beim vorherigen Befehl ist es möglich mit der Option -C eine Alternative pacman.conf an zu geben. Somit kann die vorhandene Datei pacman_arch_i686.conf wieder verwendet werden.

Der Befehl setzt sich wie folgt zusammen:

# pacstrap -C pacman_arch_i686.conf -d "$root" mkinitcpio-nfs-utils nfs-utils

Es wird die genannte *.conf Datei verwendet, die dafür sorgt das Pakete für die i686-Architektur herunter geladen werden, damit diese dann in ein nicht gemountetes Verzeichnis installiert werden. Zum Schluss werden die beiden Pakete genannt. Sollte das Installationsverzeichnis schon gemountet sein, entfällt die Option -d.

Hinweis: In allen Fällen ist das Paket mkinitcpio-nfs-utils weiterhin erforderlich. ipconfig wird im frühen Bootprozess nur verwendet wenn dies vorgesehen ist.

Nun wird das initramfs aufgebaut.

NFSv3

Die Datei mkinitcpio.conf muss konfiguriert werden.

# vim "$root/etc/mkinitcpio.conf"
MODULES="nfsv3"
HOOKS="base udev autodetect net filesystems keyboard"
BINARIES=""

Hinweis: Außerdem müssen die entsprechend benötigten module für den Ethernet-Controller dem MODULES Feld hinzufügen werden.

Die Datei mkinitcpio.conf mit den entsprechenden beispielhaften Einträgen. Die relevanten Bereiche sind farblich hervorgehoben.

Äußerst wichtig: Die Module, die hinter MODULES= eingetragen werden, sind für den Ziel-Rechner und nicht für den Server!!!

mkinitcpio.conf
# vim:set ft=sh
# MODULES
# The following modules are loaded before any boot hooks are
# run.  Advanced users may wish to specify all system modules
# in this array. For instance:
#     MODULES="piix ide_disk reiserfs"
MODULES="nfsv3 8139too ipw2200" # bitte entsprechend anpassen.

# BINARIES
# This setting includes any additional binaries a given user may
# wish into the CPIO image. This is run last, so it may be used to
# override the actual binaries included by a given hook
# BINARIES are dependency parsed, so you may safely ignore libraries
BINARIES=""

# FILES
# This setting is similar to BINARIES above, however, files are added
# as-is and are not parsed in any way. This is useful for config files.
FILES=""

# HOOKS
# This is the most important setting in this file. The HOOKS control the
# modules and scripts added to the image, and what happens at boot time.
# Order is important, and it is recommended that you do not change the
# order in which HOOKS are added. Run 'mkinitcpio -H ' for
# help on a given hook.
# 'base' is _required_ unless you know precisely what you are doing.
# 'udev' is _required_ in order to automatically load modules
# 'filesystems' is _required_ unless you specify your fs modules in MODULES
# Examples:
##   This setup specifies all modules in the MODULES setting above.
##   No raid, lvm2, or encrypted root is needed.
#    HOOKS="base"
#
##   This setup will autodetect all modules for your system and should
##   work as a sane default
HOOKS="base udev autodetect net filesystems keyboard"
#
##   This setup will generate a 'full' image which supports most systems.
##   No autodetection is done.
#    HOOKS="base udev block filesystems"
#
##   This setup assembles a pata mdadm array with an encrypted root FS.
##   Note: See 'mkinitcpio -H mdadm' for more information on raid devices.
#    HOOKS="base udev block mdadm encrypt filesystems"
#
##   This setup loads an lvm2 volume group on a usb device.
#    HOOKS="base udev block lvm2 filesystems"
#
##   NOTE: If you have /usr on a separate partition, you MUST include the
#    usr, fsck and shutdown hooks.
#    HOOKS="base udev autodetect modconf block filesystems keyboard fsck"

# COMPRESSION
# Use this to compress the initramfs image. By default, gzip compression
# is used. Use 'cat' to create an uncompressed image.
#COMPRESSION="gzip"
#COMPRESSION="bzip2"
#COMPRESSION="lzma"
#COMPRESSION="xz"
#COMPRESSION="lzop"

# COMPRESSION_OPTIONS
# Additional options for the compressor
#COMPRESSION_OPTIONS=""

Das initramfs wird nun installiert. Der einfachste Weg dies zu tun ist mit dem Befehl arch-chroot.

# arch-chroot "$root" /bin/bash
(chroot) # mkinitcpio -g /srv/tftp/linux_i686.img
(chroot) # exit

Wie oben schon unter Rechner-Architektur erwähnt soll das Boot-System im Verzeichnis /srv/tftp/ installiert werden.

Hier eine mögliche Ausgabe des build-Prozesses:
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default'
  -> -k /srv/tftp/vmlinuz-linux_i686 -c /etc/mkinitcpio.conf -g /srv/tftp/initramfs-linux_i686.img
==> Starting build: 3.9.7-1-ARCH
  -> Running build hook: [base]
  -> Running build hook: [udev]
  -> Running build hook: [autodetect]
  -> Running build hook: [net]
  -> Running build hook: [filesystems]
  -> Running build hook: [keyboard]
==> Generating module dependencies
==> Creating gzip initcpio image: /srv/tftp/initramfs-linux_i686.img
==> Image generation successful
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'fallback'
  -> -k /srv/tftp/vmlinuz-linux_i686 -c /etc/mkinitcpio.conf -g /srv/tftp/initramfs-linux-fallback_i686.img -S autodetect
==> Starting build: 3.9.7-1-ARCH
  -> Running build hook: [base]
  -> Running build hook: [udev]
  -> Running build hook: [net]
==> WARNING: Possibly missing firmware for module: bna
==> WARNING: Possibly missing firmware for module: b43legacy
==> WARNING: Possibly missing firmware for module: b43
==> WARNING: Possibly missing firmware for module: atmel
==> WARNING: Possibly missing firmware for module: at76c50x_usb
==> WARNING: Possibly missing firmware for module: prism54
==> WARNING: Possibly missing firmware for module: zd1201
==> WARNING: Possibly missing firmware for module: zd1211rw
==> WARNING: Possibly missing firmware for module: orinoco_usb
==> WARNING: Possibly missing firmware for module: wl1251
==> WARNING: Possibly missing firmware for module: rtl8723ae
==> WARNING: Possibly missing firmware for module: ipw2100
==> WARNING: Possibly missing firmware for module: ipw2200
==> WARNING: Possibly missing firmware for module: p54pci
==> WARNING: Possibly missing firmware for module: p54usb
  -> Running build hook: [filesystems]
  -> Running build hook: [keyboard]
==> Generating module dependencies
==> Creating gzip initcpio image: /srv/tftp/initramfs-linux-fallback_i686.img
==> Image generation successful

NBD

mkinitcpio-nbdAUR muss auf dem Ziel-Rechner installiert werden. Man muss es mit makepkg bauen und installieren:

# pacman --root "$root" --dbpath "$root/var/lib/pacman" -U mkinitcpio-nbd-0.4-1-any.pkg.tar.xz

Hinweis: Die Pfad-Variable "$root" muss hier auf /srv/arch/linux_i686 gesetzt sein.

Dann muss nbd in das HOOKS Feld nach net hinzufügt werden; net wird das Netzwerk konfigurieren, aber nicht versuchen ein NFS-Mount zu machen, wenn das nfsroot nicht in der Kernel-Zeile angegeben wird.

Zielrechner Konfiguration (auf dem Server)

Zusätzlich zu dem hier genannten Setup sollte

konfiguriert werden, man befolge alle anderen relevanten Teile der Arch Install Scripts.

Eine ausführlichere Alternative ist der Installation Guide.

Ebenfalls ist die fstab zu erwähnen. Diese sollte so ähnlich aussehen:

/etc/fstab
#
# /etc/fstab: static file system information
#
# <file system>         <dir>                           <type>  <options>                       <dump>  <pass>
tmpfs                   /tmp                            tmpfs   nodev,nosuid                    0       0

proc                    /proc                           proc    defaults                        0       0

none / none
              # <-- hier ist die Leerzeile wichtig!

Mit dem Befehl genfstab sollte man in diesem Fall äußerst vorsichtig sein. Dies kann einer der Gründe sein warum der Ziel-Rechner nicht bootet. Dazu sieht man am #Ende des Wikis nach, genauer bei „Im Fehlerfall...“.

Nun ist eine gute Gelegenheit zu erwähnen, dass die Konfiguration für eine Architektur beendet ist. Sollen noch weitere Ziel-Rechner mit einer anderen Architektur von diesem Server booten, sollte dafür ein eigenes Root-Verzeichnis angelegt werden und die dazu passenden Kernel mit aussagekräftigen Namen im Boot-Verzeichnis gespeichert werden. Dazu ist es notwendig zu dieser Stelle #Zielrechner Installation / Konfiguration zurück zu gehen, um die Schritte dafür zu wiederholen.

Die verschiedenen Bootloader

GRUB

Obwohl schlecht dokumentiert, unterstützt GRUB auch das Laden über PXE. Aufgrund eines Fehlers in Endian in der grub-core/net/tftp.c Datei der nicht in der bzr Revision 4548 behoben wurde (grub-gfx 2.00 ist Revision 4542), muss man das burg-bios-bzrAUR aus dem AUR selber bauen; es macht am meisten Sinn, dies in der Ziel-Rechner-Installation zu tun. Darüber hinaus ist es aufgrund eines Fehlers in grub-core/net/drivers/efi/efinet.c der nicht behoben wurde bis zur bzr Revision 4751, muss burg-efi-x86_64-bzrAUR ebenfalls erstellt werden. Der Arch-User-Repository Artikel beschreibt, wie diese Pakete gebaut werden.

# pacman --root "$root" --dbpath "$root/var/lib/pacman" -U grub-bios-bzr-4751-1-x86_64.pkg.tar.xz

Hinweis: Die Pfad-Variable "$root" muss hier auf /srv/arch/linux_i686 gesetzt sein.

Es soll die burg-bios-bzr Installation auf dem Ziel-Rechner genutzt werden, daher macht man ein arch-chroot in die Ziel-Rechner Installation damit man den Befehl grub-mknetdir benutzen kann.

# arch-chroot /srv/tftp grub-mknetdir --subdir=grub

Als nächstes wird zu burg-efi-x86_64-bzrAUR gewechselt das eben gebaut wurde, und es wird grub-mknetdir ausgeführt, genau so wie oben, nur zum zweiten Mal.

# pacman --root "$root" --dbpath "$root/var/lib/pacman" -U grub-bios-bzr-4751-1-x86_64.pkg.tar.xz

Hinweis: Die Pfad-Variable "$root" muss hier auf /srv/arch/linux_i686 gesetzt sein.

Nun erstelle man eine einfache GRUB-Konfiguration:

# vim "/srv/tftp/grub/grub.cfg"
menuentry "Arch Linux" {
    linux tftp/vmlinuz-linux_i686 quiet add_efi_memmap ip=:::::eth0:dhcp nfsroot=10.0.0.1:/srv/arch/linux_i686
    initrd tftp/initramfs-linux_i686.img
}

GRUB wird das Root-Verzeichnis root=(tftp,10.0.0.1) automatisch eintragen, so das der Kernel und das initramfs per TFTP übertragen werden, ohne zusätzliche Angaben zur Konfiguration, jedoch sollte man diese ausdrücklich angeben, wenn man weitere Nicht-TFTP Menü-Einträge machen möchtest.

Hinweis: Die Kernel Zeile sollte man anpassen wie es erforderlich ist, in Bezug auf #Pxelinux für NBD-relevante Optionen.

Pxelinux

Hinweis: Syslinux besitzt derzeit keinen UEFI-Netzwerk-Stack, so dass man nicht in der Lage sein wird syslinux-firmware-gitAUR zu benutzen. Es ist noch immer möglich mit #GRUB und TFTP den Kernel und das initramfs zu übertragen; pxelinux funktioniert gut mit älteren PXE Boot ROMs.

Pxelinux wird bereitgestellt durch syslinux.

Der pxelinux Bootloader (aus dem Paket syslinux) wird in das Boot-Verzeichnis des Ziel-Rechners kopiert.

# cp /usr/lib/syslinux/pxelinux.0 "/srv/tftp"
# mkdir "/srv/tftp/pxelinux.cfg"

Zugleich legt man auch das pxelinux.cfg Verzeichnis an, wo pxelinux standardmäßig nach seinen Konfigurationsdateien sucht. Es soll nicht zwischen verschiedenen Host-MAC-Adressen unterscheiden werden, daher erstellen wir die Standardkonfiguration.

# vim "/srv/tftp/pxelinux.cfg/default"
DEFAULT linux

LABEL linux
  MENU LABEL Arch Linux i686
  KERNEL vmlinuz-linux_i686
  APPEND initrd=initramfs-linux_i686.img quiet ip=:::::eth0:dhcp nfsroot=10.0.0.1:/arch

NFSv3 Mountpoints sind relativ zum Root des Servers nicht fsid=0. (fsid=0 wird nur bei dem noch nicht unterstützten NFSv4 angegeben.)

Wenn NFSv3 verwendet wird, ist es notwendig 10.0.0.1:/arch durch 10.0.0.1:/srv/arch/linux_i686 bei nfsroot= zu ersetzen.

Oder wenn NBD verwendet wird, wird die folgende „append“-Zeile benötigt:

append ro initrd=initramfs-linux_i686.img ip=:::::eth0:dhcp nbd_host=10.0.0.1 nbd_name=arch/linux_i686 root=/dev/nbd0

Hinweis: Es muss nbd_host und/oder nfsroot geändert werden, auf die jeweils passende Netzwerk-Konfiguration (die Adresse des NFS / NBD-Servers)

Die pxelinux Konfigurationssyntax ist identisch mit der von syslinux; man ziehe die obige Dokumentation für weitere Informationen zu Rate.

Die einzelnen Parameter werden in dem PXE-Artikel beschrieben.

Der Kernel und das initramfs wird per TFTP übertragen, so dass die Pfade zu diesen relativ sein werden, bezogen auf das TFTP Root-Verzeichnis. Andernfalls wird das Root-Dateisystem zum NFS mount selbst werden, also relativ zum Root-Verzeichnis des NFS-Servers.

Um tatsächlich pxelinux zu laden, ersetzt man filename "/grub/i386-pc/core.0"; in der Datei /etc/dhcpd.conf durch filename "/pxelinux.0";

zusätzliche Mountpunkte

NBD Root-Verzeichnis

Im späteren Bootvorgang ist es nötig das Root-Dateisystem zu beidem zu ändern, um es sowohl schreibbar zu machen rw und die Aktivierung von compress=lzo für eine deutlich verbesserte Festplatten-Performance im Vergleich zu NFS.

Hinweis: Die Pfad-Variable "$root" muss hier auf /srv/arch/linux_i686 gesetzt sein.

Das Ergebnis

Bei einem ersten Test des obigen Setups sollte eine ähnliche Ausgabe zu sehen sein:

Der ganz normale Konsolen-Login.


Arch Linux 3.9.8-1-ARCH (tty1)

(Rechner Name) login:
  
  
  
  
  
  
  
  
  

Im Fehlerfall gibt es eine solche Ausgabe:

(MAC- und IP-Adressen geändert)
Intel UNDI, PXE-2.0 (build 082)
Copyright (C) 1997-2000 Intel Corporation
For Realtek RTL8139(X)/8130/810X PCI Fast Ethernet Controller u2.13 (020326)
CLIENT MAC ADDR: 00 00 00 00 00 00 GUID: (gelöscht)
CLIENT IP: 192.000.000.000 MASK: 255.255.255.0 DHCP IP: 192.000.000.000
GATEWAY IP: 192.000.000.000
PXELINUX 4.06 2012-10-23 Copyright (C) 1991-2012 H. Peter Anvin et al
!PXE entry point found (we hope) at 9E1A:00F9 via plan 0
UNDI code segment at 9E1A len 132B
UNDI data segment at 9877 len 5A30
Getting cached packet 01 02 03
My IP address seems to be (gelöscht) 192.000.000.000
ip=192.000.000.000:192.000.000.000:192.000.000.000:255.255.255.0
BOOTIF=01-(gelöscht)
SYSUUID=(gelöscht)
TFTP prefix:
Trying to load: pxelinux.cfg/default                                    ok
early console in decompress_kernel
Decompressing Linux... Parsing ELF... done.
Booting the kernel.
IP-Config: eth0 hardware address 00:00:00:00:00:00 mtu 1500 DHCP
IP-Config: eth0 guessed broadcast address 192.000.000.000
IP-Config: eth0 complete (from 192.000.000.000):
address: 192.000.000.000 broadcast: 192.000.000.000 netmask: 255.255.255.0
gateway: 192.000.000.000 dns0     : 0.0.0.0         dns1   : 0.0.0.0
rootserver: 192.000.000.000 rootpath:
filename: pxelinux.0
NFS-Mount: 192.000.000.000:/srv/arch/linux_i686
[ 16.635244] irq 18: nobody cared (try booting with the "irqpoll" option)
[ 16.635786] handlers:
[ 16.635865] [] usb_hcd_irq [usbcore]
[ 16.635967] Disabling IRQ #18
Welcome to emergency mode! After logging in. type "journalctl -xb to view
system logs. "systemctl reboot" to reboot, "systenctl default" to try again
to boot into default node.
Giue root password for maintenance
(or type Control-D to continue):

Um die Zeilen mit dem IRQ #18 zu eliminieren wird die angegebene Option irqpoll der passendem Zeile beim jeweiligen Bootloader eingefügt.

Bei GRUB ist dies:

linux tftp/vmlinuz-linux_i686 quiet add_efi_memmap ip=:::::eth0:dhcp irqpoll nfsroot=10.0.0.1:/srv/arch/linux_i686

also der Kernel-Zeile.

Bei Pxelinux ist dies:

append initrd=initramfs-linux_i686.img quiet ip=:::::eth0:dhcp irqpoll nfsroot=10.0.0.1:/arch

also die „append“-Zeile.

In diesem konkreten Fall lag der Fehler in einer falschen fstab. Siehe dazu: #Zielrechner Konfiguration (auf dem Server). Kann diese Möglichkeit ausgeschlossen werden ist es ratsam man loggt sich im „emergency mode“ ein und schaut sich gründlich das Log an welches man durch Eingabe, wie oben zu sehen, journalctl -xb erhält. Dieses Log hatte eine Größe von ca. 72K, somit recht umfangreich, so das eine Fehlerbehebung möglich sein sollte.

Siehe auch

kernel.org: Mounting the root filesystem via NFS (nfsroot)

syslinux.org: pxelinux FAQ

Dieser Artikel (oder Teile davon) steht unter GNU FDL (GNU Freie Dokumentationslizenz) und ist eine Übersetzung aus dem ArchLinux.org Wiki. Am Original-Artikel kann jeder Korrekturen und Ergänzungen vornehmen. Im ArchLinux.org Wiki ist eine Liste der Autoren verfügbar.