Montag, 28. März 2022

debian - Setup mal nicht all inclusive

Ich bin es ja gewöhnt so etwas wie Raspberry OS Lite zu installieren. Da ist eigentlich erstmal alles dabei. Wenn man mal andere Hardware hat und mit einem debian-xxx-netinst.iso beginnt, merkt man schnell was so alles "fehlt". 

Es geht schon beim Setup los, wenn die Bemerkung kommt: Es werden Treiber/Firmware benötigt - hätte man dann eventuell mit einem "inoffiziellen Firmware" Image starten sollen? Wenn man Glück hat, läuft die Installation erstmal durch, dann sollte (muss?) man später nacharbeiten. Link.

Anmerkung: inoffziell oder non-free bezieht sich mehr oder weniger auf die Lizenzbedingungen unter der einige Hersteller ihre Linux Firmware veröffentlichen (war bei mir z.B. für Realtek und Intel Netzwerkadapter der Fall)

Dieser Artikel ist in den dargestellten Schritten schon nutzbar, an ihm wird aber aktuell gearbeitet!

Grundsetup

Auf der debian Installer Seite liest es sich einfach: Man soll einfach das ISO Image auf einen USB Stick schreiben. Aber wie genau? Unter Windows funktioniert das mit dem portablen Tool Rufus. Man braucht nichts installieren und die Bedienung ist intuitiv.

Nachtrag Juli 2023: Mit debian bookworm wird die erforderliche Firmware direkt ausgeliefert (das netinst Image ist jetzt nicht mehr 3xx MB sondern 6xx MB groß). Die folgenden Schritte in diesem Abschnitt sind nicht mehr notwendig.

Achtung: Verwendet man ein "Firmware" Image, muss man bei der abschließenden Frage nach dem Schreibmodus den dd-Modus wählen! Ansonsten ist das Firmware Image nutzlos, die zusätzliche Firmware wird vom Installer nicht erkannt.

Mit meinem MeLe Quieter2Q (J4125/8 GB Ram/256 GB eMMC) lief das Setup mit einem kleinen CD Image trotz fehlender Firmware erstmal durch, ich hatte auch eine Netzwerkverbindung. Wenn das nicht funktioniert wäre man mit einem "netinst" Image natürlich aufgeschmissen. Dann braucht man entweder eines mit Firmware oder lädt ein komplettes Image herunter.

Mit dmesg konnte ich aber im Nachgang 3 Meldungen zu fehlender Firmware finden. Ich habe die /etc/apt/sources.list um non-free contrib erweitert und die Firmware nachinstalliert:

Die sed Codezeile kann die Erweiterung direct in der sources.list vornehmen, diese Version ist zum Test. Wenn der erfolgreich ist, kann man mit sed -i ... wirklich ausführen. (alle Zeilen erfordern sudo )

cp /etc/apt/sources.list /etc/apt/sources.list.sav
sed '/^deb/ s/$/ non-free contrib/' /etc/apt/sources.list
apt update
apt install firmware-linux-nonfree firmware-realtek firmware-iwlwifi

Die Fehlermeldung "firmware: failed to load iwl-debug-yoyo.bin" ist allerdings geblieben, das ist wohl ein Bug in der Firmware selbst. 

Nachtrag Juli 2023: offenbar ist der Fehler ab Bullseye behoben. 

Sound

Da ist erstmal gar nichts installiert. Bei Raspberry OS hat das immer sofort funktioniert. Also erstmal einlesen https://wiki.debian.org/Sound 

Ich habe bisher (vor allem im Zusammenhang mit Bluetooth Lautsprechern) nie ganz verstanden warum es so viele Soundsysteme bei Linux gibt. Das muss ich jetzt wohl ansatzweise nachholen. 

Grundlage alsa

Ich hoffe diese Pakete bilden die richtige Grundlage (vielleicht braucht man das empfohlene Paket libasound2-plugins nicht? Alsa funktioniert beim zweiten Versuch erstmal ohne)

sudo apt update
sudo apt install libasound2 alsa-utils
# apt install libasound2-plugins

Von Raspberry OS weiß ich noch, da gibt es ein paar Sounddateien und einen Speakertest (Vorsicht! u.U. sehr laut! ctrl+c bereithalten):

aplay /usr/share/sounds/alsa/Noise.wav
speaker-test -t sine -f 440 -c 2 -s 1

Nichts zu hören - ok mit aplay -l oder cat /proc/asound/cards kann man die Soundkarten auflisten. Da gibt es bei mir viele Einträge: Karte 0 - mit 5 HDMI Kanälen und Karte 1 als USB gekennzeichnet, letztere ist der Analogausgang. Damit dieser als default verwendet wird, muss man eine Datei /etc/asound.conf erstellen: (kurze Version Link )

sudo sh -c 'cat > /etc/asound.conf' <<EOI
defaults.pcm.card 1
defaults.ctl.card 1
EOI

Jetzt ist der Speakertest laut zu hören, denn mein User ist in der Gruppe audio! Die Lautstärke kann man mit dem alsamixer herunterregeln.

Hinweis: Man kann das Audiodevice auch über die Umgebung setzen: AUDIODEV=hw:1

Damit man außer wav Dateien auch andere Sounds (z.B. mp3) wiedergeben kann, braucht man einen Player. Der oft verwendete mplayer hat bei mir in der Vergangenheit keinen guten Eindruck hinterlassen, er ist auch zu "groß". Ich installiere den schmalen sox player und teste sofort mit einer Sounddatei aus dem Internet:

sudo apt install sox libsox-fmt-all
play https://cdn.smartersoft-group.com/various/pull-bell-short.mp3
play -q https://cdn.smartersoft-group.com/various/pull-bell-short.mp3 2>/dev/null

Anmerkung: Die erste play Zeile liefert neben allen Details auch eine permanente Warnung "play WARN alsa: can't encode 0-bit Unknown or not applicable", die bekommt man nur mit der Umleitung ins Null Device weg. 2>/dev/null

PulseAudio

Ich habe keine einfache Beschreibung gefunden. Überall wird es so beschrieben als läuft alles automatisch und es ist überflüssig darüber zu schreiben. Viele Beschreibungen gehen von Desktop Systemen aus, mag sein dass dort alles komplett funktioniert und keiner weiß warum. Ob das ein paar Jahre alte Tutorial für FHEM von der Zeit überholt wurde?

Hier steht wenigsten das Basis Setup.

sudo apt install pulseaudio

Jetzt kann man pulseaudio als "default Sound" einrichten - ob das sinnvoll ist kann ich nicht sagen, es funktioniert - nach abmelden und wieder anmelden. Die Warnung aus dem vorherigen Abschnitt kommt nicht mehr.

sudo sh -c 'cat > /etc/asound.conf' <<EOI
pcm.default pulse
ctl.default pulse
EOI

Achtung! Der pulseaudio Server läuft jetzt nur im user mode, d.h jeweils nur wenn ein Benutzer angemeldet ist! Kein Benutzer angemeldet, keine Sound! Ein Service user fhem kann den pulseaudio Sound so nicht benutzen!

Ich wollte eigentlich pulseaudio "remote" bzw. aus docker nutzen. Hier steht: pulseaudio wäre der richtige Weg! Nach einigen Versuchen wird mir klar: Das Beste für mein Vorhaben wäre ein Dienst, der unabhängig vom User läuft und eine Netzwerkschnittstelle zur Verfügung stellt.

PulseAudio Server

In dieser Betriebsart startet der Service mit dem System und lauscht auf Port 4713 auf Clientverbindungen.

Ein schneller Test

Man kann man den user pulseaudio Prozess beenden und einen system-wide Prozess starten. Dieser übersteht Ab- und Anmeldung und läuft so unabhängig vom User. 

pulseaudio -k
sudo pulseaudio --daemonize=yes --system --realtime --log-target=journal --load="module-native-protocol-tcp auth-anonymous=1"

Auf einem Client, der ebenfalls pulseaudio installiert hat, kann man jetzt einfach über die Umgebungsvariable das Audiosignal umleiten:

PULSE_SERVER=ServerName <Befehl wie play, speakertest>

An den Berechtigungen / Gruppen musste ich nichts ändern, zumindest die Soundausgabe läuft mit der Gruppe audio.

PulseAudio Service Setup

Um diesen Modus final zu aktivieren gäbe es mehrere Wege. Auf alle Fälle muss man den User Service am Start hindern und einen systemd Services aktivieren. Link1 Link2

Alle bisherigen PulseAudio Prozesse beenden und die user-level Services abschalten:

sudo kill $(pidof pulseaudio)
sudo systemctl --global mask pulseaudio.service pulseaudio.socket

Die system Service Unit schreiben: ich trage die erforderlichen Parameter einfach hier ein und spare mir die extra Konfiguration in den Konfigurationsdateien. Diese kurze Script erzeugt mit einem einzigen C&P die unit Datei am richtigen Ort und führt ein daemon-reload aus.

service=pulseaudio
cat <<EOISERV |sudo SYSTEMD_EDITOR=tee systemctl edit --full --force $service
[Unit]
Description=$service Service
# DO NOT ADD ConditionUser=!root

[Service]
# Note that notify will only work if --daemonize=no
Type=notify
ExecStart=/usr/bin/pulseaudio --daemonize=no --system --realtime --log-target=journal --load="module-native-protocol-tcp auth-anonymous=1"
Restart=always

[Install]
WantedBy=default.target
EOISERV

Den neuen pulseaudio Service aktivieren:

sudo -s <<EOI
systemctl --system enable $service
systemctl --system start $service
EOI

Das Setup ist erstmal funktionsfähig.

Der Weg zur Erkenntnis

Folgendes Setup hat erstmal funktioniert (der entscheidende Hinweis): 

Auf dem Server muss man einen Eintrag im Abschnitt network access aktivieren (# entfernen) und ergänzen:

load-module module-native-protocol-tcp auth-anonymous=1

Die Änderung macht man entweder manuell mit nano:

sudo nano /etc/pulse/default.pa

oder automatisch mit sed:

string='load-module module-native-protocol-tcp'; sed -i "/^#$string$/ s/$/ auth-anonymous=1/;s/^#$string/$string/" /etc/pulse/default.pa

Nach einem Neustart des pulseaudio daemon (pulseaudio -k ; pulseaudio -D) lauscht pulseaudio auf Port 4713.

Auf einem Client, der ebenfalls pulseaudio installiert hat, kann man jetzt einfach über die Umgebung das Audiosignal umleiten:

PULSE_SERVER=ServerName speaker-test -t sine -f 440 -c 2 -s 1

Erstmal geschafft. Was funktioniert jetzt?

Mit der veränderten asound.conf kann man jetzt aus mehreren Applikationen gleichzeitig Sound abspielen zusätzlich auch über das Netzwerk. Mit AUDIODEV=hw:1 funktioniert weiterhin der exklusive Zugriff auf alsa direkt, allerdings nicht wenn etwas über pulseaudio läuft (Fehlermeldung).

ToDo 

noch besser recherchieren und Beschreibung ausbauen

Code Block

text

Keine Kommentare:

Kommentar veröffentlichen