FAI SPARC Debian

aus PUG, der Penguin User Group
Wechseln zu: Navigation, Suche

Debian SPARC (und X86) Architektur mittels FAI installieren

Diese Anleitung dient dazu, um mittels FAI von einem X86 Rechner aus, eine SUN Sparc mit Debian automatisch installieren zu lassen. Wer noch nie etwas von FAI gehört hat:

Filetypes.png

"FAI is a non-interactive system to install, customize and manage Linux systems and software configurations on computers as well as virtual machines and chroot environments, from small networks to large-scale infrastructures and clusters."

Quelle: http://fai-project.org/


Vorbereitungen

Wie bereits angedeutet, soll die SPARC nicht von einer anderen SPARC aus installiert werden, sondern von einem herkömmlichen X86 Rechner/Server aus. Damit dies klappt, muss dennoch zuerst auf herkömmliche Weise ein Debian auf der gewünschten (Test)SPARC installiert werden, da verschiedene Routinen innerhalb der FAI Scripte Binärprogramme aufrufen. Es besteht zwar die Möglichkeit mittels Cross-Compiling alles Nötige zu erstellen, doch der Aufwand wäre immens und stünde in keinem Verhältnis.

Des weiteren können wir das installierte System auf einem NFS Server kopieren, um daraus ein Rettungs- System zu erstellen. Dies ist besonders dann nützlich, wenn FAI ausgetestet wird und z.B. Probleme mit dem Kernel auftauchen. Mittels des Rettungs- Systems ließe sich ohne weiteres ein neuer Kernel erstellen, ohne auf ein installiertes System zurückgreifen zu müssen.

Da der Autor (ich) eine Menge Zeit damit verbracht hat, alles nötige zusammen zu suchen (passende Kernel Config ...), werden alle wichtigen Dateien am Ende des HowTos bereitgestellt.

Die Hardware

Für diese Anleitung wurde eine Sun SPARC V245 verwendet, die über vier Netzwerkkarten verfügt, sowie über eine Standard X86 Server Hardware.

Die Firmware der V245 wurde auf die letzte verfügbare Version gehoben, um im Vorfeld eventuelle Probleme zu vermeiden.

Für den X86 Teil wurde in der Regel eine Vmware Instanz verwendet, sowie Standard Intel Hardware.


Ablauf

Der Ablauf gestaltet sich im folgenden:

  • Vorbereiten des FAI-Server um das Netboot Image auszurollen
  • Installation eines Basis- Debian auf der SPARC mittels Netboot
  • Kopieren der Installation auf einen NFS Server Grundlage für das Rescue- System
  • Installation von fai-quickstart
  • Anpassen der FAI Dateipfade für unterschiedliche Architekturen
  • Kopieren der FAI Dateien auf den FAI-Server
  • Anpassen des FAI Servers
  • Testen

FAI-Server für Netboot vorbereiten

Da alles SPARCs per Netzwerk installiert werden können und nur wenige per USB od. CD-Rom, richten wir den zukünftigen FAI-Server so ein, dass wir schon mal das Debian Netboot Image auf die SPARC bekommen.

  • Was benötigt wird
    • Installiertes Debian (Squeeze =>)
    • Zwei Netzwerkkarten
    • DHCP Server
    • TFTP Server

Der Autor beginnt mit einem Debian welches nur mit SSH und den "Standard system utilities" ausgestattet wurde.

Netzwerk

Die Installation der FAI-Clients soll über die separate Netzwerkkarte eth1 erfolgen, um Konflikten mit dem DHCP Server und dem produktiven Netzwerk aus dem Weg zu gehen:

Konfiguration

  • /etc/network/interfaces
Ascii.png
[...]
allow-hotplug eth1
iface eth1 inet static
address  192.168.1.1
netmask 255.255.255.0
# post-up sysctl net.ipv4.ip_forward=1
# post-up iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# post-down sysctl net.ipv4.ip_forward=0
# post-down iptables -t nat -F 

Da es durchaus praktisch sein kann, dass der FAI-Client auf das Internet zugreifen kann, wird temporär IP-Forward und NAT aktiviert:

Gnome-terminal.png
  fai:# sysctl net.ipv4.ip_forward=1  
  fai:# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Wer es dauerhaft haben möchte, kann die Kommentarzeichen aus der /etc/network/interfaces nehmen.

DHCP

Folgt der DHCP Server.

Debian-term.png
fai:# aptitude install isc-dhcp-server

Konfiguration

  • /etc/default/isc-dhcp-server
Ascii.png
INTERFACES="eth1"
  • /etc/dhcp/dhcpd.conf
Ascii.png
ddns-update-style none;
option domain-name "meine.domain.foo";
option domain-name-servers 192.168.1.1;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
option dhcp-max-message-size 2048; 
use-host-decl-names on ;

subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.5 192.168.1.10;
  option broadcast-address 192.168.1.255;
  option routers 192.168.1.1;
  option subnet-mask 255.255.255.0;
  next-server 192.168.1.1;
  default-lease-time 600;
  max-lease-time 7200;
  server-name fai;
}

host host01 {
  hardware ethernet 0:14:4f:aa:bb:cc;
  option host-name "host01";
  fixed-address 192.168.1.5;
  always-reply-rfc1048 on;
  # Debian Installer
  filename "debian-installer.img";

  # Flash for SPARC
  # filename "flash-update-SunFire245";

  # RESCUE Kernel for SPARC
  # filename "sparc-rescue-kernel";
  # option root-path "/srv/rescue/sparc/nfsroot/" ;

  # FAI Install
  # filename "fai-sparc/boot-fai.img";
  # option root-path "/srv/fai-sparc/nfsroot" ;
}

Dies ist eine gute Ausgangsbasis zum testen. Wie sich entnehmen lässt, sind bereits Einträge vorhanden, die später zum Einsatz kommen, und daher auskommentiert sind:

  • Debian Installer = Netboot Image um Debian zu installieren
  • Flash for SPARC = Updates der OpenBoot Firmware von SUN (wenn vorhanden/nötig)
  • RESCUE Kernel for SPARC = Um das System vom NFS Server starten zu lassen
  • FAI Install = FAI Installer aufrufen

Die MAC Adresse 0:14:4f:aa:bb:cc muss natürlich durch die korrekte ersetzt werden.


Debian-term.png
fai:# /etc/init.d/isc-dhcp-server restart

TFTP

Um das Image auf den Rechner zu übertragen, wird das TFT Protokoll verwendet. Dazu wird der passende Server Dienst installiert und eingerichtet.

Debian-term.png
fai:# mkdir /srv/tftp/
fai:# aptitude install tftpd-hpa 

Konfiguration

  • /etc/default/tftpd-hpa
Ascii.png
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp/"
TFTP_ADDRESS="192.168.1.1:69"
TFTP_OPTIONS="--secure"
Debian-term.png
fai:# /etc/init.d/tftpd-hpa restart

Netboot Image

Nun wird das Debian NetBoot Image für SPARC nach /srv/tftp abgelegt:

Gnome-terminal.png
fai:# cd /srv/tftp && wget http://ftp.nl.debian.org/debian/dists/squeeze/main/installer-sparc/current/images/netboot/boot.img
fai:# mv boot.img debian-installer.img
Messagebox info.png

Eines der größten Probleme der Netboot SPARC Installation besteht in der Limitierung des OpenBootProzessors maximal 9,5MB verarbeiten zu können. Dies bedeutet: ein Netboot / Kernel Image, welches 9,5MB überschreitet, wird höchstwahrscheinlich mit der Meldung:

...
0:0>VBSC selecting POST MIN Testing.
0:0>POST enabling threads: ffffffff
0:0>VBSC setting verbosity level 2
0:0>Start Selftest.....
0:0>Master CPU Tests Basic....Done
0:0>Init MMU.....
...

... abbrechen. Siehe dazu FAI Client Kernel Konfiguration.

Debian Installation auf SPARC

Wurden die SPARC und der FAI- Server passend über Netzwerk verbunden (zb. Crosslink), kann der Test beginnen:


SPARC

Je nach aktuellem Status der SPARC, muss nun im OpenBoot (kurz OPB) das break Signal gesendet werden, bzw. neu gestartet werden. Um zu verhindern, dass das Standardbetriebssystem gestartet wird, schalten wir den Autoboot aus. Dazu in das ALOM (Alias Service Console) der SPARC einloggen und folgende Kommandos absenden:


Gnome-terminal.png
SC> bootmode skip_diag
SC> break
Are you sure you want to send a break to the system [y/n]? y

SC Alert: SC Request to send Break to host.
SC> console -f
OK> 

skip_diag wird nicht von allen Firmwares unterstützt, daher kann man eventuell auftretene Fehlermeldungen ignorieren. Beim console -f befindet man sich nun im OpenBoot. Sollte dies nicht klappen, dann:

Gnome-terminal.png
sc> reset -cy
[...]
Rebooting with command: boot  

.. beim auftauchen der Zeile Rebooting with command: boot zügig!:

Gnome-terminal.png
#.
SC> break
SC> console -f
OK> 

absenden (#. -> Raute + Punkt um in die Service Console zu gelangen), dann lässt sich der Autostart abschalten:

Gnome-terminal.png
OK> setenv auto-boot? false

Als nächstes starten wir per DHCP:

Gnome-terminal.png
OK> boot net3:dhcp

Es ist in jedem Fall hilfreich, auf der FAI-Server Seite ein 'tcpdump auf die eth1 zu setzen und die Logs zu beobachten:

Gnome-terminal.png
fai:# tcpdump -i eth1 -n
fai:# tail -f /var/log/syslog
  • Auszug Log
Feb 21 11:03:18 fai dhcpd: from the dynamic address pool for 192.168.1.0/24
Feb 21 11:03:18 fai dhcpd: DHCPREQUEST for 192.168.1.5 (192.168.1.1) from 00:14:4f:aa:bb:cc via eth1
Feb 21 11:03:18 fai dhcpd: DHCPACK on 192.168.1.5 to 00:14:4f:aa:bb:cc via eth1


  • Auszug tcpdump
11:15:21.635063 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:14:4f:aa:bb:cc, length 300
11:15:21.635244 IP 192.168.1.1.67 > 192.168.1.5.68: BOOTP/DHCP, Reply, length 300

11:15:25.635863 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:14:4f:aa:bb:cc, length 300
11:15:25.636023 IP 192.168.1.1.67 > 192.168.1.5.68: BOOTP/DHCP, Reply, length 300
11:15:25.636498 ARP, Request who-has 192.168.1.5 (ff:ff:ff:ff:ff:ff) tell 0.0.0.0, length 50
[...]
Messagebox info.png
Tritt die Meldung The file just loaded does not appear to be executable. so ist die Datei nicht korrekt herunterladen od. fehlerhaft erstellt worden. Da hilft nur neu erstellen od. Alternativen finden

War der Vorgang erfolgreich, so lässt sich nun eine minimale Debian Standard- Installation durchführen. In diesem Fall ist auch nützlich gleich Programme zu installieren, die auch im Rettungs- System hilfreich sein können (mdadm/lvm/parted/mc ....). Da die Installation über das Netzwerk erfolgt, ist es wichtig, dass der Installer einen Debian Spiegel- Server erreichen kann. Dazu entweder den NAT Teil am Anfang der Anleitung beachten, oder einen lokalen Spiegelserver einrichten.

Des weiteren hat der Autor festgestellt, dass nicht alle Spiegelserver sauber funktionieren, wenn es um SPARC Pakete geht.

Ist die Installation durch, so können wir nun auf ein vollständiges Debian zurückgreifen.

Rescue Image

Bevor das Debian nun mit überflüssigen Paketen belastet wird, installieren wir vorher nützliche Programme, die helfen können, ein festgefahrenes System wieder in Betrieb zu nehmen.

Pakete

Debian-term.png
host01:# aptitude install parted \ 
mdadm mc bzip2 libncurses5-dev rsync \ 
build-essential ethtool tcpdump vim nano \
nfs-client acl strace sparc-utils fail2ban \
lvm2 firmware-linux-nonfree aufs-tools screen


host01:# apt-get clean && apt-get autoclean

Weitere können später immer noch über NFS installiert werden, sofern mit "RW" exportiert wird.

Auf FAI Server kopieren

Hat man soweit alles zusammen, kann man nun das Rettungs- System vorbereiten.

Zuerst die nötigen Ordner auf dem FAI-Server erstellen und rsync installieren:

Gnome-terminal.png
fai:# aptitude install rsync
fai:# mkdir -p /srv/rescue/sparc/nfsroot/{proc,sys,dev,var/run}

Da /dev/ nicht mitkopiert wird, müssen wir dennoch ein paar Gerätedateien erstellen,andernfalls könnte es zu Problemen kommen:

Gnome-terminal.png
fai:# cd /srv/rescue/sparc/nfsroot/dev
fai:# cp -a /dev/{console,null,random,tty,ttyS0,urandom,zero} .

Die restlichen Gerätedateien werden vom Udev Deamon erstellt.


Nun kopieren wir das Root System auf den FAI Server, mittels rsync:

  • Rsync
Gnome-terminal.png
host01:# rsync -e ssh -az / --exclude /proc --exclude /dev  --exclude /sys --exclude /var/run --exclude /var/lock root@192.168.1.1:/srv/rescue/sparc/nfsroot/

Netboot Kernel

Wie bereits oben angesprochen, darf unter Kernel die 9,5MB nicht überschreiten. Daher wird auf eine Initrd (vorerst) verzichtet sowie alle überflüssigen Module entfernt. Des weiteren wird ein Monolith Kernel erstellt. In diesem Beispiel wird der 2.6.39 verwendet, welcher sich in den Squeeze Backports befindet. Allerdings füge ich keine Apt Zeile hinzu, sondern hole nur das Paket:

Debian-term.png
host01:# cd /usr/src && wget http://backports.debian.org/debian-backports/pool/main/l/linux-2.6/linux-source-2.6.39_2.6.39-3~bpo60+1_all.deb
host01:# dpkg -i linux-source-2.6.39_2.6.39-3~bpo60+1_all.deb
host01:# tar xjf linux-source-2.6.39.tar.bz2
host01:# ln -s linux-source-2.6.39 linux

Zum kompilieren ist es sinnvoll, noch folgende Pakete zu installieren:

Debian-term.png
host01:# aptitude install kernel-package build-essenatial bzip2

Kernel Konfiguration

Da es sehr mühsam sein kann, den Kernel zu entschlacken, kann man auf die bereits vom Autor erstellte Version vom 2.6.39 zurückgreifen und den Kernel erstellen:

Gnome-terminal.png
host01:# cd /usr/src/linux
host01:# wget https://www.pug.org/mediawiki/images/0/00/Sparc-rescue-nfsroot.txt -O .config
host01:# make menuconfig

Dann entsprechend der Ausstattung der SPARC die passenden Module einbinden. Es sei aber an die Grenze des OBP erinnert, die bei 9,5MB liegt!

Es gibt eine Besonderheit in der Kernel Konfiguration:

  • /usr/src/linux/.config
Ascii.png
CONFIG_CMDLINE="ip=::::::dhcp"

Diese Zeile sorgt dafür, dass der Kernel immer diese Option setzt. Wer andere Parameter verwenden möchte, muss diese Zeile entsprechend ändern. Wer nichts per Default mitgeben möchte, muss diese Option herausnehmen. Nur den Inhalt " " zu löschen reicht nicht, da sonst auch über die Kommandozeile mitgegebene Parameter wieder entfernt werden.

Hinweis
Hinweis

Für den Fall dass /dev/sd* Geräte nicht auftauchen, ist höchst Wahrscheinlich CONFIG_SYSFS_DEPRECATED aktiv. Daher -> Entfernen

Kernel convertieren

Der erzeugte Kernel arch/sparc/boot/zImage ist so allerdings noch nicht verwendungsfähig, da das OBP diesen nicht laden können wird. Daher muss dieser mit dem aus "sparc-utils" enthaltenen Programm elftoaout konvertiert werden. Dies kann der Kernel für uns übernehmen:

Gnome-terminal.png
host01:# cd /usr/src/linux
host01:# make vmlinux.aout

Der nun erstellte Kernel arch/sparc/boot/vmlinux.aout kann nun auf den FAI-Server kopiert werden:

Gnome-terminal.png
host01:# scp arch/sparc/boot/vmlinux.aout root@192.168.1.1:/srv/tftp/sparc-rescue-kernel

Als nächstes erneut mittels Rsync die Kernel Quellen auf dem FAI-Server hinterlegen, um von dort aus auch einen neuen Kernel erstellen zu können:

Gnome-terminal.png
host01:# rsync -e ssh -az / --exclude /proc --exclude /dev --exclude /sys --exclude /var/run --exclude /var/lock root@192.168.1.1:/srv/rescue/sparc/nfsroot/

Fstab

Da wir nun über NFS starten wollen, muss die /srv/rescue/sparc/nfsroot/etc/fstab auf dem FAI-Server angepasst werden:

  • /srv/rescue/sparc/nfsroot/etc/fstab
Ascii.png
proc            /proc           proc    defaults        0       0
/dev/nfs        /             nfs     defaults 0 0
none            /tmp            tmpfs   defaults        0       0
none            /var/run        tmpfs   defaults        0       0
none            /var/lock       tmpfs   defaults        0       0
none            /var/tmp        tmpfs   defaults        0       0

FAI Server - Rescue NFS

Nun richten wir den NFS Server auf dem FAI-Server ein, passen den DHCP-Server an und testen, ob das NFS Root System funktioniert.

NFS Server

NFS Server installieren:

Debian-term.png
fai:# aptitude install nfs-kernel-server

Konfiguration

  • /etc/exports
Ascii.png
/srv/rescue/ 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash)
# /srv/fai-sparc/nfsroot/ 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash)
# /srv/fai-amd64/nfsroot/ 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash)
# /srv/fai/config/ 192.168.1.0/24(ro,async,no_subtree_check,no_root_squash)

Der erste Export ist für das Rescue System, die anderen später für FAI.

Debian-term.png
fai:# /etc/init.d/nfs-kernel-server restart

Auch ist zu sehen, dass sowohl Schreibberechtigungen aktiv sind, als auch dass Root erlaubt ist. Dies sollte später geändert werden.

DHCP Server

Der DHCP Server benötigt nur eine kleine Änderung:


  • /etc/dhcp/dhcpd.conf
Ascii.png
[...]  
  # Debian Installer
  # filename "debian-installer.img";

  # RESCUE Kernel for SPARC
  filename "sparc-rescue-kernel";
  option root-path "/srv/rescue/sparc/nfsroot/" ;
[...]
Debian-term.png
fai:# /etc/init.d/isc-dhcp-server restart

Booten

Nun kann wie gehabt über das OBP vim Netzwerk gebootet werden. Siehe oben.

Sollten es Probleme geben, kann man auf dem FAI-Server in die Logs vom Host01 schauen:

Gnome-terminal.png
fai:# tail -f /srv/rescue/sparc/nfsroot/var/log/syslog

Ist nun ein erfolgreicher Login möglich (via Console / SSH), kann man nur sagen: Glückwunsch :-)

Wenn nun auch noch alle lokalen Geräte erreichbar sind (Platten, etc.) steht nun der Einrichtung der FAI Struktur nichts mehr im Wege.

FAI

Nun wird die FAI Struktur vorbereitet. Dazu wird der SPARC Host01 wieder normal gebootet, sodass dieser von dem installieren System startet.

FAI Quickstart

Da wir nicht alles benötigen (zumal das System wieder geplättet wird), passen wir nur das Nötigste an:

Installation

Debian-term.png
host01:# aptitude install fai-quickstart

Anpassung

Nun passen wir die Beispieldateien an, sodass sie für das neue Layout passen:

Gnome-terminal.png
host01:# cp -r /etc/fai /etc/fai-sparc
host01:# cp -r /srv/fai /srv/fai-sparc
host01:# rm /etc/fai-sparc/{grub.cfg,menu.lst}
  • Pfade anpassen:
  • /etc/fai-sparc/make-fai-nfsroot.conf
Ascii.png
NFSROOT=/srv/fai-sparc/nfsroot
TFTPROOT=/srv/tftp/fai-sparc
FAI_CONFIGDIR=/srv/fai/config
FAI_DEBOOTSTRAP="squeeze http://ftp.uni-erlangen.de/debian/"
FAI_DEBOOTSTRAP_OPTS="--exclude=info --arch=sparc"
  • /etc/fai-sparc/fai.conf
Ascii.png
FAI_CONFIG_SRC=nfs://192.168.1.1/srv/fai/config
[...]


  • Uni Erlangen ist sehr zuverlässig
  • /etc/fai-sparc/apt/sources.list
Ascii.png
deb http://ftp.uni-erlangen.de/debian/ squeeze main contrib non-free
deb http://security.debian.org/debian-security squeeze/updates main contrib non-free
  • Welche Pakete für das NFS Root installiert werden sollen. Insbesondere unten auf die SPARC Architektur + Kernel achten.
  • /etc/fai-sparc/NFSROOT
Ascii.png
PACKAGES aptitude
nfs-common fai-nfsroot module-init-tools ssh rdate lshw portmap
rsync lftp less dump reiserfsprogs e2fsprogs usbutils
hwinfo psmisc pciutils hdparm smartmontools parted mdadm lvm2
dnsutils ntpdate dosfstools vim xfsprogs xfsdump parted
procinfo dialog discover fail2ban
console-tools console-common
iproute udev subversion liblinux-lvm-perl

# needed for the simple examples
cfengine2 libapt-pkg-perl

# you should not edit the lines below
# architecture dependend list of packages that are installed

PACKAGES aptitude I386
grub lilo read-edid
linux-image-486

# packages for lenny:
# linux-image-486 aufs-modules-2.6-486

PACKAGES aptitude AMD64
grub lilo
linux-image-2.6-amd64
# packages for lenny:
# linux-image-2.6-amd64 aufs-modules-2.6-amd64

PACKAGES aptitude IA64
elilo gnu-efi efibootmgr

PACKAGES aptitude SPARC
silo linux-image-2.6.32-5-sparc64-smp firmware-linux-nonfree

PACKAGES aptitude ALPHA
aboot

PACKAGES aptitude POWERPC
linux-image-2.6-powerpc 
yaboot

Dann kann das NFS Rootsystem für FAI erstellt werden:

Gnome-terminal.png
host01:#  make-fai-nfsroot -v -C /etc/fai-sparc

Ist die Routine durchgelaufen und es finden sich keine Fehler in /var/log/fai/make-fai-nfsroot.log, dann kann man nun den Kernel anpassen.

FAI Kernel

Da wir für FAI auch eine Initrd verwenden müssen, um notfalls die Ursache mittels Busybox zu finden, zzgl. diverser FAI Scripte, müssen wir den Kernel noch weiter abspecken und die Initrd mit in den Kernel bringen. Als Grundlage für die Initrd dient uns die von FAI und Debian erstellte Datei unter /srv/tftp/fai-sparc/, sowie /boot/, die im zweiten Akt noch verkleinert wird.

Kernel Konfig

Eventuell die vorhergehende Kernel Konfiguration sichern!

Gnome-terminal.png
host01:# cd /usr/src/linux
host01:# wget https://www.pug.org/mediawiki/images/4/4e/Config-fai.txt -O .config
host01:# cd /usr/src
host01:# mkdir initram && cd initram
host01:# zcat /boot/initrd.img-$(uname -r) | cpio -i
host01:# cd /usr/src/linux && make && make modules_install
host01:# rsync -e ssh -az /lib/modules/2.6.39 192.168.1.1:/srv/fai-sparc/nfsroot/live/filesystem.dir/lib/modules/

Der letzte Befehl sorgt dafür, dass auch das FAI Live keine Fehler auswirft, weil es auf Module etc. nicht zugreifen kann.

  • Besondere Einstellungen:
Ascii.png
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="/usr/src/initram/"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0
CONFIG_INITRAMFS_COMPRESSION_BZIP2=y

# CONFIG_EXT3_FS is not set


Die Kernel Konfiguration ist so voreingestellt, sodass die Make Scripte automatisch eine Initrd aus /usr/src/initram erzeugen, die im Kernel integriert wird. Dies ist notwendig, da wir dem OBP nur eine einzelne Datei übergeben können. Des weiteren wird diese auch gleich mittel bzip2 gepackt. Werden allerdings Änderungen innerhalb von /usr/src/initram vorgenommen, muss immer ein make etc. durchgeführt werden.

Messagebox info.png

Außerdem wurde das Dateisystem EXT3 entfernt, da der Autor nur EXT2 und EXT4 verwendet und somit mehr Platz spart

Ist nun alles sauber ohne Fehler durchgelaufen, kann nun die Initram angepasst werden. Dies ist ein etwas schwierig zu dokumentieren, aber ich versuche es dennoch.

INITRD anpassen

Da die von FAI erstellte Initrd viel zu groß ist (cpio z.B. benötigt die doppelte Menge an Platz), der von Debian aber die FAI Eigenschaften fehlen, müssen wir beide zusammenführen. Ich bevorzuge in solchen Situationen gern den Midnight Commander, da dieser einen besseren Überblick verschafft.

Ich versuche es dennoch hier aufzuzeigen, nicht zuletzt, damit ich auch noch weiß, was ich getan habe ;-)

  • Debian Initrd
Gnome-terminal.png
host01:# cd /usr/src/initram/lib/modules
host01:# rm -Rf 2.6.32*
host01:# cp -r /lib/modules/2.6.39* .

Dann weitere Dateien löschen, die nicht wirklich benötigt werden, oder durch andere ersetzen

Gnome-terminal.png
host01:# cd /usr/src/initram/
host01:# rm sbin/rmmod
host01:# rm -Rf lib/firmware/


  • FAI Initrd
Gnome-terminal.png
host01:# mkdir fai-initrd
host01:# cd /usr/src/fai-initrd
host01:# zcat /srv/tftp/fai-sparc/initrd.img-2.6.32-5-sparc64-smp | cpio -i
host01:# 


  • Nun die FAI spezifischen Dateien kopieren:
Gnome-terminal.png
host01:# cd /usr/src/fai-initrd
host01:# cp bin/live* /usr/src/initram/bin/
host01:# rm -R /usr/src/initram/{scripts,init}
host01:# cp -r init scripts /usr/src/initram/

Nach dieser Aktion, sollte das /usr/src/initram/ Verzeichnis in etwa eine Größe von 8,3MB haben.

Als Abschluss wird der Kernel samt Initrd neu erstellt:

Gnome-terminal.png
host01:# cd /usr/src/linux
host01:# make && make vmlinux.aout
host01:# du -hs arch/sparc/boot/vmlinux.aout
9.5M    arch/sparc/boot/vmlinux.aout

Wie man erkennen kann, ist der Kernel nun 9,5MB groß und kann auf den FAI-Serer kopiert werden:


Gnome-terminal.png
host01:# scp /usr/src/linux/arch/sparc/boot/vmlinux.aout root@192.168.1.1:/srv/tftp/fai-sparc/boot-fai.img

Damit die Arbeit nicht abhanden kommt, sogleich auf den FAI-Server kopieren:

Gnome-terminal.png
host01:# rsync -e ssh -az /usr/src/initram root@192.168.1.1:/usr/src/

FAI Rootfs

Nun können /etc/fai-sparc und /srv/fai-sparc auf den FAI Server kopiert werden:

Gnome-terminal.png
host01:# rsync -e ssh -az /etc/fai-sparc --exclude grub.cfg --exclude menu.lst 192.168.1.1:/etc/ 
host01:# rsync -e ssh -az /srv/fai-sparc 192.168.1.1:/srv/ 


DHCP Konfiguration

Für den ersten Test, können wir nun den DHCP Server leicht auf dem FAI-Server editieren:

  • /etc/dhcp/dhcpd.conf
Ascii.png
  # Debian Installer
  # filename "debian-installer.img";

  # Flash for SPARC
  # filename "flash-update-SunFire245";

  # RESCUE Kernel for SPARC
  # filename "sparc-rescue-kernel";
  # option root-path "/srv/rescue/sparc/nfsroot/" ;

  # FAI Install
  filename "fai-sparc/boot-fai.img";
  option root-path "/srv/fai-sparc/nfsroot" ;
Messagebox info.png

Auch wenn es auf dem ersten Blick seltsam scheint, nicht /srv/fai-sparc/nfsroot/live/filesystem.dir/ zu verwenden, die FAI Scripte benötigen /srv/fai-sparc/nfsroot

Debian-term.png
fai:# /etc/init.d/isc-dhcp-server restart

NFS Konfiguration

Nun kann der NFS Export angepasst werden:

  • /etc/exports
Ascii.png
/srv/rescue/ 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash)
/srv/fai-sparc/nfsroot/ 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash)
/srv/fai-amd64/nfsroot/ 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash)
/srv/fai/config/ 192.168.1.0/24(ro,async,no_subtree_check,no_root_squash)
Debian-term.png
fai:# /etc/init.d/nfs-kernel-server restart

FAI Quickstart, die Zweite

Nun kommt erneut die Installation von fai-quickstart, allerdings dieses Mal auf dem FAI-Server:

Debian-term.png
fai:# aptitude install fai-quickstart

Konfiguration

Nach der Installation wurde das Verzeichnis /srv/fai/ erzeugt, sowie /etc/fai. Letzteres werden wir unserem Layout Anpassen:

  • Für 64Bit / i386
Gnome-terminal.png
fai:# cp -r /etc/fai /etc/fai-amd64
fai:# cp -r /etc/fai /etc/fai-i386


  • Pfade anpassen (hier nur als Beispiel für AMD64, für i386 Adaptiv):
  • /etc/fai-amd64/make-fai-nfsroot.conf
Ascii.png
NFSROOT=/srv/fai-amd64/nfsroot
TFTPROOT=/srv/tftp/fai-amd64
FAI_CONFIGDIR=/srv/fai/config
FAI_DEBOOTSTRAP="squeeze http://ftp.uni-erlangen.de/debian/"
FAI_DEBOOTSTRAP_OPTS="--exclude=info --arch=amd64"
  • Uni Erlangen ist sehr zuverlässig
  • /etc/fai-amd64/apt/sources.list
Ascii.png
deb http://ftp.uni-erlangen.de/debian/ squeeze main contrib non-free
deb http://security.debian.org/debian-security squeeze/updates main contrib non-free
  • Welche Pakete für das NFS Root installiert werden sollen. Auf den gewünschten Kernel achten!
  • /etc/fai-amd64/NFSROOT
Ascii.png
PACKAGES aptitude
nfs-common fai-nfsroot module-init-tools ssh rdate lshw portmap
rsync lftp less dump reiserfsprogs e2fsprogs usbutils
hwinfo psmisc pciutils hdparm smartmontools parted mdadm lvm2
dnsutils ntpdate dosfstools vim xfsprogs xfsdump parted
procinfo dialog discover fail2ban
console-tools console-common
iproute udev subversion liblinux-lvm-perl

# needed for the simple examples
cfengine2 libapt-pkg-perl

# you should not edit the lines below
# architecture dependend list of packages that are installed

PACKAGES aptitude I386
grub lilo read-edid
linux-image-486

PACKAGES aptitude AMD64
grub -lilo
linux-image-2.6-amd64

PACKAGES aptitude IA64
elilo gnu-efi efibootmgr

PACKAGES aptitude SPARC
silo linux-image-2.6.32-5-sparc64-smp firmware-linux-nonfree

PACKAGES aptitude ALPHA
aboot

PACKAGES aptitude POWERPC
linux-image-2.6-powerpc 
yaboot

Dann kann das NFS Rootsystem für FAI-AMD64 erstellt werden:

Gnome-terminal.png
host01:# make-fai-nfsroot -v -C /etc/fai-amd64

Sind auch hier keine Fehler aufgetreten, können wir den ersten Test mit der Sparc starten.

Erster FAI Test

Um einfach zu testen, ob die FAI Scripte, NFS und DHCP zusammen harmonieren, starten wir die SPARC neu und geben im OBP folgendes ein:

Gnome-terminal.png
OK> boot net3:dhcp root=/dev/nfs boot=live FAI_ACTION=sysinfo FAI_FLAGS="verbose" ip=::::eth3: debug

Mit ein wenig Glück kommen dann folgende Zeilen zum Vorschein:

[...]
mount: according to mtab, none is already mounted on /dev/pts
             -------------------------------------------------
                   Fully Automatic Installation  -  FAI

                   FAI 3.4.7, 24 Dec 2010   (c) 1999-2010
               Thomas Lange  <lange@informatik.uni-koeln.de>
             -------------------------------------------------

Calling task_confdir
Kernel currently running: Linux 2.6.39 sparc64 GNU/Linux
Kernel parameters: root=/dev/nfs boot=live FAI_ACTION=sysinfo FAI_FLAGS="verbose" ip=::::eth3: debug
[...]

Sollte der Init Prozess dann aber abbrechen, zum Beispiel weil falsche Pfade verwendet werden, sollte nochmal ein Blick in die folgende Datei geworfen werden:

  • /srv/fai-sparc/nfsroot/live/filesystem.dir/etc/fai/fai.conf
Ascii.png
[...]
FAI=/var/lib/fai/config
FAI_CONFIG_SRC=nfs://192.168.1.1/srv/fai/config
[...]

Dann hat sich dort eventuell ein Fehler eingeschlichen, beim Erstellen des FAI Root Dateisystems.

Ob nun tatsächlich alles funktioniert hat, lässt sich daran festmachen, dass FAI nun eine Auflistung sämtlicher Geräte, Partitionen etc. pp. erstellt und ausgibt. Ist man bis zum diesem Schritt gekommen, ist FAI nun einsatzbereit.

FAI SPARC Anpassungen

Nun, wenn sichergestellt ist, dass das Rescue System und FAI an sich funktionieren, kann man daran gehen, die Sparc installieren zu lassen.

  • Der Ablauf
    • Class definieren
    • Partitionierung
    • Bootloader


Class

Da der Rechner eine angepasste Netzwerk Konfiguration bekommen, sowie der Bootloader ein anderer ist, teilen wir dies FAI mit:

  • /etc/fai/config/class/50-host-classes
Ascii.png
[...]
    host01)
        echo "FAIBASE SILO GERMAN HOST01" ;;
[...]

Die Leserichtung ist von Rechts nach Links. Siehe dazu in der FAI-Doku.

  • Weitere nützliche Parameter:
  • /etc/fai/config/class/FAIBASE.var
Ascii.png
[...]
UTC=yes
TIMEZONE=Europe/Berlin
[...]

Partitionierung

So schön auch das setup-storage Modul auch ist, leider kennt es (zumindest in der Debian Squeeze Fassung) keine Sun Partitionen. Das bedeutet, dass die komplette Partitionierung, Dateisystemerstellung etc. von Hand ausgeführt werden muss. Dies ist natürlich sehr starr und muss vorher gut durchdacht sein. Des weiteren kommt erschwerend hinzu, dass /boot nicht auf ein /dev/md0 gelegt werden kann, da die Metainformationen vom Softwareraid Teile der Partitionierung bzw. des Bootloader beschädigen.

In diesem Fall sieht sie so aus:

  • /dev/sda1 /boot EXT2 = Für Silo/Obp zum booten
  • /dev/sdb1 - EXT2 = dd if=/dev/sda1 of=/dev/sdb1
  • /dev/sda2 FD = Software Raid /dev/md0
  • /dev/sdb2 FD = Software Raid /dev/md0
  • /dev/sda3 Whole Sun Partition = Wird automatisch angelegt und darf nicht verändert werden !
  • /dev/sdb3 Whole Sun Partition = Wird automatisch angelegt und darf nicht verändert werden !
  • VG root_vg /dev/md0
  • LV rootfs - EXT4
  • LV varfs - EXT4
  • LV varlogfs - EXT4
  • LV tmpfs - EXT4
  • LV swapfs - EXT4


Damit das umgesetzt wird, habe ich dazu eine Datei /srv/fai-sparc/config/hooks/partition.SPARC angelegt, mit folgendem Inhalt:

  • /srv/fai-sparc/config/hooks/partition.SPARC
Ascii.png

# Schleife, damit FAI nicht mehrfach dieses Script aufruft 
[ -f $LOGDIR/skip.partition ] && exit 0

for our_cl in $classes; do
  [ $our_cl = "SPARC" ] && continue
  [ -f $FAI/hooks/partition.$our_cl ] && exit 0
done

# Vorhandene Raids loeschen
mdadm  --zero-superblock /dev/sd[a,b]2 2> /dev/null
# Augenblick warten
sleep 2
# Partitionstabelle reseten und Partitionen erstellen
parted -s /dev/sda mklabel sun
# Es erscheint eine Warnung, dass nicht die optimale "Performance" verwendet wird
parted -s /dev/sda mkpart 0.0 512M
parted -s /dev/sda mkpart 518 100%
# Auf Bootbar setzen
parted -s /dev/sda set 1  boot on
# Auf Raid setzen
parted -s /dev/sda set 2  raid on

# Siehe oben.
parted -s /dev/sdb mklabel sun
parted -s /dev/sdb mkpart 0.0 512M
parted -s /dev/sdb mkpart 518 100%
parted -s /dev/sdb set 2  raid on

# Augenblick warten
sleep 4

# Jetzt Raid erstellen
mdadm --create -f -a yes /dev/md0 --level=1 --raid-devices=2 /dev/sda2 /dev/sdb2 --metadata=0.90

# Wieder warten, sonst hat LVM ein Problem
sleep 4

# LVM Volumes erstellen + formaieren in EXT4 (!!) Kein EXT3 Support im Kernel!!
pvcreate -ff -y  /dev/md0
vgcreate root_vg /dev/md0
lvcreate -n rootfs -L 5g root_vg && mkfs.ext4 /dev/mapper/root_vg-rootfs
lvcreate -n swapfs -L 1g root_vg && mkswap -f /dev/mapper/root_vg-swapfs
lvcreate -n varfs -L 3g root_vg && mkfs.ext4 /dev/mapper/root_vg-varfs
lvcreate -n varlogfs -L 1g root_vg && mkfs.ext4 /dev/mapper/root_vg-varlogfs
lvcreate -n tmpfs -L 1g root_vg && mkfs.ext4 /dev/mapper/root_vg-tmpfs

# Muss(!) Ext2 sein, sonst kein Boot moeglich
mkfs.ext2 /dev/sda1

# Fstab erstellen
cat > /tmp/fai/fstab <<EOF
proc            /proc           proc    defaults        0       0
/dev/mapper/root_vg-rootfs /               ext4    errors=remount-ro 0       1
/dev/sda1	/boot	ext2	nodev,nosuid,auto	0	2
/dev/mapper/root_vg-varfs /var            ext4    defaults,nodev,nosuid        0       2
/dev/mapper/root_vg-varlogfs /var/log            ext4    nosuid,nodev,auto        0       2
/dev/mapper/root_vg-tmpfs /tmp            ext4    nosuid,nodev,noatime,auto        0       2
/dev/mapper/root_vg-swapfs none            swap    sw              0       0
EOF

# Variablen schreiben, da andere Scripte darauf zurueckgreifen
echo "export BOOT_DEVICE=/dev/sda"  > $LOGDIR/disk_var.sh
echo "export ROOT_PARTITION=/dev/mapper/root_vg-rootfs"  >> $LOGDIR/disk_var.sh

# Fuer die Schleife
touch $LOGDIR/skip.partition
# Partitionierung nun ueberspringen
skiptask partition
  • Noch ausführbar machen
Gnome-terminal.png
fai:# chmod +x /srv/fai/srv/fai/config/hooks/partition.SPARC


Es ist sicherlich erkennbar, dass versucht wird, dass sämtliche Partitionen, Raid, VolumeGroups etc. gelöscht werden, sodass im späteren Verlauf alles neuerstellt werden kann. Leider kommt es dennoch hin und wieder vor, dass mdadm eine Rückfrage stellt, die bejaht werden muss, ob man das gefundene Raid wirklich überschreiben möchte. Wer hierzu eine Lösung haben sollte: bitte melden.

Messagebox info.png

Es ist wichtig, wie die Reihenfolge der /etc/fstab aufgebaut ist, da sie von FAI in dieser Reihenfolge eingehangen wird. Dies ist extrem wichtig für /boot

Bootloader

Da Sparc einen anderen Bootloader -- Silo -- benötigt, ist auch hier eine Anpassung notwendig. Dazu das passende Verzeichnis SILO erstellen, mit dem passenden Inhalt:

  • /srv/fai/config/scripts/SILO/20-create-siloconf
Ascii.png
#!/bin/bash -x

# copyright Thomas Lange 2001-2005, lange@debian.org
# LILO support may be dropped in a future release

FFLAGS=${FAI_FLAGS// /,}

# read varaibles

. $LOGDIR/disk_var.sh

cd $target/boot && kernelversion=$(ls vmlinuz-*)
cd $target/boot && initrdversion=$(ls initrd.img-*)
cd $target/boot && ln -s $kernelversion vmlinuz
cd $target/boot && ln -s $initrdversion initrd.img

# if class NOMBR is defined, write boot loader into root partition, not into mbr
ifclass NOMBR && BOOT_DEVICE=$ROOT_PARTITION

if ifclass SILO; then
  {
    # if the installed kernel is using an initial ramdisk
    if [ -L $target/initrd.img ]; then
	initrdopt="initrd=/initrd.img"
    fi
    # write silo.conf and install lilo to disk
    echo "Creating silo.conf for /vmlinuz"
    cat > $target/boot/silo.conf <<-EOF
	root=$ROOT_PARTITION
	partition=1
	default=Linux
	read-only
	timeout=50

	image=/vmlinuz
	initrd=/initrd.img
	label=Linux

	image=/vmlinuz.old
	label=Linux.old
	initrd=/initrd.img.old
EOF
  }
fi

# - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ifclass FAI_BOOTPART && {

    rev=`uname -r`
    mkdir -p $target/fai-boot
    cp -a /boot/vmlinuz-$rev $target/fai-boot

    ifclass SILO && {
    # write silo.conf and install silo to disk
	echo "Add /fai-boot partition to silo.conf"

	cat >> $target/etc/silo.conf <<-EOF
	image=/fai-boot/boot/$kernelversion
	$initrdopt
	label=FAI
EOF
	mkdir $target/fai-boot/etc
	cp $target/boot/silo.conf $target/fai-boot/etc
    }

}

# now call silo
# you can also use this
# $ROOTCMD silo -v
if ifclass SILO; then
    silo -C /boot/silo.conf -r $target
fi
  • Wieder ausführbar machen
Gnome-terminal.png
fai:# chmod +x /srv/fai/config/scripts/SILO/20-create-siloconf

Letzten Endes ist dies ursprünglich eine Datei von LILO gewesen, aber mit ein paar Veränderungen. Es ist z.B. sehr wichtig, dass die Konfigurations- Datei in boot/ (/dev/sda1, um genauer zu sein) wandert, da andernfalls Silo sich nicht installieren lässt.

Package Config

Wer andere Pakete, od. mehr installiert haben möchte, hat dazu mehrere Möglichkeiten:

  • /srv/fai/config/package_config/FAIBASE = Standard Pakete -> z.B. Exim4 raus und Postfix rein :-) + mdadm
  • /srv/fai/config/package_config/DEFAULT = SPARC Kernel und Silo, statt Grub/lilo
Ascii.png
[...]
PACKAGES aptitude SPARC
grub- lilo- silo
linux-image-2.6-sparc64-smp
[...]
  • /srv/fai/config/package_config/SPARC = Spezielle Sparc Pakete
Ascii.png
PACKAGES aptitude
sparc-utils

Netzwerk

Damit unser Host01 nun auch die passende - statische - Netzwerkkonfiguration erhält, erstellen wir die passenden Ordner und Dateien:

{{shell|

fai:# mkdir -p /src/fai/config/files/etc/network/interfaces/
fai:# mkdir -p /src/fai/config/files/etc/resolv.conf
fai:# touch /src/fai/config/files/etc/network/interfaces/HOST01
  • /src/fai/config/files/etc/network/interfaces/HOST01
Ascii.png
auto lo
iface lo inet loopback

auto  eth0
iface eth0 inet static
    address     10.10.10.5
    gateway     10.10.10.1
    netmask     255.255.0.0
  • /src/fai/config/files/etc/network/interfaces/HOST01
Ascii.png
auto lo
iface lo inet loopback

auto  eth0
iface eth0 inet static
    address     10.10.10.5
    gateway     10.10.10.1
    netmask     255.255.0.0


  • /src/fai/config/files/etc/resolv.conf/HOST01
Ascii.png
nameserver 4.4.4.4
nameserver 8.8.8.8

Die Werte sind natürlich nur Beispiele. Aber diese Dateien werden bei der Installation den Zielrechner kopiert.

SPARC Console

Da die Standard Inittab nicht für Sparc geeignet ist und man keinen Login erhalten würde (SSH klappt aber), müssen wir den SPARC Rechnern eine angepasste Inittab geben:

Gnome-terminal.png
fai:# mkdir -p /srv/fai/config/files/etc/inittab
fai:# touch /srv/fai/config/files/etc/inittab/SPARC
  • /srv/fai/config/files/etc/inittab/SPARC
Ascii.png
id:2:initdefault:
si::sysinit:/etc/init.d/rcS
~:S:wait:/sbin/sulogin
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
z6:6:respawn:/sbin/sulogin
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop
T0:23:respawn:/sbin/getty -L ttyS0 9600 vt102

Allerdings wird sie nicht automatisch in das System kopiert, da kein Script den passenden fcopy(8) aufruft. Das können wir schnell ändern:

  • /src/fai/config/scripts/LAST/60-files
Ascii.png
#!/bin/bash

fcopy  /etc/inittab
Gnome-terminal.png
fai:# chmod +x /srv/fai/config/scripts/LAST/60-files

Der LAST Ordner wird als letztes abgearbeitet, daher ist dies ein guter Ort um Dateien zu ersetzen od. auszutauschen.

Erste FAI Client Installation

Ist auch das geschafft, kann nun die Installation erfolgen. Dazu - wie gehabt - im Obp folgende Zeile eingeben:

Gnome-terminal.png
OK> boot net3:dhcp  root=/dev/nfs boot=live FAI_ACTION=install FAI_FLAGS="sshd verbose reboot" ip=::::eth3: debug
Messagebox info.png

Es ist enorm wichtig, die Reihenfolge der Zeile beizubehalten, da es unter Umständen sonst beim FAI Aufruf zu Problemen kommen kann

Messagebox info.png
Beim Autor kam es auch vor, dass
ip=::::eth3:
zwar beim
FAI_ACTION=sysinfo
funktionierte, jedoch nicht beim der Installation, da der Kernel aus der eth3 eine eth0 macht und somit der Parameter
ip=::::eth0:
lauten muss


Mittels SSH und dem Root Kennwort fai kann man sich nun in das laufende System einloggen und z.B. die Logs in /tmp/fail/ anschauen.

Wenn der Rechner nun installiert wurde, kann nach dem erfolgreichen Boot per ssh mit dem Root Kennwort 'fai eingeloggt werden. Herzlichen Glückwunsch zu Ihrem per FAI installierten SPARC, im Jahre 2012.

X86 Teil vervollständigt

Um nun auch den X86 Teil zum Abschluss zu, sind nur noch wenige Schritte von Nöten:

  • PXE einrichten
  • DHCPD Anpassen

PXE

Damit auch die X86 Rechner booten können, muss zuvor noch eine PXE Konfiguration auf dem Fai Server hinterlegt werden.

  • Verzeichnisstruktur erstellen:
Gnome-terminal.png
fai:# mkdir -p /srv/tftp/fai-amd64/pxelinux.cfg/

Nun kommen zwei PXE Konfigurationsdateien, die einem das Leben etwas erleichtern können

  • default - Enthält das eigentliche Menü
  • graphics.conf - Enhält die grafische Aufbereitung (Toolbox)
  • /srv/tftp/fai-amd64/pxelinux.cfg/default
Ascii.png
default menu.c32
PROMPT 0
TOTALTIMEOUT 5000

menu title PXE Special Boot Menu
menu INCLUDE pxelinux.cfg/graphics.conf
MENU AUTOBOOT Starting Local System in # seconds

label bootlocal
      menu label ^Boot local disks
      menu default
      localboot 0
      timeout 80
      TOTALTIMEOUT 9000

label sysinfo
kernel vmlinuz
append root=/dev/nfs nfsroot=/srv/fai-amd64/nfsroot boot=live ip=dhcp initrd=initrd.img FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://192.168.1.1/srv/fai/config/ FAI_ACTION=sysinfo

label install
kernel vmlinuz
append root=/dev/nfs nfsroot=/srv/fai-amd64/nfsroot boot=live ip=dhcp initrd=initrd.img FAI_FLAGS=verbose,sshd,createvt,reboot FAI_CONFIG_SRC=nfs://192.168.1.1/srv/fai/config/ FAI_ACTION=install

Das Menü enthält drei Einträge:

  • bootlocal - Bootet vom lokalen System (e.g. Festplatte ...)
  • sysinfo - Bootet Fai mit dem Flag sysinfo welches einem nur eine Informelle Ausgabe ausgibt (praktisch zum testen)
  • install - Bootet Fai mit dem Flag install welches die eigentliche Installation durchführt
  • /srv/tftp/fai-amd64/pxelinux.cfg/graphics.conf
Ascii.png
    menu color tabmsg 37;40      #80ffffff #00000000
    menu color hotsel 30;47      #40000000 #20ffffff
    menu color sel 30;47      #40000000 #20ffffff
    menu color scrollbar 30;47      #40000000 #20ffffff
    MENU MASTER PASSWD yourpassword
    MENU WIDTH 80
    MENU MARGIN 22
    MENU PASSWORDMARGIN 26
    MENU ROWS 6
    MENU TABMSGROW 15
    MENU CMDLINEROW 15
    MENU ENDROW 24
    MENU PASSWORDROW 12
    MENU TIMEOUTROW 13
    MENU VSHIFT 6
    MENU PASSPROMPT Enter Password:
    NOESCAPE 1
    ALLOWOPTIONS 0

Das grafische Menü benötigt noch eine zusätzliche Bibliothek zzgl. zu dem eigentlichen PXE Loader aus dem Paket syslinux-common:

Debian-term.png
fai:# aptitude install syslinux-common
fai:# cp /usr/lib/syslinux/menu.c32 /usr/lib/syslinux/pxelinux.0 /srv/tftp/fai-amd64/


Als letztes wird noch der Kernel und die Initrd kopiert:

Gnome-terminal.png
fai:# cp /srv/fai-amd64/nfsroot/live/filesystem.dir/boot/vmlinuz-2.6.32-5-amd64 /srv/tftp/fai-amd64/
fai:# cp /srv/fai-amd64/nfsroot/live/filesystem.dir/boot/initrd.img-2.6.32-5-amd64 /srv/tftp/fai-amd64/

Nun noch Links anlegen:

Gnome-terminal.png
fai:# cd /src/tftp/fai-amd64
fai:# ln -s vmlinuz-2.6.32-5-amd64 vmlinuz
fai:# ln -s initrd.img-2.6.32-5-amd64  initrd.img

DHCP Konfiguration

Als letztes erfolgt die DHCP Konfiguration, basierend auf der bereits erstellten Datei:

  • /etc/dhcp/dhcpd.conf
Ascii.png
group {
  filename "fai-amd64/pxelinux.0";
  option root-path "/srv/fai-amd64/nfsroot" ;

  host CLIENT1 { hardware ethernet 00:0c:29:ff:0b:40; option host-name "CLIENT1"; }
  host CLIENT2 { hardware ethernet 00:0c:29:ff:0c:50; option host-name "CLIENT2"; }
  host CLIENT3 { hardware ethernet 00:0c:29:ff:1d:60; option host-name "CLIENT3"; }
}

Damit ist auch der X86 Teil vollständig.

Wie geht es weiter

Nun, zum einen muss noch so eingies für AMD64 Plattform angepasst werden, dann sollten dringends die SSH Einstellungen zzgl. Schlüssel angepasst werden, sowie Feintuning:

  • Postfix nur mit Relay + localhost
  • Kernel 2.6.32 durch einen aktuellen ersetzen, da Meldungen von mdadm "mdadm: sending ioctl 20001261 to a partition!" sehr nervig sind
  • Cgroups mit einbinden für LXC Linux Container
  • Partitionierung optimieren
  • ...

Probleme

  • Ich kann mich per SSH während der Installation nicht einloggen:
    • Nachprüfen, ob überhaupt ein Kennwort gesetzt wurde, in /srv/fai-sparc/nfsroot/live/filesystem.dir/etc/shadow
  • Kennwort für die Installierten Clients per Default ändern?
    • Zu finden in /etc/fai-sparc/make-nfs-root.conf

Fazit

Hat man erst einmal die größten Hürden (Kernel + Initrd + Partitionierung) überwunden, geht FAI recht leicht von der Hand, zumal der Rest dann Plattform unabhängig ist. Doch als SPARC Benutzer hat man es teils sehr schwer, an aktuelle Dokumentation zu kommen und auch Menschen kennenlernen zu dürfen, die SPARC noch außerhalb von Solaris verwenden.

AddOns

Eigener Kernel

Soll ein eigener Kernel zum Einsatz kommen als der Standard Kernel von Debian, ist es am einfachsten ein lokales Repository einzurichten. Zwar bestünde auch die Möglichkeit, per fcopy die Datei auf das Zielsystem zu kopieren und dann per Chroot installieren zu lassen, aber unter Umständen bleibt es nicht nur bei diesem einen Paket. Auch spätere Updates wären so einfacher möglich.

Der Kernel wurde mit Hilfe von make-kpkg erstellt, welches sich im kernel-package Paket befindet. Wer noch keine Busybox installiert hat, sollte dies nachholen, da sie für die Initrd benötigt wird. Des weiteren hat make-kpkg das Problem, dass im Debian Paket keine Abhängigkeit zu dem Paket Busybox und initramfs-tools besteht, was allerdings essentiell ist. Ist dies nicht der Fall, wird bei der Installation des Kernels des Fai Clients keine Initrd erzeugt. Also müssen wir make-kpkg mitteilen, dass diese Abhängigkeit notwendig ist, und vor der Installation des Kernels diese Pakete installiert werden müssen.

Dazu wird der Einfachheit das Verzeichnis /usr/src/make-kpkg erzeugt, mit der angepassten Datei /usr/share/kernel-package/Control darin:

Debian-term.png
host01:# mkdir /usr/src/make-kpkg && cp /usr/share/kernel-package/Control /usr/src/make-kpkg/

Der passende Patch:

Ascii.png
--- /usr/share/kernel-package/Control	2010-07-18 20:08:34.000000000 +0200
+++ Control	2012-02-24 09:45:58.000000000 +0100
@@ -54,7 +54,7 @@
 Priority: optional
 Provides: =ST-image,  =ST-image-=CV
 Pre-Depends: debconf (>= 0.2.17) | debconf-2.0
-Depends: =I coreutils (>= 5.96)
+Depends: =I coreutils (>= 5.96), initramfs-tools (>= 0.55) | linux-initramfs-tool
 Suggests: fdutils, =ST-doc-=V=SA | =ST-source-=V, ksymoops, =ST-image-=V=SA-dbg
 Description: Linux kernel binary image for version =V=SA
  This package contains the Linux kernel image for version 


Dann wird diese Datei gepatched:

Debian-term.png
host01:# cd /usr/src/make-kpkg
host01:# cat Control.patch | patch -p0

Die Datei Control ist nun angepasst und sorgt dafür, dass später die Initrd erzeugt werden kann.

Ein make-kpkg Beispiel könnte so aussehen:

Debian-term.png
host01:# aptitude install busybox kernel-package
host01:# cd /usr/src/linux
host01:# make-kpkg --overlay-dir /usr/src/make-kpkg kernel_image kernel_headers --initrd --revision 10.1 --append-to-version -foo

Die dann erstellten Pakete können dann ins Repository aufgenommen werden.

Messagebox info.png

Eventuell daran denken, das Verzeichnis /usr/src/ auf den FAI-Server zu kopieren, für das Rescue System. Sonst ist nach der Installation des FAI-Clients alles wieder weg.

FTP

Als Zugang wird der VSFTPD Server verwendet:

Debian-term.png
fai:# aptitude install vsftpd

Das Standardverzeichnis ist /srv/ftp welches wir so belassen.

Dann noch die passenden Ordner erzeugen:

Gnome-terminal.png
fai:# mkdir -p /srv/ftp/binary
fai:# mkdir -p /srv/ftp/source

Debian Repository

Kurz die passenden Zeilen:

Debian-term.png
fai:# aptitude install dpkg-dev

Dann die passenden Debian Pakete in die jeweiligen Verzeichnisse packen.

  • /srv/ftp/localdebs/binary = Alle binär Pakete
  • /srv/ftp/localdebs/source = Alle Quellcode Pakete (wenn vorhanden)

Und zum Schluss die Packages.gz erzeugen lassen:

Debian-term.png
fai:# cd /srv/ftp/localdebs
fai:# dpkg-scanpackages binary /dev/null | gzip -9c > binary/Packages.gz
fai:# dpkg-scanpackages sources /dev/null | gzip -9c > sources/Sources.gz


Die passende sources.list Zeile:

  • /etc/apt/sources.list
Ascii.png
deb ftp://192.168.1.1:/localdebs/ binary/
deb-src ftp://192.168.1.1:/localdebs/ source/

Root Kennwort generieren lassen

Wer für Studenten od. Kunden häufig Rechner einrichten muss, mit unterschiedlichen Rootkennwörtern, der kann zum nachfolgendem Script greifen, welches ein Kennwort generiert, mittels GPG verschlüsselt und per Mail versendet:

GnuPG vorbereiten

Gnome-terminal.png
fai:# chroot /srv/fai-amd64/nfsroot/live/filesystem.dir/
chroot:# aptitude install gnupg libmail-sender-perl libstring-random-perl libcrypt-gpg-perl 
chroot:# gpg gpg --gen-key
gpg> (2)
gpg> <enter>
gpg> 0
gpg> (y)
gpg> Real Name: Fai Install
gpg> Email adress: install@domain.foo
gpg> Comment: Fai Install Server
gpg> (O)
gpg> Enter passphrase: <very secret passphrase!!>
[...]

Das entstandene Verzeichnis /root/.gnupg verschieben wir nach /etc/fai/gnupg und erstellen einen Link:

Gnome-terminal.png
chroot:# mv /root/.gnupg /etc/fai/gnupg
chroot:# chmod 0700 /etc/fai/gnupg
chroot:# ln -s /etc/fai/gnupg /root/.gnupg
Messagebox info.png

An dieser Stelle sollte überlegt werden, ob der private Schlüssel (secret-key) auf dem System verbleiben soll, od doch verschoben werden sollte

Script

Das folgende Script stammt aus dem Faiwiki und wurde nur ein wenig angepasst.

  • Statt md5 wird SHA512 verwendet
  • Variable $FAI_ROOT entfernt
  • Statt 8 Zeichen, werden 10 verwendet

Da im Script die passende ID benötigt wird, schauen wir nach, wie die ID lautet:

Gnome-terminal.png
chroot:# gpg --list-keys

Gefragt wird nach dem Teil 2048D/<ID>.

Diese ID + die Daten für den Absender, Mailserver etc. sind in dem Script anzupassen:

-> Immer noch in der Chroot Umgebung:

  • /usr/local/bin/random_rootpw
Ascii.png
#!/usr/bin/perl
# BEGIN LICENCE BLOCK
#
# Copyright (C) 2004 Michal Svamberg <svamberg_at_civ.zcu.cz>
#               2006 Thomas Gebhardt <gebhardt_at_hrz.uni-marburg.de>
#               2007 Andreas Gabriel <gabriel_at_hrz.uni-marburg.de>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
#
# END LICENCE BLOCK

use strict;
use Env qw(FAI_ROOT FAI_ACTION ROOTCMD GNUPGHOME);
use String::Random;
use Crypt::GPG;
use Mail::Sender;


# ---------------------------------- START:CONF ---
my @SEND_TO = (
        'john-doe@domain.foo' # Empfaenger Adresse angeben
);

my $SEND_FROM   = 'install@domain.foo'; # Absender Adresse angeben
my $SMTP_SERVER = "smtp.domain.foo"; # Mail Server angeben
my $GPG_KEY_ID  = "0x<keyid>"; # Key ID HIER ANPASSEN !!

$GNUPGHOME = "/etc/fai/gnupg";   # no "my" here! (tied to ENV variable)


# ---------------------------------- END:CONF ---

# ---------------------------------------------------------------- send_mail ---
sub send_mail {

        my ( $encrypted ) = @_;

        foreach my $admin (@SEND_TO) {


          
          # make mail
          my $sender = new Mail::Sender({
                                         #debug => "/tmp/smtp.txt",
                                         smtp => $SMTP_SERVER,
                                         from => $SEND_FROM
                                        });

          
          $sender->OpenMultipart({
                                  to => $admin,
                                  subject => "FAI: Random root password for " .`hostname`,
                                  multipart => "encrypted;\nprotocol=\"application/pgp-encrypted\"",
                                  boundary => '--------------rootpwIUZODMVABJDLBHFVEEEVJF',
                                 })

            ->Part({ ctype => 'application/pgp-encrypted',
                     description => 'PGP/MIME version identification',
                     disposition => 'NONE',
                     msg =>"Version: 1\n"})
              ->Part({
                        description => 'OpenPGP encrypted message',
                        ctype => 'application/octet-stream; name="encrypted.asc"',
                        encoding => '7BIT',
                        disposition => 'inline; filename="encrypted.asc"',
                        msg => "$encrypted\n"
                       })
                ->Close() or die "Cannot send mail: $Mail::Sender::Error\n";
        }

        return 0;
}

# ==============================================================================

exit unless ($FAI_ACTION eq 'install');

my $rand = new String::Random;
my $rootpw = $rand->randregex('\w\w\w\w\w\w\w\w\w\w');  # 10 random printable characters
system ("/bin/echo \"root:$rootpw\" | $ROOTCMD chpasswd -c SHA512");

$rootpw .= "\n";

my $gpg = new Crypt::GPG;
$gpg->gpgopts("--armor");

#pack the new pw into an mime entity
my $entity = << '*END*';
Content-Type: text/plain
Content-Disposition: inline
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0

*END*

$entity .= "$rootpw\n" ;


my $encrypted = $gpg->encrypt ($entity, $GPG_KEY_ID);

print "Send encrypted root password via SMTP to " .(join ', ', @SEND_TO) ."\n";

# send emails
send_mail($encrypted);

exit 0;
Gnome-terminal.png
chroot:# chmod +x /usr/local/bin/random_rootpw
chroot:# exit

Classes

Als Letztes muss lediglich angegeben, für welche Klassen dieses Script ausgeführt werden muss, Beispiel:

  • /srv/fai/config/class/50
Ascii.png
[...]
VM*)
	echo "FAIBASE ROOTPWG GERMAN";;
  • /srv/fai/config/scripts/ROOTPWG/30-generate-rootpw
Ascii.png
#!/bin/sh

/usr/local/bin/random_rootpw

Und natürlich ausführbar machen:


Gnome-terminal.png
fai:# chmod +x /srv/fai/config/scripts/ROOTPWG/30-generate-rootpw

Am Ende wird dann dem im Script angegebenen Empfänger eine verschlüsselte E-Mail gesendet, welche dann das Root Kennwort enthält. Der Empfänger der E-Mail muss natürlich über den privaten Schlüssel verfügen. Mittels

Gnome-terminal.png
chroot:# gpg --export > fai-pubkey.gpg
chroot:# gpg --export-secret-keys > fai-secretkey.gpg

Können beide Schlüssel in eine Datei kopiert und auf das Zielsystem gebracht werden. Dort werden dann die Schlüssel mittels gpg --import wieder importiert.

Quellen



--Denny 12:42, 22. Feb. 2012 (UTC)