Grundinstallation als Server mit Arch Linux ARM

Letzte Aktualisierung: 25.06.2019

Ausgangspunkt ist bei allen Anleitungen ein frisch installiertes ArchLinux. Um dieses auf den Datenträger zu bekommen, wird zwingend ein Linux-System benötigt, von Windows aus funktioniert das Flashen (eigentlich) nicht! Gehen Sie dann einfach auf »archlinuxarm.org«, wählen Sie unter Platforms Ihren SBC aus und folgen Sie der dortigen Installationsanleitung. Oder Sie schauen einmal auf die Seite mit einigen vorgefertigten OS-Images!

Nach dem ersten Booten müssen wir uns als root-User anmelden. Der SSH-Server erlaubt dies aus Sicherheitsgründen jedoch standardmäßig nicht mehr direkt, sodass ein Umweg nötig ist: Wir melden uns mit dem Standardnutzer „alarm“ an (Passwort ist ebenfalls alarm) und können dann erst in der aktiven SSH-Sitzung zu root wechseln:

su -

Nach Eingabe des root-Passworts (standardmäßig root; wir ändern das später) wird zuerst das System aktualisiert:[1][2]

pacman -Syu
shutdown -r now

Da später noch sowohl Werkzeuge zum Bauen von Programmpaketen als auch das Tool wget gebraucht werden, werden diese auch gleich installiert:

pacman -S --needed base-devel wget

Deutsches System und Benutzerverwaltung

Zuerst wird das System wie im »ArchLinux-Wiki« beschrieben auf Deutsch geändert:

su -
echo KEYMAP=de-latin1-nodeadkeys > /etc/vconsole.conf
rm /etc/localtime
ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime
nano /etc/locale.gen

In dieser Datei werden jetzt die Zeilen mit de_DE.UTF-8 UTF-8 und en_DK.UTF-8 UTF-8 entkommentiert („Dänisches Englisch“ für ISO-konforme IT-Daten wie z.B. Wochenanfang Montag statt Sonntag). Zum Schluss werden die Locales generiert, ein Hostname gesetzt und der Rechner neu gestartet:

locale-gen
nano /etc/locale.conf

LANG=de_DE.utf8
LC_DATE=en_DK.utf8
LC_NUMERIC=en_DK.utf8
LC_TIME=en_DK.utf8

hostnamectl set-hostname MeinHostname
shutdown -r now

Nun wird das Passwort des root-Nutzers geändert, dann ein (weiterer) normaler Nutzeraccount (hier bspw. „schmied“) angelegt, der zusätzlich als sudoer berechtigt wird, zur Gruppe users gehört, ein eigenes Homeverzeichnis erhält und dessen Standard-Shell bash ist; schließlich löschen wir aus Sicherheitsgründen noch den Default-User „alarm“ inkl. seines Homeverzeichnisses:

su -
passwd
useradd -m -g users -s /bin/bash schmied
passwd schmied
nano /etc/sudoers

Ans Ende dieser Datei wird folgende Zeile hinzugefügt:

schmied ALL=(ALL) ALL

Das Anlegen dieses normalen Nutzers ist aus Sicherheitsgründen generell eine gute Idee und sowieso zwingend erforderlich, wenn später mittels makepkg eigene Pakete kompiliert werden sollen (nötig z.B. bei Tvheadend), da dort die Option --asroot entfernt wurde! Den ebenfalls gewöhnlichen Benutzer(namen) „alarm“ löschen wir, weil er potenziell jedem bekannt ist und somit einen Angriffspunkt für Menschen mit bösen Absichten darstellt... Hierzu beenden wir die SSH-Sitzung (!), melden uns mit dem neuen Nutzer „schmied“ komplett neu an und wechseln wieder zu root:

su -
userdel -r alarm

Raspberry Pi: RAM-Split anpassen und HDMI abschalten

Da unser SBC als Headless Server betrieben werden soll, teilen wir der GPU den kleinstmöglichen Speicher zu:

nano /boot/config.txt

Hier jetzt den Eintrag gpu_mem=64 zu gpu_mem=16 ändern.

Ferner wird keine HDMI-Ausgabe benötigt, sodass diese automatisch mit jedem Systemstart deaktiviert werden kann:

nano /etc/systemd/system/hdmioff.service

[Unit]
Description=Turns off HDMI on startup

[Service]
Type=oneshot
ExecStart=/opt/vc/bin/tvservice -o
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Dieses Abschalten jetzt und künftig bei jedem Systemstart automatisch ausführen:

systemctl start hdmioff.service
systemctl enable hdmioff.service

(Dieses Abschalten reduziert den Strombedarf um einige Milliampere und kann mittels /opt/vc/bin/tvservice -s kontrolliert werden. Die Ausgabe sollte dann etwa lauten: state 0x120001 [TV is off].)

Odroid-C1: RAM vergrößern

Der C1 erlaubt es, das Videodecoding und die HDMI-Ausgabe abzuschalten und so RAM zu sparen.

nano /boot/boot.ini

Hier suchen wir die Sektionen „Disable VPU“ und „Disable HDMI Output“ und ändern die dort definierten Parameterzeilen wie folgt ab:

setenv vpu "0"
setenv hdmioutput "0"

Netzwerk konfigurieren

Jetzt wird das System angewiesen, der Netzwerkschnittstelle eth0 permanent eine feste IP (hier 192.168.178.2) zuzuweisen:[3][4]

nano /etc/systemd/network/eth0.network

Diese Datei modifizieren wir wie folgt:

[Match]
Name=eth0

[Network]
Address=192.168.178.2/24
Gateway=192.168.178.1
DNS=192.168.178.1

Als letztes wird der Service für systemd-networkd und systemd-resolved auf enabled gestellt und das System neu gestartet:

systemctl enable systemd-networkd.service
systemctl enable systemd-resolved.service
shutdown -r now

Nachdem der Raspberry Pi wieder hochgefahren ist, ist er jetzt (in diesem Beispiel) unter der Adresse 192.168.178.2 erreichbar, wobei davon ausgegangen wird, dass der künftige Server via LAN-Kabel mit dem Router verbunden ist, welcher die IP-Adresse 192.168.178.1 hat.

Systeminformationen beim SSH-Login (optional)

Man kann das SSH-Terminal nach dem Login des root-Nutzers dazu bringen, Systeminformationen oder Wilkommensnachrichten auszugeben. Der Phantasie sind dabei kaum Grenzen gesetzt, die hier vorgestellte Variante soll nur als Beispiel dienen:[5][6][7]

su-
nano ~/.bash_profile

KERNEL=`uname -srmo`
NUMPROC=$(ps ax | wc -l | tr -d " ")
let upSeconds="$(/usr/bin/cut -d. -f1 /proc/uptime)"
let secs=$((${upSeconds}%60))
let mins=$((${upSeconds}/60%60))
let hours=$((${upSeconds}/3600%24))
let days=$((${upSeconds}/86400))
UPTIME=`printf "%d days, %02dh%02dm%02ds" "$days" "$hours" "$mins" "$secs"`
MemF=$(cat /proc/meminfo | grep MemFree | awk {'print $2'})
MemT=$(cat /proc/meminfo | grep MemTotal | awk {'print $2'})
Temp=$(awk '{printf "%3.1f°C\n", $1/1000}' /sys/class/thermal/thermal_zone0/temp)
NOW=$(date +"%A, %e %B %Y, %r")
IP=$(/sbin/ifconfig eth0 | grep 'inet\ ' | tr -s ' ' | cut -d ' ' -f3)
WWWIP=$(wget -q -O - http://icanhazip.com/ | tail)
#Colours as variables
#Cyan bold:
C="\e[1;36;49m"
#Red:
R="\e[31m"
#Default:
X="\e[00;37m"
clear
echo -e "$C              +$X"
echo -e "$C              #$X"
echo -e "$C             ###$X"
echo -e "$C            #####$X"
echo -e "$C            ######$X            $R$NOW"
echo -e "$C           ; #####;$X           $R$KERNEL"
echo -e "$C          +##.#####$X"
echo -e "$C         +##########$X          Uptime.......: $UPTIME"
echo -e "$C        #############;$X        Memory.......: ${MemF}kB (free) / ${MemT}kB (total)"
echo -e "$C       ###############+$X       Processes....: $NUMPROC"
echo -e "$C      #######   #######$X       IP addresses.: $IP / $WWWIP"
echo -e "$C    .######;     ;###;''.$X     Temperature..: $Temp"
echo -e "$C   .#######;     ;#####.$X"
echo -e "$C   #########.   .########'$X"
echo -e "$C  ######'           '######$X"
echo -e "$C ;####                 ####;$X"
echo -e "$C ##'                     '##$X"
echo -e "$C#'                         '#$X"

Hinweis: Für einen Odroid C2 mit Mainline-Kernel ersetzen Sie /sys/class/thermal/thermal_zone0/temp durch /sys/class/hwmon/hwmon0/temp1_input.[8]

SSH-Login-Bildschirm
Abb. 1: Beispielhafte Ausgabe nach erfolgreichem SSH-Root-Login