# Die APU aufbauen und mit Debian in Betrieb nehmen
# Spezifikationen
- <https://www.pcengines.ch/apu4d4.htm>

# Montage des Kühlers
- <https://www.pcengines.ch/apucool.htm>


Die Montage des Kühlers, d.h. das Aufkleben der Aluplatte an die richtige Stelle im Gehäuse, geht auch gut damit, dass man 

- die Platine ohne Kühlung provisorisch in das Gehäuse einfügt, dann

- sich durch die beiden großen Löcher in der Platine mit einem Stift Markierungen auf der Innenseite des Gehäuses anbringt. Die beiden Löcher markieren gut die Diagonale der Postion des Alukühlers. 

Dann klebt man das Alublech auf und schiebt dann die Platine zuerst verkanntet ein und presst sie dann vorsichtig auf das Alublech. 

# BIOS Anmerkung
Änderungen im BIOS 4.12.0.1 (nach F10) werden erst beim nächsten Einschalten, also nach stromlos, wirksam.

Auch wenn die geänderte Einstellung schon vorher im Menü erscheint.  

Aufgefallen / getestet mit der m Option (clk für die WLAN Karte).

# Energieverbrauch 
Gemessen mit ELV Energy Master Basic 2 und Steckernetzteil Seanon KSA 24W 120/200VE Output 12V 2A

APU4D4 mit 256GB SSd und WLE600 Wlankarte

APU beim booten: max 9W

APU im Leerlauf: 5,4W  
APU im Leerlauf mit BIOS PCIe Powermanagement: 4,7W

APU ausgeschaltet: 1,5W

Nur Netzteil: 0,0W

# APU Installation auf dem PC vorbereiten

Erforderlich ist ein Nullmodemkabel zur Verbindung APU <--> PC  
Ein Terminalprogramm (z.B. minicom)  
Eventuell bei Installation PXE übers Netz ein tftpserver (z.B., dnsmasq)  


# APU Installation mit USB-Stick 

Bereithalten: einen USB-Stick mit dem aktuellen Debian Image, Stick als bootbar definiert mit:  
- mit `sudo dd bs=4M if=/path/to/debian-10.0.0-amd64-netinst.iso of=/dev/sdx status=progress oflag=sync` das Image auf den Stick kopieren  
- mit dem USB-Stick booten, dann im Grub-Menü die Bootzeile mit `e` editieren:  
- wenn das grub-Menu da ist, mit `e` die Befehlszeile ändern und dazu hinter /linux/ boot ergänzen:  
  `console=ttyS0,115200n8`  


Damit ist die serielle Schnittstelle bis zum nächsten Booten als Standard festgelegt.  
Wenn das System installiert ist und neu bootet, auch an dieser Stelle wie beschrieben im Grub-Menu mit `e` 
die Grub-Befehlszeile ändern und ttyS0 aktivieren.  



# APU Netz Installation von Debian oder Ubuntu 
Für die Installation über das Netz ohne Bootmedium und mit vorbelegten Antworten
muss das eigene Netzwerk eingerichtet werden mit folgenden Diensten: 

- TFTP-server mit dem Bootimage 
- DHCP-server / Proxy der der APU ip-adresse und Pfad zum Bootimage übermittelt
 
## Verwendete Hardware
- Privates LAN mit Internetzugang, Router als DHCPserver z.B. Fritz!Box
- Rechner als PXE - BOOTP - TFTP - DHCP Server  (nicht exklusiv)
- APU4D4 mit 4Gb RAM, 256GB SSD und WLE600 Wlankarte (bislang nicht verwendet)
- Serielles Nullmodem Kabel zwischen APU und Rechner
- Netzwerkkabel

## Verwendete Adressen
- Diese sind an die eigenen anzupassen
- 192.168.178.0/24 Netzwerk
- 192.168.178.254 Fritz!Box Router, DHCPserver, Zugang Internet
- Die folgenden Adressen ausserhalb des Bereiches F!B DHCP-server
- 192.168.178.51 Statische Adresse für die APU (später)
- 192.168.178.52 Statische Adresse für den PXE - BOOTP - TFTP server

## Einrichten PXE - BOOTP - TFTP- Server
- Anleitung von Marcel verwendet / erweitert für TFTP-server
- dnsmasq installieren falls nötig: 
  sudo apt install dnsmasq
- Anpassen /etc/dnsmasq.conf
- Da wir nur wenig Funktionen von dsnmasq benötigen, löschen wir die installierte
    Datei und ersetzen sie durch folgenden Inhalt.



    dhcp-range=192.168.178.0,proxy                    # Unser Netzwerk.  
    dhcp-boot=pxelinux.0,192.168.178.52,192.168.178.0 # IP TFTP-Server und Netzwerk.  
    pxe-service=x86PC,"Netzwerk Boot",pxelinux       # gewünschter Dienst  
    enable-tftp                     # aktiviere TFTP-server   
    tftp-root=/var/lib/tftp         # hier liegen die Daten Debian 12 Bookworm   
    port=0                          # DNS brauchen wir hier nicht   

### Bootimage holen im Browser oder mit wget, ...

- [download netboot.tar.gz Image](https://ftp.halifax.rwth-aachen.de/debian/dists/buster/main/installer-amd64/current/images/netboot/netboot.tar.gz)
- Verzeichnis für TFTP-server anlegen
  sudo mkdir /var/lib/tftp
- Bootimage dort entpacken
- sudo tar xvf netboot.tar.gz -C /var/lib/tftp

### Konfigurations Dateien für die Clients erstellen oder anpassen

Es kann für jeden Client eine spezielle Datei erstellt werden oder auch mehrere allgemeinere für mehrere Clients.  

Weitere Infos in https://wiki.ubuntuusers.de/PXE-Boot/  

Die in netboot.tar enthaltene default Konfigurationsdatei pxelinux.cfg/default kann für die APU nicht ohne Anpassung verwendet werden wegen fehlender Grafikkarte.

Inhalt der default Datei für APU Installation im tftpserver mit Antwortdatei (debseed.cfg)  
Achtung IP-adresse tftp Server evtl. anpassen
Dateiname C0A8B2 ergibt sich als hex von 192.168.178. Damit kann diese Datei für alle Geräte im Netz 192.168.178.0/24 verwendet werden.   


    SERIAL 0 115200
    CONSOLE 0

    default Bookworm

    ALLOWOPTIONS 0
    TIMEOUT 600

    LABEL Bookworm
	MENU LABEL ^Bookworm
	KERNEL debian-installer/amd64/linux
	append interface=enp1s0 priority=critical initrd=debian-installer/amd64/initrd.gz auto=true url=tftp://192.168.178.52/debseed.cfg console=ttyS0,115200n8 --- console=ttyS0,115200n8



Die Antwortdatei debseed.cfg und die Hilfsdatei netcfghack.sh müssen sich im TFTP-server Rootverzeichnis befinden.
netcfghack.sh sorgt für die statische Netzkonfiguration von enp1s0 der APU.

    #!/bin/sh
    killall-dhcp
    netcfg
    echo netcfghack ende

debseed.cfg hier ohne Kommentare, aber noch ein Hinweis zu Partionierung  
In debseed.cfg wird der größte freie (unpartionierte) Bereich genommen. 20G sind gut ausreichend. Ist keiner vorhanden >12G, fällt die Installation in den interaktiven Modus.  
Weitere Informationen im Debian Installationshandbuch [Debian Handbuch](https://www.debian.org/releases/stable/amd64/apbs04.en.html)

    #_preseed_v1
    ######### debseed.cfg  ohne Kommentare, damit sie ins wiki passt
    d-i apt-setup/contrib boolean true
    d-i apt-setup/non-free boolean true
    d-i apt-setup/non-free-firmware boolean true
    d-i apt-setup/security_host string security.debian.org
    d-i apt-setup/services-select multiselect security, updates
    d-i clock-setup/ntp boolean true
    d-i clock-setup/utc boolean true
    d-i debian-installer/country string DE
    d-i debian-installer/language string en
    d-i debian-installer/locale string de_DE.UTF-8
    d-i finish-install/keep-consoles boolean true
    d-i finish-install/reboot_in_progress note
    d-i grub-installer/bootdev  string /dev/sda
    d-i grub-installer/with_other_os boolean true
    d-i hw-detect/load_firmware boolean true
    d-i keyboard-configuration/xkb-keymap select de
    d-i localechooser/supported-locales multiselect en_US.UTF-8
    d-i mirror/country string manual
    d-i mirror/http/directory string /debian
    d-i mirror/http/hostname string ftp.halifax.rwth-aachen.de
    d-i mirror/http/proxy string
    d-i netcfg/choose_interface select auto
    d-i netcfg/choose_interface select enp1s0
    d-i netcfg/confirm_static boolean true
    d-i netcfg/dhcp_failed note
    d-i netcfg/dhcp_options select Configure network manually
    d-i netcfg/disable_autoconfig boolean true
    d-i netcfg/get_domain string ffdo.net
    d-i netcfg/get_gateway string 192.168.178.254
    d-i netcfg/get_hostname string berghofen
    d-i netcfg/get_ipaddress string 192.168.178.51
    d-i netcfg/get_nameservers string 192.168.178.254
    d-i netcfg/get_netmask string 255.255.255.0
    d-i netcfg/hostname string berghofen.ffdo.net
    d-i netcfg/wireless_wep string
    d-i partman-auto/expert_recipe string                         \
          boot-root ::                                            \
                  6000 8000 16000 ext3                            \
                          $primary{ } $bootable{ }                \
                          method{ format } format{ }              \
                          use_filesystem{ } filesystem{ ext3 }    \
                          mountpoint{ / } .                       \
                  5000 6000 6000 linux-swap                       \
                          method{ swap }                          \
                          format{ } .                             \
                          .
    d-i partman-auto/init_automatically_partition select biggest_free
    d-i partman-partitioning/confirm_write_new_label boolean true
    d-i partman/choose_partition select finish
    d-i partman/confirm boolean true
    d-i partman/confirm_nooverwrite boolean true
    d-i passwd/root-login boolean false
    d-i passwd/user-fullname string Debian apu
    d-i passwd/user-password password insecure
    d-i passwd/user-password-again password insecure
    d-i passwd/username string fb
    d-i pkgsel/upgrade select safe-upgrade
    d-i preseed/run string netcfghack.sh
    d-i time/zone string Europe/Berlin
    d-i pkgsel/include string \
    bird2 \
    bridge-utils \
    build-essential \
    debconf-utils \
    curl \
    dkms \
    dnsutils \
    fail2ban \
    flashrom \
    git \
    info \
    iperf3 \
    iproute2 \
    iputils-tracepath \
    libncurses-dev libreadline-dev zlib1g-dev liblzo2-dev libssl-dev \
    lshw \
    mlocate \
    mtr-tiny \
    needrestart \
    neofetch \
    net-tools \
    openssh-server \
    psmisc \
    ssh-tools \
    syncthing \
    tree \
    unbound \
    vim \
    wireless-tools \
    wpasupplicant \
    zip
    d-i preseed/late_command string cp /etc/network/interfaces  /target/etc/network/interfacesweg2
    popularity-contest popularity-contest/participate boolean false
    tasksel tasksel/first multiselect standard



 In der debseed.cfg sind die IP-adressen, Hostnamen und User/PW für den sudouser anzupassen.
 Es sind auch ein paar Pakete der Kategorie 'nice to have' aufgenommen.

## Ablauf der Installation
Auf dem tftpserver das serielle Terminalprogramm starten, in einem zweiten Terminalfenster dnsmasq mit Option -d starten, damit die Ausgabe im Terminal sichtbar bleibt.
Falls dnsmasq port 69 nicht öffnen kann, prüfen wer drauf sitzt:    
    sudo ss -lp 'sport = 69'  
    und mit kill processid beenden, dann sollte dnsmasq starten.  

    dnsmasq-dhcp: PXE(enp109s0f1) 00:0d:b9:58:66:1c proxy
    dnsmasq-dhcp: PXE(enp109s0f1) 192.168.178.51 00:0d:b9:58:66:1c pxelinux.0
    dnsmasq-tftp: sent /var/lib/tftp/pxelinux.0 to 192.168.178.51
    dnsmasq-tftp: sent /var/lib/tftp/ldlinux.c32 to 192.168.178.51
    dnsmasq-tftp: Datei /var/lib/tftp/pxelinux.cfg/01-00-0d-b9-58-66-1c nicht gefunden
    dnsmasq-tftp: Datei /var/lib/tftp/pxelinux.cfg/C0A8B233 nicht gefunden
    dnsmasq-tftp: Datei /var/lib/tftp/pxelinux.cfg/C0A8B23 nicht gefunden
    dnsmasq-tftp: sent /var/lib/tftp/pxelinux.cfg/C0A8B2 to 192.168.178.51
    dnsmasq-tftp: sent /var/lib/tftp/debian-installer/amd64/linux to 192.168.178.51
    dnsmasq-tftp: sent /var/lib/tftp/debian-installer/amd64/initrd.gz to 192.168.178.51
    dnsmasq-tftp: sent /var/lib/tftp/debseed.cfg to 192.168.178.51
    dnsmasq-tftp: sent /var/lib/tftp/netcfghack.sh to 192.168.178.51

APU booten (Strom einschalten) und mit N PXE boot auswählen sobald es im seriellen Terminal angeboten wird. Nach einiger Zeit wird die Auswahl zur Netzschnittstelle angeboten.  
Bei der Schnittstelle enp1s0 auswählen und bestätigen. (Es ist mir nicht gelungen, diese Auswahl automatisch treffen zu lassen).  
Wenn alles klappt, ist die APU nach ca 18 Minuten installiert und bootet in das frisch installierte System.  
 Bei Fehlern in der debseed.cfg springt die Installation in den interaktiven Modus.

Die Konfiguration (oder auch Kompilieren) von tinc, bird2 und unbound kann jetzt erfolgen.  
Die Abhängigkeiten lib*-dev sind schon installiert, ebenso der gcc compiler für tinc kompilieren.   

## Tabelle der Installationen und für das Kompilieren von tinc  

Hier

Kompilieren und teilweise Konfiguration von tinc 1.1pre18  
Bitte die Kommentare im Code beachten


    #!/usr/bin/sh
    # tincanpass     2024-05-06
    #
    # tinc source wird geholt und kompiliert, installiert und etwas konfiguriert
    # bird und unbound werden nicht behandelt
    #
    #  erwartet die bereits erfolgte Installation der Abhängigkeiten auf der APU
    # falls nicht, hier die nötigen (zusatz)libs für tinc kompilieren
    #
    # sudo apt install libncurses-dev libreadline-dev zlib1g-dev liblzo2-dev libssl-dev
    #
    # tincpre18 holen (setzt internetzugriff voraus), kompilieren und installieren
    # /etc/tinc Verzeichnisse anlegen, keys und rudimentäre tinc.conf erzeugen
    # Aufruf als normaler user, sudo wird verwendet wenn nötig
    cd
    mkdir tinc
    cd tinc
    #tinc 1.1pre18 holen und entpacken
    wget https://www.tinc-vpn.org/packages/tinc-1.1pre18.tar.gz
    tar -xf tinc-1.1pre18.tar.gz
    cd tinc-1.1pre18

    # maketinc.sh erzeugen, damit tinc compile bei fehler alleine
    # wiederholt werden kann
    #  dazu nach Fehlerkorrektur im tinc-1.1pre18 Verzeichnis ./maketinc.sh aufrufen.
    echo "#!/bin/sh" >maketinc.sh
    echo "# tinc1.1 local compile + install mit eigenen DIRS " >>maketinc.sh
    echo "make distclean" >>maketinc.sh
    echo "./configure --prefix=/usr --sysconfdir=/etc --runstatedir=/run --localstatedir=/var --with-systemd" >>maketinc.sh
    echo "make" >>maketinc.sh

    # maketinc.sh ausführbar machen und aufrufen
    chmod +x maketinc.sh
    ./maketinc.sh

    echo "Meldung ...deprecated ist KEIN Fehler"
    echo "falls Fehler aufgetreten mit control-c abbrechen"
    echo "Fehler korrigieren und ./maketinc.sh erneut aufrufen"
    echo "tinc mit 'sudo make install' installieren"
    echo "es werden auch die tinckeys erzeugt"
    echo "lan/tinc.conf und wan/tinc.conf sind noch anzupassen"
    echo "weiter mit enter."
    read aa

    # make install mit sudo ausführen im tinc-1.1pre18 Verzeichnis
    sudo make install

    # tinc Verzeichnisse anlegen und etwas vorkonfigurieren
    # Die persönlichen Werte anpassen (berghofen, IP, connectto)
    # Werte für lan einstellen
    sudo mkdir -p /etc/tinc/lan/hosts
    sudo tinc --net=lan init berghofen
    sudo tinc --net=lan set Device /dev/net/tun
    sudo tinc --net=lan set Mode switch
    sudo tinc --net=lan set AddressFamily ipv4
    sudo tinc --net=lan set MaxTimeout 30
    sudo tinc --net=lan set BindToAddress 192.168.178.51
    sudo tinc --net=lan set Port 10001
    sudo tinc --net=lan set ConnectTo berglap
    sudo tinc -b --net=lan generate-keys 4096

    # Werte für wan einstellen
    sudo mkdir -p /etc/tinc/wan/hosts
    sudo tinc --net=wan init berghofen
    sudo tinc --net=wan set Device /dev/net/tun
    sudo tinc --net=wan set Mode switch
    sudo tinc --net=wan set AddressFamily ipv4
    sudo tinc --net=wan set MaxTimeout 30
    sudo tinc --net=wan set BindToAddress 192.168.178.51
    sudo tinc --net=wan set Port 661
    sudo tinc --net=wan set ConnectTo nordstadt
    sudo tinc --net=wan set ConnectTo hoerde
    sudo tinc -b --net=wan generate-keys 4096
    echo
    echo "Die restliche Konfiguration muss noch angepasst werden."
    echo " u.a. die hosts der Partner (nordstadt, hoerde, ...)
    exit 0

# FAQ oder Fehler  

Nach einer Laufzeit von mehreren können die WLAN-Karten fehlerhaft werden. Das zeigt sich darin, dass die APU nicht bootet und keinerlei Leds leuchten.  
Nach Ausbau der WLAN-Karte bootet die APU wieder wie gewohnt und läuft. Entweder man ersetzt die WLAN-Karte oder sie entfällt. Dieser Fehler ist bisher bei 2 Geräten aufgetreten.  


