ubuntuusers.de

🛈 Aktuell gibt es im Wiki ca. 430 Artikel, die nur für Xenial getestet sind. Dies entspricht ca. 5,5 % aller Wikiartikel. Damit diese im nächsten Frühjahr nicht alle archiviert werden müssen, ist eure Mithilfe gefragt!

Neueste Artikel

28. Februar 2021

Ein kurzer Blick in den TIOBE-Index zeigt: auch wenn Go und Rust als die Systemsprachen der Zukunft gelten, ist C weiterhin omnipräsent. Eine gute Gelegenheit, ein interessantes Thema aufzugreifen: die Strict Aliasing Rule.

Wer mit C programmiert, dirigiert Speicher – genauer gesagt Arbeitsspeicher. C wird gerne als portable Assemblersprache betrachtet, diese stellt den Speicher allerdings besonders in den Vordergrund. Der Kontakt mit Speicher tritt einerseits bei der dynamischen Speicherverwaltung mit malloc() und free() auf, erfolgt allerdings bereits mit der Verwendung von Datentypen. Ich umschreibe Datentypen gerne als „Schablone“ bzw. „Maske“ für Speicher. Der kleinste Datentyp ist der char, er umfasst 1 Byte. Hiernach folgt der short, der 2 Byte groß ist. Für besonders große Zahlen gibt es long mit 4 Byte. Spielt die Anzahl der Bytes keine Rolle, kann man den int nehmen, der mindestens 2 Byte groß sein soll, ich habe also keine Garantie, dass ein int immer wie unter Linux 4 Byte umfasst, wenn ich meinen Code auf eine andere Maschine zum Laufen bringen will. Im Zweifel muss ich ihn also portieren.

Zahlen im Speicher

Obenstehende Abbildung zeigt, wie zwei Zahlen im Speicher liegen: im einfachsten Fall in Binärdarstellung, dicht an dicht. Haben wir zwei zusammenliegende Speicherstellen, die als char markiert sind, können wir in Versuchung kommen, diesen Speicher umzuinterpretieren. Was passiert, wenn wir diese 2 Bytes nicht als zwei chars, sondern als ein short betrachten? C gilt als schwach typisiert, weil wir genau das tun können. Und das geht so:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    unsigned char *chrs = malloc(2);
    *chrs = 5;
    *(chrs + 1) = 44;

    unsigned short *shrt = chrs;
    printf("%d\n", *shrt);

    free(chrs);
    return 0;
}

Intern sieht es jetzt (fast) folgendermaßen aus:

Zahlen im Speicher

Das ist der Grund, warum ich bei C an Programmierung mit Typenschablonen als Sicht auf den Speicher denke. Rechnen wir jetzt alles zusammen, müsste das Programm uns 1324 ausgeben – tut es aber nicht. Auf einem aktuellen 64-bit Linux-System wird stattdessen 11269 ausgegeben. Wir haben trotzdem fast alles richtig gedacht, nur müssen wir uns ins Gedächtnis rufen, dass x86-CPUs mit Little Endian arbeiten und wir deshalb die Bytes verdreht denken müssen. Dieser Fallstrick soll uns aber ein Gefühl dafür geben, wie oft bei C-Programmierung die lockere Standardisierung sowie die lokalen (i. S. v. Architektur) Gegebenheiten Herausforderungen bescheren.

Structs in C

Informationen kommen selten einzeln daher. Um sie sinnvoll im Code und im Speicher zu strukturieren, bietet C die structs, die eine Reihe von Mitgliedern (ähnlich wie Variablen) organisieren. Ein Beispiel:

struct country {
    char *name;
    char iso3166[3];
    unsigned short formation;
    char *capital;
};

Im Speicher können wir uns das so vorstellen, auch wenn wir ein entscheidendes Detail noch im Laufe des Beitrags kennenlernen werden:

Struct im Speicher

Diese Vorstellung hilft zwar an der einen oder anderen Stelle, kann allerdings auch zu Missverständnissen führen, wenn wir uns zu sehr auf diese Speicherdarstellung verlassen.

Wir könnten zum Beispiel denken, dass wir vereinfacht die Werte verdrehen können:

#include <stdio.h>

struct country {
  char *name;
  char iso3166[3];
  unsigned short formation;
  char *capital;
};

struct country2 {
  char *capital;
  char iso3166[3];
  unsigned short formation;
  char *name;
};

int main (void)
{
  char *de_name = "Deutschland";
  char *de_capital = "Berlin";
  struct country germany = {
    de_name, "DE", 1949, de_capital
  };

  printf("Country Name: %s\n", germany.name);

  struct country2 *germany2 = (struct country2 *) &germany;

  printf("Country Name: %s\n", germany2->name);

  return 0;
}

Bei structs kommt es vor allem auf die Reihenfolge und die Datentypen an – allerdings kann man nicht darauf vertrauen.

Objektorientierung in C

Im voherigen Beispiel konnten wir eindrucksvoll sehen, dass wir besonders einfach Pointer auf structs umcasten – und somit uminterpretieren – können. Diese Technik ist als type punning bekannt, wurde schon vor knapp 40 Jahren bei den Berkley sockets (vgl. struct sockaddr_in) eingesetzt und lässt sich nun für viele verschiedene Zwecke einsetzen: zum Beispiel für Vererbung oder Bäume – oder die Kombination aus beidem.

Zur Veranschaulichung möchte ich einen Baum aus der Verwaltungsgliederung heranziehen: hier gibt es den Staat, die Bundesländer und die Landkreise, die jeweils unterschiedliche Informationen besitzen.

Beispiel Baum

Ziel ist es, jeden Knoten am Baum aufzuhängen. Allerdings ist die Struktur komplex: so hilft es nicht, den Typen anhand der Ebene festzulegen, weil sonst Landkreise und kreisfreie Städte nicht unterschieden werden können. Die Lösung wäre, ein Unterscheidungsfeld am Anfang eines jeden Knotens festzulegen. Bei der Implementierung müssen wir bedenken, dass natürlich technsiche Informationen zur Baumimplementierung mitgegeben werden sollen:

struct country {
    char type;
    void *child;
    void *sibling;

    // data
    char *name;
    char *capital;
    //...
};


struct state {
    char type;
    void *child;
    void *sibling;

    // data
    char *name;
    //...
};


struct district {
    char type;
    void *child;
    void *sibling;

    // data
    char *name;
    //...
};

Strict Aliasing Rule

Doch halt! Wir dürfen bei C nicht vergessen, dass wir im Zweifel alles hinterfragen müssen. Unser Ziel ist es, dass die ersten drei Felder immer an der gleichen Stelle im Speicher liegen, sodass wir unabhängig von der Wahl der drei structs immer die gleichen Member an der gleichen Stelle erreichen können. Doch können wir uns darauf verlassen? Die Antwort ist im C-Standard zu finden und hier gibt der C99-Standard unter der Sektion „6.7.2.1 Structureand union specifiers“, Punkt 13 Aufschluss. Dieser Punkt beschreibt, dass bei structs die Reihenfolge der Members im Speicher unverändert sein und das erste Element auch am Anfang beginnen muss – er erlaubt aber auch Freiraum zwischen den Feldern, die der Compiler in Verbindung mit seinem Optimierungssystem selber bestimmen darf.

Strict Aliasing Rule am Beispiel dreier Structs

Für den Compiler hat dies Vorteile – für uns als Programmierer wird dies allerdings eine Herausforderung. Wir können uns also nur sicher sein, dass die Adresse des ersten Elements mit der Adresse des Structs selber übereinstimmt. Die Strict Aliasing Rule ist eine Folge aus diesem Umstand und sagt aus, dass wir nur dann standardkonform einen Pointer dereferenzieren können, wenn dessen Typ kompatibel zu dem Typ ist, der für die Speicherstelle festgelegt wurde.

Die Lösung

Wie können wir denn aber nun effizient unseren Baum umsetzen? Indem wir den Umstand ausnutzen und den gemeinsamen Anfang auslagern:

struct node_base {
    char type;
    void *child;
    void *sibling;
};

struct country {
    struct node_base base;

    // data
    char *name;
    char *capital;
    //...
};


struct state {
    struct node_base base;

    // data
    char *name;
    //...
};


struct district {
    struct node_base base;

    // data
    char *name;
    //...
};

Hierdurch erreichen wir, dass das (erste) Element garantiert an der gleichen Stelle (d. h. am Anfang) liegt und wir auf zusätzliche Indirektionen / Pointer oder Abstraktionen verzichten können.

Speicher bei der Lösung mit base-Member

Fazit

C ist weiterhin eine sehr effiziente und systemnahe Sprache, die einen unverblümten Blick auf das wichtigste Material eines Programmiers gibt, mit dem dieser seine Programme formt: den Speicher. Mit zunehmendem Optimierungswunsch gibt es jedoch seit knapp 20 Jahren eine Regel, die nur wenige kennen, aber große Auswirkungen besonders dem Portieren hat: die Strict Aliasing Rule. Es gibt noch weitere Anwendungsfälle für sie, ein wichtiger Anwendungsfall wurde in diesem Artikel besprochen. Dieser Fall tritt besonders dann auf, wenn Strukturen aus der Objektorientierten Programmierung (OOP) in C nachgebildet werden sollen.

Dass diese Regel eher unbekannt ist, lässt sich auch daran erkennen, dass die Referenzimplementierung von Python, CPython, noch bis zur Version 2.7 gegen diese Regel verstieß – was allerdings dank PEP 3123 mit CPython 3.0 gelöst wurde.

Strict Aliasing lässt sich übrigens in den meisten Compilern ausschalten, wer allerdings plattform- und compilerübergreifenden Code schreiben will, sollte die Regel allerdings beachten.

Weitere Informationen zu diesem Thema bietet dieses Gist sowie der StackOverflow-Thread zu diesem Thema.

  1. Android ohne Google I: Vorüberlegungen
  2. Android ohne Google II: Custom Recovery (TWRP) aufspielen
  3. Android ohne Google III: Custom Rom (LineageOS) aufspielen
  4. Android ohne Google IV: Freie Apps von F-Droid
  5. Android ohne Google VI: Tracking systemweit unterbinden mit Blokada
  6. Android ohne Google VII: Apps isolieren mit Shelter
  7. Android ohne Google VIII – Empfehlenswerte Apps
  8. Android ohne Google IX – Mehr Kontrolle mit NetGuard

Smartphones befinden sich naturgemäß nicht immer hinter einem Filter wie pi-hole und nicht allen Apps vertraut man uneingeschränkt. Diese Lücke kann NetGuard schließen.

Es gibt verschiedene Möglichkeiten, den Netzwerkverkehr eines Android-Smartphones zu filtern. AFWall+ ist sicherlich eine sehr mächtige Lösung, benötigt aber root-Rechte. Ich roote meine Smartphones aus Sicherheitserwägungen grundsätzlich nicht. Außerdem macht man sich das Leben mit einem gerooteten Smartphone auch nicht unbedingt leichter. Eine weitere Möglichkeit sind Apps, die ein virtuelles lokales VPN betreiben und den Netzwerk verkehr über diesen Umweg filtern. In diese Kategorie fallen Blokada und NetGuard.

Blokada ist, was die Bedienung betrifft, definitiv die einfachere Lösung. Der gesamte Traffic wird durch ein VPN geleitetet, der Anwender wählt aus verschiedenen Blocking-Listen aus und entsprechend dieser Listen filtert Blokada. Vor allem wenn man nicht viel Konfigurationsaufwand betreiben möchte, ist Blokada eine tolle Lösung. NetGuard hat darüber hinaus noch weitergehende Möglichkeiten, da man damit einzelne Apps komplett vom Zugriff auf WLAN und/oder mobile Daten ausschließen kann. Der Preis dafür ist ein ungleich höherer Konfigurationsaufwand und geringere Übersichtlichkeit.

NetGuard installieren

Es gibt NetGuard in verschiedenen Ausführungen:

  • Im Play Store gibt es eine funktional abgespeckte Version, die den Google-Richtlinien entspricht. Schließlich möchte der Werbekonzern Google keine Apps zulassen, die potenziell Werbung filtern können.
  • Weil Android aber eine offeneres Betriebssystem als z. B. iOS ist, kann man via GitHub auch eine APK herunterladen und manuell installieren.
  • Eine weitere Version lässt sich über den F-Droid Store beziehen.

Diese Anleitung basierte auf der F-Droid Variante und sollte auch mit der GitHub-Variante funktionieren. Die Play Store-Ausführung ist ungeeignet, da sie funktional zu beschnitten ist.

Der Entwickler von NetGuard, Marcel Bokhorst, ist auch für die beliebte Mail-App FairEmail verantwortlich. Ähnlich wie bei FairEmail sind einige Pro-Funktionen als „Premium“ markiert und setzen eine Spende voraus. Spendet man mehr als 5€ kann man NetGuard auf allen eigenen Geräten aktivieren. Eine solch schmale Spende sollte selbstverständlich sein, wenn man eine App nutzt!

Die Pro-Funktionen umfassen die Möglichkeit, den Netzwerk-Verkehr zu filtern und das Filter-Protokoll. Für diese Anleitung setze ich die Pro-Funktionen voraus.

Der Spendenprozess ist etwas kompliziert, weil F-Droid kein integriertes Bezahlsystem hat, funktioniert aber zuverlässig. Zur Auswahl stehen aktuell PayPal, Bitcoin oder Monero.

NetGuard einrichten

Nach dem Start muss man erst einmal die Einrichtung der VPN Verbindung zulassen. Diese ist Grundvoraussetzung für den Betrieb der App.

Nach dem Start ist die App dennoch deaktiviert. Der Schieberegler oben Links zeigt den Betriebszustand an. Über die drei Punkte oben rechts erreicht man – wie bei Android üblich – die Menüs.

In den Einstellungen ruft man zuerst die Standard-Einstellungen auf. Hier muss man wählen zwischen einem Backlist- und einem Whitelist-Ansatz. Bei einem Whitelist-Ansatz wählt man WLAN und Mobilfunk blockieren, wodurch alle Apps automatisch keinen Netzzugriff haben und dieser manuell freigeschaltet werden muss.

Man kann dies auch umgekehrt machen und von Haus aus allen Apps Netzzugriff gewähren und nur einzelne Apps blockieren. Das hängt stark von eurem Nutzungsprofil und den genutzten Apps ab. Ich mag dieses „mehr“ an Kontrolle und verfolge einen Blacklist-Ansatz. Den Schalter für „Wenn Bildschirm an“ Regeln anwenden habe ich deaktiviert. Hierdurch kann man Apps bei aktiviertem Screen den Zugriff erlauben und würde dadurch primär unerwünschten Traffic im Hintergrund verhindern.

Anschließend benötigt man eine Blocking-Liste, die sich über den Einstellungspunkt Sicherung laden lässt.

NetGuard nimmt dazu die Liste von Steven Black. Es lassen sich auch andere Listen nutzen, aber da mir die Liste von Steven Black genügt, habe ich das nicht getestet. Soweit ich das sehe, aktualisiert NetGuard die Host-Datei nicht automatisch, man sollte also von Zeit zu Zeit die Option Host-Datei herunterladen anklicken.

Danach ruft man die Erweiterten Optionen auf. Hier kann man entscheiden, ob man die Regeln auch für System-Apps anwenden möchte. Ich nutze ein sehr reduziertes Custom ROM, weshalb ich auf den zusätzlichen Konfigurationsaufwand verzichte. Arbeitet man mit einem Stock ROM, muss man sich ggf. diese Mühe machen. Die Option Datenverkehr filtern ist essenziell, da dadurch erst die Blocking-Liste zum Einsatz kommt. Die Optionen Internetzugriff protokollieren und Bei Internetzugriff benachrichtigen sind für den Anfang bei einem Blacklist-Szenario sehr hilfreich, da dadurch Benachrichtigungen bei einem Internetzugriff erscheinen. Ansonsten würden die Apps einfach stillschweigen blockiert werden. Nach einiger Zeit kann man diese Optionen aber zugunsten des Batterieverbrauchs deaktivieren, da dann jede App konfiguriert sein dürfte.

NetGuard im Betrieb

Hat man alle Einstellungen vorgenommen, schaltet man NetGuard scharf.

Entweder konfiguriert man nun in der App-Liste schon mal prophylaktisch für die Apps die jeweiligen Berechtigungen oder wartet auf die jeweilige Benachrichtigung. Über die drei Menüpunkte kann man im Betrieb das Protokoll aufrufen (muss ggf. erst angeschaltet werden) und damit lässt sich verfolgen, was die Apps so aufrufen. Das Protokoll ist ausführlicher, aber auch unübersichtlicher als bei Blokada.

Seine Stärke spielt NetGuard also weniger als Adblocker aus, sondern mehr im Bereich der Kontrolle. Apps, denen man keinen Zugriff auf das Netz oder z. B. nur im WLAN Zugriff gestatten möchte, lassen sich so effektiv steuern. Für reines Adblocking nutze ich zusätzlich Fennec mit uBlock.

Bewertung

Wenn man ein seriöses Custom ROM nutzt und nur Apps aus F-Droid installiert, braucht weder Blokada, noch NetGuard. Sobald man aber Apps aus dem Play Store (oder eben Aurora) oder Hersteller-Apps via APK installiert, betritt man quasi das Reich des Bösen. Manche Apps haben mehr Tracker als Funktionen integriert und nicht auf alle Apps kann man verzichten. Hier ist dann je nach Bedarf Blokada oder NetGuard erforderlich.

Der Artikel Android ohne Google IX – Mehr Kontrolle mit NetGuard erschien zuerst auf [Mer]Curius

Es ist schon fast ein running gag. Bei jeder neuen Plasma-Version wird vollmundig ein noch besserer Wayland-Support versprochen. Benutzbar ist es trotzdem nicht – jedenfalls nicht, wenn man so exotische KDE Applications wie Kontact nutzt.

Bei der jüngsten Veröffentlichung von KDE Plasma 5.21 wurde wieder vollmundig Wayland-Support versprochen:

KDE is pushing to have first class support for Wayland, and Plasma 5.21 makes massive progress towards reaching that goal.

https://kde.org/announcements/plasma/5/5.21.0/

Viele Leser werfen mir ja meine „Meckerei“ vor, aber wenn mir zum wiederholten Mal massiver Fortschritt hin zu einer erstklassigen Unterstützung versprochen wird, erwarte ich doch schon ein wenig Benutzbarkeit.

Meine Hardware ist das hier vorgestellte HP EliteBook. Ich habe also eine Intel Onboard Grafik (Comet Lake) und damit alles andere als irgendwas Exotisches oder gar proprietäre Treiber.

Nachdem Plasma 5.21 nun für Arch Linux ausgerollt wurde, habe ich heute die Gelegenheit ergriffen und mal ein Update gemacht und auch mal wieder die Wayland Session gestartet.

Das Experiment dauerte keine 5 Minuten. Der Desktop startet zwar, aber KMail ist unbenutzbar. Grafik-Artefakte, keine Größenveränderung des Fensters möglich – Ende des Experiments.

Für mich war KDE mal eine hochgradig integrierte Software-Sammlung – das war die Stärke von KDE gegenüber z. B. einer losen Zusammenstellung von MATE, Thunderbird & Co. KDE scheint mit seiner Markenstrategie auch die Verantwortung für die Applications abgeben zu wollen. Was echt nett ist, weil es außer Kontact keine PIM-Suite für KDE gibt. Oder hat jemand mal Kube in freier Wildbahn gesehen?

Rein Marken-technisch haben die Entwickler vielleicht recht, wenn sie ihre Ankündigungen nur auf bestimmte Produkte beziehen – also von Wayland-Support reden und wirklich nur den Plasma-Desktop meinen. Helfen wird es ihnen in der Öffentlichkeit nicht. Die schreibt nämlich immer noch erstaunlich oft von KDE 5 und meint damit mehr als nur den Desktop.

Nebenbei gelang es mir auch nicht einen Hauptmonitor zu definieren, aber da ich sowieso nicht vorhatte, die Wayland-Session weiter zu nutzen (ohne E-Mail Programme und PIM Suite bringt das ja nichts) bin ich da nicht weiter ins Detail gegangen.

Mal sehen, wie oft man noch in Ankündigungen enorme Fortschritte hin zu erstklassigem Wayland-Support lesen darf, bevor man das wirklich nutzen kann.

Ansonsten ist das neue Startmenü nett und das Farbschema wurde auch hübsch angepasst. Der neue Systemmonitor nimmt zwar den halben Screen ein und versteckte die Informationen in zig Untermenüs aber sieht auch nett aus. Hier hat man sich scheinbar vom Windows 10-Task Manager inspirieren lassen. Wirklich toll ist die Abkehr von den uralten Startscripten und der Wechsel auf systemd zum Starten der Plasma-Session. Diese Funktion hätte es mehr verdient, ins Schaufenster gestellt zu werden, als ein nicht funktionierender Wayland-Support.

Der Artikel Kommentar: Wayland und Plasma – Nur ohne Apps erschien zuerst auf [Mer]Curius

NGINX ist neben Apache einer der bekanntesten Webserver. Allerdings kann das Tool mehr als nur ein schlichter Webserver sein. Reverse Proxy, Load Balancer, Mail Proxy oder HTTP cache Server sind ein paar wenige Funktionen die Nginx beherrscht.

Ich möchte euch heute ein paar Beispiele zu einzelnen Funktionen zeigen. Den Anfang macht logischerweise die Installation. Als System verwende ich einen Ubuntu 20.04 LTS Server.

 

Nginx

 

Installation Nginx unter Ubuntu/Debian

Die Installation der frei verfügbaren Version (Die kommerzielle Variante nennt sich Nginx Plus) erfolgt über das Nginx Repository.

sudo wget https://nginx.org/keys/nginx_signing.key

sudo apt-key add nginx_signing.key

sudo nano /etc/apt/sources.list.d/nginx.list

  deb https://nginx.org/packages/mainline/ubuntu/ focal nginx
  deb-src https://nginx.org/packages/mainline/ubuntu/ focal nginx
              
sudo apt install nginx

sudo systemctl is-enabled nginx.service

sudo systemctl enable nginx

Nach der Installation erfolgt eine schnelle Kontrolle.

ss -ltn
ubuntu:~$ curl -I http://127.0.0.2

HTTP/1.1 200 OK
Server: nginx/1.19.6
Date: Thu, 17 Dec 2020 22:20:49 GMT
Content-Type: text/html
Content-Length: 612

Nginx selbst kompilieren

Es besteht auch die Möglichkeit, das Nginx Paket selbst zu kompilieren. Dies wird dann nötig, wenn Pakete benötigt werden, die in der Standardvariante nicht enthalten sind. Die war zum Beispiel bei der Verwendung von GeoIP oder LibreSSL mal bzw. ist noch so.

Mit dem folgenden Befehl können die installierten Module eingesehen werden.

Nginx –V

In der Standardinstallation sollte hier das Modul --add-dynamic-module=/build/nginx-5J5hor/nginx-1.18.0/debian/modules/http-geoip2 angezeigt werden. D.h. das eingangs erwähnte Geo IP Modul wird hier bereits geladen.

Einen eigenen Nginx Server unter Debian/Ubuntu einrichten

Nach einer erfolgreichen Installation zeigt Nginx eine Standardseite an. Diese kann gelöscht oder zusätzlich eine eigene virtuelle Seite angelegt werden. Auf einer IP können so mehrere Webseiten gehostet werden.

Folgende Struktur bietet sich unter Ubuntu an:

Konfiguration der einzelnen virtuellen Server.

/etc/nginx/sites-available/xyz

Momentan aktive Server wobei es sich hier um einen Symlink handelt.

/etc/nginx/sites-enabled/xyz

Schritt für Schritt heißt dies für einen Server welche auf Port 80 lauscht:

#config anlegen
touch /etc/nginx/sites-available/itrig

#config schreiben
nano /etc/nginx/sites-available/itrig

server {

        listen 80 default_server;    

        # Make site accessible from http://localhost/

        server_name localhost;
        location / {
            root /usr/share/nginx/html;
            index index.html index.htm;
        }
}

#aktiv setzen
ln -s /etc/nginx/sites-available/itrig /etc/nginx/sites-enabled/itrig

Konfiguration überprüfen

nginx –t

Neustart der Konfiguration mit

#lädt nur die neue Konfiguration
nginx –s reload

oder

sudo systemctl reload nginx


Nginx als Loadbalancer verwenden

Neben der reinen Webserverfunktion bietet NGINX die Möglichkeit den Server, als Loadbalancer zu betreiben. Da heißt der Server sorgt für Ausfallsicherheit bzw. Leistung von Webanwendungen, in dem er die Last verteilt. Vorstellen kann man sich dies wie einen Haupthändler, welcher Daten unter verteilt.

LoadbalancerNginx bietet mehrere Varianten an, wie diese Verteilung geschehen kann.

Round Robin

Das bekannteste dürfte das Round Robin Verfahren sein. Es wird eine Liste von Servern durchgearbeitet und die Last nach und nach verteilt. Ist die Liste zu Ende, fängt der Server wieder am Anfang an.

Im unteren Beispiel werden 3 Server in der Gruppe "itrigloadbalancer" zusammengefasst und der Webserver geht diese Liste nach und nach durch. Unterstützt werden die Protokolle HTTP, HTTPS, FastCGI, uwsgi, SCGI, memcached, und gRPC.

http {
    upstream itrigloadbalancer {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://itrig.de;
        }
    }
}

Least Connected

Eine weitere Lastverteilung ist das Least-Connected-Verfahren. Hier wird auf die aktiven Verbindungen der einzelnen Server geschaut. Der Server, welcher die geringste Anzahl an aktiven Verbindungen hat, bekommt die Anfrage zugeschanzt.

upstream intrigleastload {
        least_conn;
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

Session-Persistenz - IP Hash

Die dritte Möglichkeit Last zu verteilen, stellt das IP-Hash-Verfahren dar. Hier werden von den zugreifenden Client IPs Hash Werte erstellt. Anhand dieser Werte wird einem Client immer ein bestimmter Server zugewiesen. Damit erhält der Nutzer eine Session Persistenz, da Anfragen immer vom gleichen Server beantwortet werden.

Beim Round-Robin- oder Least-Connected-Load-Balancing kann jede nachfolgende Anfrage eines Clients potenziell auf einem anderen Servern ankommen.

upstream itrighash {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

Weighted load balancing

Alle Varianten lassen sich zusätzlich gewichten. So kann es vorkommen, dass ein Server eine bessere Hardware verbaut hat, als ein anderer. Mit Weighted load balancing lässt sich einzelnen Geräten mehr Last zuschieben.

upstream itrigmitgewicht {
        server srv1.example.com;
        server srv2.example.com weight=3;
        server srv3.example.com;
    }
upstream itrig {
    ip_hash;
    server srv1.example.com weight=2;
    server srv2.example.com;
    server srv3.example.com;
}

Mehr zu der Thematik unter load_balancing.


Nginx als Reverse Proxy verwenden

Den aufmerksamen Lesern dürfte aufgefallen sein, dass in einem Code Beispiel weiter oben eine Zeile mit "proxy_pass" vorhanden ist. Diese Zeile deutet darauf hin, dass NGINX als Reverse Proxy eingesetzt wird und ein Aufruf nicht direkt auf dem Server landet, sondern weitergeleitet wird.

location /webshop {
proxy_pass http://opencart.itrig.local;
}

location /landkarte {
proxy_pass http://192.168.100.99;
}

Es gibt verschiedene "Vorteile" für so eine Weiterleitung.

So kann der Nginx als HTTPS Endpunkt dienen und die Struktur dahinter kann unverschlüsselt agieren. Auch bietet NGINX die Möglichkeit als Reverse Proxy und als Load Balancer gleichzeitig zu arbeiten, die Details sind weiter oben zu lesen.

Weiter erlaubt der vorgeschaltete Server eine Caching Funktion, was zum schnelleren Ausliefern von Webseiten beitragen kann.

Hier ein Beispiel mit gesplittetem Cache aus der offiziellen NGINX Cache Dokumentation.

proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m
                 max_size=10g inactive=60m use_temp_path=off;
proxy_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m
                 max_size=10g inactive=60m use_temp_path=off;

split_clients $request_uri $my_cache {
              50%          “my_cache_hdd1”;
              50%          “my_cache_hdd2”;
}

server {
    # ...
    location / {
        proxy_cache $my_cache;
        proxy_pass http://my_upstream;
    }
}

Das Thema Sicherheit spielt ebenso eine Rolle, da durch den vorgeschalteten Server, die Angriffsfläche kleiner gehalten wird.


NGINX mit Regex

Richtig interessant wird es, sobald die aufgerufene URL verschiedene Eigenschaften besitzt bzw. ein besonderes Verhalten zeigen sollte.

Diese Eigenschaften werden mit regulären Ausdrücken umgesetzt.

Hier sind ein paar Beispiele von regulären Ausdrücken für NGINX :

# Die URL ist durch * case insensitive
 location ~* /itrig/ {
    #...
    #...
    }

# Die URL ist case sensitive das ^ sorgt dafür das nur z.B. /itrig/logo.jpg gültig ist und nach dem ersten Match gestoppt wird.
 location ^~ /itrig/ {
    #...
    #...
    }

# Bilder anhand der Endung umleiten
 location ~ \.(gif|jpg|png)$ {
    root /data/images;
    }

# Unnötige Endungen aussperren (case insensitive)
 location ~* "\.(old|orig|original|php#|php~|php_bak|save|swo|aspx?|tpl|sh|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rdf)$" {
    deny all;
    }

# Einen Alias setzen
 location /_/static {
        alias /path/to/glory;
    }

# Rewrite einer URL,  "pfad" wird entfernt
    location /pfad {
        rewrite ^/pfad(.*)$ $1 break;
        proxy_pass http://splunk-api:8080;
    }

Es bietet sich immer an, eigene Befehle zu testen, bevor sie produktiv eingesetzt werden, denn neben Einschränkungen auf URLs kann ebenso Haus und Hof geöffnet werden.

Ein Regex Test sollte daher immer gemacht werden. Hier findet sich so ein Tool online regex.datahoarder.dev.

Das Tool kann jederzeit auf der eigenen Umgebung gehostet werden und ist auf Github zu finden.

Nginx_Regular_Expression_Tester

 

25. Februar 2021

Firefox hat scheinbar die Kurve gekriegt und rollt wieder interessante Funktionen aus, nachdem man einige Zeit lang vor allem durch so etwas wie Pocket und Screenshots glänzte. In der aktuellen Version 86 führt man einen neuen Cookie-Schutz ein.

Ich hatte kürzlich ja bereits berichtet, dass ich mich von der dauernden Cookie-Löscherei verabschiedet habe. Eine Grundvoraussetzung hierfür war die First Party Isolation. Nun ersetzt Mozilla das System quasi durch eine erweiterte Netzwerk-Partitionierung.

Nicht nur die Cookies werden nun zwischen den Webseiten isoliert, sondern alle gespeicherten Daten. Also auch Cache, Session-IDs & Co. Damit möchte man die immer beliebter werdenden Tracking-Mechanismen jenseits von Cookies adressieren.

Bei neuen Profilen ist die Netzwerk-Partitionierung seit Firefox 85 aktiviert und „Total Cookie Protection„-Funktion wird aktiviert, wenn man den „Verbesserten Schutz vor Aktivitätenverfolgung“ in den Einstellungen auf „Streng“ setzt.

Bei bestehenden Profilen muss ggf. erst einmal die First Party Isolation deaktiviert werden. Entweder indem man das entsprechende Addon deinstalliert oder – sofern man die Anpassung manuell vorgenommen hat – indem man in about:config den entsprechenden Schalter wieder umlegt.

privacy.firstparty.isolate = false

Danach ist noch zu prüfen, ob die Netzwerk-Partitionierung aktiv ist:

privacy.partition.network_state = true 

Möchte man nicht pauschal die Richtlinie zur Aktivitätenverfolgung auf „Streng“ setzen, kann man den neuen Cookie-Schutz auch manuell einschalten. Die Cookie-Partitonierung mittesl „Total Cookie Protection“ aktiviert folgende Anpassung:

network.cookie.cookieBehavior = 5

Eine schöne neue Funktion und sollte von allen umgesetzt werden. Firefox ist unverzichtbar wenn man auch nur ein bisschen Wert auf digitale Privatsphäre legt. Leider setzt sich der Abwärtstrend unvermindert fort und es steht zu befürchten, dass wir bald nur noch die Wahl zwischen dem einen oder anderen Chrome-Fork haben.

Der Artikel Firefox ersetzt First Party Isolation erschien zuerst auf [Mer]Curius

24. Februar 2021

Die MZLA Technologies Corporation hat mit Thunderbird 78.8 ein planmäßiges Update für seinen Open Source E-Mail-Client veröffentlicht.

Neuerungen von Thunderbird 78.8

Mit dem Update auf Thunderbird 78.8 hat die MZLA Technologies Corporation ein planmäßiges Update für seinen Open Source E-Mail-Client veröffentlicht. Die neue Version bringt mehrere Fehlerbehebungen, welche sich in den Release Notes (engl.) nachlesen lassen, und schließt darüber hinaus auch mehrere Sicherheitslücken.

Der Beitrag Thunderbird 78.8 veröffentlicht erschien zuerst auf soeren-hentzschel.at.

23. Februar 2021

Mozilla hat Firefox 86 für Windows, Apple macOS und Linux veröffentlicht. Dieser Artikel fasst die wichtigsten Neuerungen zusammen – wie immer auf diesem Blog weit ausführlicher als auf anderen Websites.

Download Mozilla Firefox für Microsoft Windows, Apple macOS und Linux

Firefox erhält „vollständigen Cookie-Schutz“

Als Mozilla vor vier Wochen Firefox 85 veröffentlicht hat, wurde mit der Einführung der sogenannten Netzwerk-Partitionierung, nebenbei bemerkt dem umfangreichsten Partitionierungs-System aller Browser, ein großer Schritt in Richtung eines noch besseren Schutzes der Privatsphäre der Nutzer gemacht. Gleichzeitig wurde für Nutzer, welche den strengen Schutz aktiviert haben, die „Level 2“-Liste aktiviert, welche noch mehr Tracker blockiert.

Mit Firefox 86 geht Mozilla den nächsten großen Schritt für all jene Nutzer, welche in den Datenschutz-Einstellungen den strengen Schutz einschalten.

Damit wird nämlich eine zusätzliche Maßnahme aktiviert, welche Mozilla als „vollständigen Cookie-Schutz“ bezeichnet. Vereinfacht gesagt bedeutet dies, dass die Cookies jeder Domain in einem separaten Cookie-Container gespeichert werden – seitenübergreifendes Tracking über Cookies ist so nicht mehr möglich.

Vollständiger Cookie-Schutz in Firefox 86

Neue Drucken-Oberfläche

Die Verbesserung der Drucken-Funktion war ein großer Schwerpunkt von Mozilla in den letzten Monaten. Dies schließt zum einen Verbesserungen der Druckausgabe in vorherigen Updates ein und wird mit Firefox 86 auch direkt sichtbar, in Form eines komplett neuen und plattformübergreifend konsistenten Drucken-Dialogs anstelle der bisherigen vom jeweiligen System bereitgestellten Drucken-Oberfläche.

Drucken-Dialog in Firefox 86

Seite als PDF-Datei speichern

Ein komplett neues Feature, welches Mozilla im Rahmen der neuen Drucken-Oberfläche implementiert hat, ist die Möglichkeit, eine Webseite als PDF-Datei zu speichern. Diese Funktion kann über den neuen Drucken-Dialog genutzt werden, ähnlich wie eine solche Funktion in der Vergangenheit durch virtuelle „PDF-Drucker“ auf System-Ebene bereitgestellt werden konnte.

Firefox 86: Seite als PDF speichern

Bild-in-Bild für mehrere Videos gleichzeitig

Ein Video ansehen und gleichzeitig etwas anderes am Computer machen – mit Firefox kein Problem. Bei Klick auf die entsprechende Schaltfläche wird das jeweilige Video vom Tab losgelöst und erscheint in einem eigenständigen kleinen Fenster. Dieses liegt über allen Anwendungen, d.h. Firefox muss sich nicht im Vordergrund befinden, um das Video zu sehen. Der Benutzer kann beispielsweise seine E-Mails in Thunderbird abrufen und gleichzeitig ein Video auf YouTube ansehen.

Bisher war diese Funktion auf ein Video limitiert. Multitasking-Experten dürfen sich freuen, denn ab sofort ist es möglich, mehr als ein Video gleichzeitig vom Hauptfenster losgelöst zu haben und so mehrere Videos parallel sehen zu können, während gleichzeitig andere Aufgaben erledigt werden.

Bild-in-Bild Firefox 86

Leseansicht auch für lokale Dateien

Per Klick auf das Buch-Symbol in der Adressleiste erscheinen Artikel im Web so aufbereitet, dass sie störungsfrei gelesen werden können. Konkret bedeutet dies eine angenehme Farbgebung und Schriftgestaltung sowie keine störenden Elemente wie Werbung. Der Nutzer hat hierbei auch diverse Anpassungsmöglichkeiten und kann sich die Artikel sogar vorlesen lassen.

Leseansicht Firefox 86

Dabei gab es bislang eine Einschränkung: Es musste sich um Artikel im Web handeln, welche über https:// respektive http:// aufgerufen werden. Für lokal gespeicherte Dateien hat die Leseansicht bisher also nicht funktioniert. Ab sofort steht die Leseansicht auch für lokal gespeicherte Dokumente zur Verfügung, welche via file:// aufgerufen werden.

Dark-Mode für Text-Dokumente

Heute bietet praktisch jedes System einen sogenannten Dark-Mode, in welchem dunkle Farben verwendet werden, was (abhängig von der Bildschirmtechnologie) nicht nur die Akkulaufzeit verbessern kann, sondern gerade in dunkler Umgebung auch für die Augen angenehmer sein kann. Auch Firefox besitzt ein dunkles Theme, welches standardmäßig automatisch aktiviert wird, wenn der Dark-Mode des Betriebssystems aktiv ist.

Beim Betrachten von Text-Dokumenten in Firefox hatte man bislang jedoch nicht viel von diesem dunklen Theme, denn hier war der Hintergrund weiterhin Weiß und der Natur eines Text-Dokumentes gemäß gab es von dieser Weißfläche sehr viel.

Ab Firefox 86 werden auch für Text-Dokumente im Dark-Mode dunkle Farben benutzt.

Text-Dokumente im Dark-Mode Firefox 86

Verbesserungen der Webplattform und Entwicklerwerkzeuge

Firefox unterstützt nun die CSS Pseudoklasse :autofill. Experimentell dazu kommt eine erste Unterstützung der CSS-Funktion image-set() für responsive Bilder in CSS. Die Unterstüzung dafür muss in Firefox 86 allerdings noch via about:config aktiviert werden (layout.css.image-set.enabled).

Auf JavaScript-Seite erwähnenswert ist die Unterstützung von Intl.DisplayNames.

Bei Verwendung von margin oder padding für interne table-Elemente zeigt Firefox jetzt eine Warnung an, dass diese Eigenschaft keine Wirkung hat. Ähnliche Warnungen für „inaktives CSS“ zeigt Firefox bereits seit längerem für viele weitere Dinge an.

Gibt es auf einer Seite Script-Fehler zeigen die Entwickler-Werkzeuge die Fehleranzahl nun direkt in der Werkzeugleiste an, auch wenn das Konsolen-Werkzeug selbst nicht geöffnet ist.

Bei Seiten mit iFrames erlaubt ein neues Auswahlwerkzeug nun die Auswahl des entsprechenden iFrames. Inspektor, Konsole und Debugger beziehen sich dann auf das jeweilige iFrame statt auf die gesamte Seite.

Ausführliche Informationen zu Verbesserungen der Webplattform in Firefox 86 finden sich auf hacks.mozilla.org sowie in den MDN web docs.

Geschlossene Sicherheitslücken und andere Sicherheits-Verbesserungen

Wie immer hat Mozilla auch in Firefox 86 wieder mehrere Sicherheitslücken geschlossen. Alleine aus Gründen der Sicherheit ist ein Update auf Firefox 86 daher für alle Nutzer dringend empfohlen.

Das Decoding von Videos findet ab sofort in einem separaten Firefox-Prozess („RDD“) statt.

Auf Linux wurde ein Schutz aktiviert, um vor der sogenannten Stack Clash-Attacke zu schützen. Und für WebRTC-Kommunikation ist DTLS 1.0 nicht länger ausreichend, DTLS 1.2 wird ab sofort vorausgesetzt.

Sonstige Neuerungen in Firefox 86

Auf Apple macOS 11 und höher zeigt Firefox in der Menüleiste nun an, wenn Medien wie beispielsweise ein Video auf YouTube wiedergegeben werden.

Firefox 86: Medien-Wiedergabe Apple macOS 11

Für Nutzer mit aktiviertem Hauptpasswort wird auf about:logins fünf Minuten nach der Entsperrung eine erneute Eingabe erzwungen, wenn der Nutzer die Passwörter erneut im Klartext sichtbar machen möchte.

Wurde der CSV-Import von Zugangsdaten aktiviert (signon.management.page.fileImport.enabled in about:config) erscheint nun nach dem Import ein Dialog, welcher zusammenfasst, wie viele Datensätze importiert worden sind und ob es ggfs. Fehler gab.

Firefox 86: Dialog nach CSV-Import von Passwörtern

Für Nutzer von Firefox in Kanada wurde das Feature ausgerollt, Kreditkarten-Daten in Firefox speichern und Formulare automatisch entsprechend ausfüllen zu können. Bisher stand dieses Feature nur für Nutzer in den USA zur Verfügung. Pläne für die Deutschland, Österreich und die Schweiz sind zu diesem Zeitpunkt nicht bekannt.

Die Auslagerung vom Canvas- und WebGL-Zeichnen in den GPU-Prozess auf Windows sowie Apple macOS soll eine spürbar verbesserte Performance und Stabilität in bestimmten Situationen bringen.

Auch für WebExtension-Entwickler gab es wieder ein paar Verbesserungen, welche sich hier nachlesen lassen. Unter anderem benötigen Erweiterungen nicht länger die umfangreiche „tabs“-Berechtigung, um auf die Tab-URL, den Titel sowie die Favicon-URL zuzugreifen, wenn eine entsprechende Host-Berechtigung existiert.

Natürlich kam auch in Firefox 86 die Unterstützung weiterer Unternehmensrichtlinien sowie weitere Verbesserungen der Barrierefreiheit, Fehlerbehebungen und sonstige Verbesserungen unter der Haube dazu.

Der Beitrag Mozilla veröffentlicht Firefox 86 erschien zuerst auf soeren-hentzschel.at.

Synology betreibt seine bekannten NAS Systeme mit einem eigenen Betriebssystem – dem DiskStation Manager – das letztlich ein Linux ist. Doch ein reichlich altes Linux und Updates kommen nur selten.

Die Synology DiskStation 218 war eine meiner besten Kaufentscheidungen im IT-Bereich vergangenen Jahre. Das System ist vielseitig, stabil und wartungsarm. Ich konnte damit viel mehr Dinge realisieren, als vorher auf meinem Linux Home-Server liefen und habe gleichzeitig viel weniger Scherereien.

Mit dieser Entscheidung bin ich nicht alleine. Zusammen mit QNAP dürfte Synology einen Gutteil des deutschen Marktes unter sich aufteilen und ich weiß, dass Synology auch bei vielen IT-technisch versierten Nutzern beliebt ist, wenn sie etwas Wartungsarmes brauchen.

Selbst einem unkritischen Nutzer fällt aber die geringe Update-Frequenz auf. Die Version 7 des DSM ist massiv verspätet und bisher im Betatest. Die Produktivsysteme laufen auf DSM 6, zuletzt auf Version 6.2.4-25554 aktualisiert. Updates kommen sehr selten, die letzte Aktualisierung kam am 16.12.2020 und davor sogar 16.07.2020. Die Updatefrequenz für Pakete wie PHP, MySQL, Perl & Co ist nicht wesentlich besser.

Die Basis ist das, was im Linux-Jargon gerne als „gut abgehangen“ bezeichnet wird. Ich hatte dazu hier mal ein bisschen was geschrieben. Auch mit dem jüngsten Update hat sich da an den Versionen wenig getan. Der Kernel basiert weiter auf 4.4.59+, PostgreSQL ist nun bei 9.3.25, nginx ist jetzt bei 1.16.1. Was mit Version 7 mitgeliefert wird, konnte ich bisher noch nicht testen.

Nun sind Versionen natürlich nicht alles, man kann schließlich sicherheitsrelevante Fehler auch patchen, ohne die Version zu verändern. Hier macht die geringe Updatefrequenz aber Sorgen.

Es handelt sich immerhin um Geräte, die potenziell direkt aus dem Netz erreichbar sind und viel mehr Angriffsfläche als ein normales Desktopsystem bieten.

Wie würdet ihr das beurteilen? Bin ich zu kritisch? Gibt es wirklich so wenige sicherheitskritische Probleme bei den Basispaketen?

Der Artikel Synology DSM – Alte Basis, wenig Updates erschien zuerst auf [Mer]Curius

22. Februar 2021

https://hyperblog.de/media/users/hoergen/podcast/20210222_low_latency_f_r_die_musikproduktion_150.mp3

Da ich unter Linux Musik produziere gibt es hier und da Möglichkeiten, wie man das System etwas tunen kann. Eines der Dinge ist, dass man sich einen Low Latency Kernel installiert, wenn man an die Grenzen des Rechners stößt. Allerdings hat dieser dann eventuell so den einen oder anderen Nachteil, wenn man den Rechner noch für Alltagsarbeiten nutzt. Daher arbeite ich mit dem ganz normalen Kernel von Kubuntu 20.04 LTS der auch wunderbar seinen Dienst verrichtet.

 

Es gibt da aber dennoch die eine oder andere Kleinigkeit, die man machen kann, um das System zu optimieren. Quasi zu Fokussieren. Erik Rigtorp hat hier einen Low Latency Tuning Guide geschrieben, der ein paar sehr eigentlich selbstverständliche und ein paar interessante Vorschläge enthält.

 

Aktuell teste ich gerade recht zufriedenstellend, das Abschalten des Hyperthreadings.

Kurz gesagt: In meinem Rechner arbeitet ein Intel mit 4 CPU Cores, die virtuell jeweils nochmal aufgeteilt werden. In meinem System werden dadurch 8 CPUs angezeigt, die jeweils eigene Prozesse abarbeiten können. Das so eine Multiparallelität nicht immer von Vorteil ist, wenn man eine Sache benutzen möchte, kennt man ja schon aus der realen Welt, bzw auch von anderen Betriebsystemen.

Es gibt verschiedene Wege das Hyperthreading abzuschalten, ich habe mich im Moment für die Konsole entschieden und gegen das BIOS, so kann ich das immer recht spontan an und wieder ausschalten.

Daher habe ich mir folgendes kleines Script namens cpu_disable_hyperthreading.sh angelegt, um den Parameter komfortabel umschalten zu können. Das Skript muss mit root Rechten bzw sudo ausgeführt werden !

 

#!/bin/bash 
# Titel: Hyperthreading ausschalten
# Autor: hoergen
# Datum: 12.02.2021
#  
#  Zum Ausführen des Scriptes muss man root sein
#  
# Quelle: https://rigtorp.se/low-latency-guide/
#  
#  


while [ -n "$1"  ]; do

       case "$1" in

               -h) echo -e "\n\nOhne Parameter wird das Hyperthreading ausgeschaltet"
echo " und der aktuelle Status wird angezeigt"
                   echo    " -h zeigt diese Hilfe an"
                   echo -e " -a aktiviert das Hyperthreading wieder.\n\n";;
               -a)  echo "\n\nSchalte Hyperthreading aus. Ausgeschaltet=0"
                    echo on > /sys/devices/system/cpu/smt/control;;

               *) echo "\n\nOhne Parameter wird das Hyperthreading ausgeschaltet"
                  echo "Schalte Hyperthreading an. Angeschaltet=1"
                  echo off > /sys/devices/system/cpu/smt/control;;
       esac
       shift
done





# Disable Hyperthreading
#echo "Schalte Hyperthreading aus. Ausgeschaltet=0"  
#echo off > /sys/devices/system/cpu/smt/control
hyperStatus=$(cat /sys/devices/system/cpu/smt/active)
echo -e "\n\nHyperthreading ist aus:0 / an:1 = $hyperStatus"

# Check if turbo boost is enabled enabled = 0  
turboBoost=$(cat /sys/devices/system/cpu/intel_pstate/no_turbo)
echo -e "Turbo Boost ist an:0 / aus:1 = $turboBoost\n\n"  


 

Hier nun das gesamte Paper: Low Latency tuninng guide by Eric Rigtorp (25.04.2020) https://rigtorp.se/low-latency-guide/

 

 

 

 

Linux ist kein Betriebssystem, sondern ein Kernel. Den Spruch kriegen Anwender seit Jahren zu hören. Das was auf den Geräten installiert wird, kommt meist in Form einer Linux-Distribution, also einer Zusammenstellung, zum Anwender. Doch welche Bedeutung haben sie nach Jahren der Nivellierung?

Wie der Name schon sagt, sorgen Distributionen für die Verteilung der Software an den Anwender. Man kann Linux nicht ohne Distribution nutzen, man kann sich höchstens selbst eine Distribution mit Linux from Scratch bauen. Dirk Deimeke hat kürzlich in seinem Blog über die zukünftige Rolle von Distributionen geschrieben. Die Perspektive auf das Problem rührte primär von den neuen Formen her Applikationen auszurollen. Seien es Container oder neue Formate. Ich denke die Ursache für den sukzessiven Bedeutungsverlust liegt noch tiefer.

Linux-Distributionen sind ein interessantes Phänomen, wenn man sich den Unterschied von Selbst- und Fremdwahrnehmung angucken möchte. In der Community sind sie identitätsstiftend und die Community formiert sich noch immer primär um die einzelnen Distributionen. Sie sind hier möglicherweise sogar noch wichtiger als die Desktopumgebungen. Das steht in einem interessanten Spannungsverhältnis zur Fremdwahrnehmung, die meist von „dem Linux“ spricht und damit oft die führenden Distributionen meint. Doch steht die Selbstwahrnehmung auch in einem Spannungsverhältnis zur Realität?

Die neuen Formate mit zentralen Verteilungsmechanismen für Applikationen – seien es Docker-Container, Flatpaks oder Snaps – beschleunigen sicher einen Trend, aber sie verursachen ihn meiner Meinung nach nicht. Linux-Distributionen sind seit Jahren einer starken Nivellierung ausgesetzt.

Um zu erklären, was ich damit meine, muss ich ein wenig in Erinnerungen schwelgen. Damals, 2007 oder so, als ich meine ersten nachhaltigen Gehversuche mit Linux machte, gab es massive Unterschiede zwischen den Distributionen. Es ging hier um so grundlegende Fragen wie das Init-System. Upstart, SysV-Init oder BSD-Like Kreationen wie bei Arch Linux. Ob eine Distribution länger an HAL festhielt oder früh auf den neuen Ansatz DeviceKit wechselte, war nichts was der Anwender bestimmen konnte. Das gleiche bei dem Gegensatz richtiger root-Account versus sudo, der Endlosdiskussionen auslöste. Konfigurationswerkzeuge konnten ganz unterschiedlich sein. Man erinnere sich an das Mandriva Control Center (MCC) oder YaST. Unter der Oberfläche waren die Unterschiede noch gewaltiger. Obwohl Linux ein unixoides System ist, regelt das nicht bis ins letzte Detail wo Systemdateien und Bibliotheken liegen müssen.

Bei der Paketverwaltung gab es himmelweite Unterschiede, die weit über den Gegensatz RPM versus DEB hinausgingen. Es machte in der praktischen Bedienung durchaus einen Unterschied, ob man das komplexe Toolkit von Debian verwenden durfte oder die quälend langsamen Routinen von openSUSE oder Fedora. Letztere konnten lange Zeit nicht mal nicht mehr benötigte Abhängigkeiten entfernen und die Abhängigkeitshölle mit totaler Blockade des Systems ist kein Märchen, sondern war traurige Realität.

Auch die Software-Auswahl war eine bewusste Entscheidung der Distributions-Entwickler. Die Beispiele entstammen jetzt dem KDE-Bereich, weil ich damit am meisten gearbeitet habe, aber sie lassen sich sicher auf andere Desktopumgebungen übertragen. Die Entscheidungen für KDE bei 3.5 zu bleiben, wie Debian sie entgegen dem allgemeinen Trend bei „Lenny“ traf, waren individuelle Entscheidung der Entwickler. Nur wenige mögen sich erinnern, aber Kubuntu lieferte bereits mit KDE 3.5 Dolphin als Dateimanager aus. Oder wenn eine Distribution eine bestimmte Software wie KDEPIM in einer anderen Version nutzte, als den Rest des Ökosystems und so den Wechsel auf Akonadi hinauszögerte. Die Wahl des Displaymanagers auf LightDM, wie sie bis vor Kurzem das Ubuntu-Universum prägte, hatte Folgen für die Anwender. Die Upstream-Entwickler haben das gehasst, weil die Wechselwirkungen unvorhersehbar waren und so manches Problem verursachten.

Der Anwender entschied sich somit nicht nur für eine Distribution als Marke, sondern kaufte damit im übertragenen Sinne auch ein Set an Werkzeugen und Systemdesign-Entscheidungen ein, die sein Anwendungserlebnis massiv prägten.

Das hat sich in den letzten Jahren sukzessive gewandelt. In einem allgemeinen Trend haben die meisten Distributionen sich für systemd und damit verbundene Dienste entschieden. Das gleiche gilt für PolicyKit, udev, upower usw. Der Trend, alles in /usr abzulegen vereinheitlicht die Dateistrukturen der Distributionen. freedesktop-Standards spielen heute eine zentrale Rolle und werden verbreitet befolgt. Heute kommen sogar Debian und Fedora mit Administratorrechten via sudo und die Distributionen, die beim klassischen root-Konzept geblieben sind, blockieren einen direkten Anwendungsstart damit. Die Entwicklung ausgereifter grafischer Konfigurationswerkzeuge für die Desktopumgebungen hat Eigenlösungen der Distributionen abgelöst (außer bei openSUSE). Software ist komplexer geworden, weshalb die meisten Distributionen upstream nur noch wie vorgesehen paketieren.

Sogar vor den Installationsroutinen hat die Nivellierung nicht halt gemacht. Sehr viele Distributionen verwenden heute Calamares als Installer. Das Spektrum reicht hier von Debian bis Manjaro. Daneben pflegen viele Distributionen zwar noch ihre Eigenentwicklungen, aber der Trend ist deutlich zu sehen.

Die Unterschiede zwischen den meisten Distributionen haben sich also stark nivelliert. Wer das nicht wahrhaben möchte, sollte mal versuchen, ein aktuelles BSD aufzusetzen. Natürlich gibt es noch die Spezialfälle wie Slackware, Vault Linux oder Devuan aber diese sind eine winzige Minderheit. Sowohl was die Nutzerzahlen betrifft, als auch gemessen an der Gesamtzahl der Distributionen. Die meisten Distributionen haben inzwischen ein stark vereinheitlichtes Ökosystem mit lediglich graduellen Unterschieden. Man kann Systeme und Arbeitsweisen meist sehr schnell auf einen neuen Unterbau umziehen.

Das gilt sogar für die Releasezyklen. Entweder es gibt keinen Zyklus und die ganze Distribution wird rollend weiter entwickelt oder es gibt fixe Zyklen mit relativ langen Supportzeiträumen. Es ist fertig, wenn es fertig ist, was z. B. lange Debian von Ubuntu abhob, gilt schon lange nicht mehr. Faktisch wird irgendwann alle zwei Jahre im Frühjahr ein Release veröffentlicht um den groben Zyklus einzuhalten.

Noch lustiger wird es, wenn man auf die Ebene der Maintainer guckt. Zwischen Debian und Ubuntu gibt es inzwischen so viele „Personalunionen“, wo der gleiche Entwickler die selben Pakete für beide Distributionen betreut, dass man schon fast Debuntu als Distribution sprechen kann.

Diese Nivellierung sehe ich überhaupt nicht negativ. Qualitativ hat Linux als System massiv vom Wechsel Quantität zu Qualität profitiert. Niemand, der beispielsweise mit openSUSE 10.2 arbeiten durfte will ernsthaft in diese Zeit zurück.

Auf diese stark vereinheitlichte Basis treffen nun neue Paketierungsformate für Desktopsysteme und der Trend zu Virtualisierung und Containern im professionellen Bereich. Der Trend zur Vereinheitlichung wird sich dadurch eher beschleunigen, da zentrale Anwendungen aus den gleichen Bezugsquellen dann einfach auf die Distributionsbasis gelegt werden.

Angesichts der Nivellierung stellt sich aber schon die Frage, warum es diesen Zoo an Distributionen gibt. Im Grunde genommen ist meiner Meinung nach vor allem Tradition und Identitätsbildung für die Community. Zusätzlich noch ein paar dicke Entwickler-Egos, denn warum sollte man gerade das eigene Projekt zugunsten der Konkurrenz einstellen.

Denn faktisch ist Linux längst ein Betriebssystem. Linux ist der Kernel plus zentrale Bestandteile, die nahezu alle Distributionen teilen und die sie von anderen freien Systemen wie BSD-Varianten oder Android abheben.

Der Artikel Linux-Distributionen – Welche Bedeutung haben sie in Zukunft? erschien zuerst auf [Mer]Curius

Mit „Kanboard im Container…“ hat mein Ausflug ins Containerland begonnen. Mittlerweile läuft mein Pod bereits eine Weile und ich nutze die Anwendung regelmäßig. Jedoch musste ich nach jedem Neustart des Hosts den Pod kanboardpod manuell starten. Ich hatte mir daher vorgenommen, hierfür eine Systemd-Service-Unit zu erstellen, welche diesen Task automatisiert. Doch habe ich mit Freude festgestellt, dass podman-generate-systemd(1) mir diese Arbeit abnehmen kann.

Also starte ich einen ersten Versuch und erzeuge entsprechende Service-Unit-Dateien in meinem HOME-Verzeichnis. Die Option „--name“ sorgt dafür, dass in den Service-Unit-Dateien die Namen des Pods bzw. der Container verwendet werden, anstatt der UUIDs. Die Option „--files“ sorgt dafür, dass die Ausgabe in Dateien und nicht auf die Standard-Ausgabe geschrieben wird.

$ podman generate systemd --name --files kanboardpod
/home/alice/pod-kanboardpod.service
/home/alice/container-kanboard.service
/home/alice/container-pgsql_db.service

$ cat pod-kanboardpod.service
# pod-kanboardpod.service
# autogenerated by Podman 2.0.5
# Mon Jan 25 13:19:51 CET 2021

[Unit]
Description=Podman pod-kanboardpod.service
Documentation=man:podman-generate-systemd(1)
Wants=network.target
After=network-online.target
Requires=container-kanboard.service container-pgsql_db.service
Before=container-kanboard.service container-pgsql_db.service

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
ExecStart=/usr/bin/podman start 62cdd29105a4-infra
ExecStop=/usr/bin/podman stop -t 10 62cdd29105a4-infra
ExecStopPost=/usr/bin/podman stop -t 10 62cdd29105a4-infra
PIDFile=/run/user/1000/containers/overlay-containers/b3c9bd9754cdc999108d0f4aad7d808c007cc34eee34faefd41ee39c3e1ca18b/userdata/conmon.pid       
KillMode=none
Type=forking

[Install]
WantedBy=multi-user.target default.target

$ cat container-kanboard.service 
# container-kanboard.service
# autogenerated by Podman 2.0.5
# Mon Jan 25 13:19:51 CET 2021

[Unit]
Description=Podman container-kanboard.service
Documentation=man:podman-generate-systemd(1)
Wants=network.target
After=network-online.target
BindsTo=pod-kanboardpod.service
After=pod-kanboardpod.service

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
ExecStart=/usr/bin/podman start kanboard
ExecStop=/usr/bin/podman stop -t 10 kanboard
ExecStopPost=/usr/bin/podman stop -t 10 kanboard
PIDFile=/run/user/1000/containers/overlay-containers/99d386a42b186efb3347d909cea265b990469dc33e1889a3006425a71956699b/userdata/conmon.pid
KillMode=none
Type=forking

[Install]
WantedBy=multi-user.target default.target

$ cat container-pgsql_db.service 
# container-pgsql_db.service
# autogenerated by Podman 2.0.5
# Mon Jan 25 13:19:51 CET 2021

[Unit]
Description=Podman container-pgsql_db.service
Documentation=man:podman-generate-systemd(1)
Wants=network.target
After=network-online.target
BindsTo=pod-kanboardpod.service
After=pod-kanboardpod.service

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
ExecStart=/usr/bin/podman start pgsql_db
ExecStop=/usr/bin/podman stop -t 10 pgsql_db
ExecStopPost=/usr/bin/podman stop -t 10 pgsql_db
PIDFile=/run/user/1000/containers/overlay-containers/fe757283f0662220fee23a563053ea7f30dbdf6d9fbb492c010a01dd7598fc9b/userdata/conmon.pid
KillMode=none
Type=forking

[Install]
WantedBy=multi-user.target default.target

Um die generierten Service-Units zu installieren und zukünftig als derjenige User auszuführen, welcher den Pod und die Container erzeugt hat, verschiebe ich sie in das zu erstellende Verzeichnis ~/.config/systemd/user. Anschließend werden die neuen Units in die Systemd-Konfiguration eingelesen und aktiviert.

$ mkdir -p .config/systemd/user
$ mv *.service .config/systemd/user/
$ systemctl --user enable pod-kanboardpod.service
$ podman pod stop kanboardpod
$ systemctl --user start pod-kanboardpod.service

Nachdem ich die Service-Units an die richtige Stelle verschoben und aktiviert hatte, habe ich meine laufende Pod-Instanz gestoppt und über die entsprechende Service-Unit gestartet.

Ich wähnte mich nun bereits am Ziel. Doch nach einem Neustart des Hosts war die Anwendung wieder nicht verfügbar. Die Service-Unit war nicht gestartet worden. Podman kann hier nichts dafür, denn es ist systemd, welcher dafür sorgt, dass im User-Kontext laufende Services beendet werden, wenn sich der entsprechende User ausloggt und diese erst startet, wenn der User sich einloggt.

Valentin Rothberg von Red Hat gab mir den entscheidenden Tipp, um dieses Problem zu lösen. Die Lösung versteckt sich in der Manpage zu podman-generate-systemd(1):

The systemd user instance is killed after the last session for the user is closed. The systemd user instance can be kept running ever after the user logs out by enabling lingering using

$ loginctl enable-linger <username>

Manual page podman-generate-systemd(1)

@Valentin: Thanks a lot, that solved my issue!

Fazit

Ich bin ehrlich gesagt hoch erfreut, dass die Entwickler hier eine Möglichkeit vorgesehen haben, um aus bestehenden Pods bzw. Container-Instanzen Systemd-Service-Units generieren zu können. Dies ermöglicht es, Container-Instanzen und Pods mit den gewohnten Werkzeugen zu starten, zu stoppen und deren Status zu kontrollieren.

So besteht die Möglichkeit, die rootless-Podman-Container auch als unprivilegierte Dienste laufen zu lassen. Das gefällt mir.

21. Februar 2021

Als Cloud noch primär für ausgelagerten Festplattenspeicherplatz stand und als Thema insgesamt noch neu war, schossen die Verschlüsselungslösungen nur so aus dem Boden. Doch was ist jetzt noch aktuell?

Ich habe heute die Übersichtsseite zur Cloud und zu Verschlüsselungslösungen für die Cloud aktualisiert. Die Liste umfasst immer noch den Dreiklang aus Boxcryptor (proprietär), Cryptomator (Open Source) und EncFS (unsicher, aber immer noch verbreitet). Hinzu kommt noch SimpleumSafe für macOS-Anwender.

Daneben gibt es noch ein paar Nischenlösungen. Anwender von KDE Plasma können mit Plasma Vault arbeiten, das aber funktional noch immer nicht den Kinderschuhen entwachsen ist und es gibt hacky Oberflächen wie Sirikali oder zulucrypt.

Bei der Überarbeitung habe ich festgestellt, dass ich mich schon lange nicht mehr intensiv mit dem Thema befasst habe, weil ich es kaum noch benötige. Gleichwohl scheint sich auf dem Gebiet auch nicht viel getan zu haben.

Cloud betreibe ich entweder in Eigenregie mit Nextcloud oder nutze meine Synology NAS als Cloud-Speicher. In meinem Umfeld habe ich den Eindruck, dass dieser Weg verbreitet ist. Wer für das Thema Cloud-Verschlüsselung sensibilisiert ist, hat irgendwann den Weg zur eigenen Cloud genommen.

Greife ich abgesehen davon auf einen Cloud-Speicher zurück, dann um Dateien zu teilen und gemeinsam zu bearbeiten. Verschlüsselung ist dann keine Funktion, die ich benötige, weil eine gemeinsame Bearbeitung von Dateien mit Ende-zu-Ende-Verschlüsselung quasi nicht möglich ist. Es soll da Lösungen geben, aber eine wirklich Funktionierende ist mir bisher nicht unter gekommen.

Darum würde mich interessieren, womit ihr so arbeitet. Nutzt ihr Cloud-Verschlüsselung überhaupt noch oder betreibt ihr eure eigene Cloud? Sofern ihr noch verschlüsselt, welche Lösung verwendet ihr? Welche Beschränkungen und Probleme gibt es?

Der Artikel Cloud-Speicher-Verschlüsselung – Was nutzt ihr? erschien zuerst auf [Mer]Curius

  1. YubiKey Teil I – Einleitende Bemerkungen
  2. YubiKey Teil II – LUKS Verschlüsselungen mit 2FA
  3. YubiKey Teil III – Zwei-Faktor-Authentifizierung mit U2F
  4. YubiKey Teil IV – KeePassXC absichern
  5. Exkurs: YubiKey-Software

Die Konfiguration des YubiKeys erfolgt über Open Source-Software. Hier gibt es parallele Lösungen, die sich unterschiedlich bedienen. Sofern verfügbar ist der YubiKey-Manager zu bevorzugen.

Recherchiert man zum YubiKey stößt man oft auf das Personalization-Tool, für das auch eine GUI gibt. Diese GUI ist so grausam (Screenshots hier), dass ich hier immer die entsprechenden Befehle für die Kommandozeile angegeben habe. Die Entwicklung des Personalization-Tools hat YubiKey aber zugunsten einer neuen Lösung eingestellt.

Neu ist der YubiKey-Manager, für den es ebenfalls eine optionale GUI gibt.

Windows und macOS-Anwender können sich die Software einfach bei Yubico herunterladen. Für Linux empfiehlt Yubico auf der Webseite das AppImage aber ich finde AppImages von allen drei modernen Formaten (Flatpak, Snap, AppImage) als unhandlichste Variante.

In den Paketquellen herrscht bei vielen Distributionen aber leider ein ganz schöner Wildwuchs mit vielen Abhängigkeiten. Bei Arch Linux zieht der neue Manager das alte Tool als Abhängigkeit mit, bei Debian scheint dies nicht notwendig zu sein, das gleiche gilt für openSUSE. Debian und Ubuntu liefern allerdings nur die CLI und nicht die GUI. Hier bietet Yubico selbst ein PPA an. Im Gegenzug zum alten Tool ist das neue Werkzeug in aktiver Entwicklung. Je nach Distribution und Releasemodell sollte also auf die Versionsnummer geachtet werden. Sternstunden der Linux-Paketierung eben.

Um den neuen Manager zu nutzen muss der pcscd Service laufen.

# systemctl start pcscd

Die GUI erlaubt es übersichtlich die Slots zu konfigurieren, aber auch Funktionen wie NFC bei Bedarf abzuschalten. Vor allem Letzteres ist sinnvoll, wenn man nur ausgewählte Funktionen verwendet.

Wer sich also sicherer mit einer GUI fühlt sollte zur neuen Variante greifen. Eine gute GUI ersetzt nämlich durchaus in vielen Fällen die Kommandozeile.

Der Artikel Exkurs: YubiKey-Software erschien zuerst auf [Mer]Curius

  1. YubiKey Teil I – Einleitende Bemerkungen
  2. YubiKey Teil II – LUKS Verschlüsselungen mit 2FA
  3. YubiKey Teil III – Zwei-Faktor-Authentifizierung mit U2F
  4. YubiKey Teil IV – KeePassXC absichern
  5. Exkurs: YubiKey-Software

Der Passwortmanager ist ein ebenso notwendiger wie neuralgischer Punkt. Er ermöglicht komplizierte und vielfältige Passwörter, aber ist gleichzeitig der Schlüssel zu unserer gesamten digitalen Identität. Hier kann man mit YubiKey für mehr Sicherheit sorgen.

KeePassXC ist eine der wenigen Erfolgsgeschichten aus einem Fork. Durch die Abspaltung von KeePassX hat die Entwicklung wieder so richtig Fahrt aufgenommen und viele tolle Funktionen wurden implementiert.

Ein Passwortmanager sollte nie nur mit einem starken Passwort geschützt sein, sondern immer noch mit einem zweiten Faktor, der sich in eurem Besitz befinden muss. Insbesondere wenn die Passwortdatenbank über einen Cloud-Speicher synchronisiert wird.

Für den niedrigschwelligen Einstieg bietet KeePassXC hier die Möglichkeit, eine Schlüsseldatei zu erzeugen. Zum Entsperren der Datenbank benötigt man dann Passphrase und Schlüsseldatei. Die Kombination von Wissen und Besitz sozusagen. Diese Schlüsseldatei bewahrt man natürlich getrennt von der Passwortdatenbank auf. Die Datenbank kann über einen Cloud-Speicher synchronisiert werden, die Schlüsseldatei sollte hingegen nie ins Internet geraten, sondern über ein Kabel oder im Heimnetz auf das Gerät übertragen werden. Da sich die Schlüsseldatei nie oder selten ändert, ist das auch kein Komfortproblem.

Mehr Sicherheit bietet hier natürlich der YubiKey, denn eine Schlüsseldatei ist schließlich auch nur eine Datei und kann theoretisch bei einem Angriff auf eurer System gestohlen werden. Der YubiKey befindet sich dagegen auch physisch in eurem Besitz.

KeePassXC mit YubiKey absichern

Legt ein Backup der Datenbank an bevor die Sicherheitseinstellungen verändert werden. Ansonsten verliert ihr bei Problemen Zugriff auf die gesamte Datenbank.

Unter Datenbank / Datenbank-Sicherheit lassen sich die verschiedenen Sicherheitsmaßnahmen konfigurieren.

KeePassXC verweist hier bereits auf die Notwendigkeit, das HMAC-SHA1 Challenge-Response Verfahren zu nutzen. Solltet ihr den YubiKey bereits für LUKS nutzen, ist Slot 2 bereits passend konfiguriert.

Über den Button YubiKey Challenge-Response hinzufügen startet die Einrichtung, die sehr einfach ist. KeePassXC erkennt den YubiKey, man bestätigt mit einem Tipp auf den Key und danach ist die Datenbank mit dem YubiKey verbunden.

Abschließend schließt ihr die Datenbank und öffnet sie erneut, um zu prüfen, ob die Entsperrung mit YubiKey klappt. Ggf. muss der Hardwareschlüssel im Aufklappmenü noch ausgewählt werden. Anschließend gibt man das Kennwort ein und klickt auf OK. In einem zweiten Schritt erfordert KeePassXC die physische Betätigung des YubiKeys.

Im Alltagsbetrieb

Die Zusammenarbeit mit YubiKey klappt fehlerfrei. Je nach Häufigkeit der Entsperrung dürfte man aber den YubiKey im Betrieb kaum noch vom Gerät abziehen.

Ein Problem ist die Synchronisation. Der KeePass-Client auf Android KeePassDX kann gegenwärtig noch nicht mit YubiKey umgehen, weshalb die Datenbank nur auf Desktop-Clients mit KeePassXC genutzt werden kann. Wie so oft sind iPhone-Anwender hier, was die Sicherheit betrifft, im Vorteil. Da ich auf meinem Android-Smartphone sowieso nur eine abgespeckte Variante der Datenbank nutze, ist das für mich kein so großes Problem.

Der Artikel YubiKey Teil IV – KeePassXC absichern erschien zuerst auf [Mer]Curius

Prolog

Durch Zufall bin ich auf restic gekommen, es ist ein Backup Programm, welches sehr ähnlich zu borg Backup funktioniert, aber von Grund auf neu geschrieben wurde und eine andere Syntax benutzt. Der Original Autor ist Alexander “fd0” Neumann, er hat das Programm in go geschrieben.

Für mich sind die herausragenden Eigenschaften:

  • Verschlüsselung der Daten (auch die Struktur ist ohne Passphrase nicht einsehbar)
  • Deduplizierung  (ist im Video von 2016³ endlich mal gut erklärt)
  • immer Vollbackups
  • man kann Snapshots auch per z.B.: SFTP Storage lokal mounten (Stichwort FUSE)
  • sehr schnell
  • Verifizierung der Daten mit Hashsummen 
  • leicht zu konfigurieren
  • integrierte Update Funktion

Hier soll es um das Backup Programm im praktischen Einsatz gehen.

Gesichert werden 2 Laptops und ein Server (später) auf meinem Storage bei Hetzner. Mein Artikel soll kein selber lesen der Dokumentation ersetzen oder ersparen, sondern ein Leitfaden für mich und Leute sein, die eine ähnliche Situation haben. Es ist also ein Notizblock, um schnell das setup zu verstehen und als Hilfe gedacht, wenn nach Monaten mal ein Problem auftritt und ich wissen möchte, wie hatte ich mir das gedacht.

Ich benutze derzeit restic nur als user zum sichern von Bildern und persönlichen Dokumenten. Natürlich würde es auch für die komplette Installation der Laptops gehen, das brauche ich aber momentan nicht.

Voraussetzungen

Hetzner hat die Besonderheit, dass der Storage über Port 22 und 23 erreichbar ist. Hinweis: Bei Hetzner ist user@name durch eure Kennung z.B. u0815@u0815 zu ersetzen, ich wollte hier nicht meinen realen Account offenbaren.

Hat man den Public_Key auf dem Storage unter .ssh/authorized_keys hinterlegt, ist der Zugriff über Port 23 für Backup Programme ohne Passwort möglich.

Einloggen per ssh ist unterbunden.

Bevor man sich einen Wolf sucht, bitte entweder mit

lftp -p 23 sftp://user@name.your-storagebox.de 
oder
sftp -P 23 user@name.your-storagebox.de

testen. Es sollte nun ohne Passwortabfrage eine Verbindung zum Storageserver hergestellt werden.

Warum lftp?

Nun es geht auch mit sftp, das ist ja standardmäßig bereits installiert, allerdings ist lftp der klare Sieger, wenn man rekursiv mal etwas löschen muss, was bei mir der Fall war, das beschreibe ich weiter unten. Ansonsten ist die Verwendung weitgehend identisch. Bei sftp gibt man den Port mit großem -P an und es versteht df -h, lftp dafür du -hs (Achtung u.U. langsam).

Eine Merkwürdigkeit ist bei lftp, dass man trotz ssh Key eine Passwort Aufforderung bekommt, wo man einfach nur <ENTER> drücken muß.

Ein Workaround um die Passwort Abfrage zu umgehen, ist der Trick, einen eigentlich unnötigen Platzhalter "platz" zu verwenden:

lftp -p 23 -u user,platz sftp://name.your-storagebox.de

Zum experimentieren mit restic verwende ich einen Alias. (Hetzner storagebox)

#                  -p password_file    -r repository pfad
alias back='restic -p ~/.ssh/restic_pw -r sftp://user@name.your-storagebox.de:23/privat/bernd/T500

Mit dem alias back erspare ich mir die Angabe des Repositories und des Passwords. Man könnte natürlich auch mit Environment Variablen arbeiten, das finde ich aber unsicherer, weil die für Angreifer leichter auslesbar wären. Ich denke z.B. aber auch an die .bash_history. Der Nachteil des Alias ist, dass man die Autocompletion von bash verliert, wenn man allerdings als alias restic verwendet, fällt dieser Nachteil weg, man handelt sich dann ggfs. andere Nachteile ein. Zum Beispiel, wenn man mit mehreren Repositories arbeiten will. 

#In restic_pw ist das lange Password des Repositories abgelegt, es darf nur für den User lesbar sein
~/.ssh/restic_pw 
chmod 600 ~/.ssh/restic_pw 

 

 

In den weiteren Beschreibungen verwende ich den Alias back und nicht restic, um Verwirrungen beim Leser zu vermeiden.

Anlegen des Repository

Vorher auf dem sftp Server nachschauen, welche Verzeichnisstruktur bereits vorhanden ist. Das Verzeichnis des Repositories wird angelegt, es muss nicht existieren! Bei mir z.B. /home/privat/bernd. wobei das /home nicht mit angegeben wird! Im obigen Beispiel ist dies bereits berücksichtigt und deshalt reicht ein einfaches

back init

created restic repository  e5f00e22 at sftp://user@name.your-storagebox.de:23/privat/bernd/T500

(...)

Damit ist in kurzer Zeit die notwendige Datenstruktur auf dem Storage angelegt und bereit für ein erstes Backup

Erstes Backup erstellen

Ich habe als erstes mal meine Dokumente gesichert.

Hier das Protokoll des dritten Aufrufes, das erst Backup lief ca. 40 Minuten

back backup Dokumente
repository e5f00e22 opened successfully, password is correct
using parent snapshot 3504f0f6

Files:           0 new,     0 changed,   139 unmodified
Dirs:            0 new,     0 changed,    12 unmodified
Added to the repo: 0 B  

processed 139 files, 2.634 GiB in 0:00
snapshot b982a7d0 saved

Backup auflisten

back snapshots 

repository e5f00e22 opened successfully, password is correct

ID        Time                 Host        Tags        Paths

--------------------------------------------------------------------------

99494f33  2021-02-18 19:01:31  T500                    /home/bed/Dokumente

3504f0f6  2021-02-19 19:42:50  T500                    /home/bed/Dokumente

b982a7d0  2021-02-19 21:10:30  T500                    /home/bed/Dokumente


--------------------------------------------------------------------------

3 snapshots

 

Backup Dateien auflisten

#back ls b982a7d0 # oder das aktuellste mit latest
back ls latest
(...)
/Dokumente/SchaubLorenz_Golf100.pdf
/Dokumente/Toshiba_TLG373.pdf
(...)

Das Ergebnis ist mit pipe weiter verarbeitbar. Zum Beipiel

back ls latest|grep -i toshiba
/Dokumente/Toshiba_TLG373.pdf

Backup Dateien suchen

restic bietet auch eine Suchfunktion

back find toshiba* --ignore-case 
repository e5f00e22 opened successfully, password is correct
Found matching entries in snapshot 3504f0f6 from 2021-02-19 09:42:50
/Dokumente/Toshiba_TLG373.pdf

Found matching entries in snapshot 99494f33 from 2021-02-18 09:01:31
/home/bed/Dokumente/Toshiba_TLG373.pdf

Found matching entries in snapshot b982a7d0 from 2021-02-19 13:10:30
/Dokumente/Toshiba_TLG373.pdf

Backup checken

Ein Hilite von restic ist die check Funktion, hier wird die Struktur auf Integrität geprüft.

Sie testet das Repository auf Fehler und meldet gefundene Fehler. Sie kann auch verwendet werden, um alle Daten zu lesen und somit eine Wiederherstellung zu simulieren.

Standardmäßig lädt der "check"-Befehl immer alle Daten direkt aus dem Repository und verwendet keinen lokalen Cache.

Die 2 Beispiele sind nicht vom T500, sondern vom Tuxedo, dort läuft durch den moderneren Prozessor auch die Hardware decryption, was natürlich dem Vorgang den Marsch bläst.

back check

time back check

using temporary cache in /tmp/restic-check-cache-775446915
repository cfa22dd6 opened successfully, password is correct
created new cache in /tmp/restic-check-cache-775446915
create exclusive lock for repository
load indexes
check all packs
check snapshots, trees and blobs

[0:01] 100.00%  3 / 3 snapshots

no errors were found


real 0m31,592s

user 0m1,660s

sys  0m0,359s
Nicht schlecht, oder? nach gerade mal 32 Sekunden weiß ich, dass mein Backup in Ordnung ist. Doch was ist wirklich los, simulieren wir doch einen kompletten Restore... des 55GiB großen Repo (ok, Download Speed nicht mit einberechnet)
back check --read-data

time back check --read-data 

using temporary cache in /tmp/restic-check-cache-410215478
repository cfa22dd6 opened successfully, password is correct
created new cache in /tmp/restic-check-cache-410215478

create exclusive lock for repository

load indexes

check all packs

check snapshots, trees and blobs
read all data  2 / 3 snapshots

[0:01] 100.00%  3 / 3 snapshots

[1:12:32] 100.00%  9019 / 9019 packs

no errors were found



real   72m58,199s

user   12m50,579s

sys    4m16,768s

 

Repository Password ändern

Beim ausprobieren und einrichten ist mir ein Fehler unterlaufen. Ich wollte eigentlich ein password file benutzen, habe es aber ich der command line nicht angegeben. Damit wurde als Password File der Private Key genommen, wahrscheinlich keine gute Idee ;-)

Das merkte ich aber erst, als das erste Backup lief.

Da es hier aber ein größeres Backup war, wollte ich es nicht neu machen, sonder habe mich nach der sehr guten Dokumentation gerichtet und einfach einen neuen Key angelegt, dann meinen Aufruf korrigiert und den nun nicht mehr notwendigen Key gelöscht. Fertig.

Weil hier der Alias back benutzt wird, besonders darauf achten, dass das hinterlegte password auch händisch im 

~/.ssh/restic_pw 

angepasst wird, sonst könnte es böse Überraschungen geben ;-)

Also:

Auflisten aller Keys
​back key list
password ändern
​back key passwd

Key hinzufügen

​back key add

Key löschen

​back key delete

Restore

Ich komme nun zum eigentlichen Zweck eines Backup Programms, dem zurückholen von einzelnen Dateien oder des gesamten gesicherten Bestands.

Zuerst feststellen was alles, wann gesichert wurde:

back snapshots
repository cfa22dd6 opened successfully, password is correct
ID        Time                 Host        Tags        Paths
--------------------------------------------------------------------------
00fbbd64  2021-02-18 19:01:26  Bullseye                /home/bed/Bilder
84e0f2bc  2021-02-19 12:17:52  Bullseye                /home/bed/Dokumente
c3d0c516  2021-02-19 17:16:48  Bullseye                /home/bed/Dokumente
7d2d6547  2021-02-19 20:07:09  Bullseye                /home/bed/Bilder
--------------------------------------------------------------------------
4 snapshots

Ich möchte die Bilder im Ordner usb-warzen zurück sichern, Witzigerweise sind die nicht im gesicherten Ordner Bilder, sondern in Dokumente.

Siehe auch Datei suchen

Einzelne Dateien finden und zurück holen
Mehrere Möglichkeiten:

back ls c3d0c516|grep usb-warzen

/Dokumente/usb-warzen
/Dokumente/usb-warzen/1.png
/Dokumente/usb-warzen/1.png_max_200kb.jpg
/Dokumente/usb-warzen/10.png
/Dokumente/usb-warzen/10.png_max_200kb.jpg
/Dokumente/usb-warzen/11.png
/Dokumente/usb-warzen/11.png_max_200kb.jpg
/Dokumente/usb-warzen/2.png
/Dokumente/usb-warzen/2.png_max_200kb.jpg
/Dokumente/usb-warzen/3.png
/Dokumente/usb-warzen/3.png_max_200kb.jpg
/Dokumente/usb-warzen/4.png
/Dokumente/usb-warzen/4.png_max_200kb.jpg
/Dokumente/usb-warzen/5.png
/Dokumente/usb-warzen/5.png_max_200kb.jpg
/Dokumente/usb-warzen/6.png
/Dokumente/usb-warzen/6.png_max_200kb.jpg
/Dokumente/usb-warzen/7.png
/Dokumente/usb-warzen/7.png_max_200kb.jpg
/Dokumente/usb-warzen/8.png
/Dokumente/usb-warzen/8.png_max_200kb.jpg
/Dokumente/usb-warzen/9.png
/Dokumente/usb-warzen/9.png_max_200kb.jpg

back ls latest listet alle Dateien auf, die gesichert worden, kann prima mit pipe und den unix tools verarbeitet werden.

z.B.

back ls latest|grep usb-warzen

Kein Treffer

Aber Achtung! latest listet also nur den aktuellen snapshot, wenn man nach Bildern sucht passt das hier zufällig, wenn man Dokumente finden will, muss in diesem Fall die korrekte snapshotid verwendet werden.

 

Oder das Kommando find nutzen Achtung Case sensitiv! 

Vorteil gegenüber der ersten Methode, es sucht in allen snapshots...

back find  usb-warzen*

repository cfa22dd6 opened successfully, password is correct

Found matching entries in snapshot 84e0f2bc from 2021-02-19 12:17:52

/Dokumente/usb-warzen

/Dokumente/usb-warzen/1.png

/Dokumente/usb-warzen/1.png_max_200kb.jpg

/Dokumente/usb-warzen/10.png

/Dokumente/usb-warzen/10.png_max_200kb.jpg

/Dokumente/usb-warzen/11.png

/Dokumente/usb-warzen/11.png_max_200kb.jpg

/Dokumente/usb-warzen/2.png

/Dokumente/usb-warzen/2.png_max_200kb.jpg

/Dokumente/usb-warzen/3.png

/Dokumente/usb-warzen/3.png_max_200kb.jpg

/Dokumente/usb-warzen/4.png

/Dokumente/usb-warzen/4.png_max_200kb.jpg

/Dokumente/usb-warzen/5.png

/Dokumente/usb-warzen/5.png_max_200kb.jpg

/Dokumente/usb-warzen/6.png

/Dokumente/usb-warzen/6.png_max_200kb.jpg

/Dokumente/usb-warzen/7.png

/Dokumente/usb-warzen/7.png_max_200kb.jpg

/Dokumente/usb-warzen/8.png

/Dokumente/usb-warzen/8.png_max_200kb.jpg

/Dokumente/usb-warzen/9.png

/Dokumente/usb-warzen/9.png_max_200kb.jpg


Found matching entries in snapshot c3d0c516 from 2021-02-19 17:16:48

/Dokumente/usb-warzen/1.png

/Dokumente/usb-warzen/1.png_max_200kb.jpg

/Dokumente/usb-warzen/10.png

/Dokumente/usb-warzen/10.png_max_200kb.jpg

/Dokumente/usb-warzen/11.png

/Dokumente/usb-warzen/11.png_max_200kb.jpg

/Dokumente/usb-warzen/2.png

/Dokumente/usb-warzen/2.png_max_200kb.jpg

/Dokumente/usb-warzen/3.png

/Dokumente/usb-warzen/3.png_max_200kb.jpg

/Dokumente/usb-warzen/4.png

/Dokumente/usb-warzen/4.png_max_200kb.jpg

/Dokumente/usb-warzen/5.png

/Dokumente/usb-warzen/5.png_max_200kb.jpg

/Dokumente/usb-warzen/6.png

/Dokumente/usb-warzen/6.png_max_200kb.jpg

/Dokumente/usb-warzen/7.png

/Dokumente/usb-warzen/7.png_max_200kb.jpg

/Dokumente/usb-warzen/8.png

/Dokumente/usb-warzen/8.png_max_200kb.jpg

/Dokumente/usb-warzen/9.png

/Dokumente/usb-warzen/9.png_max_200kb.jpg

 

Angenommen, ich möchte das Verzeichnis /Dokumente/usb-warzen/  wieder herstellen, es aber, weil ich unsicher bin vorerst in /tmp speichern: 

time back restore c3d0c516 -i /Dokumente/usb-warzen/ --target /tmp
repository cfa22dd6 opened successfully, password is correct

restoring <Snapshot c3d0c516 of [/home/bed/Dokumente] at 2021-02-19 17:16:48.706292257 +0100 CET by bed@Bullseye> to /tmp


real    0m17,422s

user    0m1,095s

sys    0m0,399s

bed@Bullseye:~$ ls -ltr /tmp/Dokumente/usb-warzen/

insgesamt 24392
-rw-r--r-- 1 bed bed 1851594 11. Nov 19:28 7.png
-rw-r--r-- 1 bed bed 1484032 11. Nov 19:28 2.png
-rw-r--r-- 1 bed bed 1573462 11. Nov 19:28 1.png
-rw-r--r-- 1 bed bed 1877277 11. Nov 19:28 6.png
-rw-r--r-- 1 bed bed 1629634 11. Nov 19:28 5.png
-rw-r--r-- 1 bed bed  600155 11. Nov 19:28 4.png
-rw-r--r-- 1 bed bed 4588086 11. Nov 19:28 3.png
-rw-r--r-- 1 bed bed 1615798 11. Nov 19:28 9.png
-rw-r--r-- 1 bed bed 1986633 11. Nov 19:28 8.png
-rw-r--r-- 1 bed bed 2383447 11. Nov 19:28 10.png
-rw-r--r-- 1 bed bed  168904 11. Nov 19:28 9.png_max_200kb.jpg
-rw-r--r-- 1 bed bed  187365 11. Nov 19:28 8.png_max_200kb.jpg
-rw-r--r-- 1 bed bed  188381 11. Nov 19:28 7.png_max_200kb.jpg
-rw-r--r-- 1 bed bed  191964 11. Nov 19:28 6.png_max_200kb.jpg
-rw-r--r-- 1 bed bed  188648 11. Nov 19:28 5.png_max_200kb.jpg
-rw-r--r-- 1 bed bed  166986 11. Nov 19:28 4.png_max_200kb.jpg
-rw-r--r-- 1 bed bed  198799 11. Nov 19:28 3.png_max_200kb.jpg
-rw-r--r-- 1 bed bed  198531 11. Nov 19:28 2.png_max_200kb.jpg
-rw-r--r-- 1 bed bed  180148 11. Nov 19:28 1.png_max_200kb.jpg
-rw-r--r-- 1 bed bed  199263 11. Nov 19:28 11.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 3276158 11. Nov 19:28 11.png
-rw-r--r-- 1 bed bed  197313 11. Nov 19:28 10.png_max_200kb.jpg


Wie lösche ich auf dem sftp Server rekursiv?

Das hat zwar direkt nichts mit restic zu tun, aber da ich es beim experimentieren brauchte ....

Weil ich mich beim Testen im Pfad geirrt hatte, war der Wunsch nach einem rekursiven Löschen vorhanden.

lftp bietet das und erspart damit u.U. eine Menge Tipparbeit :-) (Bei Debian apt install lftp)

Bei lftp gibt man einfach rm -r Directory ein, dann rattert es im Karton und man kann derweil in einem anderen Tab weiterarbeiten.

 

 

Wenn ich überhaupt mäkeln wollte, dann ist es der name "restic" Wie bitte? Weiß jemand wie dieser Name zu Stande kam? Ich habe gefragt, ein Namengenerator war schuld ;-) Aber mittlerweile kann ich restic fehlerfrei tippen, alles gut.

Eine gute Idee ist immer back command --help. (oder eben restic command --help)

Damit komme ich gut zurecht.

Ps: Ich musste den Quellcode editieren, werde wohl auch noch etwas dran schrauben, also ab- und zu mal schauen, wen es denn interessiert ...

Linksammlung:

blog.datentraeger.li/?p=1733 

techgoat.net/index.php?id=5 

³ media.ccc.de/v/c4.openchaos.2016.01.restic

restic.readthedocs.io/en/stable/index.html

 

 

Es geht bergauf!

Es geht bergauf und es ist nicht schön. Jetzt hatten wir wochenlang Teillockdown und die Diskussionen gingen gerade los, wer zuerst aufmachen darf, mit Frisören und Schulen in Reihe eins, und dann sowas!

Für Mo., Di., Mi. und Do. zeigt der Wochentagsgraph (basierend auf den Daten von worldometers) hinten einen kleinen Anstieg – allerdings nicht für Fr. (gestern).

Woher sind die Grapen? Nun, mit einem Script selbst generiert. Der schleichende Durchschnitt hat auch seine Berechtigung – zumindest der über 7 Tage, in dem über 3 Tage sehe ich keinen Sinn, und die Haifischzähne im Wochenverlauf scheinen ein globales Phänomen zu sein.

Ich fürchte, dass während die Zahlen maßnahmenbedingt zurückgingen stiegen gleichzeitig die Zahlen durch die Mutanten im Untergrund an, und jetzt haben sich die beiden Trends gekreuzt. Ich bin da aber natürlich Laie, wie viele andere auch.

Das Basteln der ersten Graphen war noch viel Handarbeit, aber dann wurde es von mir teilautomatisiert, so dass das Script die Daten jeden Tag neu runterlädt.

#!/bin/bash
# 
# Coronadaten von worldometers nach Wochentag getrennt anzeigen
#
# @DONE: Lines einfärben nach Wochentag
# @DONE: Automatisieren. 
#
# Lizenz: GPLv3  
#

yvals=($(wget -O - https://www.worldometers.info/coronavirus/country/germany/ 2>/dev/null | sed -ne "s/,/ /g; /name: 'Daily Cases'/,/]/ {s/data: \[null//; s/].*}//p}"))

ny=${#yvals[@]}

for i in $(seq 0 $((ny-1)))
do
	echo -e "$i\t${yvals[$i]}"
done > xy.dat

tag=(dummy Sa So Mo Di Mi Do Fr)
farbe=(dummy black blue olive red dark-grey grey web-green)

max () {
	echo $@ | tr " " "\n" | sort -n | tail -n 1
}

maxy=$(max ${yvals[@]})

zeros=${maxy//[0-9]/0}
top=$((${maxy:0:2}+1))${maxy:3:-0}${zeros:2}
echo top $top

# leeren
echo >  plot7.plt

# In 7-Tagesschritten von Sa. bis Fr. (weil Sa. 1. Meßpunkt ist, Sa:=1) durchlaufen, getrennte Dateien erzeugen
for i in {1..7}; do sed -n "$i~7p" xy.dat > wotag-$i-${tag[$i]}.csv ; done
# Gnuplot-Datei erzeugen
for i in {1..7}; do
	echo "
	set term qt
	set xrange [0:$((ny*105/100))]
	set yrange [0:$top]
	set title \"${tag[$i]}\"
	plot \"wotag-$i-${tag[$i]}.csv\" using 1:2 with linespoint lc \"${farbe[$i]}\"
	set output  \"wotag-$i-${tag[$i]}.png\"
	set term png
	replot"
done >> plot7.plt
gnuplot -p plot7.plt
# eog: Eye-of-Gnome Bildbetrachter.
eog wotag-[1-7]-*.png

(Update 22.2.’21 Das Ausgabeformat habe ich nachträglich auf png geändert (set term png; set output ….png) und den Bildbetrachteraufruf eog am Ende angefügt.)

Anfangs speicherte ich die Seite vom Browser aus im Modus „Seitenquelltext anzeigen“. Er liefert keine fertige Bilddatei aus, sondern die Daten und generiert aus diesen die Grafik on the fly. So kommt man also einfach an die Daten.

Zu Beginn zeigt das Script einen Shebang, der dem Kernel sagt, wie das Programm auszuführen ist. Es folgen Kommentare mit der Gnu-Public-Lizence.

Dann der Code, um das HTML als Datei runterzuladen, dafür nimmt man wget.

yvals=($(wget -O - https://www.worldometers.info/coronavirus/country/germany/ 2>/dev/null | sed -ne "s/,/ /g; /name: 'Daily Cases'/,/]/ {s/data: [null//; s/].*}//p}"))

Mit -O gibt man den Outputort an, meist einen Dateinamen, aber wie viele Shellwerkzeuge, kann auch wget ein isoliertes Minuszeichen übergeben werden, dann wird die Ausgabe auf Stdout, den Bildschirm, ausgegeben.

Aber wget ist geschwätzig und zeigt mit großem Brimborium an, wieviel Prozent schon runtergeladen wurden, Datum, Uhrzeit, Url, IP-Adresse und weiß der Teufel – den Müll kann man mit 2>/dev/null ins Nirwana umleiten.

Der restliche Output wird mit einer Pipe an Sed geleitet, den Stream-Editor, spezialisiert für solche Jobs und mit einer konzentrierten Syntax ausgestattet, um die Ausgabe zu schneiden, umzuformen, zu ergänzen, zu manipulieren.

Mit sed wandel ich alle Kommas in Leerzeichen um. Ich will alles in ein großes Array schreiben, und die Syntax sieht so aus:

yvals=(3 4 2 1 9)

Aber die Quelle liefert

data: [3,4,2,1,9]

Auch interessiert mich nur der Abschnitt „Daily Cases“ und darin nur die Zeile „data“. Die nächste, kryptisch wirkende Zeile, ermittelt die Arraygröße.

Die folgende Forschleife läuft durch alle Werte, und gibt Zeilenweise die Indexnummer und die Anzahl bestätigter Neuinfektionen aus. Die Umlenkung hinter der Schleife lenkt all das in eine Datei xy.dat.

ny=${#yvals[@]}

for i in $(seq 0 $((ny-1)))
do
	echo -e "$i\t${yvals[$i]}"
done > xy.dat

Die Beispieldaten oben sähen damit etwa so aus:

0	3
1	4
2	2
3	1
4	9

Dann folgen zwei Arrays mit Namen für die Wochentage – da die Shell ab 0 zählt, aber ich ab 1, habe ich einen dummy für die 0 eingefügt. Ähnlich für die Farben des Graphen.

tag=(dummy Sa So Mo Di Mi Do Fr)
farbe=(dummy black blue olive red dark-grey grey web-green)

max () {
	echo $@ | tr " " "\n" | sort -n | tail -n 1
}

Dann sehen wir eine max-Funktion. Sie übergibt alle Argumente des Arrays, die mit Leerzeichen getrennt sind, und ersetzt die Leerzeichen mit tr, dem Zeichentranslator, mit Zeilenumbrüchen. Die Zeilen werden mit sort sortiert und tail -n1 nimmt vom Ende eine Zeile, da steht nach Adam Riese das Maximum drin.

Die nächste Zeile ruft die max-Funktion mit unserem Array auf.

maxy=$(max ${yvals[@]})

zeros=${maxy//[0-9]/0}
top=$((${maxy:0:2}+1))${maxy:3:-0}${zeros:2}
echo top $top

Dann folgt eine komplexe Häßlichkeit, die einen Wert wie 31554 nimmt, die 31 vorne abschneidet, zu 32 hochrechnet, und 000 hinten anhängt aber auch mit Werten zwischen 100 und 99999999 zurechtkommen sollte.

Sie dient dazu dem Plotprogramm zu sagen, wie groß der y-Wert werden darf, aber einen aufgerundeten Wert zu verwenden mit etwas Luft nach oben. Da die Werte je nach Wochentag gehörig schwanken führt die automatische Range-auswertung von gnuplot sonst dazu, dass der Achsenmaßstab von Tag zu Tag schwankt.

# leeren
echo >  plot7.plt

Dies löscht die plot7.plt-Datei von gestern oder neulich. Dann schreibe ich, wieder mit sed, das ein Kommando dafür hat, jede 7. Zeile in eine Datei, und das für 7 unterschiedliche Startwerte, sprich Wochentage, in 7 unterschiedliche Zieldateien (.csv).

for i in {1..7}
do
  sed -n "$i~7p" xy.dat > wotag-$i-${tag[$i]}.csv
done

Dann werden je Wochentag ca. 8 Befehle in die Plotdatei geschrieben.

# Gnuplot-Datei erzeugen
for i in {1..7}; do
	echo "
	set term qt
	set xrange [0:$((ny*105/100))]
	set yrange [0:$top]
	set title \"${tag[$i]}\"
	plot \"wotag-$i-${tag[$i]}.csv\" using 1:2 with linespoint lc \"${farbe[$i]}\"
	set output  \"wotag-$i-${tag[$i]}.png\"
	set term png
	replot"
done >> plot7.plt

Das set term qt setzt die Ausgabe auf den Grafikfenstermodus. QT ist eine Firma, QT-Trolltech o.ä., die eine bekannte, plattformübergreifende Grafikbibliothek für C++ geschrieben hat, ähnlich wie GTK (C) oder Swing (Java).

Mit set xrange [von:bis]` legt man die x-Achse fest. Auch hier lasse ich etwas Luft.

Das `set title XY` bringt die Wochentage von oben ins Bild. Man will nicht im Kopf behalten müssen, dass die Datenerfassung an einem Freitag begann – oder war es Samstag?

Dann wird verklausuliert gesagt, dass die Daten von – Beispielsweise wotag-3-Mo.csv zu plotten sind. Dann ist So=2 und Sa=1, also doch Sa! Using 1:2 sind die Spalten der Datei, mehr gibt’s eh nicht, und linespoint verbindet die Datenpunkte, hebt sie aber auch vor. `lc N` setzt die linecolor, falls das wer manipulieren will. Für jeden Tag gebe ich dann einen Dateinamen an, in den das Ergebnis geschieben werden soll. Man könnte auch png, jpg, pdf usw. wählen.

Mit set term png sage ich dem Programm, dass das Format png sein soll; das extrapoliert gnuplot nicht aus dem Namen.

Oben wurde schon mal plot aufgerufen. Hier reicht ein `replot`, wenn man keinen Parameter ändern will. Das eine zeigt am Schirm in einem Fenster an, das andere schreibt in eine Datei.

Die Befehle werden aber nicht unmittelbar ausgeführt, sondern in eine Datei geschrieben und am Ende wird gnuplot aufgerufen, um die Aktionen durchzuführen.

Dabei wird die Bildschirmausgabe aber so schnell durchlaufen, dass man außer dem letzten Bild nichts sieht. Zur Kontrolle, ob nichts schiefläuft, sollte das reichen.

Alle Dateien landen im aktuellen Verzeichnis, also empfiehlt es sich dafür ein neues Verzeichnis anzulegen.

Zusammengefügt habe ich ursprünglich 7 svg-Dateien von Hand.

Das habe nun zu PNG geändert, denn die lassen sich mit einem Betrachter wie eog leicht alle ansehen, oder als Referenzen in ein SVG laden, das sich dann automatisch aktualisiert, wenn die Dateien mit altem Namen und neuen Daten überschrieben werden.

Die CSV-Dateien sind z.Zt. kl. als 500 Bytes, die PNGs < 6kb, je.

Das Datum aus den xValues zu extrahieren ist möglich, aber eine lesbare Ausgabe daraus zu bauen ist mir zu viel Gefummel.

So sieht die fertige Plotdatei aus (hier noch mit SVGs):

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Sa"
	plot "wotag-1-Sa.csv" using 1:2 with linespoint lc "black"
	set output  "wotag-1-Sa.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "So"
	plot "wotag-2-So.csv" using 1:2 with linespoint lc "blue"
	set output  "wotag-2-So.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Mo"
	plot "wotag-3-Mo.csv" using 1:2 with linespoint lc "olive"
	set output  "wotag-3-Mo.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Di"
	plot "wotag-4-Di.csv" using 1:2 with linespoint lc "red"
	set output  "wotag-4-Di.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Mi"
	plot "wotag-5-Mi.csv" using 1:2 with linespoint lc "dark-grey"
	set output  "wotag-5-Mi.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Do"
	plot "wotag-6-Do.csv" using 1:2 with linespoint lc "grey"
	set output  "wotag-6-Do.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Fr"
	plot "wotag-7-Fr.csv" using 1:2 with linespoint lc "web-green"
	set output  "wotag-7-Fr.svg"
	set term svg
	replot

Diese Ranges könnte man vor den Rest rausziehen, aber das ist mehr Arbeit als Nutzen. Fragen zum Script beantworte ich gerne.

Man benötigt Linux, bei dem die meisten Tools mit an Bord sind (tr, bash, sed, sort, tail) oder leicht nachinstalliert werden können (gnuplot, wget). Unter Windows ist es für jemanden, der nicht schon Erfahrungen mit Scripten hat, mühsam, alles zu installieren und einzurichten, aber möglich. Macs haben ja ein Open-BSD als Basis, inklusive Bash, da sollte es fast so leicht sein wie unter Linux.

20. Februar 2021

Es gibt Bereiche, da gibt es keine Kompromisse. Entweder man bewegt sich Anonym im Internet oder nicht. Es gibt keine halbe Anonymität. Die Fallstricke hier sind zahlreich.

Der erste Fallstrick besteht schon darin, es irgendwie praktisch zu haben zu wollen. Immer mal weder kommen Dienste auf, die einem irgendwas abnehmen wollen und behaupten, einen mit ein, zwei Klicks abzusichern. Die größten Scharlatane sind sicherlich die Anbieter der heftig beworbenen VPN-Dienste, die irgendwas von Anonymität behaupten. Nicht besser sind aber Angebote wie Brave Browser, wie man heute lesen konnte. Versehentlich hat man über den integrierten Tor-Dienst aufgerufene URLs an den DNS-Server geleakt. Abgesehen davon natürlich, dass die Tor-Funktion im Brave Browser sowieso nur einen Bruchteil der Funktionen des Tor-Browsers umsetzt und eine Wiedererkennung nicht effizient verhindert.

Tails und der Tor-Browser sind unbequem. Sie leiden an digitaler Amnesie, haben nicht die passenden Addons und das Browserfenster hat immer so eine nervige Größe. Außerdem lassen sie sich nicht fest installieren und sind langsam. Das machen die Entwickler nicht, weil sie die Anwender ärgern wollen, sondern um den Zweck zu erreichen.

Wenn ihr Anonymität braucht, lasst die Finger von diesen vermeintlich leichten Lösungen. Wenn irgendjemand etwas leichter umsetzen kann, was die Originalentwickler kompliziert machen, dann sollte das erst einmal Argwohn wecken. Wenn ihr schon keine Lust habt, euch technisch zu beschränkten, dann werdet ihr beim sozialen Aspekt sowieso scheitern. Denn neben technisch schlecht umgesetzten Lösungen besteht die größte Gefahr in Fehlern des Anwenders. Mal nicht aufgepasst und mit dem falschen Login angemeldet, mal mit dem Klarnamen unterschrieben, mal das Tab im falschen Browser geöffnet und schon ist die sorgsam aufgebaute Identität unrettbar kompromittiert.

Der Artikel Kommentar: Keine Kompromisse bei der Anonymität erschien zuerst auf [Mer]Curius

KDE hat KIO, GNOME hat GVFS – soweit der übliche Dualismus. Angeblich soll Wettbewerb ja förderlich für die Entwicklung sein. KIO konnte leider praktisch nie mit GVFS mithalten, weil nur KDE Programme damit arbeiten konnten.

Das ist schon immer ärgerlich gewesen, denn ein einfach zu nutzendes System von Netzwerkfreigaben ist eine Grundvoraussetzung, um erfolgreich mit einem NAS arbeiten zu können. Ich fand es in diesem Kontext auch immer bedauerlich, wenn sogar in Anfängerforen immer aus der Not heraus auf eine Einbindung in die fstab verwiesen wurde. Linux ist in vielen Bereichen sonst schon sehr viel weiter. Wenn das nicht klappt, ohne Netzwerke über mehrere Semester zu studieren, wandern eben doch wieder alle in Cloud und synchronisieren via Dropbox und sichern bei Google Drive. Kosten sind damit schließlich kaum noch verbunden und die Hürden viel niedriger. Datenschutz und Privatsphäre fallen dann meist hinten runter.

Diese Lücke wurde angeblich in den letzten Monaten geschlossen, denn KIO-FUSE sollte nun entfernte Verzeichnisse mittels FUSE einbinden und damit auch für Programme nutzbar machen, die nicht mit KIO umgehen können. Eine ärgerliche Lücke und um so froher war ich, als diese nun endlich geschlossen sein sollte.

Jedenfalls konnte man das die letzten Monate überall lesen:

Schon damals klappte das hier nicht, aber ich ließ das erst mal ruhen und wollte abwarten, was es so für Berichte gibt.

Einige Distributionen haben das jetzt auch paketiert. Wenn man aber nach einer Dokumentation sucht oder einer Manpage, findet sich nichts. Die Funktion klappt auch nicht „out of the Box„. Jedenfalls nicht mit openSUSE Tumbleweed und Arch Linux.

Das wirft bei mir zwei Fragen auf:

  1. Hat das überhaupt mal jemand erfolgreich zum Laufen bekommen?
  2. Gibt es dafür eine Dokumentation?

Ich finde es sehr befremdlich, wenn mit einer solchen Funktion basierend auf einer so dünnen Informationslage, hausieren gegangen wird.

Update 20.02.21

Man muss kio-fuse ggf. direkt im entsprechenden Installationsverzeichnis starten und anschließend über sftp:// in Dolphin mounten. Normal eingebundene Freigaben werden nicht automatisch umgestellt. Der Komfortgewinn ist somit nahezu nicht vorhanden und die großspurige Ankündigung der Funktion maßlos übertrieben. KIO kommt auch mit kio-fuse nicht in die Nähe von einer praktischen Verwaltung entfernter Dateisysteme wie GVFS sie für Gtk-basierte Umgebungen bietet.

Der Artikel KIO-FUSE – Ankündigungs-Fata Morgana? erschien zuerst auf [Mer]Curius

19. Februar 2021

Was ist das und warum ausgerechnet ich

Obsidian ist eine ziemlich intelligent gebaute Software rund um die Themen: Notizzettel, Knowledgebase, Wiki, Ideensammlung. Also alles was man so aufschreibt und sammelt, aber nie so genau weiß: soll ich das jetzt in meiner Textverarbeitung schreiben, oder als reine Textdatei, oder in meiner speziellen Software für z.B. Rezepte oder auf dem Smartphone oder nur auf dem Rechner, oder oder oder … einfach zu viele Frage, zuviele Möglichkeiten und die allermeisten dieser Möglichkeiten sind einfach zu begrenzt, weil “geht nur als APP” , “Hat ein eigenes Dateiformat", “kann nicht exportiert werden", “kann nicht synchronisiert werden", als dass es auf Dauer gut gehen würde.

 

Update 19.02.2021: Ich habe zu Obsidian ein Tutorial mit einer grundsätzlichen Einführung produziert. Weiter unten sind auch noch weitere Quellen hinzugefügt

 

Am einfachsten wäre eine Textdatei, denn die kann man unter Linux, Windows, Mac, Android, iOS oder wasweissichdennschon öffnen und bearbeiten. Aber es bleibt ja nicht nur bei einer Textdatei, sondern das summiert sich ja. Also hat man irgendwann eine Menge Textdateien. Nächstes Problem: wenn man die Textdateien öffnet, sehen die schnöde aus. Oder sehr merkwürdig, weil man versucht mit Sonderzeichen irgendwelche Layouts zu kreieren, die auch nicht wirklich befriedigen. Fett, Kursiv und Überschriften wären echt hilfreich.
Dann kommen weitere Problem: Wie finde ich bei vielen Textdateien das was ich suche? Wie sieht das irgendwann in Zukunft aus,wenn ich das System wechsle? Wie mache ich mich abhängig von einer Software? Was mache ich, wenn ich diese Software nicht mehr bekommen kann?

 

Auf all diese Fragen gibt es zwei Antworten: Obsidian und Markdown

 

Markdown

Fangen wir von hinten an. Markdown ist eine “Sprache” zur Formatierung und Gliederung von Texten. Also Fett, Kursiv, Durchgestrichen, Überschriften, Tabellen, Aufzählungen und so weiter. Die Sprache ist so gehalten, dass man sie in einen normalen Text mit integrieren kann. Ein wenig wie HTML, nur einfacher und lesbarer.

Beispiele

  • Eine Überschrift würde man so schreiben # Kapitel 2
  • Eine untergeordnete Überschrift wäre dann ## Kapitel 2.1 und so weiter
  • Einen kursiven Text würde man *kursiv* schreiben, einen fett gedruckten Text würde man **fett** schreiben und fett+kursiv so ***fett kursiv***
  • Todos

    •  Einkaufen
    •  chillen und Pizza

Und von diesen Formatierungen gibt es noch richtig viel mehr https://www.markdownguide.org/basic-syntax/

Alles wirklich immer noch gut lesbar in einer normalen Textdatei. Aber schön? Nun, es gibt richtig viele Markdown Editoren für alle möglichen Betriebssysteme inklusive Smartphones. Diese stellen diese Formatierungen im Text gleich richtig dar und viele davon haben auch noch einen “Preview Modus", in dem der Text ohne die Formatierungszeichen, aber mit dem gewünschten Layout dargestellt wird. Also in Schön.

 

Obsidian

Damit kommt Obsidian ins Spiel. Was ist Obsidian eigentlich genau?
Obsidian ist ein

  • Markdown Preview & Editor
  • Dateiverwaltung
  • Suchmaschine
  • Voll integrierte Markdown Suite mit zusätzlich integrierten Funktionen, die auch vollständig nur mit der Tastatur bedienbar ist, wenn man das möchte

Obsidian verwaltet einfach nur das was da ist. Hat man also eine Struktur mit Unterverzeichnissen und den entsprechenden Dateien schon erstellt, dann “stülpt” man Obsidian einfach nur darüber und fertig. Hat man sowas noch nicht, dann startet man mit Obsidian einfach einen eigenen “Vault". Ein Vault ist sowas wie eine Instanz oder Knowledgedatenbank. Man kann verschiedene Vaults anlegen und zwischen ihnen wechseln. Neue Markdown Dateien fügt man einfach per Import oder per Copy’n'Paste hinzu. Wenn man erstmal verstanden hat, was man damit eigentlich machen kann und vor allem wie uneingeschränkt über alle Systeme und sehr zukunftssicher, dann will man diese Art der Wissenssammlung nicht mehr missen.

 

Achja, als kleines Info-Schmankerl: Es gibt viele Anwendung, die als Input Markdown verwenden. So kann man auch aus seinen Texten schöne PDF Dateien erzeugen. Oder wenn man seine Sammlung über verschiedene Geräte synchronisieren möchte, kann man das Verzeichnis mit all den Unterverzeichnissen und Textdateien einfach mit z.B. einer Nextcloud automatisch synchronisieren lassen. Dadurch, dass es nur kleine Textdateien sind, geht die Synchronisation super schnell, auch wenn die Leitung extrem schmal ist. UND Ihr könnt Markdown Dateien auch direkt in der Nextcloud editieren. Es gibt dort nämlich auch einen Markdown Editor. Probiert es einfach aus!

 

Obsidian ist aktuell in der Version 0.6.4 0.7.3 0.11 für Linux, Windows und Mac hier https://obsidian.md frei und kostenlos runterladbar. Es sind weitere Features geplant, die die Eingabe und Verwaltung noch komfortabler machen soll, als sie jetzt schon ist.

 

Weitere Quellen

  1. Markdown in Obsidian https://publish.obsidian.md/help/How+to/Basic+note+taking
  2. Markdown Wikipedia https://de.wikipedia.org/wiki/Markdown

 

 

 

IceWM ist einer der Klassiker unter den Linux-Fenstermanagern – 1997 entstand die erste Version. Schon damals wirkte er ein wenig retro – und blieb in den folgenden Jahren doch immer auf der Höhe der Zeit. Aktuell zählt er zu den wenigen aktiv weiterentwickelten Projekten aus alten Zeiten.

Fluxbox macht neuerdings Schwierigkeiten mit dem Multimonitorsetup, auch Openbox scheint ausentwickelt, JWM beherrscht keine Fensterlisten – was nimmt man da also am besten, wenn man einen einfachen Nicht-Tiling-Fenstermanager benötigt? Moment, da gab es doch noch was: Na klar: IceWM!

IceWM war einst mein persönlicher Einstieg in die Welt der minimalistischen Linuxoberflächen – das war, als KDE 2, Gnome 1.4 und Windows ME aktuell waren. Die Vorteile damals waren eine niedrige Einstiegshürde bei der Konfiguration und ein Windows-ähnliches Grundaussehen. Mit IceWM ließ sich auch als Linux-Anfänger schnell ein sehr individueller Desktop zusammenzimmern, da er schon eine gut vorkonfigurierte Taskbar mitbrachte und man sich von dort gut durch die selbsterklärenden Configdateien hangeln konnte. Daran hat sich bis heute eigentlich nichts geändert.

Kontinuität

Eine alte Konfigurationsdatei von damals war noch aufzutreiben – und funktioniert anstandslos mit der aktuellen Version. Nach knapp 20 Jahren hat man wieder seine Arbeitsumgebung von einst vor Augen. Erstaunlich. Die Faszination für eine schlichte Oberfläche ist dabei ungebrochen: Die Möglichkeit, in Menüs alles genau so anzuordnen, wie man es benötigt, sticht allen Komfort von Gnome, KDE & Co. immer wieder aus, gerade wenn man für ein System keine ausgewachsene Desktopumgebung benötigt. Der Geschwindigkeitsgewinn kommt obendrauf. Und – ein kleiner Seitenhieb auf die Gnome-Shell muss sein – seit selbst die Desktops auf Desktopsymbole verzichten, werden die Unterschiede zu Nur-Fenstermanagern sogar wieder geringer.

Die Rechner sind heute so flott, dass es eigentlich keinen Unterschied mehr macht, ob man Gnome, KDE oder einen Fenstermanager laufen lässt. Auf Animationen und graphischen Komfort will man auch kaum mehr verzichten. Doch IceWM findet offenbar trotzdem weiterhin seine Fans – und wird seit einiger Zeit sogar wieder aktiv weiterentwickelt, nachdem die Entwickler mehrmals wechselten. Distributionen wie Fedora liefern bereits die neuen Versionen aus.

Eine Schwachstelle von IceWM war damals die Optik: Wirklich gute Themes und Dekorationen gab es nicht, nur Windows- und OS/2-Imitationen und sonst sehr viele sehr bunte, verspielte „Raumschiffkommandozentralen“. Aus Ermangelung an schlichten, unaufdringlichen Themes begann ich damals einfach selbst, ein paar für den Eigengebrauch zu entwerfen, um die Funktionalität und das Handling von IceWM zu nutzen, aber das Ganze etwas ästhetischer aussehen zu lassen.

Ein Wiedersehen mit der eigenen Arbeit

Umso erstaunter war ich, als IceWM nun wieder auf der Platte landete – und mit ihm ein paar neue Standardthemes. die wirklich gut benutzbar sind. Noch erstaunter war ich, als sie mir sehr bekannt vorkamen. Jemand hat tatsächlich das Theme „NiceKristall“, eine Weiterentwicklung meines Themes „N-Icedesert“, benutzt, um für die AntiX-Distribution einen Satz Standardthemes unter dem Namen „Clearview“ zu entwerfen. Über diesen Umweg ist es auch in andere Distributionen gelangt, die IceWM paketieren – und somit zurück auf den eigenen Rechner. Ein wirklich nettes Wiedersehen. Open Source funktioniert. ;-)

Und wie nutzt sich IceWM nun im Jahre 2021? Immer noch genauso wie damals. Es gibt inzwischen auch noch andere schöne schlichte Themes, mit z. B. „win8“ oder „Shades of Grey“ oder „IceMint“ lässt sich IceWM in eine sehr modern wirkende, flotte Arbeitsumgebung verwandeln. In Kombination mit z. B. Compton bekommt man auch transparente Menüeffekte. Nur auf manuelles Tiling, eine Snap-Funktion, muss man verzichten, wie auch auf alle anderen graphischen Spielereien. Dafür fällt die Konfiguration und Bedienung so umfangreich aus wie eh und je. Während die Grundkonfiguration in einer zentralen Textdatei erledigt wird, lassen sich davon abweichend während des Betriebs Änderungen graphisch über das Hauptmenü vornehmen – beim nächsten Start werden wieder die Einstellungen aus der Textdatei verwendet. Anpassungen des Menüs, das nicht nur über den „Startbutton“, sondern auch über einen Kontextklick auf den freien Desktop erreicht wird, sowie die Bestückung der Taskleiste werden über separate Textdateien bewerkstelligt.

18. Februar 2021

Für Gtk-basierte Desktopumgebungen gibt es vermutlich eine Million Themes, für KDE gibt es fast nur den Standard Breeze und den vorherigen Standard Oxygen. Nun gibt es mit Lightly einen modernisierten Fork von Breeze.

Ich mochte Breeze immer, sowohl das Widgetdesign als auch die Icons sind hübsch und funktional. Die Veröffentlichung von KDE Plasma 5 liegt nun aber schon ein wenig zurück und Designtrends ändern sich. Bei macOS 11 kann man beobachten, dass das Pendel wieder etwas von der absoluten Reduktion in Richtung mehr grafische Darstellung zurück schwingt.

Ich persönlich finde außerdem vieles bei Breeze „gequetsch“. Ich habe FullHD auf einem 14″ Monitor, da darf ruhig ein wenig Platz um die Bedienelemente sein. Außerdem kann man auch jenseits von wabbelnden Fenstern grafische Effekte sinnvoll einsetzen.

Die Installation erfolgt bei openSUSE und Fedora aus einem Zusatz-Repositorium. Arch-Nutzer können das AUR bemühen.

Ich beobachte das Projekt schon länger aber mit Version 0.4 nähert man sich einem benutzbaren Zustand an. Es gibt noch Ecken und Kanten im neuen Design, aber ich finde es so ausgereift, dass ich gerne damit arbeite.

Lightly erfindet das Rad nicht neu, sondern ist meiner Meinung nach die notwendige Modernisierung, die Breeze nie erfahren hat.


Aktualisierung vom 22.02.21

Aus gegebenem Anlass möchte ich hier noch auf einen aktuellen Blogpost verweisen, der das KDE-Theming erläutert.

Der Artikel Lightly – Modernes Design für KDE erschien zuerst auf [Mer]Curius

17. Februar 2021

PulseAudio ist ein mächtiger Soundserver und Sonos bietet tolle WLAN Boxen. Mit ein paar Tricks kann man über PulseAudio auch die Sonos Boxen ansteuern.

Die Linux-Community ist manchmal einfach toll. Da klage ich ein wenig über Grenzen und Schwierigkeiten bei der Migration und sofort bekomme ich E-Mails mit hilfreichen Tipps. Die Lösung liegt manchmal so nahe.

Kleiner Hinweis vorweg. Man kann Sonos Boxen auch mit Noson ansteuern, aber ich mag diese dezidierten Apps nicht, sondern möchte die von mir präferierten Programme für das Abspielen nutzen.

Das kann man mit PulseAudio erreichen. Ein kleines Kommentar kann ich mir nicht verkneifen: Was haben damals die Ewiggestrigen gegen PulseAudio gegiftet. Braucht niemand, nicht ausgereift. Aus heutiger Sicht war das ein Vorgeschmack auf jenes, was danach mit systemd & Co kam. Heute gehört es zum festen Bestandteil jeder ernst zu nehmenden Distribution und wird sukzessive durch die weiter entwickelte Lösung pipewire abgelöst. Mal gucken, wann sich da der Hass der „Unix-Wutbürger“ entlädt.

Zurück zum Thema. Es gibt grundsätzlich wohl die Möglichkeit, mit PulseAudio auch Airplay 2 anzusteuern, ich konnte diese Lösung aber nicht zum Laufen bekommen. Die Boxen waren zwar sichtbar, aber blieben stumm. Eine weitere Möglichkeit besteht in der Nutzung von DLNA. Sonos unterstützt diesen Standard nicht offiziell, aber die Boxen können darüber angesteuert werden.

PulseAudio-DLNA installieren und einrichten

PulseAudio-DLNA ist eine Erweiterung, die leider nicht bei allen Distributionen zum Standardbaukasten gehört. Bei Ubuntu ist es für 18.04 noch in den Paketquellen, bei Debian steht es für alle Ausgaben zur Verfügung. Arch-Nutzer müssen leider zum AUR greifen und openSUSE-Anwender zum OBS.

Ist das entsprechende Paket installiert, ist es mit Benutzerrechten in der Konsole zu starten. Sollte eine Firewall wie ufw oder firewalld aktiviert sein, so muss man diese vorher deaktivieren. Ich konnte keine Portfreigabe ermitteln, die über die Session hinaus gültig und funktionsfähig bleibt.

$ pulseaudio-dlna

Danach läuft eine lange Ausgabe durch, in der man sieht, wann die Boxen erkannt werden.

[gerrit@GH-Elite ~]$ pulseaudio-dlna  
02-17 19:42:42 pulseaudio_dlna.application                    INFO     Using version: 0.6.0 
02-17 19:42:42 pulseaudio_dlna.application                    INFO     Binding to *:8080 
02-17 19:42:42 pulseaudio_dlna.application                    INFO     Encoder settings: 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <AVConvAacEncoder available="False" bit-rate="192"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <AVConvFlacEncoder available="False"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <AVConvL16Encoder available="False" sample-rate="44100" channels="2"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <AVConvMp3Encoder available="False" bit-rate="192"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <AVConvOggEncoder available="False" bit-rate="192"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <AVConvOpusEncoder available="False" bit-rate="192"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <AVConvWavEncoder available="False"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <FFMpegAacEncoder available="True" bit-rate="192"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <FFMpegFlacEncoder available="True"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <FFMpegL16Encoder available="True" sample-rate="44100" channels="2"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <FFMpegMp3Encoder available="True" bit-rate="192"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <FFMpegOggEncoder available="True" bit-rate="192"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <FFMpegOpusEncoder available="True" bit-rate="192"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <FFMpegWavEncoder available="True"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <FaacAacEncoder available="True" bit-rate="192"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <FlacFlacEncoder available="True"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <LameMp3Encoder available="True" bit-rate="192"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <NullEncoder available="True"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <OggencOggEncoder available="False" bit-rate="192"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <OpusencOpusEncoder available="False" bit-rate="192"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <SoxL16Encoder available="False" sample-rate="44100" channels="2"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <SoxWavEncoder available="False"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO     Codec settings: 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <AacCodec enabled="True" priority="12" mime_type="audio/aac" backend="generic"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <FlacCodec enabled="True" priority="9" mime_type="audio/flac" backend="generic"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <L16Codec enabled="True" priority="1" mime_type="audio/L16" backend="generic"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <Mp3Codec enabled="True" priority="18" mime_type="audio/mp3" backend="generic"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <OggCodec enabled="True" priority="6" mime_type="audio/ogg" backend="generic"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <OpusCodec enabled="True" priority="3" mime_type="audio/opus" backend="generic"> 
02-17 19:42:42 pulseaudio_dlna.application                    INFO       <WavCodec enabled="True" priority="15" mime_type="audio/wav" backend="generic"> 
02-17 19:42:42 pulseaudio_dlna.plugins.chromecast             INFO     ChromecastPlugin.discover() 
02-17 19:42:42 pulseaudio_dlna.pulseaudio                     INFO     Module "module-dbus-protocol" already loaded. 
02-17 19:42:42 pulseaudio_dlna.pulseaudio                     INFO     Probing for $PULSE_DBUS_SERVER unsuccessful. 
02-17 19:42:42 pulseaudio_dlna.pulseaudio                     INFO     Probing for /run/pulse/dbus-socket unsuccessful. 
02-17 19:42:42 pulseaudio_dlna.pulseaudio                     INFO     Probing for $XDG_RUNTIME_DIR successful (unix:path=/run/user/1000/pulse/dbus-socket). 
02-17 19:42:42 pulseaudio_dlna.pulseaudio                     INFO     Probing for org.PulseAudio.ServerLookup1 successful (unix:path=/run/user/1000/pulse/dbus-soc
ket). 
02-17 19:42:42 pulseaudio_dlna.pulseaudio                     INFO     Found the following pulseaudio server addresses: unix:path=/run/user/1000/pulse/dbus-socket 
02-17 19:42:42 pulseaudio_dlna.pulseaudio                     INFO     Connecting to pulseaudio on "unix:path=/run/user/1000/pulse/dbus-socket" ... 
02-17 19:42:43 pulseaudio_dlna.pulseaudio                     INFO     Added the device "Küche - Sonos One SL Media Renderer (DLNA)".
 

Ganz unten sieht man wie mein Sonos ONE SL in der Küche erkannt wird. Diesen kann ich nun im Plasma Audioapplet als Ziel auswählen.

Danach kann ich mit einem beliebigen Programm wie Elisa Musik abspielen. Zu beachten ist die erhebliche Latenz, weshalb die Methode nur für Musik oder Podcasts funktioniert.

Das ist kein gleichwertiger Ersatz für Airplay aber definitiv viel besser als alle anderen getesten Lösungen.

Der Artikel Sonos Boxen mit PulseAudio verbinden erschien zuerst auf [Mer]Curius

Die meisten Anwender wären wohl schon froh, hätten sie Android 10 bereits auf ihren Geräten, geschweige den das aktuelle 11. So langsam sickern aber die ersten Funktionen der Turnus gemäß dieses Jahr zu erwartenden Version 12 durch.

Herzlich lachen musste ich bei der Ankündigung neuer „Privacy-Funktionen“, die von der Berichterstattung gleich mal in die Nähe der Funktionen von iOS gerückt wurden. Konkret geht es wohl um Indikatoren, die anzeigen, ob eine App gerade auf Kamera oder Mikrofont zugreift.

Es war klar. Nachdem Apple letztes Jahr mit einem umfassenden Tracking-Einwilligungssystem vorgelegt hat, musste Google dringend PR-technisch nachziehen.

Aber natürlich nichts, was dem Umsatz von Alphabet schadet – also nichts, was wirklich gegen Personalisierung, Tracking und Datensammlung mit dem Zweck der Werbungsauslieferung hilft. Nicht umsonst hat Google im Herbst seine iOS-Apps längere Zeit nicht aktualisiert. Vermutlich musste die Rechtsabteilung erst prüfen, wie wenig Transparenz noch erlaubt ist.

Bei dem System, dessen Entwicklung man bestimmt, macht man so etwas natürlich nicht. Aber auch bei Google, weil man: PR ist wichtig. Also macht man etwas, das sich ganz nett in den Ankündigungen liest und Googles Geschäftsmodell überhaupt nicht tangiert. Anders gesagt: Indikatoren für Kamera und Mikrofon-Nutzung. Da fühlen sich die Kunden ganz sicher und es stört niemanden.

Mit Google wird es niemals ein wirklich sicheres (im Sinne von Datenschutz und Privatsphäre) Android geben. Natürlich kann man versuchen, ohne Google zu arbeiten oder ein Custom ROM einzusetzen, aber selbst danach baut das Gerät noch Verbindungen zu Google auf. Jede einzelne tief verankerte Verbindung zu Google zu kappen kostet enorm viel Aufwand und kann durch ein Update der ROM auch gleich wieder konterkariert werden. Und wehe, ihr braucht nur eine proprietäre App: Dann seid ihr nahe dran am Vorhof zur Hölle.

Das gilt ebenso für Programme wie Chrome/Chromium oder das in den USA zunehmend populäre Chrome OS. Der Konzern will eure Daten, weil Werbung und Daten inzwischen untrennbar verwoben sind. Alles andere ist nur Mittel zum Zweck. Open Soure darf da freundlicherweise noch den Open Core beisteuern.

Letztlich bleibt da nur die Hoffnung auf wirkliche freie Systeme oder der Griff zu einem iPhone. Natürlich fließen auch da Daten ab und natürlich ist Apple keine Hilfsorganisation mit hehren Zielen. Aber wenigstens eine Firma mit einem Geschäftsmodell jenseits der Personalisierung von Werbung.

Wirklich bedauerlich ist aber nicht die Art, wie Alphabet sein Geld verdient oder wie Android entwickelt wird. Wir leben in einer kapitalistischen Weltordnung und was legal ist, darf gemacht werden. Wirklich bedauerlich ist, wie sehr die Medien immer wieder PR-Meldungen abschreiben. Dazu kann ganz hilfreich sein, sich mal die vielen Abhängigkeiten anzusehen.

Der Artikel Kommentar: Android – Privacywashing durch Google erschien zuerst auf [Mer]Curius

16. Februar 2021

Schon 8 Jahre nach der Erstveröffentlichung gibt es eine neue Version von fcd, dem schnellen Verzeichniswechsler für die Shell.

(Anm.: Mithilfe der Kommentare habe ich einen Bug gefunden, und in den Kommentaren wird auch erklärt, wie man ihn beseitigt. Ein Update des Artikels folgt daher in Kürze).

Die neue Version kommt mit Leerzeichen in Verzeichnisnamen zurecht – eine Funktion, die ich nicht direkt selbst brauche, da ich keine Verzeichnisse mit Leerzeichen mache, aber immer mehr Programme legen solche Verzeichnisnamen an (z.B. ‚VirtualBox VMs‘, Zoom: ‚Unknown Organization‘, …) und diese tauchen störend in den Auswahllisten auf.

Der Fix war überraschend einfach, nachdem ich mich erst mal zu der v.a. kosmetisch gedachten Verbesserung aufgerafft hatte.

Hier der neue Code:

#!/bin/bash
#
# fcd.sh: Fast change directory.
#
# Source it from your .bashrc-file, to use it as a function.
#
# Update Ver.1.0, 2021-02-07
# changed from locate/egrep to mapfile, see code. Handles blanks in paths now flawlessly
# Update Ver.0.9, 2013-08-21, comments, publication
# Prototyp 2010
#
# Copyright GPLv3
# fcd () { # list=$(locate $1 | egrep "/$1$")
mapfile -d '' list < <(locate -b -0 -r "$1$") count=$(echo $list | wc -w ) case $count in 0) echo "unknown directory: "$1 && return # could search for partial matches Doc => Documentation ;; 1) if [[ -d "$list" ]]; then echo "1) match: $list" cd "$list" else echo "not a directory: $1" fi ;; *) select directory in "${list[@]}" "/exit/"; do if [[ "$directory" = "/exit/" ]]; then
break;
fi if [[ -d "$directory" ]]; then echo "multi) $directory" cd "$directory" break else echo "not a directory: "$1 fi done ;; esac }

14. Februar 2021

Was ist das


Sonobus ist eine Software, die entweder eigenständig, oder als VST3 Plugin benutzt werden kann, um mit anderen Menschen live Peer to Peer zu musizieren. Die Software läuft auf allen gängigen Betriebsystemen wie Linux, Windows,Mac, Android und IOS.

 

Natürlich ist eine schnelle Internetanbindung eines jeden Teilnehmers wichtig. Und mit Schnell ist nicht nur der Down- und Upload 100Mbit/20Mbit) gemeint, sondern die Latenz. Also wie lange ein Netzwerkpaket von dir zu deinen Mitmusikern braucht. Und der ganze Weg wieder zurück. Das wird oft auch als Ping bezeichnet (so heisst das Programm), der als Wert Milisekunden zurück gibt. Je niedriger dieser Wert in Millisekunden ist, desto besser. Wenn der Wert z.B. über 50ms geht, könnte es etwas abenteuerlich werden und man sollte vielleicht lieber auf sehr langsame Musik, bzw sehr unrhythmische Musik ausweichen, oder die Jamsession als hochexperimentell verstehen ;)

 

Für einige dieser Betriebsysteme gibt es bereits fertige Versionen zum installieren als Download. Für andere Betriebsysteme, wie Linux muss die Software selbst erstellt (comopiliert) werden. Das ist zwar etwas aufwändiger, aber sehr einfach zu machen und dafür auch wesentlich angepasster an das eigene System.

 

Auf der Entwicklerseite sind die paar einfachen Schritte gut erklärt dokumentiert, die ich hier etwas angepasst wiederhole, um zu zeigen, dass es wirklich sehr einfach ist. Ich compiliere die Software auf einem Notebook mit Kubuntu 20.04 LTS und dem KXStudio Repository, auf dem ich Musik mit Bitwig produziere.

 

Das Videotutorial zum Blog

YoutubePeerTube

 

Vorbereitung

Damit die Software erstellt (compiliert) werden kann, müssen bestimmte Pakete installiert sein (wie z.B. den Compiler und die Bibliotheken, deren Funktionen im Programmcode aufgerufen werden und das Programm mit dem der Programmcode/Quellcode auf den eigenen Computer kopiert wird). Genug der Erklärungen, legen wir los.

Die Konsole öffnen und mit folgendem Befehl **alle notwendigen Programme (Compiler, Bibliotheken, usw) installieren**. Hier finden sich mehr Pakete, als auf der Entwicklerseite, weil diese davon ausgehen, dass der Compiler und Git schon auf deinem System installiert ist.

Pakete installieren

sudo apt install libopus-dev libopus0 libjack-jackd2-dev libasound2-dev libx11-dev libxext-dev libxinerama-dev libxrandr-dev libxcursor-dev libgl-dev libfreetype6-dev opus-tools git build-essential

Verzeichnisse erstellen
In meinem Fall habe ich in meinem Home-Verzeichnis ein Verzeichnis, das “Programme” heisst und in diesem Verzeichnis erstelle ich ein Unterverzeichnis “Sonobus". Wenn du das genauso machen willst und das Verzeichnis “Programme” noch nicht hast, dann gehe folgendermaßen in der Konsole vor

Wechsel zuerst in dein Homeverzeichnis /home/deinBenutzerName/ entspricht der Tilde ~

cd ~

Erstelle das Verzeichnis “Programme” und wechlse in das Verzeichnis

mkdir Programme
cd Programme

Erstelle das Verzeichnis “Sonobus” und wechsle in das Verzeichnis

mkdir Sonobus
cd Sonobus

 

Den Quellcode Downloaden
Jetzt “downloade” bzw klone den Quellcode (das dauert 1-2 Minuten)

git clone https://github.com/essej/sonobus.git

Wechlse in das Unterunterverzeichnis “Builds/LinuxMakefile”

cd Builds/LinuxMakefile

Auf einem U/Kubuntu System rufst du zur Sicherheit, dass auch alles installiert ist, dieses Script mit root (Superuser) Rechten auf

sudo bash ubuntu\_get\_prereqs.sh

 

Sonobus erstellen und installieren
Und jetzt erstellst (compilierst) du das Programm

./build.sh

Das dauert jetzt eine Weile (10 Minuten+) Je nachdem wie schnell dein Computer ist. Wenn alles fertig ist, dann sieht du wieder die Eingabezeile und die letzten Ausgaben dürften ungefähr so aussehen

Linking SonoBus - Shared Code
Linking SonoBus - Standalone Plugin
Linking SonoBus - VST3

Jetzt kannst du Sonobus installieren mit (root Rechten)

sudo ./install.sh

 

Zum Deinstallieren gibt es in diesem Unterverzeichnis auch noch ein Script

sudo ~/Programme/Sonobus/sonobus/Builds/LinuxMakefile/uninstall.sh

Der lange Pfad mit der Tilde stellt nur sicher, dass auch das richtige Skript im richtigen Verzeichnis aufgerufen wird und ihr könnt diesen Befehl aus jedem Verzeichnis aus aufrufen.

 

Sonobus aufrufen

  1. Jetzt kannst du mit deinem normalen Benutzer das Programm aus der Konsole aufrufen. indem du einfach Folgendes eingibst und Enter drückst
    SonoBus
  2. Oder unter Kubuntu kannst du das Programm über das Menü in der Kategorie “Multimedia” finden und dort anklicken.
  3. Oder lade in deiner DAW das VST Plugin Sonobus.

 

Ich wünsche dir und deinen Freunden viel Spaß beim online Musizieren !

 

Quellen

  1. Sonobus Webseite https://sonobus.net/
  2. Sonobus Handbuch https://sonobus.net/sonobus_userguide.html
  3. Sonobus git Repository (Quellcode) https://github.com/essej/sonobus
  4. Kubuntu https://kubuntu.org/
  5. KX Studio https://kx.studio/
  6. Bitwig https://www.bitwig.com/