Die nachfolgende Erklärung beschreibt die Installation und Konfiguration eines PXE-Servers und basiert zu großen Teil auf Informationen von hier und weiteren Netzfundstellen.
Für die Geraer Teilnahme an der bundesweiten Hey, Alter!-Aktion haben wir uns (aus blanker, technischer Neugier) dazu entschlossen, nicht einfach auf das Aufsetzen der PCs per USB-Stick (Ventoy ist sehr empfehlenswert für die Erstellung von Multiboot-USB-Sticks) zu setzen.
Stattdessen wollten wir das ganze automatisiert per PXE-Server umsetzen und weitere Anpassungen vornehmen.
Das (über Gitlab) bereitgestellte Image sollte nicht verändert, das Endergebnis aber trotzdem für Thüringer Umstände (bspw. das Vorhandensein einer Schulcloud) angepasst sein.
schematische Netzstruktur
(Unsere reale Netzstruktur sieht anders aus. Es sind nur die relevanten Teile dargestellt und das ganze noch etwas vereinfacht.)
Grundidee
- manueller Download des "Hey, Alter!"-ISOs
- Einbindung/mount ins Dateisystem
- Anpassung der PXE-grub-Konfiguration
- Anpassung von zusätzlichen Startskripten usw., separate/eigene preseed-Datei
Vorbereitung des Servers(UEFI ist vorbereitet, aber ungetestet)
apt install openssh-server mc nmap net-tools screen nginx nfs-kernel-server dnsmasq qemu-guest-agent
zusätzliche Pfade
mkdir /tftp /tftp/bios /tftp/boot /tftp/grub /tftp/bios/pxelinux.cfg mkdir /var/www/html /var/www/html/iso mkdir /var/www/html/IRGENDWAS
PXE
nano /tftp/bios/pxelinux.cfg/default DEFAULT menu.c32 NU TITLE ULTIMATE PXE SERVER - By Griffon - Ver 2.0 PROMPT 0 TIMEOUT 0 MENU COLOR TABMSG 37;40 #ffffffff #00000000 MENU COLOR TITLE 37;40 #ffffffff #00000000 MENU COLOR SEL 7 #ffffffff #00000000 MENU COLOR UNSEL 37;40 #ffffffff #00000000 MENU COLOR BORDER 37;40 #ffffffff #00000000
NFS
nano /etc/exports /var/www/html/linuxmint/20.3 192.168.0.0/16(ro,no_subtree_check,no_root_squash,async,all_squash) /var/www/html/heyalter 192.168.0.0/16(ro,no_subtree_check,no_root_squash,async,all_squash) /var/www/html/iso 192.168.0.0/16(ro,no_subtree_check,no_root_squash,async,all_squash)
fstab
nano /etc/fstab /var/www/html/heyalter-setup_extensions /var/www/html/heyalter/setup/setup_extensions none bind 0 0
Syslinux
mkdir -p ~/Downloads/syslinux cd ~/Downloads/syslinuxwget https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.zip unzip syslinux-6.03.zip
cp ~/Downloads/syslinux/bios/com32/elflink/ldlinux/ldlinux.c32 /tftp/bios cp ~/Downloads/syslinux/bios/com32/libutil/libutil.c32 /tftp/bios cp ~/Downloads/syslinux/bios/com32/menu/menu.c32 /tftp/bios cp ~/Downloads/syslinux/bios/com32/menu/vesamenu.c32 /tftp/bios cp ~/Downloads/syslinux/bios/core/pxelinux.0 /tftp/bios cp ~/Downloads/syslinux/bios/core/lpxelinux.0 /tftp/bios
grub
UEFI
apt-get download shim.signed apt-get download grub-efi* apt-get download grub-efi-amd-signed #dpkg -x <%name of deb package%> shim #dpkg -x <%name of deb package%> grub dpkg -x shim-signed_1.38+15.4-7_amd64.deb shim dpkg -x grub-efi-amd64-signed_1+2.04+20_amd64.deb grub cp ~/Downloads/shim/usr/lib/shim/shimx64.efi.signed /tftp/grub/bootx64.efi cp ~/Downloads/grub/usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed /tftp/grubx64.efi
Firewall eventuell unnötig
nano /etc/hosts.allow portmap: 192.168.90.0/24 nano /etc/hosts.deny portmap: ALL
für Hey, Alter! (das läuft noch nicht!)
Um das fertige Image anzupassen, werden hooks verwendet, die direkt in der setup.sh des Images mit übergeben bzw. angesteuert werden.
Die Skripte überlagern das gemountete (schreibgeschützte) Image.
# Vergeben eines eindeutigen Hostnamens
nano /var/www/html/heyalter-setup_extensions/10-hostname.sh
#!/usr/bin/sh
sudo hostnamectl set-hostname "heyalter-gera-`ip a|grep ether|head -n 1 | sed 's/ *$//g' | sed 's/^ *//g' | cut -d" " -f2 | sed 's/://g'`"
# Installieren eines Inventarisierers
nano /var/www/html/heyalter-setup_extensions/20-fusioninventory.sh
#!/usr/bin/sh
sudo apt install fusioninventory-agent -y
sudo fusioninventory-agent --server=https://ticket.ffggrz.de/plugins/fusioninventory/ --tag="Hey, Alter!"
# Deinstallieren von unbenötigter Software
nano /var/www/html/heyalter-setup_extensions/30-uninstall.sh
#!/usr/bin/sh
#apt remove zoom teams teams-for-linux telegram skype discord
sudo snap remove discord
sudo snap remove skype
sudo snap remove teams
sudo snap remove teams-for-linux
sudo snap remove telegram-desktop
sudo snap remove zoom-client
Für jede neue ISO (händische Lösung)
cd /var/www/html/iso
wget https://ftp.fau.de/mint/iso/stable/20.3/linuxmint-20.3-xfce-64bit.iso mkdir -p /var/www/html/linuxmint/20.3
nano /etc/fstab /var/www/html/iso/linuxmint-20.3-xfce-64bit.iso /var/www/html/linuxmint/20.3/ iso9660 loop 0 0
mkdir -p /tftp/bios/boot/casper cp /var/www/html/linuxmint/20.3/casper/vmlinuz /tftp/boot/casper cp /var/www/html/linuxmint/20.3/casper/initrd /tftp/boot/casper
ln -s /tftp/boot /tftp/bios/boot nano /tftp/bios/pxelinux.cfg/default #LABEL LinuxMint-20.3-XFCE-ISO
LABEL LinuxMint-20.3-XFCE-ISO
MENU LABEL Linux Mint 20.3 XFCE - Autoinstall
KERNEL /boot/dist/linuxmint/20.3/casper/vmlinuz
INITRD /boot/dist/linuxmint/20.3/casper/initrd.lz
APPEND netboot=nfs ip=dhcp boot=casper nfsroot=192.168.90.11:/var/www/html/linuxmint/20.3 url=http://192.168.90.11/_preseed/linuxmint.seed automatic-ubiquity locale=de_DE keyboard-configuration/layoutcode=de console-setup/layoutcode=de netcfg/get_hostname=install netcfg/get_domain=install
Einrichtung per Halbautomatik
# nur die entpackte Datei verwenden/verlinken export src=https://gitli.stratum0.org/heyalter/heyalter-ubuntu-iso/-/jobs/3228/artifacts/raw/artifacts/heyalter-master-20220303-b170-e3d2fa90.iso export dest=heyalter #export base=`basename ${src}` export base=${dest}-`date +%Y%m%d` cd /var/www/html/iso wget ${src} -O ${base}.iso
mkdir -p /var/www/html/${dest}
umount -lf /var/www/html/${dest} echo "/var/www/html/iso/${base}.iso /var/www/html/${dest} iso9660 loop 0 0" >> /etc/fstab
# anschließend den bisherige loop-Eintrag löschen
nano /etc/fstab
/var/www/html/heyalter-setup_extensions /var/www/html/heyalter/setup/setup_steps none bind 0 0
# aktuelle Installationsschritte kopieren
cp /var/www/html/heyalter/setup/setup_steps/*.sh /var/www/html/heyalter-setup_extensions/
# eigene und mitgelieferte Schritte einbinden
mount -o bind /var/www/html/heyalter-setup_extensions/ /var/www/html/heyalter/setup/setup_steps/
cp /var/www/html/${dest}/preseed/ubuntu.seed /var/www/html/${dest}.seed
#/var/www/html/${dest}/preseed/ubuntu.seed # Pfade (kernel, initrd) ggf. noch anpassen echo "LABEL ${base}" >> /tftp/bios/pxelinux.cfg/default echo " MENU LABEL Wipe disk and install ${base}" >> /tftp/bios/pxelinux.cfg/default echo " KERNEL /boot/dist/${dest}/casper/vmlinuz" >> /tftp/bios/pxelinux.cfg/default echo " INITRD /boot/dist/${dest}/casper/initrd" >> /tftp/bios/pxelinux.cfg/default echo " APPEND netboot=nfs ip=dhcp boot=casper nfsroot=192.168.90.11:/var/www/html/${dest} url=http://192.168.90.11/${dest}/preseed/ubuntu.seed locale=de_DE keyboard-configuration/modelcode=SKIP automatic-ubiquity console-setup/layoutcode=de netcfg/get_hostname=install netcfg/get_domain=install" >> /tftp/bios/pxelinux.cfg/default
- Details
- Geschrieben von: Matthias Drobny
- Kategorie: Hey, Alter!
Auch für die Konfiguration von Gluon-Geräten ist ansible einsetzbar. Die folgenden Beispiele zeigen verschiedene Möglichkeiten.
export ANSIBLE_HOST_KEY_CHECKING=False
Kontaktadressen setzen
ansible all -i inventory/gluonHardware.ini -m raw -a "uci set gluon-node-info.@owner[0].contact=Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. '" -m raw -a "uci commit" -u root --ask-pass
Passwörter vereinheitlichen
- einfach mehrmals mit allen vorhandenen Passwörter abfahren
- nur bei den passenden Geräten können die Änderungen vorgenommen werden
ansible all -i inventory/gluonHardware.ini -m raw -a "echo -e \"GEHEIMES_PASSWORT\nGEHEIMES_PASSWORT\" | passwd root" -u root --ask-pass
Datenkontrolle
ansible all -i inventory/gluonHardware.ini -m raw -a "uci show system.@system[0].hostname" -u root --ask-pass
- Details
- Geschrieben von: Matthias Drobny
- Kategorie: Freifunk
Download alte Firmware: https://www.ubnt.com/download/unifi/unifi-mesh/uap-ac-m nach /tmp
tftp connect 192.168.1.20 binary rexmt 1 timeout 60 put BZ.qca956x.v3.7.58.6385.170508.0957.bin
- Details
- Geschrieben von: Matthias Drobny
- Kategorie: Freifunk
Grundpakete installieren
sudo apt-get install build-essential cmake pkg-config libnl-genl-3-dev libnl-3-dev
cd /opt/
sudo git clone https://github.com/wlanslovenija/tunneldigger.git
cd tunneldigger/client/
sudo cmake .
sudo make
Kernel-Module laden
sudo nano /etc/modules
l2tp_eth
Dienste anlegen/starten
sudo nano /etc/systemd/system/tunneldigger.service
[Unit]
Description=Tunneldigger-client
After=syslog.target network.target
[Service]
Type=simple
User=root
Group=root
PIDFile=/run/tunneldigger.pid
ExecStart=/opt/tunneldigger/client/tunneldigger -u "%H" -b 1.vpn.freifunk-gera-greiz.de:20181 -b 2.vpn.freifunk-gera-greiz.de:20181 -b 3.vpn.freifunk-gera-greiz.de:20181 -i mesh-vpn-l2tp-1 -a
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable tunneldigger.service
sudo systemctl start tunneldigger.service
- Details
- Geschrieben von: Matthias Drobny
- Kategorie: Freifunk
InfluxDB installieren
wget -O- https://repos.influxdata.com/influxdb.key | sudo tee /usr/share/keyrings/influxdb.key
echo "deb https://repos.influxdata.com/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt update
sudo apt install -y influxdb
sudo nano /etc/influxdb/influxdb.conf
reporting-disabled = true
bind-address = "127.0.0.1:8088"
[meta]
dir = "/var/lib/influxdb/meta"
[data]
dir = "/var/lib/influxdb/data"
wal-dir = "/var/lib/influxdb/wal"
series-id-set-cache-size = 100
[http]
bind-address = "127.0.0.1:8086"
auth-enabled = true
log-enabled = false
systemctl enable --now influxdb
Go installieren
cd /usr/local/
wget https://go.dev/dl/go1.18.linux-amd64.tar.gz -O go-release-linux-amd64.tar.gz
tar xvf go-release-linux-amd64.tar.gz
rm go-release-linux-amd64.tar.gz
sudo nano /etc/profile.d/golang.sh
#!/bin/sh
export GOPATH=/opt/go
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
chmod 755 /etc/profile.d/golang.sh
Yanic installieren
go install github.com/FreifunkBremen/yanic@main
cp /opt/go/pkg/mod/github.com/\!freifunk\!bremen/Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. fa0/config_example.toml /etc/yanic.conf
nano /etc/yanic.conf
[respondd]
enable = true
synchronize = "1m"
collect_interval = "1m"
[respondd.sites.ffhb]
domains = ["city"]
[[respondd.interfaces]]
ifname = "br-ffhb"
ip_address = "fd2f:5119:f2d::5"
[webserver]
enable = false
bind = "127.0.0.1:8080"
webroot = "/var/www/html/meshviewer"
[nodes]
state_path = "/var/lib/yanic/state.json"
prune_after = "7d"
save_interval = "5s"
offline_after = "10m"
[[nodes.output.geojson]]
enable = true
path = "/var/www/html/meshviewer/data/nodes.geojson"
[[nodes.output.meshviewer-ffrgb]]
enable = true
path = "/var/www/html/meshviewer/data/meshviewer.json"
[nodes.output.meshviewer-ffrgb.filter]
no_owner = false
[[nodes.output.meshviewer]]
enable = false
version = 2
nodes_path = "/var/www/html/meshviewer/data/nodes.json"
graph_path = "/var/www/html/meshviewer/data/graph.json"
[nodes.output.meshviewer.filter]
no_owner = true
[[nodes.output.nodelist]]
enable = true
path = "/var/www/html/meshviewer/data/nodelist.json"
[nodes.output.nodelist.filter]
no_owner = true
[[nodes.output.raw]]
enable = true
path = "/var/www/html/meshviewer/data/raw.json"
[nodes.output.raw.filter]
no_owner = true
[database]
delete_after = "7d"
delete_interval = "1h"
[[database.connection.influxdb]]
enable = false
address = "http://localhost:8086"
database = "ffhb"
username = ""
password = ""
[[database.connection.graphite]]
enable = false
address = "localhost:2003"
prefix = "freifunk"
[[database.connection.respondd]]
enable = false
type = "udp6"
address = "stats.bremen.freifunk.net:11001"
[[database.connection.logging]]
enable = false
path = "/var/log/yanic.log"
cp /opt/go/pkg/mod/github.com/\!freifunk\!bremen/Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. fa0/contrib/init/linux-systemd/yanic.service /lib/systemd/system/yanic.service
systemctl daemon-reload
mkdir -p /var/lib/yanic
mkdir -p /var/www/html/meshviewer/data
touch /var/log/yanic.log
chown yanic /var/log/yanic.log /var/lib/yanic /var/www/html/meshviewer/data
systemctl start yanic
systemctl enable yanic
- Details
- Geschrieben von: Matthias Drobny
- Kategorie: Freifunk