Technik

Kernel aus Backports installieren

21. Juli 2022 · Betriebssysteme · andreas · Kein Kommentar

Je nach verwendeter Hardware fehlt mit ein bißchen Pech im Kernel der Debian-Stable-Version altersbedingt die Unterstützung für einige Hardware-Komponenten.

Das aktuelle Debian Bullseye verwendet standardmäßig den Kernel 5.10

$ uname -a Linux *** 5.10.0-16-amd64 #1 SMP Debian 5.10.127-1 (2022-06-30) x86_64 GNU/Linux

Glücklicherweise gibt es als einfache und Distributions-konforme Lösung für solche Fälle das Backports-Repository:

Backports are packages taken from the next Debian release (called “testing”), adjusted and recompiled for usage on Debian stable. Because the package is also present in the next Debian release, you can easily upgrade your stable+backports system once the next Debian release comes out. [Quelle]

Die Backports bieten die Möglichkeit, mit Hilfe der gewohnten Paketverwaltung - sofern bereitgestellt - auf eine neuere Version eines Pakets zu aktualisieren, ohne dabei ein Franken-Debian zu erschaffen.

Als erstes müssen, sofern dies nicht bei der Installation des Systems bereits angewählt wurde, die Backports in der Datei “/etc/apt/sources.list” ergänzt werden:

# bullseye-backports, previously on backports.debian.org deb http://deb.debian.org/debian/ bullseye-backports main contrib non-free deb-src http://deb.debian.org/debian/ bullseye-backports main contrib non-free

Dann kann man sich nach einem “apt update” auf die Suche nach einem passenden Kernel machen:

$ sudo apt search linux-image Sortierung… Fertig Volltextsuche… Fertig ... linux-image-5.10.0-11-amd64/stable-security 5.10.92-2 amd64 Linux 5.10 for 64-bit PCs (signed) ... linux-image-5.18.0-0.bpo.1-amd64/bullseye-backports 5.18.2-1~bpo11+1 amd64 Linux 5.18 for 64-bit PCs (signed) ...

In der Liste werden alle Kernel-Versionen angezeigt, die installiert werden können, i.d.R. ist die Version mit möglichst wenigen Zusätzen im Namen die richtige:

$ sudo apt install linux-image-5.18.0-0.bpo.1-amd64/bullseye-backports ... Version »5.18.2-1~bpo11+1« (Debian Backports:bullseye-backports [amd64]) für »linux-image-5.18.0-0.bpo.1-amd64« gewählt. ... Die folgenden NEUEN Pakete werden installiert: linux-image-5.18.0-0.bpo.1-amd64 0 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.

Nach erfolgreicher Installation reicht ein Neustart, um mit dem aktualisierten Kernel zu starten.

$ uname -a Linux *** 5.18.0-0.bpo.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 5.18.2-1~bpo11+1 (2022-06-14) x86_64 GNU/Linux

Im GRUB-Menü kann jederzeit wieder der bisher verwendete Kernel gestartet werden und falls der neue Kernel wieder entfernt werden soll, reicht ein einfaches “sudo apt purge …”, um die Installation rückgängig zu machen.


YouTube, Thumbnails und WebP

04. Juli 2022 · Anwendungen · andreas · Kein Kommentar

Seit einiger Zeit wurden in meinem Firefox beim Besuch der YouTube-Website keinerlei Thumbnails mehr angezeigt, sondern stattdessen die Vorschaubilder durch einen grauen Platzhalter ersetzt.

Nachdem das testweise Abschalten der installierten Erweiterungen nicht half, führte das Anlegen eines neuen Profils zur Erkenntnis, daß es an einem Parameter des Standardprofils liegen muss.

Verantwortlich war der Parameter “image.webp.enabled”, welcher die Unterstützung für das WebP-Format regelt und auf “false” gesetzt war. Nach dem Zurücksetzen des Wertes auf den Standard “true” funktionieren die Vorschaubilder wieder wie gewohnt.


Denon PMA-50 und Linux

25. Juni 2022 · Hardware · andreas · Kein Kommentar

Der Denon PMA-50 ist ein cooler kleiner Verstärker, der neben zahlreichen analogen und digitalen Eingängen auch eine USB-B-Buchse mitbringt, mit deren Hilfe er als USB-DAC agieren kann - eigentlich ideal für den Betrieb an einem Raspberry Pi.

Durch die USB-B-Verbindung mit einem PC oder Mac können audiophile Musikliebhaber die neuesten hochauflösenden Formate zur Wiedergabe von PCM- und DSD-Dateien nutzen. Dabei werden hochauflösende PCM-Tracks mit bis zu 24 Bit/192 kHz sowie 2,8-MHz- und 5,6-MHz-DSD-Tracks unterstützt. [Quelle]

Wie erwartet bezieht sich “PC” nur auf Windows und es gibt keinerlei Information, ob ein Betrieb unter Linux möglich ist. Also hilft nur Ausprobieren - im konkreten Fall mit einem Raspberry Pi und dem aktuellen Raspbian.

Direkt beim Einstecken erkennt der Kernel den Verstärker

Jun 25 10:32:31 raspberrypi kernel: [ 880.636565] usb 1-1.3: new high-speed USB device number 4 using dwc_otg Jun 25 10:32:32 raspberrypi kernel: [ 880.768195] usb 1-1.3: New USB device found, idVendor=154e, idProduct=1003, bcdDevice= 1.00 Jun 25 10:32:32 raspberrypi kernel: [ 880.768263] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0 Jun 25 10:32:32 raspberrypi kernel: [ 880.768298] usb 1-1.3: Product: PMA-50 Jun 25 10:32:32 raspberrypi kernel: [ 880.768322] usb 1-1.3: Manufacturer: D & M Holdings Inc. Jun 25 10:32:32 raspberrypi kernel: [ 880.807205] hid-generic 0003:154E:1003.0001: hiddev96,hidraw0: USB HID v1.10 Device [D & M Holdings Inc. PMA-50] on usb-20980000.usb-1.3/input2

und auch Pulseaudio ist zufrieden:

* index: 1 name: driver: flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY state: IDLE suspend cause: (none) priority: 9049 volume: front-left: 30419 / 46% / -20.00 dB, front-right: 30419 / 46% / -20.00 dB balance 0.00 base volume: 65536 / 100% / 0.00 dB volume steps: 65537 muted: no current latency: 68.38 ms max request: 20 KiB max rewind: 20 KiB monitor source: 1 sample spec: s32le 2ch 44100Hz channel map: front-left,front-right Stereo used by: 0 linked by: 2 fixed latency: 59.95 ms card: 1 module: 20 properties: alsa.resolution_bits = "32" device.api = "alsa" device.class = "sound" alsa.class = "generic" alsa.subclass = "generic-mix" alsa.name = "USB Audio" alsa.id = "USB Audio" alsa.subdevice = "0" alsa.subdevice_name = "subdevice #0" alsa.device = "0" alsa.card = "2" alsa.card_name = "PMA-50" alsa.long_card_name = "D & M Holdings Inc. PMA-50 at usb-20980000.usb-1.3, high speed" alsa.driver_name = "snd_usb_audio" device.bus_path = "platform-20980000.usb-usb-0:1.3:1.0" sysfs.path = "/devices/platform/soc/20980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/sound/card2" udev.id = "usb-D___M_Holdings_Inc._PMA-50-00" device.bus = "usb" device.vendor.id = "154e" device.vendor.name = "D&M Holdings, Inc. (Denon/Marantz)" device.product.id = "1003" device.product.name = "PMA-50" device.serial = "D___M_Holdings_Inc._PMA-50" device.string = "front:2" device.buffering.buffer_size = "21152" device.buffering.fragment_size = "5288" device.access_mode = "mmap" device.profile.name = "analog-stereo" device.profile.description = "Analog Stereo" device.description = "PMA-50 Analog Stereo" module-udev-detect.discovered = "1" device.icon_name = "audio-card-usb" ports: analog-output: Analog Output (priority 9900, latency offset 0 usec, available: unknown) properties: active port:

Funtkioniert!


Festplatte einer virutellen Linux-Maschine vergrößern

15. Juni 2022 · Betriebssysteme · andreas · Kein Kommentar

Wenn die Festplatte einer virtuellen Maschine volläuft, so kann im Gegensatz zu physikalischen Rechnern das Problem meist recht einfach behoben werden. Etwas spannender wird es, wenn die virtuelle Festplatte partitioniert ist und bei der Erweiterung eine andere Partition im Weg ist:

$ sudo fdisk -l /dev/sda Disk /dev/sda: 30,18 GiB, 32408698880 bytes, 63298240 sectors Disk model: VBOX HARDDISK Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xf3f6188b Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 61296639 61294592 29,2G 83 Linux /dev/sda2 61298686 63297535 1998850 976M 5 Extended /dev/sda5 61298688 63297535 1998848 976M 82 Linux swap / Solaris

Das oben stehende Beispiel zeigt eine solche Situation: die eigentliche Daten- bzw. Betriebssystempartition “/dev/sda1” kann nicht einfach vergrößert werden, da die erweiterte Partition “/dev/sda2” mit der darin enthaltenen Swap-Partition “/dev/sda5” direkt anschließend auf dem Datenträger liegt.

Vollständigen Beitrag lesen


Perl, Unicode und Umlaute in Dateinamen

09. Juni 2022 · Programmierung · andreas · Kein Kommentar

Das Projekt klingt einfach: eine Liste von Dateinamen aus einem Verzeichnis auslesen, in einer Datenbank speichern und zu einem späteren Zeitpunkt anhand der Liste in der Datenbank wieder öffnen. Leider konnte das Skript einige Dateien nicht mehr finden, obwohl diese im Verzeichnis weiterhin vorhanden waren.

Heruntergebrochen auf ein Beispielskript sieht das Szenario wie folgt aus:

test.pl
#!/usr/bin/perl use strict; use warnings; use utf8; use DBI; # remove database unlink("files.sqlite"); # create database from scratch my $dbh = DBI->connect("dbi:SQLite:dbname=files.sqlite", "", "", { sqlite_unicode => 1 }); $dbh->do("CREATE TABLE files (name TEXT);"); # the file to be processed my $filename = "Elternschreiben Änderungen der Regelungen zum Infektionsschutz.pdf"; # create the file in the current directory open(my $fh, ">$filename"); print $fh "TEXT"; close($fh); # read files in current directory opendir(my $dh, "."); while (my $file = readdir($dh)) { next if $file !~ /pdf$/; $file = $dbh->quote($file); $dbh->do("INSERT INTO files (name) VALUES ($file);"); } closedir($dh); # get number of files with name "filename" $filename = $dbh->quote($filename); my $sth = $dbh->prepare("SELECT COUNT(*) AS cnt FROM files WHERE name = $filename;"); $sth->execute; my $row = $sth->fetchrow_hashref; print "found $row->{cnt} file(s).\n"; $sth->finish; $dbh->disconnect();

Statt des erwarteten Ergebnisses “1” ist das Skript jedoch der Meinung, keine passende Datei eingelesen zu haben:

found 0 file(s).

Um Probleme mit der Datenbank auszuschließen, kann das Szenario im Dateisystem nachgebildet werden:

test.pl
#!/usr/bin/perl use strict; use warnings; use utf8; use DBI; # the file to be processed my $filename = "Elternschreiben Änderungen der Regelungen zum Infektionsschutz.pdf"; my $found = 0; # create the file in the current directory open(my $fh, ">$filename"); print $fh "TEXT"; close($fh); # read files in current directory opendir(my $dh, "."); while (my $file = readdir($dh)) { next if $file !~ /pdf$/; if ($file eq $filename) { $found++; } } closedir($dh); print "found $found file(s).\n";

Auch hier wird statt der erwarteten “1” eine “0” für die Menge der gefundenen Dateien ausgegeben.

found 0 file(s).

Einen ersten Hinweis auf die mögliche Ursache bringt die Ausgabe der zu vergleichenden Werte mittels “Data::Dumper”. Während für “$filename” der Wert

$VAR1 = "Elternschreiben \x{c4}nderungen der Regelungen zum Infektionsschutz.pdf";

ausgegeben wird, wird für “$file” der Wert

$VAR1 = 'Elternschreiben Änderungen der Regelungen zum Infektionsschutz.pdf';

ausgegeben, d.h. die Werte der beiden Variablen sind in der internen Repräsentation in Perl tatsächlich unterschiedlich. Mit den richtigen Anhaltspunkten führt eine Suche im Internet zum Stackoverflow-Beitrag “In what encoding does readdir return a filename?” und der dort verlinkten ausführlichen Erklärung.

Des Rätsels Lösung ist die Verwendung von “Encode::decode_utf8”

test.pl
#!/usr/bin/perl use strict; use warnings; use utf8; use DBI; use Encode; # the file to be processed my $filename = "Elternschreiben Änderungen der Regelungen zum Infektionsschutz.pdf"; my $found = 0; # create the file in the current directory open(my $fh, ">$filename"); print $fh "TEXT"; close($fh); # read files in current directory opendir(my $dh, "."); while (my $file = readdir($dh)) { next if $file !~ /pdf$/; if (Encode::decode_utf8($file) eq $filename) { $found++; } } closedir($dh); print "found $found file(s).\n";

dann stimmt auch die Anzahl der gefundenen Dateien mit der erwarteten Anzahl überein:

found 1 file(s).