Wurde Arch Linux ARM gebootet und Zugang per SSH gewährt, sind noch einige Konfigurationsdateien anzupassen, hier in Kürze einige zuerst von mir vorgenommenen Einstellungen. Die /etc/fstab
wurde bereits im Rahmen der Vorkonfiguration Abschnitt 2.3 editiert. Bei älteren Installationen notwendige Schritte zur Umstellung auf systemd habe ich im Abschnitt 7 zusammengefasst.
systemctl reboot
.Soll die oben erwähnte Tastenkombination Strg+Alt+Entf den DockStar nicht neu booten, sondern lediglich herunterfahren (entsprechend systemctl poweroff
) verlinkt man einfach das zugehörige Target neu.
[root@alarm ~]# ln -sf /usr/lib/systemd/system/poweroff.target /etc/systemd/system/ctrl-alt-del.target
Je nach Alter des Installationsmediums wird man bei dem erste Update ggf. mit einer Vielzahl an notwendigen manuellen Eingriffen konfrontiert. Die Vorgehensweise ist normalerweise bei den Upstream News dokumentiert, Stichwort manual intervention required. Auch nachdem das System komplett eingerichtet ist, sollte man es regelmäßig sichern, aktualisieren und warten, diesbezüglich finden sich im Wiki eine Reihe von wichtigen Hinweisen.
Verzeichnisse, deren Inhalt nach einem Reboot ohnehin gelöscht bzw. neu erstellt wird, können zur Schonung des USB-Sticks in den RAM verlagert werden. Dazu wird üblicherweise das Dateisystem tmpfs
eingesetzt, das unter Arch Linux für die Verzeichnisse /tmp
und /run
Verwendung findet. Die ehemaligen Verzeichnisse /var/run
und /var/lock
sind seit einiger Zeit Links auf /run
respektive /run/lock
und somit ebenfalls im RAM verortet.
Das Einbinden des temporären Verzeichnisses /tmp
erfolgt über eine Systemd mount unit /usr/lib/systemd/system/tmp.mount
. Ein Eintrag in /etc/fstab
ist optional, etwa um die Maximalgröße (Voreinstellung: 50% des RAM) zu reduzieren. Auch für das Verzeichnis /var/log
nutze ich tmpfs
, was sich insbesondere bei Einsatz eines Syslog Daemons wie syslog-ng
empfiehlt.
#/etc/fstab (continued)
tmp /tmp tmpfs nodev,nosuid,mode=1777,size=16M 0 0
varlog /var/log tmpfs nodev,nosuid,mode=0755,size=8M 0 0
Auf aktuellen Systemen erfolgt die Verwaltung des Systemlogs durch systemd-journald
, folglich gilt syslog-ng
als obsolet und ist nicht mehr vorinstalliert. Bei älteren Installationen wird man den Dienst normalerweise deaktivieren wollen, um Redundanz zu vermeiden.
[root@alarm ~]# systemctl stop syslog-ng.service
[root@alarm ~]# systemctl disable syslog-ng.service
Einsehen lässt sich das Journal mit journalctl
, gespeichert wird es per Voreinstellung unter /var/log/journal/
. Zur Verlagerung in den RAM ist es nicht notwendig /var/log/
als tmpfs
zu mounten, systemd-journald
stellt dafür eigene Optionen bereit.
#/etc/systemd/journald.conf
[Journal]
Storage=volatile
RuntimeMaxUse=8M
Das Journal wird nun unter /run/log/journal/
angelegt, auf /var/log/
schreiben nurmehr Applikationen, die ihre Meldungen direkt dort ablegen, wie z.B. pacman
.
Die eingangs erwähnte USB-Festplatte ist bereits mit Ext4 formatiert12 und bleibt permanent angeschlossen. Sie wird deshalb wie der USB-Stick fest über /etc/fstab
eingebunden. Neben ihrer eigentlichen Aufgabe als primäres Aufnahmeverzeichnis für den VDR (Abschnitt 6.4) nutze ich die Festplatte zur Erweiterung des Speicherplatzes für das Betriebssystem. Dazu werden Verzeichnisse auf der Festplatte mit der mount
-Option --bind
zusätzlich an geeigneter Stelle im Verzeichnisbaum eingebunden. Damit dennoch ein längerer Standby möglich bleibt, berücksichtige ich nur Verzeichnisse, auf die selten zugegriffen wird: Der Paket-Cache, das ABS-Wurzelverzeichnis (Abschnitt 4.3) sowie das /srv
Verzeichnis. Letzteres beherbergt z.B. von HTTP- und (T)FTP-Server bereitgestellte Inhalte.
#/etc/fstab (continued)
LABEL=usbhdd /hdd ext4 defaults 0 0
/hdd/pkg /var/cache/pacman/pkg none bind 0 0
/hdd/abs /var/abs none bind 0 0
/hdd/srv /srv none bind 0 0
Alternativ wären natürlich auch symbolische Links oder ein Anpassung der Pfade in /etc/pacman.conf
und /etc/abs.conf
möglich. Die Paketdatenbank /var/lib/pacman/sync
verbleibt auf dem Stick, andernfalls würde jeder Aufruf von pacman
die Festplatte aus dem Standby holen. Die angegebenen Verzeichnisse müssen, falls nicht bereits vorhanden, vor dem Mounten natürlich angelegt werden.
Die von mir verwendete Festplatte geht nach 30 Minuten ohne Zugriff automatisch in den Standby, andere mit hdparm -S
eingestellte Werte blieben ohne Wirkung. Um einen früheren Timeout herbeizuführen, wird also ein Programm wie hd-idle
benötigt. Bei der Konfiguration nutzt man vorzugsweise die ID der Festplatte.
#/etc/conf.d/hd-idle
START_HD_IDLE=true
HD_IDLE_OPTS="-i 0 -a /dev/disk/by-id/ata-xxxxxxx -i 600 -l /var/log/hd-idle.log"
Mit systemctl enable hd-idle.service
fügt man das Programm den beim Booten automatisch gestarteten Diensten hinzu. Bedarfsweise gelingt mit hd-idle -t
oder hdparm -y
auch ein unmittelbarer Spindown.
Mit der Paketverwaltung des Systems sollte man, wie bei jeder Linux-Distribution, vertraut sein. Bei Arch Linux ist auch das Erstellen von Software-Paketen relativ leicht. In den folgenden Abschnitten mache ich davon mehrfach gebrauch ohne auf das Vorgehen im Detail einzugehen, deshalb hier ein kurzer Überblick mit obligatorischen Links zum Wiki.
Zweierlei Arten von Paketen muss man unterscheiden:
pacman
von einem Mirrorserver heruntergeladen und installiert. Abhängigkeiten werden dabei automatisch aufgelöst. Seit Anfang 2014 kann die Authentizität der Pakete anhand ihrer Signaturen überprüft werden.makepkg
führt diese Anweisungen aus und komprimiert das Kompilat zu einem Paket, das dann mit pacman -U
installiert werden kann. Abhängigkeiten werden dabei nicht automatisch aufgelöst.Quellpakete haben die Dateiendung .src.tar.gz
, können aber auch ungepackt in einer Verzeichnistruktur vorliegen. Sie sind dann von Interesse, wenn Pakete aus dem archlinuxarm-Repository angepasst werden sollen oder dort nicht vorhanden sind. Quellpakete kann man von Hand erstellen - Prototypen von PKGBUILDs befinden sich nach Installation von abs
unter /usr/share/pacman/
-, meist wird man aber auf vorhandene Pakete zurückgreifen:
Einige Pakete aus dem AUR sind bei ALARM als Binärpakete verfügbar, können also direkt mit pacman
installiert werden. Die Quellen befinden sich zusätzlich im Git-Repository.
Als Git- und Paketbauverzeichnis bietet sich wiederum die Festplatte an. Vor dem Kompilieren der ABS- und AUR-Pakete ist zumindest das arch
-Array im PKGBUILD zu editieren, man kann es aber auch einfach mit der makepkg
-Option -A
ignorieren. Mitunter sind jedoch weitere Anpassungen an die ARM-Architektur erforderlich.
Da keine Swap-Partition angelegt wurde, macht sich insbesondere im letzten Schritt des Paketbaus, dem Komprimieren des Paketes, mitunter der begrenzte RAM bemerkbar13:
xz: (stdin): Nicht genügend Hauptspeicher verfügbar
bsdtar: Write error
Zumeist genügt es dann Programme mit erhöhtem Bedarf an RAM (wie z.B. vdradmind
, Abschnitt 6.3.1) vorübergehend zu beenden. Anschließend kann die Zusammenstellung und Komprimierung des betroffenen Paketes mit makepkg -Rf
erneut veranlasst werden. Eine zusätzliche Maßnahme wäre die Verwendung einer Kompressionsart, die weniger Arbeitsspeicher beansprucht:
#/etc/makepkg.conf
PKGEXT='.pkg.tar.gz'
Wer die Möglichkeit dazu besitzt, verlagert die Rechenlast per Cross-Compiling auf einen oder mehrere leistungsfähige i686/x86_64-Rechner im Netzwerk14. Hier ist zu beachten, dass distcc einige Dateien unter /tmp
ablegt, die ursprüngliche Beschränkung auf 8 MB erwies sich in diesem Zusammenhang als zu knapp bemessen, vgl. Abschnitt 4.1. Alle hier genannten Pakete habe ich auf dem DockStar aber auch ohne Cross-Compiling erstellen können, problematisch war dies nur im laufenden Betrieb.
Die Fehlermeldung bei erschöpftem RAM ist selten so eindeutig wie im vorherigen Abschnitt, oft werden Programme, deren Bedarf an RAM nicht gestillt werden kann, einfach beendet. Die Ursache findet man dann mit dmesg
, hier z.B. bei einer abgebrochenen Datensicherung mit rsync
:
[ 3901.497857] Out of memory: Kill process 1262 (rsync) score 272 or sacrifice child
[ 3901.497872] Killed process 1263 (rsync) total-vm:74980kB, anon-rss:24844kB, file-rss:0kB
Zwar könnte man in dieser Situation vorübergehend ein swapfile, vorzugsweise auf der USB-Festplatte, einrichten. Alternativ - oder zusätzlich - gibt es aber auch die Möglichkeit, den verfügbaren RAM besser auszunutzen: Dazu wird mithilfe des Kernelmoduls zram eine virtuelle Swap-Partition /dev/zram0
angelegt und eingebunden. Die in diesen Swap ausgelagerten Daten werden komprimiert und im RAM gespeichert. Die Swap-Partition beansprucht dabei jederzeit nur die den komprimierten Daten entsprechende Menge das RAMs. Im Endeffekt werden also umso mehr Daten im RAM komprimiert, je höher der tatsächliche Bedarf an RAM ist. Der Preis dafür ist eine erhöhte CPU-Belastung.
Das Anlegen und Einbinden des virtuellen Swaps übernimmt das im AUR verfügbare Paket zramswap Pro CPU wird ein zram-Device erzeugt - beim DockStar also eines -, die zusammen maximal eine 20% des RAMs entsprechende Menge an unkomprimierten Daten aufnimmt. Dieser Wert lässt sich über eine zusätzliche Servicedatei beeinflussen:
#/etc/systemd/system/zramswap.service.d/size.conf
[Service]
Environment="ZRAM_SIZE=50"
Mit systemctl daemon-reload
wird die Änderung übernommen, systemctl enable zramswap.service
fügt zramswap
den beim Booten automatisch gestarteten Diensten hinzu.
Die Steuerung der LEDs über das /sys
-Verzeichnis erfordert root-Rechte, soll möglichst aber auch anderen Nutzern offenstehen. Der direkte Einsatz von sudo ist in diesem Zusammenhang etwas umständlich. Ich habe deshalb ein einfaches C-Programm geschrieben, das sich auf herkömmliche Weise mit sudo
ausführen lässt. Auch kann es einfach innerhalb eines Scriptes genutzt werden, das seinerseits mit sudo
aufgerufen wurde (Abschnitt 6.4). Das Programm wird mit gcc
, der im gleichnamigen Paket enthalten ist, kompiliert:
[user@alarm ~]$ gcc -o led led.c
Es manipuliert jeweils nur eine der beiden LEDs und ermittelt diese anhand des Namens, unter dem das Programm aufgerufen wurde. Deshalb werden zwei Dateien erstellt, die auf denselben Inode zeigen (Hardlink):
[root@alarm ~]# cp led /usr/local/bin/led_green
[root@alarm ~]# ln /usr/local/bin/led_green /usr/local/bin/led_orange
Ohne Parameter werden verfügbare Zustände und aktueller Status angezeigt. Als erster Parameter kann der gewünschte Status angegeben werden. Der Status timer
benötigt zusätzlich die Parameter delay_on
und delay_off
, hier ein Beispiel:
[root@alarm ~]# led_green
none nand-disk timer ide-disk heartbeat [default-on]
[root@alarm ~]# led_green timer 1000 1000
Um die LEDs beim Herunterfahren zum Erlischen zu bringen habe ich folgenden Service implementiert.
#/etc/systemd/system/leds-off.service
[Unit]
Description=Switch off LEDs before poweroff
DefaultDependencies=no
Before=poweroff.target
After=umount.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/led_green none ; /usr/local/bin/led_orange none
[Install]
WantedBy=poweroff.target
Zur Zeit gibt es für mich keine Veranlassung einen angepassten Kernel zu erstellen: Das Aufs-Dateisystem wurde unlängst in den ALARM-Kernel integriert und seit der Berücksichtigung einer größeren Anzahl von DVB-Treibern in Version 3.1.10-11 läuft auch mein DVB-Stick von Freecom out of the box. Anhand eines anderen Sticks beschreibe ich in Abschnitt 5, wie man auch ohne Kernelkompilation an die neuesten DVB-Treiber gelangt.
Wer eine Anpassung der Kernelkonfiguration vornehmen will, kann sich an den Artikel Kernel Compilation im Wiki halten. Das zu modifizierende Kernelpaket befindet sich jedoch nicht im ABS, sondern im Git-Repository, siehe Abschnitt 4.3, nachfolgend das zuletzt von mir verwendete, überarbeitete Paket. Anders als im ALARM-Kernel werden Patches und Quelldateien für das Aufs-Dateisystem direkt aus dem Aufs-Git-Repository heruntergeladen.
Um die Kompilierzeit zu reduzieren, verwende ich im PKGBUILD das make
-Target localmodconfig
. Es deaktiviert in der Kernelkonfiguration sämtliche Module, die momentan nicht geladen sind. Als Basis dient die Konfiguration des laufenden Kernels aus /proc/config.gz
. Man sollte also vor Aufruf von makepkg
sämtliche Hardware, die man nutzen möchte, anschließen (ggf. nacheinander) und in Betrieb nehmen, sowie Programme und Daemons starten, die auf Kernelmodule angewiesen sind (z.B. der NFS Server). Im Anschluss werden neu hinzugekommene Kerneloptionen einzeln abgefragt. Man kann hier die Vorgaben zunächst bestätigen und hat im letzten, durch make menuconfig
ausgelösten Schritt Gelegenheit in einer textbasierten Oberfläche die Konfigurationen zu überarbeiten. Hilfe bei der Auswahl benötigter Optionen bietet das Buch Linux Kernel in a Nutshell insbesondere Kapitel 7. Ein daraus abgeleitetes praktisches Beispiel folgt auch in Abschnitt 5.1.
Ist der Kernel konfiguriert, bestätigt man das Speichern der .config
-Datei. Nach dem Kompilieren entstehen die Pakete linux-custom
und linux-custom-headers
. Sie lassen sich parallel zu linux
und linux-headers
installieren, das Kernelimage befindet sich unter /boot/uImage-custom
. Um dieses Image zu booten, kann man behelfsweise /boot/uImage
damit ersetzen:
[root@alarm ~]# mv /boot/uImage /boot/uImage-alarm
[root@alarm ~]# cp /boot/uImage-custom /boot/uImage
Sollte nach einem Reboot der eigene Kernel nicht starten, stellt man das ursprüngliche Image wieder her (den Stick dazu an einen anderen PC anschließen) und kann so wieder den offiziellen Kernel nutzen. Ein unbeabsichtigtes Überschreiben von /boot/uImage
durch ein Update - pacman
geht ja davon aus, das diese Datei zum Paket linux
gehört - lässt sich mit der Option NoUpgrade
vermeiden, die neue Datei wird dann mit der Endung .pacnew
versehen. Alternativ kann man natürlich auch die Kernelpakete vom Update ausschließen:
#/etc/pacman.conf
NoUpgrade = boot/uImage
#IgnorePkg = linux linux-headers
Ein Reboot ist normalerweise nur dann notwendig, wenn im Rahmen eines Updates ein neuer Kernel installiert wurde. ↩
Externe Festplatten sind ab Werk zumeist mit NTFS formatiert. Schreiboperationen unter Linux sind mit ntfs-3g zwar möglich, gehen aber mit außerordentlich hoher CPU-Last einher. Der Versuch auf einem Pogoplug E02 eine NTFS-Partition als VDR-Aufnahmeverzeichnis zu verwenden endete mit regelmäßigem Überlauf des Puffers und folglich unbrauchbaren Aufnahmen. Mit einer Ext4-Partition ist dagegen auch ein Abspielen von laufenden Aufnahmen völlig unproblematisch. ↩
Wird bereits der Kompiliervorgang mangels RAM unterbrochen, sollte man - nach etwaigen Maßnahmen den RAM betreffend (Abschnitt
4.4) - makepkg
fortan mit der Option -e
aufrufen. Andernfalls wird der Quellcode jedesmal erneut entpackt und somit bereits kompilierte Teile der Software gelöscht. Zuvor kann man auch einen etwaigen ./configure
-Schritt im PKGBUILD vorübergehend auskommentieren. Patches dürfen nicht erneut angewendet werden, sind also - sofern sie nicht separat innerhalb der neuen prepare()
-Funktion zu Anwendung kommen - auszukommentieren, sinnvollerweise ebenso alle weiteren Schritte, die ein Löschen bereits erstellter Binaries nach sich zöge, wie z.B. die standardmäßige Neuerstellung des build
-Verzeichnisses bei Paketen, deren Quellen aus Versionskontrollsystemen geladen werden. Letzteres lässt sich durch die seit Version 4.1 von pacman
mögliche Angabe der VCS-Quelle im source()
-Array bewerkstelligen.
↩
In Version 3.1-9 wurde unter Arch Linux User=nobody
im distccd.service
eingefügt. Die Option --user
wird dadurch ignoriert. Für Arch Linux x86_64 steht ein Quellpaket distccd-alarm
zur Verfügung, das auf die vorkompilierten crosstool-ng
toolchains zurückgreift. Es erstellt separate Pakete für ARMv5/6/7-Toolchains mit jeweils eigenen Konfigurations- und Servicedateien für distccd
.
[user@linux ~]$ git clone git://github.com/WarheadsSE/PKGs
[user@linux ~]$ cd PKGs/distccd-alarm/
[user@linux ~]$ makepkg
[user@linux ~]$ sudo pacman -U distccd-alarm-armv5-4.9.2-1-x86_64.pkg.tar.xz
Nach Anpassen von /etc/conf.d/distccd-armv5
kann der distccd-armv5.service
gestartet werden.
↩