Schlagwort-Archive: Linux

Linux: Single-Thread-Programme auf Multicore-Rechnern parallelisieren

*Auf Uhr tipp* Dauert mal wieder lange, das berechnen – kein Wunder, denn die Software, welche ich hier einsetze, kann nur einen einzigen CPU-Kern nutzen. Wäre doch schön, wenn man so Aufgaben beschleunigen kann, oder?

In meinem Fall heißt die „Bremse“ Tesseract, ein open source OCR-System um eingescannte Dokumente in Text zu verwandeln. Bisher fütterte ich jede Seite nacheinander an das Programm um im Anschluss eine zusammengesetzte PDF zu generieren. Eine einfache Beschleunigungslösung wäre es mehrere Seiten parallel zu starten, aber dazu ist einiges an Logik notwendig – ich möchte nur bis zu einer maximalen Anzahl an parallelen Prozessen haben (CPU-Kerne) und benötige die Info wann alle Prozesse fertig sind. Viel Scripting für ein bisschen Geschwindigkeit – und unnötig, denn es gibt ein Passendes Tool: GNU parallel von O. Tange aus „;login: The USENIX Magazine, February 2011:42-47„.

Das Tool ist unter Arch nicht vorinstalliert, findet sich aber im Community-Repo. Der Aufruf ist ähnlich zu xargs – in meinem Fall sieht der Befehl so aus:

parallel -j 8 \
tesseract {} {.}.hocr -l deu hocr \
::: ${files}

In der ersten Zeile wird bestimmt, dass maximal 8 Prozesse zugleich gestartet werden. Danach kommt der Aufruf der Software. {} wird durch den Dateinamen ersetzt, {.} durch den Dateinamen ohne Endung. In der dritten Zeile wird nach dem Trennzeichen (:::) die Dateiliste mitgegeben – in meinem Fall in einer Variable, es kann aber auch direkt per Globbing gearbeitet werden („::: /tmp/out*“).

Der Grundprozess parallel blockt dabei so lange, bis alle Unterprozesse beendet sind – perfekt für meine Anforderung. Durch diese kleine Änderung ist bei mehrseitigen Dokumenten die Verarbeitung um ein vielfaches schneller.

Das Tool ist dabei natürlich nicht auf OCR beschränkt, auch bei anderen Programmen, welche man auf mehrere oder aufteilbare Quellen loslässt, kann es verwendet werden. Ein gutes Beispiel wäre das Umwandeln von Bildern in einer Batch:

parallel -j 8 \
convert {} {.}.png \
::: ./*.bmp

OpenVPN: Kein automatischer Restart nach Verbindungsabbruch

Kurze Verbindungsunterbrechung und weg war er, mein VPN-Tunnel. Soweit nichts besonderes, aber eigentlich sollte OpenVPN die Verbindung automatisch neu aufbauen. In der Praxis funktionierte das Ganze bei mir leider nicht, der Tunnel verschwand einfach, der zugehörige Prozess war nicht mehr auffindbar. Im Log zeigte sich folgendes:

[…server…] Inactivity timeout (--ping-restart), restarting
TCP/UDP: Closing socket
/etc/openvpn/down.sh tap0 1500 1576 …ip… 255.255.255.0 restart
WARNING: Failed running command (--up/--down): could not execute external program
Exiting due to fatal error
/bin/route del -net …gateway… netmask 255.255.255.255
ERROR: Linux route delete command failed: could not execute external program
/bin/route del -net 0.0.0.0 netmask 128.0.0.0
ERROR: Linux route delete command failed: could not execute external program
/bin/route del -net 128.0.0.0 netmask 128.0.0.0
ERROR: Linux route delete command failed: could not execute external program
/etc/openvpn/down.sh tap0 1500 1576 …ip… 255.255.255.0 init
WARNING: Failed running command (--up/--down): could not execute external program
Exiting due to fatal error

Nach kurzem Nachdenken klare Sache: OpenVPN gibt bei Angabe von user/group in der Config nach der initialen Verbindung seine Root-Rechte auf und läuft im spezifizierten Userkontext weiter – und der darf nicht an den Routingtabellen oder Netzwerkgeräten herumfummeln. Die Lösung: Der OpenVPN-User muss rechte zum setzen von Routen behalten oder OpenVPN unter einem höher privilegiertem User laufen.

Scanner-Button unter Arch Linux

Gesehen habe ich sie schon oft, die Hardware-„Scan“-Tasten diverser Scanner – einen wirklichen Sinn haben sie für mich nie ergeben, sind doch üblicherweise Scanner und Tastatur nicht sonderlich weit voneinander entfernt. Nun habe ich für ein autonomes Scansystem einen Raspi ohne Monitor mit Scanner und Scripten verknüpft – wäre praktisch, wenn ich mir jetzt noch die Scan-Taste nutzbar machen könnte, oder?

Das Zauberwort schien erst „scanbuttond“ zu lauten, welches für Arch im AUR verfügbar ist – andere Distributionen scheinen ebenfalls großteils Pakete bereit zu stellen. Nach der Installation kann man mit dem Befehl

scanbuttond -f

prüfen, ob der Scanner unterstützt wird: Das Programm startet kommentarlos im Vordergrund, sollte beim Drücken des Scan-Knopfes jedoch eine passende Meldung erzeugen. Sollte – in meinem Falle leider nicht. Auslöser ist vermutlich die neuere libusb, welche scanbuttond das Gerät nicht finden lässt.

Nach kurzer Recherche fand ich im Arch-Forum den Verweis auf scanbd – ebenfalls im AUR – welches noch aktiv entwickelt zu werden scheint. Die Einrichtung selbst ist in der Arch-Wiki beschrieben. In der Hoffnung dass mein Gerät sofort funktioniert wird der Daemon mit folgendem Befehl gestartet:

scanbd -d 7 -f

Die Ausgaben sind etwas chaotisch, jedoch ist definitiv mein Scannermodell zu erkennen und auch beim Drücken der Scan-Taste ist etwas passendes zu sehen:

scanbd: trigger action for scan for device fujitsu:fi-4120Cdj:13715 with script test.script
[…]
scanbd: append string fujitsu:fi-4120Cdj:13715 to signal scan_begin
scanbd: now sending signal scan_begin
[…]

Entsprechend der Anleitung werden die Dateien kopiert (cp /etc/sane.d/* /etc/scanbd/sane.d/), in /etc/sane.d/dll.conf alles bis auf „net“ gelöscht und in /etc/sane.d/net.conf der Server „localhost“ aktiviert. In /etc/scanbd/sane.d/dll.conf wiederum wird „net“ gelöscht.

Der Scan-Button ist bereits mit /etc/scanbd/test.script vorbelegt, der Einfachheit halber habe ich nur den Inhalt der Datei durch meine Befehle ersetzt. Es wäre auch möglich die zahlreichen Zusatztasten meines Scanners zu nutzen um so bereits einen Speicherort o.Ä. zu definieren oder z.B. den Scan bereits beim einlegen des Papiers zu starten, aber ich belasse es erst mal beim Standard. Unter Arch sollte man nach der Konfiguration noch das Debuglevel in /etc/scanbd/scanbd.conf senken, ansonsten wird das Systemlog durch die sekündlichen Prüfroutinen gut gefüllt.

Dank der kleinen Bastellösung kann ich nun „ohne PC“ scannen – Papier rein, Knopf drücken und der Raspi übernimmt automatisch das einscannen, OCR und archivieren mit (zumindest meistens) brauchbaren Metadaten – der Feinschliff kann dann später am PC erfolgen.

Gentoo-Upgrade: XML::Parser perl module is required for intltool

Uff… Updates schleifen lassen ist bei Rolling-Release-Distros ja immer ein Problem. Heute im Angebot: Das Gentoo-Upgrade eines Systems, welches etwa 4 Monate stand, verabschiedet sich bei nahezu allen Paketen mit folgender Meldung während „configure“:

XML::Parser perl module is required for intltool

Eine Neuinstallation von Perl und dem genannten XML-Modul brachte keine Besserung, auch unter @preserved… oder revdep-rebuild zeigte sich nichts passendes. Die Lösung ist einfacher als befürchtet: Der Befehl

perl-cleaner --reallyall

sucht alle betroffenen Pakete, welche noch Verweise auf ein altes Perl enthalten, und baut sie über portage neu. Bei mir kam es noch zu einer Kollision durch veraltete glib und qt-Pakete, da der emerge-Befehl aber bereits fertig zum kopieren bereitstand war die nötige Ergänzung kein wirkliches Problem – knapp 190 Pakete später funktioniert’s dann auch wieder mit dem Update.

Linux auf Acer Aspire One ZG5: Kernel-Panic durch SD-Leser

Offenbar gibt es eine Regression in den letzten Linux-Kerneln(vermutlich 3.12.x): Auf oben genannten System kam es alle paar Minuten zu unerklärlichen Kernel-Panics. Im Trace war öfter die Rede vom sdhci-Modul, welches für die SD-Leser zuständig ist. Auslöser ist höchstwahrscheinlich der Slot an der linken Seite – die rechte Seite nutzt PCI-Hotplug und ist ohne Karte dem System nicht bekannt. Betroffen sind vermutlich beide Seiten, zwar ist der rechte durch PCI-Hotplug ohne Karte von System getrennt, jedoch werden beide Controller als „JMicron Technology Corp. Standard SD Host Controller“ erkannt.

Als Workaround kann man – bis der Fehler behoben ist – den SD-Card-Leser abschalten, hierzu wird folgendes Kernel-Argument genutzt:

modprobe.blacklist=sdhci,sdhci_pci

Im Fall von Grub2 auf Archlinux kann es z.B. in /etc/defaults/grub als GRUB_CMDLINE_LINUX hinterlegt werden. Logischerweise lassen sich bis der Fehler behoben ist keine SD-Karten im Gerät nutzen.

BitBastelei #76 (Part 2/2) Installation von Arch Linux

BitBastelei #76 (Part 2/2) Installation von Arch Linux

(85 MB) 00:49:04

2013-12-29 11:00 🛈

Die grundlegenden Schritte lassen sich auf https://wiki.archlinux.org/index.php/Beginners’_Guide/Installation finden.

Die Hintergründe warum ich installiere und was meine Ziele sind finden sich in Part 1.

Inhalt
======
00:13 Download
01:05 USB-Stick zur Installation vorbereiten
02:49 Dateiintegrität per md5sum prüfen
03:30 Boot von USB-Stick
05:20 Wenns nicht bootet: acpi=off
07:00 Internetzugang konfigurieren
08:37 Tastatur auf Deutsch umschalten
08:47 Partitionieren der Festplatte
12:21 Formatieren der Partitionen (1 swap/ext2)
13:14 Verschlüsseln einer Partition mit cryptsetup
16:28 Formatieren der Partitionen (2 btrfs)
17:30 Mounten der Partitionen
18:44 Mirrorliste
19:49 Installation des Grundsystems
21:18 Erstellen einer fstab
21:47 Wechsel ins neue System
22:07 Konfiguration: locale-gen, Sprache, Keymap, Zeitzone, Hostname
24:40 initrd für Verschlüsselung anpassen
26:04 Bootloader installieren & konfigurieren
28:20 Passwort setzen
28:44 Erster Start ins neue System
29:50 Netzwerk & Installation von SSH
30:29 Dienste per Systemd
31:18 Desktop Environments: KDE/GNOME/XFCE/LXDE
33:15 Softwareinstallation: Gruppen, Provider, Optionale Abhängigkeiten, Suche
36:06 AUR: Übersicht
37:37 AUR: Installation per Hand
40:45 AUR: Installation per yaourt
43:38 fstab: Kompression für btrfs
45:16 Anlegen eines Users
45:34 Installation eines Grafikservers
46:10 Start des LXDM
46:37 Netzwerkkonfiguration per NetworkManager
47:25 Deutsche Tastatur in der grafischen Oberfläche
47:53 Anpassen des Panels: Akkumonitor
48:20 Fazit

Ergänzungen:
============
02:19 – Korrektur: bs=4M – dd if=archlinux….iso of=/dev/sdx bs=4M
07:53 – Wenn bereits beim Booten ein Netzwerkkabel eingesteckt ist bezieht der Rechner bereits eine IP, dieser Schritt kann dann entfallen
08:29 – https://wiki.archlinux.org/index.php/Beginners’_Guide/Installation#Wireless
10:03 – https://wiki.archlinux.org/index.php/Beginners’_Guide/Installation#Using_cgdisk_to_create_GPT_partitions
11:40 – SWAP = Auslagerungsspeicher, Erweiterung des RAMs auf der Festplatte. Hiermit kann das System selten genutzte Daten des Arbeitsspeichers auf die Festplatte verschieben und so den schnelleren RAM zur Verfügung halten.
20:26 – https://wiki.archlinux.org/index.php/Grub#UEFI_systems_2
42:53 – …und ein RM, welches jedoch auch OK aussieht…
46:49 – Wenn man immer Netzwerk möchte sollte man den Dienst automatisch starten: „systemctl enable NetworkManager“

Hinweise:
=========
Nicht vergessen: Es gibt keine 100%ige Sicherheit. Da die Bootdateien hier zum Beispiel nicht verschlüsselt sind könnte ein Angreifer an dieser Stelle ansetzen und den Kernel infizieren. Erschweren kann man dieses vorgehen z.B. durch ein Bootloader-Passwort, einen modifizierten Bootloader für verschlüsselte Partitionen oder durch dsa Auslagern der Boot-Dateien auf einen USB-Stick. Auch kann man z.T. mit Kältespray und entsprechender Hardware das RAM auslesen und so den Verschlüsselungskey zusammensetzen. Ebenfalls bringt die Verschlüsselung nichts, wenn eine Applikationslücke genutzt wird.

MySQL-Fehler: XMBC/OpenELEC lässt keine Änderungen an der Filmdatenbank zu

Narf? Muss das sein? Beim automatischen Import meines neu sortierten TV-Aufnahmen-Speichers ist in XMBC bzw. OpenELEC so einiges nicht ganz da gelandet, wo es sollte. A Clockwork Orange von 2013? Guess not.

Keine große Sache, oder? Einfach manuell aktualisieren und den richtigen Eintrag auswählen, schon wird alles aktualisiert, so weit die Theorie. In der Praxis landete ich wieder auf der selben, falschen Detailansicht.

Schuld war meine MySQL-Datenbank, diese liegt – da ich mehrere XMBCs betreibe – auf einem zentralen Server. In der Log-Datei (/storage/.xbmc/temp/xbmc.log) fand sich folgende Zeile:

ERROR: SQL: Undefined MySQL error: Code (1548)
Query: delete from movie where idMovie=146
ERROR: DeleteMovie failed

Hm – strange, also auf in phpMyAdmin und nachgeschaut. Ein Film mit idMovie=146 existiert, so weit so gut, aber auch hier funktioniert der Delete nicht und vermeldet:

Cannot load from mysql.proc. The table is probably corrupted

Schuld sind die integrierten Trigger/Funktionen/… der XMBC-Datenbank in Kombination mit einem verpennten Update. Der MySQL-Server selbst wurde eine Version hochgezogen, die Datenbanken aber nicht aktualisiert. Ein einfaches

mysql_upgrade

(ggf. mit -uroot -p) bringt alles auf den neuesten Stand und die MediaDB kann wieder bearbeitet werden.

AC3-Dateien anhängen

OK, zugegeben, einfacher gehts nicht, aber da man das einfachste gerne Übersieht: AC3-Dateien (aka Audio nach A/52) haben – zumindest soweit ich sehe – alle nötigen Metadaten im Stream und nicht in am Dateianfang oder -ende, entsprechend können die Dateien einfach aneinander gehangen werden:

cat 1.ac3 2.ac3 3.ac3 > full.ac3

PHP (Linux, CLI) clear screen

Wenn man PHP auf der CLI nutzt könnte man in die Versuchung kommen den Bildschirm leeren zu wollen, also in etwa das selbe, was der Linux-Befehl „clear“ macht. Da bei exec (so vermute ich) die Termcaps nicht übergeben werden funktioniert ein exec(‚clear‘); nicht sonderlich. Wenn man immer das selbe Terminal nutzt lassen sich die nötigen Steuerzeichen direkt als echo hinterlegen. Um die Zeichen zu ermitteln loggt man sich normal auf der gewünschten Konsole ein und startet „clear | xxd“ – hier sieht man die für das aktuelle Terminal nötigen Steuerzeichen in Hex. In meinem Fall

0000000: 1b5b 481b 5b32 4a .[H.[2J

in PHP verpackt ergibt sich dann (ausgeschrieben) folgende Zeile:

echo chr(0x1b) . chr(0x5b) . chr(0x48) . chr(0x1b) . chr(0x5b) . chr(0x32) . chr(0x4a);

ext4 vs. BTRFS – mal wieder

OK, ok, zugegeben, das Thema gibt’s zu Hauf im Netz, aber ich vertraue lieber eigenen Zahlen: Was ist schneller: ext4 oder btrfs? Hintergrund ist ein Backupzwischensystem, welches große Datenmengen schnell verarbeiten muss. Die Kompression von BTRFS wäre angesichts der Kosteneinsparung durch weniger Plattenverbrauch ein schöner Bonus, aber darf nicht auf Kosten der Geschwindigkeit gehen.

Das System ist ein „Low-End“ Dualcore (Intel(R) Pentium(R) CPU G645 @ 2.90GHz) mit 16GB RAM und 4 Hitachi Deskstar 5K3000 á 2TB. Die Platten mit 5300rpm sehen zwar auf den ersten Blick etwas schwachbrüstig aus, da die Daten aber vermutlich sehr groß und entsprechend hoffentlich am Stück geschrieben werden sollte die geringe Drehzahl hoffentlich nicht wirklich ins Gewicht fallen. Das Mainboard (ASRock H77 Pro4/MVP) verfügt über zwei SATA-Controller – der Intel® H77 steuert neben 4 SATA2-Ports zusätzlich 2 Ports mit SATA3 bei, ein ASMedia ASM1061 stellt 2 zusächliche SATA3-Ports bereit. Die Platten wurden über die SATA3-Ports an beide Controller verteilt.

Die Tests liefen auf einem Arch Linux x86_64-System mit Kernel 3.11.2, als RAID kam das im Kernel enthaltene md-Framework zum Einsatz, auf die bei BTRFS integrierte RAID-Funktion verzichte ich, da ich separate Schichten für besser wartbar halte.

Erst einmal die rohen Werte der Platte: Diese lieferten im Test jeweils etwa 140MB/s sequential Read.

Erster Versuch: 1GB sequential Write, die Platten werden dabei erst mal als RAID5 genutzt, in der Hoffnung, dass die Geschwindigkeit noch ausreichend ist. Das Ergebnis ist etwas ernüchternd:

1GB Sequencial File Write
RAID5, EXT4 99MB/s
RAID5, BTRFS 134MB/s
RAID5, BTRFS (LZO) 144MB/s

BTRFS liegt zwar klar vor ext4 und auch die Kompression bringt auf Grund der gut komprimierbaren Quelle einen Geschwindigkeitsschub, insgesamt liegt die Leistung aber unter meinen Anforderungen – 144MB/s könnte die 2GBit/s Uplink grade so bewältigen, aber eigentlich hätte ich schon gerne noch etwas Reserve… Die Antwort dürfte klar sein: Da die Daten hier nur zwischengelagert werden bin ich auf das RAID5 nicht angewiesen, also RAID0 ftw – der erste Blick aufs rohe Device ist vielversprechend: 490MB/s sind ein guter Start – und was machen die Dateisysteme daraus?

RAID0, EXT4 349MB/s
RAID5, BTRFS 376MB/s
RAID5, BTRFS (LZO) 382MB/s

Viel ändert sich nicht – BTRFS mit Kompression erreicht gegenüber ext4 knapp 10% höhere Schreibraten. Die 380MB/s dürften erst bei etwa 4GBit/s uplink an ihre Grenzen stoßen – bis die fällig sind dürfte eher der Plattenplatz ausgehen. Sieger gefunden würde ich sagen: BTRFS schlägt ext4 sowohl bei Geschwindigkeit als auch beim Funktionsumfang – ob es auch die Stabilität der ext-Systeme nacheifern kann wird die Zeit zeigen.