311 lines
10 KiB
Markdown
311 lines
10 KiB
Markdown
# HW4F Netboot Installer
|
|
|
|
Server die automatische Installation über das Netzwerks von Ubuntu 22.04
|
|
im Rahmen des Projekts [**Hardware for Future**](https://hardwareforfuture.de)
|
|
des [dezentrale e.V](https://dezentrale.space/).
|
|
|
|
Für den Betrieb wird einmalig eine Internetverbindung benötigt.
|
|
Der Server wird über Ansible aufgesetzt.
|
|
Hierfür werden verschiedene Komponenten installiert,
|
|
u.a. FAI (Fully Automatic Installation).
|
|
Mit dem Server wird ein Netz aufgespannt,
|
|
welches für den Anschluß des zu installierenden Rechner verwendet wird.
|
|
Wenn die Rechner mit dem Netzwerk verbunden sind,
|
|
können sie über einen Netzwerkboot
|
|
(zumeist F12-Taste für das Bootmenü beim Start des Rechners) über PXE gebootet werden.
|
|
PXE lädt die erforderliche Dateien vom Server
|
|
und der FAI-Installer installiert dann Ubuntu auf den Rechner.
|
|
|
|
Es wird ein Nutzer `demo` angelegt.
|
|
Das Passwort ist `fai`.
|
|
Dieser Nutzer kann Administrationsrechte erlangen.
|
|
Das Passwort muss im Anschluss geändert werden.
|
|
|
|
|
|
## Verweise
|
|
|
|
* [FAI Project](https://fai-project.org)
|
|
* [FAI Project - Available distributions](https://fai-project.org/download/dists/)
|
|
* [FAI Project - FAI-Guide](https://fai-project.org/fai-guide/)
|
|
* [FAI Project - Variables](https://wiki.fai-project.org/index.php/Variables)
|
|
* [github.com faiproject/fai](https://github.com/faiproject/fai)
|
|
* [github.com faiproject/fai-config](https://github.com/faiproject/fai-config)
|
|
* [iPXE](https://ipxe.org)
|
|
* [Ansible](https://www.ansible.com)
|
|
|
|
|
|
## Komponenten
|
|
|
|
* DHCP: isc-dhcp-server
|
|
* TFTP: tftpd-hpa
|
|
* DNS: unbound
|
|
* ntp: ntp
|
|
* time: inetd
|
|
* HTTP: nginx
|
|
* rtime: inetd
|
|
* Apt Cache: apt-cacher-ng
|
|
|
|
|
|
## Voraussetzungen
|
|
|
|
Server:
|
|
|
|
* Debian Bullseye
|
|
* Zwei Netzwerkports oder zwei Netzwerkkarten (1x für WAN, 1x für LAN und FAI)
|
|
|
|
Zu installierende Clients:
|
|
|
|
* CPU amd64 mit Unterstützung für Hardwarevirtualisierung
|
|
* 1GiB empfohlen (min. 512MB RAM)
|
|
* mehr als 20 GB SSD oder Festplatte
|
|
* PXE-fähig oder USB-Stick mit bootfähigen iPXE oder
|
|
iPXE-CD zum Booten der Rechner
|
|
|
|
## Verwendung
|
|
|
|
Zunächst Ansible für die automatische Installation
|
|
und Konfiguration aller Komponeten herunterladen:
|
|
```console
|
|
apt install python3-pip
|
|
pip3 install ansible
|
|
```
|
|
|
|
Danach ein Playbook (z.B. `fai.yml`) anlegen
|
|
und die grundlegende Parameter festlegen:
|
|
```yml
|
|
- hosts: localhost
|
|
become: true
|
|
vars:
|
|
dhcp_interface: eth1 # NIC für die Installer Netz
|
|
wan_interface: eth0 # NIC zum Internet
|
|
roles:
|
|
- fai
|
|
```
|
|
|
|
Einen Eintrag hinzufügen in
|
|
`~/.ssh/config`
|
|
```
|
|
host hw4f-fai hw4f-fai.server.dezentrale.space
|
|
user username
|
|
#hostname 10.137.0.8
|
|
```
|
|
|
|
Danach das Playbook ausführen:
|
|
|
|
```
|
|
ansible-playbook fai.yml
|
|
|
|
ansible-playbook -i inventory/dezentrale.yml \
|
|
-K --check --diff -v fai.yml
|
|
```
|
|
|
|
Nur FAI rekonfigurieren und das NFSROOT erzwungen neu bauen.
|
|
```
|
|
ansible-playbook -i inventory/dezentrale.yml -l hw4f-fai \
|
|
-v --diff -t fai \
|
|
-e 'fai_nfsroot_force_rebuild=true' fai.yml
|
|
```
|
|
|
|
|
|
|
|
### Virtuale Testinstanz
|
|
|
|
Für eine testweise Installation kann
|
|
[Vagrant](https://www.vagrantup.com/) verwendet werden.
|
|
Es richtet anhand des *Vagrantfile* eine virtuelle Maschine ein
|
|
und provisioniert sie anschließend automatisch mittels Ansible.
|
|
Vagrant unterstützt verschiedene Provider für Virtualisierungslösungen
|
|
bspw. VirtualBox oder libvirt/KVM.
|
|
|
|
Zur Verwendung muss Vagrant zunächst installiert werden.
|
|
Hier beispielsweise zusammen mit VirtualBox:
|
|
|
|
```
|
|
### VIRTUALBOX
|
|
apt install vagrant virtualbox
|
|
### Libvirt/KVM
|
|
apt install vagrant qemu-system-x86
|
|
```
|
|
|
|
Danach kann die virtuelle Umgebung erstellt
|
|
und automatisch eingerichtet werden:
|
|
|
|
```
|
|
### INITIAL PROVISIONING
|
|
vagrant up --color
|
|
### FULL REPROVISIONING
|
|
vagrant destroy; vagrant up --color
|
|
```
|
|
|
|
Die Vagrantfile definiert eine Maschinen mit zwei Ethernet-Ports.
|
|
Der erste Port ist für Verwaltung von Vagrant
|
|
und der zweite Port (IP: `192.168.33.1`)
|
|
um die notwendige FAI Services über ein virtuelles Netzwerk anzubieten.
|
|
Mit diesen Netzwerk können dann weitere virtuelle Maschine verbunden werden,
|
|
um sie mit FAI automatisch zu installieren.
|
|
|
|
|
|
*Hinweis:* Die Verwendung von VirtualBox wird empfohlen.
|
|
Bei libvirt/KVM gab es Probleme
|
|
mit dem Starten von Clients für Testinstallationen im virtuellen Netzwerk.
|
|
Hier kann es helfen das Netzwerk über *Virt-Manager* neuzustarten oder
|
|
ein weiteres isoliertes Netzwerk zu erstellen
|
|
und es mit dem zweiten Netzwerkport des FAI-Servers zu verbinden.
|
|
|
|
|
|
#### Zugriff auf die vagrant VM
|
|
|
|
Zugriff auf die vagrant VM wird gewährt über:
|
|
```
|
|
vagrant ssh
|
|
```
|
|
|
|
Mit Benutzername und Passwort:
|
|
```
|
|
### CREDENTIALS
|
|
Username: `vagrant`
|
|
Password: `vagrant`
|
|
|
|
### COMMAND
|
|
ssh vagrant@machine-ip
|
|
```
|
|
|
|
Mit PubKey Auth
|
|
```
|
|
ssh -i .vagrant/machines/hw4f-fai-vagrant/libvirt/private_key \
|
|
vagrant@machine-ip
|
|
```
|
|
|
|
#### Zugriff auf die zu installierende Maschine nehmen (Live System)
|
|
|
|
Dies ist recht nützlich zur Analyse des Livesystems.
|
|
|
|
|
|
Auf dem FAI-Server wird zunächst die IP-Adresse des Clients herausgesucht.
|
|
Diese findet sich unter `/var/lib/dhcp/dhcpd.leases`.
|
|
|
|
Dann kann per ssh Zugriff genommen werden
|
|
```
|
|
### CREDENTIALS
|
|
Username: `root`
|
|
Password: `fai`
|
|
ssh root@192.168.33.10
|
|
```
|
|
|
|
Das Installations log findet sich unter
|
|
`tail -f /tmp/fai/fai.log`
|
|
|
|
|
|
#### Secrets
|
|
|
|
In der folgenden Konfigurationsdatei
|
|
wird u.A. auch das Root-Passwort
|
|
des Live-Systems festgelegt.
|
|
|
|
Die NFS-root configuration findet sich hier
|
|
`/etc/fai/nfsroot.conf`
|
|
|
|
Das Secret wird definiert in
|
|
`/srv/fai/config/class/FAIBASE.var`
|
|
|
|
|
|
### Konfiguration
|
|
|
|
Über Ansible-Variablen kann die Installation noch weiter angepasst werden.
|
|
|
|
|
|
|**Variable** |**Beschreibung** |**Standard** |
|
|
|--- |--- |---------------------------------------- |
|
|
|`dhcp_interface` |NIC des Installationnetzes (muss gesetzt sein) |`eth1` |
|
|
|`wan_interface` |NIC zum Internet |`eth0` |
|
|
|`server_name` |Server-Name |`hw4f-fai` |
|
|
|`domain_name` |Domain-Name des Netzes |`local` |
|
|
|`server_ip` |IP des Servers in CIDR-Notation |`192.168.33.9/24` |
|
|
|`gateway_ip` |IP des Default-Gateways in CIDR-Notation |`192.168.33.1/24` |
|
|
|`apt_cacher_offline_mode` |`true`, um nur den vorhanden Packet-Cache als Repository zu nutzen |`false` |
|
|
|`debian_release` |Debian Release, was für FAI genutzt werden soll. |`bullseye` |
|
|
|`pxe_preselected_entry` |Vorausgewählte iPXE-Eintag |`exit` (von lokalem Datenträger starten) |
|
|
|`pxe_menu_timeout` |Timeout für iPXE-Menu in Millisekunden |5000 |
|
|
|`ipxe_additional_entries` |Zusätzliche Einträge für iPXE-Menu |keine |
|
|
|`use_apt_cache_for_server` |Apt Cache für den Server selbst verwenden |`true` |
|
|
|`fai_hw4f_profile_username` |Desktop Benutzername |`user` |
|
|
|`fai_hw4f_profile_username` |Desktop Benutzername |`user` |
|
|
|`fai_hw4f_profile_password` |Passwort der Benutzers |`dezentrale` |
|
|
|
|
Alle relevanten Netzwerk-Informationen werden
|
|
aus der IP-Adresse des Servers abgeleitet.
|
|
|
|
Beispielsweise kann der Server mit obigen Playbook aufgesetzt werden,
|
|
eine Rechner mit Ubuntu installiert werden und
|
|
danach der Server wie folgt in den Offline-Installationsmodus versetzt werden:
|
|
|
|
```yml
|
|
- hosts: localhost
|
|
become: true
|
|
vars:
|
|
dhcp_interface: eth1 # NIC für die Installer Netz
|
|
wan_interface: eth0 # NIC zum Internet
|
|
apt_cacher_offline_mode: true
|
|
roles:
|
|
- fai
|
|
```
|
|
|
|
Danach das Playbook noch einmal ausführen,
|
|
um die Konfigration zu aktualisieren:
|
|
|
|
```
|
|
ansible-playbook -i inventory/dezentrale.yml \
|
|
-l hw4f-fai --diff --ask-become-pass fai.yml
|
|
### WHEN "sudo_nopasswd: true"
|
|
ansible-playbook -i inventory/dezentrale.yml \
|
|
-l hw4f-fai --diff fai.yml
|
|
```
|
|
|
|
#### Zusätzliche Menü-Einträge im iPXE-Menü
|
|
|
|
Das vordefinierte Playbook für `playbook-vagrant.yml` (Vagrant)
|
|
enthält bereits einen zusätzlichen Eintrag für Memtest.
|
|
|
|
```
|
|
ipxe_additional_entries:
|
|
memtest:
|
|
name: Memtest86+
|
|
files: tools/memtest
|
|
kernel: memtest86+-5.31b.bin
|
|
# other:
|
|
# name: Anzeigetext des Eintrags
|
|
# files: path/to/files/to/copy
|
|
# kernel: Kernel
|
|
# args: Argumente für den Kernel
|
|
# initrd:
|
|
# - initrd0.img
|
|
# - initrd1.img
|
|
# - ...
|
|
# multiboot:
|
|
# - module0.img
|
|
# - module1.img
|
|
# - ...
|
|
|
|
pxe_preselected_entry: memtest
|
|
```
|
|
|
|
Dabei werden alle Dateien unter,
|
|
die im `files` ausgewiesen sind,
|
|
in das PXE-Verzeichnis kopiert.
|
|
Es wird ein zusätzlichen Menüeintrag
|
|
mit dem Label `memtest` (Name des Eintrags) und
|
|
dem Anzeigetext aus `name` angelegt.
|
|
Es sind folgende Felder für jeden Boot-Eintrag möglich:
|
|
|
|
|**Feld** |**Beschreibung** |**iPXE-Argument** |
|
|
|--- |--- |--- |
|
|
|files |Dateien für den Eintrag | |
|
|
|kernel |Zu ladenden Kernel |`kernel` |
|
|
|args |Argumente des Kernel |an Kernel angehängt |
|
|
|initrd |InitRD-Images |`initrd` |
|
|
|multiboot |Images für Multiboot-Kernel |`multiboot` |
|
|
|
|
Der vorausgewählt Eintrag kann über `pxe_preselected_entry` mit dem Label ausgewählt werden.
|
|
Um FAI auszuwählen muss `__fai` gesetzt werden.
|
|
|