Schlagwort-Archive: Linux

DVB-T Stick auf Abwegen: RTL_SDR

DVB-T – da war ja was – dieser Fernsehstandard, der irgendwie nie richtig funktionierte. Tja, entsprechend sind passende Empfangsgeräte recht günstig im Netz zu finden – unter anderem USB-Empfänger für den Rechner. Nach einem Vortrag bei der LUG-MYK zum Thema mitschneiden von ADS-B, also Flugzeugpositionen wie beispielsweise auf Flightradar24.com zu sehen, wurde ich hellhörig. Ich wusste zwar, dass man alte Analogfernseher zu Diagnosezwecke nutzen kann (z.B. hatte ich so getestet, ob meine ersten AVR-Funkmodule Daten absetzen), aber mit digitalem Tuner am PC ergeben sich da ja ganz neue Möglichkeiten.

Passenderweise fand sich auch bei mir ein passender Empfänger mit dem RTL2838U-Chipsatz in der Bastelkiste. Leider nur mit einem FC0013-Tuner, welcher nicht bis zu den Flugfrequenzen hoch kommt, aber da gibt es ja noch mehr: Das damals mit TV geprüfte 433MHz-Band z.B. – hier treiben sich viele Heimgeräte wie z.B. Funkthermometer, Funkschalter, etc herum. Passenderweise gibt es auch hierzu bereits mit rtl_433 ein passendes Programm – hiermit lassen sich Signale auf dieser Frequenz mitlesen.

Neben der Ausgabe von Rohdaten kann die Software auch die Protokolle der folgenden Funksensoren dekodieren:

  • Rubicson Temperature Sensor
  • Registering protocol[02] Prologue Temperature Sensor
  • Registering protocol[03] Silvercrest Remote Control
  • Registering protocol[04] ELV EM 1000
  • Registering protocol[05] ELV WS 2000
  • Registering protocol[06] Waveman Switch Transmitter

Ein kurzer Testlauf brachte bei mir auch direkt ein paar Geräte zum Vorschein:

[…]
Found 1 device(s):
0: Realtek, RTL2838UHIDIR, SN:
Using device 0: ezcap USB 2.0 DVB-T/DAB/FM dongle
Found Fitipower FC0013 tuner
[…]
Tuned to 433920000 Hz.
Sensor temperature event:
protocol = Rubicson/Auriol
rid = f5
temp = 20.2
xxxx
[…]
Remote button event:
model = Waveman Switch Transmitter
id = A
channel = 1
button = 1
state = off
00 00 00
[…]
Sensor temperature event:
protocol = Rubicson/Auriol
rid = f5
temp = 20.3
xxxx

Wie man sieht meldet sich ein Funkthermometer mit 20,2°C welches ich direkt im Haus verorten konnte – ebenfalls dabei war das ausschalten einer Funksteckdose – diese ist hier im Haus sicher nicht zu finden und geht wohl auf das Konto der Nachbarschaft. Erschreckend ist dabei, dass auch diese Funksteckdose offenbar vollständig unverschlüsselt läuft, es könnte also jeder mit etwas Ahnung der Geräte nach belieben ein- und ausschalten.

top: write error

Nutzt man unter Linux „top“ kombiniert mit einer Pipe kommt es in einigen Fällen derzeit zu einem Fehler, z.B.

top -bn1 | head -n 10
top: write error

Schuld ist offenbar ein Bug in einer top-Version. Der Fehler tritt auf wenn die Pipe vor top beendet wird, also z.B. bei „head“ – in diesem Fall erhält top ein SIGPIPE und wirft die Meldung. Betroffen ist 3.3.6 (Gentoo) und einige 3.3.7 (Fedora). Unter Fedora sollte >=3.3.7-6.fc19 aus Stable Abhilfe schaffen, unter Gentoo ist der Fehler auch in der aktuellen Testing (3.3.8) vorhanden, hier muss manuell der zugehörige 1-Zeilen-Patch aus dem Upstream eingespielt werden. Gentoo-Bug mit genauerer Beschreibung existiert jetzt, ich vermute mal der Einzeiler sollte es recht schnell schaffen.

—Update—

Status: CONFIRMED -> RESOLVED
Resolution: FIXED

*procps-3.3.8-r1 (25 Oct 2013)

25 Oct 2013; Lars Wendler +procps-3.3.8-r1.ebuild:
Fixed write error when using top with pipes. Thanks to Florian Knodt for reporting this in bug #485952.

Linux LVM: „Hängende“ Snapshots entfernen

Was ein Murks: Einer meiner Server brauchte dank Problem des Festplattentreibers einen Neustart. Nach dem Boot fiel mir auf, dass im LVM-System einige alte Snapshots von Systemtests liegen geblieben sind. Schnell mal aufräumen – oder auch nicht, denn dummerweise wollte LVM da nicht mitspielen. Erst mal eine kleine Übersicht des Systems:

root@rescue:~# pvs
PV VG Fmt Attr PSize PFree
/dev/md2 storage lvm2 a-- 2.70t 1.57t
root@rescue:~# vgs
VG #PV #LV #SN Attr VSize VFree
storage 1 32 9 wz--n- 2.70t 1.57t
root@rescue:~# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
[...]
test-www4-boot storage swi-a-s- 512.00m www4-boot 0.10
test-www4-data storage swi-a-s- 70.00g www4-data 38.39
test-www4-root storage swi-a-s- 20.00g www4-root 63.09
test2-www4-boot storage swi-a-s- 512.00m www4-boot 0.10
test2-www4-data storage swi-a-s- 70.00g www4-data 37.31
test2-www4-root storage swi-a-s- 20.00g www4-root 59.58
www4-boot storage owi-a-s- 512.00m
www4-data storage owi-a-s- 73.24g
www4-root storage owi-a-s- 20.00g
[...]

Man sieht die mit „test“ beginnenden Snapshots welche entfernt werden sollen. Üblicherweise reicht hier ein lvremove welches folgende Ausgabe brachte:

Do you really want to remove active logical volume test-www4-root? [y/n]: y
/sbin/dmeventd: stat failed: No such file or directory
/sbin/dmeventd: stat failed: No such file or directory
Unable to deactivate open storage-test--www4--root-cow (253:2)
Failed to resume test-www4-root.
libdevmapper exiting with 3 device(s) still suspended.

Ab diesem Punkt ist die LVM-Verwaltung faktisch tot. Kommandos wie z.B. lvs hängen sich auf und geben keine Ausgabe. Erst nach einem Reboot ist die Verwaltung wieder möglich, dann taucht der soeben gelöschte test-www4-root wieder auf, ist allerdings kein Snapshot mehr und lässt sich nun auch fehlerfrei entfernen. Keine schöne Lösung, denn ich habe viele Snapshots und dazu eine Abneigung gegen Reboots. Mit strace findet man im hängenden Zustand folgendes:

ioctl(3, DM_TABLE_STATUS, 0x81b5a40) = 0
stat64("/dev/storage/www4-root", {st_mode=S_IFBLK|S_ISVTX|0660, st_rdev=makedev(253, 1), ...}) = 0
open("/dev/storage/www4-root", O_RDONLY|O_DIRECT|O_LARGEFILE|O_NOATIME) = 4
fstat64(4, {st_mode=S_IFBLK|S_ISVTX|0660, st_rdev=makedev(253, 1), ...}) = 0
open("/dev/storage/www4-root", O_RDONLY|O_LARGEFILE) = 5
ioctl(5, BLKGETSIZE64, 0xffcc33a8) = 0
close(5) = 0
close(4) = 0
open("/dev/storage/www4-root", O_RDONLY|O_LARGEFILE) = 4
ioctl(4, BLKGETSIZE64, 0xffcc3378) = 0
close(4) = 0
stat64("/dev/storage/www4-root", {st_mode=S_IFBLK|S_ISVTX|0660, st_rdev=makedev(253, 1), ...}) = 0
open("/dev/storage/www4-root", O_RDONLY|O_DIRECT|O_LARGEFILE|O_NOATIME) = 4
fstat64(4, {st_mode=S_IFBLK|S_ISVTX|0660, st_rdev=makedev(253, 1), ...}) = 0
ioctl(4, BLKBSZGET, 0x8174458) = 0
_llseek(4, 21474770944, [21474770944], SEEK_SET) = 0
read(4,

Der Auslöser scheint also die Snapshotquelle zu sein, nicht der Snapshot selbst. Eine Suche brachte mich zur Debian-ML auf der das Problem beschieben wird – dankenswerterweise funktionierte der Workarround auch in meiner Situation:

– Der lvremove-Befehl wird in einer Shell abgesetzt und hängt sich auf
– Auf einer zweiten Shell setzt man die Snapshotquelle manuell mit folgenden Befehl wieder in Gang: „dmsetup resume /dev/storage/www4.root“
– Die erste Shell reagiert wieder, der Snapshot sollte verschwunden sein
– Ggf. zurückgebliebene Laufwerksleichen werden mit „dmsetup remove /dev/storage/xxx“ entfernt

Gentoo: net-misc/bridge-utils lässt sich nicht installieren

Dafuq? Während einer Gentoo-Installation ließ sich plötzlich eine 802.1d Ethernet-Bridge nicht mehr korrekt ansprechen. Ein „brctl“ zeigt lediglich „Command not found“. Kann doch nicht sein – net-misc/bridge-utils habe ich eben noch emerged und es gab keine Fehler. Ein „equery files bridge-utils“ zeigt ebenfalls seltsames:

equery files bridge-utils
* Searching for bridge-utils ...
* Contents of net-misc/bridge-utils-1.4:
/usr
/usr/share
/usr/share/doc
/usr/share/doc/bridge-utils-1.4
/usr/share/doc/bridge-utils-1.4/AUTHORS.bz2
/usr/share/doc/bridge-utils-1.4/ChangeLog.bz2
/usr/share/doc/bridge-utils-1.4/FAQ.bz2
/usr/share/doc/bridge-utils-1.4/FIREWALL.bz2
/usr/share/doc/bridge-utils-1.4/HOWTO.bz2
/usr/share/doc/bridge-utils-1.4/PROJECTS.bz2
/usr/share/doc/bridge-utils-1.4/README.bz2
/usr/share/doc/bridge-utils-1.4/RPM-GPG-KEY.bz2
/usr/share/doc/bridge-utils-1.4/SMPNOTES.bz2
/usr/share/doc/bridge-utils-1.4/THANKS.bz2
/usr/share/doc/bridge-utils-1.4/TODO.bz2
/usr/share/doc/bridge-utils-1.4/WISHLIST.bz2
/usr/share/man
/usr/share/man/man8
/usr/share/man/man8/brctl.8.bz2

Die Binary fehlt?!

Ein neues emerge unter Aufsicht zeigt auch warum:

[...]
error: field 'ip6' has incomplete type
make[1]: *** [libbridge_if.o] Error 1
make[1]: *** [libbridge_init.o] Error 1
make[1]: *** [libbridge_devif.o] Error 1
[...]

Das kompilieren bricht wegen modifizierter Header-Dateien bei Kerneln => 3.8 ab, das ebuild registriert dies jedoch nicht und meldet eine erfolgreiche Installation. Die Lösung sollte inzwischen bereits verfügbar sein: Mit der seit einigen Tagen stabilen Version net-misc/bridge-utils-1.5 sollte das Problem behoben sein.

et-sdl-sound: Segfault – Patch

Der ET-spielenden Linux-Bevölkerung ist „et-sdl-sound“ sicher ein Begriff: Dieser „Hack“ erlaubt es über LD_PRELOAD das Spiel vom bisherigen „Open Sound System“ (OSS) loszulösen und per SDL auch z.B. mit ALSA oder Pulse zu betreiben und somit die Sondausgabe auf aktuellen Distributionen zu ermöglichen. Leider haben die letzten Updates meines Arch Linux Systems gleich mehrere Fehler ausgelöst: Im ersten Schritt änderte sich (durch die /usr/bin-Migration?) die CRC der ET-Binary. Da über diese Prüfsumme der Hack das Spiel erkennt war keine Tonausgabe mehr möglich. Ein weiteres Problem stellt inzwischen wohl die Nutzung von stdout dar – warum auch immer, bei jeder Ausgabe verabschiedet sich das Spiel per Segfault.

Für beide Probleme habe ich nun eine aktualisierte Version in meinem Github-Repo – die CRC der Arch-Linux Version wurde ergänzt, der Code grob für neuere Compiler umgestellt und die Info-Ausgaben in die Datei /tmp/et-sdl-sound.log umgeleitet.

Ascel AE20125 Linux-GUI

Die Firma Ascel Elektronic bietet mit dem AE20125 einen günstigen Funktionsgenerator-Bausatz an, welcher sich durch Technische Daten und Preis zwischen den „Billigteilen“ auf Fernost und ausgewachsenen Modellen platzieren kann.

Die Sinus- (bis 10 MHz), Dreieck- und Rechtecksignale (bis 2,5 MHz) lassen sich am Gerät selbst über Taster und ein 2x16er LCD einstellen, wer es komfortabler mag kann das Gerät über eine optionale USB-Schnittstelle mit dem PC verbinden.

Ich selbst stehe derzeit mit dem Bausatz noch auf Kriegsfuß: Einige der Taster funktionieren nicht und da der Quellcode des verbauten AVRs nicht verfügbar und das LockBit gesetzt ist, stellt sich die Fehlersuche als etwas kompliziert heraus. Um die restlichte Funktion zu prüfen sollte der USB-Port herhalten – leider gibts die Software nur für Windows und dessen Nutzung erhöht bei mir das Frustpotential doch erheblich. Da das Protokoll einfach aufgebaut und in der Anleitung dokumentiert ist habe ich auf die schnelle eine GUI in Qt gezaubert, welche die Steuerung auch unter Linux (und vermutlich auch Windows NT/2K/XP/Vista/7/CE5/CE6, MacOSX und anderen Unixen) ermöglicht. Bis auf die noch nicht implementierte Preset-Funktion sollten alle Möglichkeiten der Originalsoftware gegeben sein. Quellen gibts wie immer auf GitHub.

Bild: https://www.adlerweb.info/blog/wp-content/uploads/2013/07/Bildschirmfoto-AE20125gui-1-289×300.png

[Kurztipp] Standby nach mehreren Aufgaben

Derzeit bin ich auf meinem Rechner einige Videos am recodieren – über Nacht stört es nicht, aber praktisch wäre es schon den PC nach getaener Arbeit abzuschalten. Ein einfaches anhängen des Kommandos funktioniert nicht, da ich mehrere Prozesse simultan am laufen habe. Da alle CPU-intensiv sind sieht die qnd-Lösung jetzt folgendermaßen aus: Alle 5 Sekunden wird die Systemload geprüft, ist sie unter 1 schaltet das System ab. Einfach, aber sollte seinen Zweck erfüllen.

while : ;do echo -n '.' ; if [ `cat /proc/loadavg | cut -d '.' -f 1` -lt 1 ] ;then pm-hibernate ; break ;fi ; sleep 5 ;done

Videostabilisierung unter Linux

Egal wie ruhig man ist: Auf großen Zoomstufen oder beim Bewegen verwackelt fast jedes Video. Professionelle Aufnahmegeräte bieten für diesen Zweck meist eine Stabilisierung in Kamera oder Objektiv, dies ist jedoch aufwändig und kostet entsprechend viel Geld. Besitzer von Consumergeräten müssen aber nicht ganz auf eine solche Stabilisierung verzichten: Viele Videoeditoren bieten entsprechende Bildfilter, welche (auf Kosten der Videoqualität) softwareseitig die Stabilisierung übernehmen. Als kostenlose Lösung ist vielen die entsprechende Funktion der Videoplatform YouTube bekannt, jedoch lässt sich diese nur auf komplette Videos anwenden und ist nicht konfigurierbar, zudem möchte man nicht jedes Video auf der zu Google gehörenden Platform bereitstellen. Leider sieht es unter Linux dünn aus – zwar kann man über wine die Lösung Virtualdub/Deshaker nutzen und der Editor KDEnlive bietet passende Filter im Menü, beide Lösungen lassen sich jedoch nur schwer automatisieren und leidet unter nervigen kleinen Bugs.

Bild: https://www.adlerweb.info/blog/wp-content/uploads/2013/05/kdenlivestab.png

Um nun bei mir das ganze zu erschlagen habe ich ein Script geschrieben, welches alles nötige übernimmt. Die eigentliche Stabilisierung steckt in der Software transcode, da diese jedoch mit vielen Codecs Probleme hat muss das Video entsprechend vorbereitet werden. Durch den Zwischenschritt als MPEG2 ist temporär ein vielfaches des ursprünglichen Speicherplatzes nötig, der sollte beim Umgang mit Videos ja ohnehin reichlich vorhanden sein. Das Ausgabeformat ist derzeit auf 8MBit/s x264 mit 128k MP3 eingestellt, der Stabilisierungsfilter läuft mit Standardwerten.

ffmpeg -i $1 -vcodec mpeg2video -b:v 10000k $1.mpg
ffmpeg -i $1 -acodec libmp3lame -b:a 128k $1.mp3
transcode -J stabilize -i $1.mpg -y null,null -o dummy
transcode -J transform -i $1.mpg -y xvid,pcm -w 10000k -o $1.stab.temp.mp4
ffmpeg -i $1.stab.temp.mp4 -i $1.mp3 -vcodec libx264 -acodec copy -b:v 8000k -map 0:0 -map 1:0 $1.stab.avi
rm $1.stab.temp.mp* $1.mp3 $1.mpg $1.*.trf

Voraussetzungen sind ffmpeg und transcode. Debian/Ubuntu liefern zum Teil statt ffmpeg dessen Fork avconf, in diesem Fall einfach im Script den Befehl anpassen.

http://www.youtube.com/watch?v=HMkRF2yz8M0

Linux: Anzahl der geöffneten Dateien pro Prozess anzeigen

*Poff* – das war die Wand der maximal geöffneten Prozesse auf einem Linux-System – praktisch wäre es jetzt noch zu wissen welcher Prozess dafür verantwortlich ist. In diesem Fall hilft folgender Befehl – er erstellt eine Liste aller Prozesse mit der Anzahl der geöffneten Dateien, die verschwenderichsten oben:

lsof | cut -d ' ' -f 1 | uniq -c | sort -r

Auf der Suche nach den inodes

So ein Linux-Server mit ext4 ist nicht so schnell klein zu bekommen – ich schaffs aber natürlich trotzdem. Auf einem meiner App-Server verabschiedete sich übers Wochenende der Datenbankserver. Diagnose eindeutig: Platte voll, 0 Bype frei. Der Auslöser ist auch schnell ausgemacht – mangels logrotate haben sich über 8GB in /var/log angesammelt. Klare Sache – Logs löschen, Dienste neustarten undnichts. Platte voll. Dafuq? Am Platz liegts nicht – dort sind die 8GB nun frei – ich vermute Böses…

# df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/root 23G 14G 8.2G 62% /
# df -i /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/root 1474560 1474560 0 100% /

Treffer versenkt – die Inodes sind voll. Aber warum? Nach kurzem Gegoogle gehe ich davon aus, dass meist eine Datei = ein Inode ist, also wird die Bash-Keule ausgepackt:

(for i in `find / -xdev -type d 2>/dev/null` ;do (echo -n `ls -1a "$i" | grep -vP "^(.|..)$" |wc -l` && echo " - $i") ;done) | sort -n

Dieser Code erzeugt eine Liste aller Ordner auf dem Device der Root-Partition – aufsteigend nach der Anzahl der Dateien sortiert. In meinem Fall ist der Schuldige relativ eindeutig:

[...]
1460 - /usr/share/man/man1
1620 - /usr/portage/metadata/cache/dev-perl
1620 - /usr/portage/metadata/md5-cache/dev-perl
1692 - /usr/portage/metadata/glsa
4554 - /usr/share/man/man3
972513 - /var/nagios/home/.maildir/new

Ich sollte mal ein paar Mails löschen -Oder auch nicht, denn…

rm *
-bash: /bin/rm: Argument list too long

also muss auch hier getrickst werden:
find ./ -exec rm {} +