FAI SPARC Debian
Inhaltsverzeichnis
- 1 Debian SPARC (und X86) Architektur mittels FAI installieren
- 2 Debian Installation auf SPARC
- 3 Rescue Image
- 4 FAI Server - Rescue NFS
- 5 FAI
- 6 X86 Teil vervollständigt
- 7 Wie geht es weiter
- 8 Probleme
- 9 Fazit
- 10 AddOns
- 11 Quellen
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:
"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
[...] 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:
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.
fai:# aptitude install isc-dhcp-server |
Konfiguration
- /etc/default/isc-dhcp-server
INTERFACES="eth1" |
- /etc/dhcp/dhcpd.conf
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.
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.
fai:# mkdir /srv/tftp/ fai:# aptitude install tftpd-hpa |
Konfiguration
- /etc/default/tftpd-hpa
TFTP_USERNAME="tftp" TFTP_DIRECTORY="/srv/tftp/" TFTP_ADDRESS="192.168.1.1:69" TFTP_OPTIONS="--secure" |
fai:# /etc/init.d/tftpd-hpa restart |
Netboot Image
Nun wird das Debian NetBoot Image für SPARC nach /srv/tftp abgelegt:
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 |
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:
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:
sc> reset -cy [...] Rebooting with command: boot |
.. beim auftauchen der Zeile Rebooting with command: boot zügig!:
#. SC> break SC> console -f OK> |
absenden (#. -> Raute + Punkt um in die Service Console zu gelangen), dann lässt sich der Autostart abschalten:
OK> setenv auto-boot? false |
Als nächstes starten wir per DHCP:
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:
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 [...]
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
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:
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:
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
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:
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:
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:
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
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.
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:
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:
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:
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
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:
fai:# aptitude install nfs-kernel-server |
Konfiguration
- /etc/exports
/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.
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
[...] # Debian Installer # filename "debian-installer.img"; # RESCUE Kernel for SPARC filename "sparc-rescue-kernel"; option root-path "/srv/rescue/sparc/nfsroot/" ; [...] |
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:
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
host01:# aptitude install fai-quickstart |
Anpassung
Nun passen wir die Beispieldateien an, sodass sie für das neue Layout passen:
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
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
FAI_CONFIG_SRC=nfs://192.168.1.1/srv/fai/config [...] |
- Uni Erlangen ist sehr zuverlässig
- /etc/fai-sparc/apt/sources.list
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
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:
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!
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:
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.
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
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
host01:# cd /usr/src/initram/ host01:# rm sbin/rmmod host01:# rm -Rf lib/firmware/ |
- FAI Initrd
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:
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:
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:
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:
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:
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
# 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" ; |
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 |
fai:# /etc/init.d/isc-dhcp-server restart |
NFS Konfiguration
Nun kann der NFS Export angepasst werden:
- /etc/exports
/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) |
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:
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
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
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
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
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:
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:
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
[...] 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
[...] 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
[...] 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
# 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
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.
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
#!/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
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
[...] PACKAGES aptitude SPARC grub- lilo- silo linux-image-2.6-sparc64-smp [...] |
- /srv/fai/config/package_config/SPARC = Spezielle Sparc Pakete
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
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
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
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:
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
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
#!/bin/bash fcopy /etc/inittab |
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:
OK> boot net3:dhcp root=/dev/nfs boot=live FAI_ACTION=install FAI_FLAGS="sshd verbose reboot" ip=::::eth3: debug |
Es ist enorm wichtig, die Reihenfolge der Zeile beizubehalten, da es unter Umständen sonst beim FAI Aufruf zu Problemen kommen kann |
Beim Autor kam es auch vor, dass ip=::::eth3:zwar beim FAI_ACTION=sysinfofunktionierte, 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:
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
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
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:
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:
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:
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
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:
host01:# mkdir /usr/src/make-kpkg && cp /usr/share/kernel-package/Control /usr/src/make-kpkg/ |
Der passende Patch:
--- /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:
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:
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.
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:
fai:# aptitude install vsftpd |
Das Standardverzeichnis ist /srv/ftp welches wir so belassen.
Dann noch die passenden Ordner erzeugen:
fai:# mkdir -p /srv/ftp/binary fai:# mkdir -p /srv/ftp/source |
Debian Repository
Kurz die passenden Zeilen:
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:
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
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
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:
chroot:# mv /root/.gnupg /etc/fai/gnupg chroot:# chmod 0700 /etc/fai/gnupg chroot:# ln -s /etc/fai/gnupg /root/.gnupg |
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:
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
#!/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; |
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
[...] VM*) echo "FAIBASE ROOTPWG GERMAN";; |
- /srv/fai/config/scripts/ROOTPWG/30-generate-rootpw
#!/bin/sh /usr/local/bin/random_rootpw |
Und natürlich ausführbar machen:
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
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
- http://www.funtoo.org/wiki/Funtoo_Linux_Installation_on_SPARC
- http://www.funtoo.org/wiki/Netboot_image_creation_for_SPARC_machines
- http://www.wh-netz.de/knowledgebase/FaI
- http://fai-project.org/doc/man/make-fai-nfsroot.html
- http://fai-project.org/fai-guide.html
- http://wiki.fai-project.org/wiki/FAI_Cross-architecture
- http://itp.tugraz.at/~ahi/admin/FullyAutomaticInstallation.html
- http://mediakey.dk/~cc/howto-create-your-own-debian-or-ubuntu-package-repository/
- http://wiki.fai-project.org/wiki/Encrypting_confidential_files_on_the_install_server - Verschlüsselte Dateien
- http://wiki.fai-project.org/wiki/Generate_random_root_password_during_installation,_encrypt_and_send_by_mail - Root PW Generieren
--Denny 12:42, 22. Feb. 2012 (UTC)