Heute war nen ‚schöner‘ verbummelter Tag …

Geschichte

Gestern Abend kommt von einem Familienmitglied die Chatnachricht „mein Rechner geht nicht mehr“, auf die ich antworte „mal Strom für mindestens eine Minute trennen“. Am Ende hilft das (nat.) nix und wir verabredeten uns für heute zu einem Telefonat.

Zu 10 Uhr dann das erste Telefonat und ich stelle recht schnell fest, dass Remote-Support ohne X und somit nur per Telefon echt ma nich geht. (Das Buchstabieren von iwelchen Kommandos ist ganz schön mühsam …)
Heraus gekommen ist immerhin, dass es sich um einen Login-Loop unter Ubuntu 16.04 (ich war anfangs noch der Meinung, dass es noch ein von mir installiertes 14.04 ist) handelt, welches seit ca. letzten Freitag besteht.

Nach ner Stunde habe ich die Faxen dicke und leider nicht mal ansatzweise ne Idee außer, dass es iwas mit der recht alten NVIDIA GeForce 6800 GS in der Aldi-Multimediakiste zu tun hat. In /var/log/Xorg.* und ~/.xsession-errors war so richtig nix zu finden.

Dann kümmerte ich mich erst einmal darum, wie ich remote auf den Desktop per SSH zugreifen kann. Dazu war es dann nötig, auf der Fritz!Box (über die der andere Rechner an INet angebunden ist) ne Portweiterleitung einzurichten und openssh-server auf dem zu reparierenden Rechner zu installieren. (Also wieder andere Baustellen …) – Das hat aber glücklicherweise dann ganz gut geklappt.

Dann hatte ich etwas Zeit (auch wenn ich nebenbei etwas HomeOffice machen ‚musste‘) zum umsehen, Loop-Ursache lokalisieren und das System noch etwas aufräumen.

Idee 1

Zuerst versuchte ich mein Glück mit dem Update des proprietären Nvidia-Treibers aus dem Paket nvidia-$NR.
Ergebnis: Ohne Erfolg, da die (alte) GeForce nur bis zum Paket nvidia-304 unterstütz wird. Also alles wieder zurückgedreht …

aptitude purge ~nnvidia- && aptitude install nvidia-304

Idee 2

Dann dachte ich mir, ich verzichte ganz auf den proprietären Kram und setze auf den (offenen) Nvidia-Treiber nouveau.
Ergebnis 2: Blöd nur dass der iwie nicht mit dem Monitor zusammenarbeiten wollte und ich nicht in der Lage war, eine annehmbare (größer 640×480) Auflösung einzustellen, obwohl ich (seit Ewigkeiten mal wieder) ne komplette /etc/X11/xorg.conf händisch gebastelt hab …
(Früher musste man alles händisch machen und Dinge haben nur geklappt, wenn man die korrekten Parameter hatte. Heute wird extrem viel automatisch gemacht und man kann oft gar nix mehr groß händisch ändern, wenn der Automatismus versagt. *grml*)

Zielgerade

Ich stieß dann (iwie in meinem 30sten Tab) auf den Foreneintrag „Anmeldung auf graphischer Oberfläche nicht möglich“ im ubuntuusers.de-Forum. Eigentlich nur, weil der recht aktuell ist. (Viele andere Recherchetreffer waren schon ewig alt …)
Der dort verlinkte Launchpad-Bug #1634802 brachte mich jedoch immer noch nicht auf die Zielgerade, jedoch auf eine Fährte. – Nämlich den (auf Ask Ubuntu verlinkten) Launchpad-Bug #1639180, der in der Beschreibung auch meine Fehlermeldung (die ich am Ende in /var/log/syslog fand) enthält:
X Error of failed request: BadValue (integer parameter out of range for operation).

Lösung

Letzten Donnerstag (3.11.16) – und da kommen wir ärgerlicherweise wieder zu Ausgangssituation .oO(Hätte ich das mal ernst genommen und in meine Recherche zu Beginn eingebunden!) – wurde die Version „304.132-0ubuntu0.16.04.2“ verteilt. Diese scheint (wie bspw. obige Bugs ja auch zeigen) einige Unzulänglichkeiten zu haben und verursachte auch auf meinem Problemsystem den Login-Loop.

Die vorhergehende Version „304.131-0ubuntu3“ lief (und läuft) ohne diese Probleme. – Ergo habe ich ein Downgrade durchgeführt.

Dazu also wieder alle installierten Nvidia-Pakete deinstallieren:

aptitude purge ~nnvidia- && aptitude install nvidia-304

Dann die „304.131-0ubuntu3“ installieren:

apt-get install nvidia-304=304.131-0ubuntu3

Am Ende noch (da das System ja nicht täglich unter meiner Kontrolle ist) die „304.131-0ubuntu3“ in der (neuen) Datei /etc/apt/preferences.d/nvidia-304 (mit folgenden Inhalt) gepinnt (s. Apt-Pinning)

Package: nvidia-304
Pin: version 304.131-0ubuntu3
Pin-Priority: 1001

Und nach nem Reboot war der Login-Loop weg … 🙂 *fertsch*

Danke an die Community, ohne die in der ja doch recht kurzer Zeit (von letztem Donnerstag bis heute) eine Lösung nicht in meinen eigenen Kräften gewesen wäre!

Parallel zu LastPass probiere ich gerade seit einiger Zeit Enpass (auf meiner Ubuntu-Kiste und auf meinem Android-Handy) im Zusammenspiel mit meiner ownCloud aus. – Bis jetzt ganz gut …

Hier desh. ganz kurz ein paar Notizen zur Installation.

  1. Enpass per PPA installieren: https://www.enpass.io/kb/how-to-install-on-linux/
    Von Web Upd8 gibts auch nen schönen Artikel
  2. .desktop-Datei erstellen (s.u.)
  3. Starter-Icon herunterladen:
    wget https://upload.wikimedia.org/wikipedia/commons/c/c1/Enpass_icon.svg -O ~/.icons/Enpass.svg
  4. fertig …

# ~/.local/share/applications/Enpass.desktop
[Desktop Entry]
# https://standards.freedesktop.org/desktop-entry-spec/latest/
Version=5.2
Terminal=false
Type=Application
Name=Enpass
Comment=cross-platform password management solution
Exec=/opt/Enpass/bin/runenpass.sh
# wget https://upload.wikimedia.org/wikipedia/commons/c/c1/Enpass_icon.svg -O ~/.icons/Enpass.svg
Icon=Enpass
# https://standards.freedesktop.org/menu-spec/latest/apa.html
Categories=Security;Settings;System;Utility

Auch wenn ich nicht wirklich ‚viel‘ code, aber so ab und zu fällt ja doch mal was an … In den letzten Jahren v.a. aber eher Klein(st)beiträge zu bereits bestehndem Code Anderer, statt eigener Projekte.

2010 versuchte ich meine ersten Schritt(ch)e(n) mit Git und suchte dafür eine geeignete Plattform. – Nur Kommandozeile mit eigenem Git-Server war mir damals IMHO zu umständlich und wohl auch zu nerdy. ‚Damals‘ gabs zwar schon Github (und dort hatte ich auch seit 2009 einen ungenutzten Account), aber als F(L)OSS-Verfächter wollte ich mehr Community und fand letztlich Gitorious, wo ich mir einen Account zulegte. (So jedenfalls meine Erinnerung …)

Bei Gitorious gab es anfänglich keinen Issue-Tracker und die Interaktion über Weboberfläche war, im Gegensatz zu Github, sehr beschränkt. So kam es im Laufe der folgenden fünf Jahre zur vorrangigen Nutzung meines Github-Accounts.

Im letzten Jahr gab es Bedarf für die Zusammenarbeit mehrer Personen ein einem Projekt (etwas bug fixing im Code von POLYKON) – dabei sollte das erst einmal nicht in der Öffentlichkeit passieren. Somit schied Github (auf Grund der Kosten) aus und ich fand BitBucket und erstellte auch dort einen Account.

In Summe hatte ich bis dahin also drei Accounts bei unterschiedlichen Anbietern für Git-Repositories gesammelt …

Letzte Woche wollte ich mal wieder bei Gitorious schauen, was so los ist und stellte fest, dass GitLab den Laden übernommen hat und man empfiehlt, die eigenen Gitorious-Repos auf GitLab umzuziehen. Dann habe ich mich also mal bei GitLab umgeschaut und schwupps, war der vierte Account geklickt … 😉

Warum nun noch einen vierten Account?

  • GitLabs Webinterface ist schnell
  • GitLab bietet nichtöffentliche Repos an
  • GitLab bietet eig. alle (von mir benutzten) Features wie Github (und ist sogar besser ;))
  • GitLab gibts in der Community Version kostenlos
  • und jetzt der Knaller: per Klick konnte ich (mit etwas Recherche) alle Repos aus den anderen drei Accounts importieren
  • wenn die Butze iwann (vllt.) mal zu macht, dann kann ich/man das immer noch selber hosten
  • das Icon ist süüüß … 😉

Zusammengefasst: Aktuell schrumpfe/konsolidiere ich meine Git-Plattform-Accounts. Gitoriuous is schon weg und gleich kommt noch der Bitbucket-Account dran. Bei Github werde ich dann wohl nur noch wg. der Issue- und Pull-Request-Zwecke sein, die eigenen Projekte kommen dort auf jeden Fall weg.

Mal schauen, ob sich das Aufräumen langfristig als klug erweisen wird …

Da am kommenden Samstag (14.02.2015) meine Open-/GPG/PGP *whatever* Keys eh auslaufen, habe ich mich heute mal rangesetzt und etwas aufgeräumt und (endlich auch) erneuert (1024 bits DSA is halt nicht mehr aktuell)

Als ‚Vorbild‘ habe ich mir Bruce Schneier genommen 😉 und mir die folgenden beiden RSA-Keys mit 4096 bits generiert:

Gestern wollte/musste ich mal wissen, was in einem LXC-Container (auf unserem Kommune-Server) gemountet ist. – Da das im ersten Anlauf nicht ganz so trivial heraus zu bekommen war, hier mal meine kleine Gedankenstütze.

long story short

root@host:~/# ls -lha /proc/$(lxc-info -n container -p | awk '{print $2}')/root/home

Erklärbär

Szenario

  • LXC-Version: 0.7.5 (ja ich weiß, is alt  … ;))
  • Host = hn
  • Container = container
  • Mount = in der fstab (host:/var/lib/lxc/container/fstab) ist das host:/home mit der Zeile "/home home none bind 0 0" eingebunden (d.h. also, dass beim Starten des LXC-Containers des /home vom Host beim Start des Containers in den Container gemountet wird; dabei ist home als relativer Pfad zum / angegeben)

Das Problem

Wenn man nun auf dem Host wissen will, wie das /home im Container aussieht (ls -lha /var/lib/lxc/container/rootfs/home) wird man feststellen, dass es ganz anders aussieht, als erwartet. – Hintergrund ist, dass der obige Mount in einem temporären Filesystem (also nicht wie ein normaler/echter Mount) eingehängt wird.

Hier mal die Ausgabe, die mit einem Standard-LXC-Template (Ubuntu) erzeugt wird:

root@host:~/# ls -lha /var/lib/lxc/container/rootfs/home
total 4.0K
drwxr-xr-x  3 root   root     19 Aug 18  2012 .
drwxr-xr-x 22 root   root   4.0K Feb  7 14:15 ..
drwxr-xr-x  2 ubuntu ubuntu   54 Aug 20  2012 ubuntu

Die Lösung

Nach etwas Recherche stieß ich auf den Blog-Post „LXC 1.0: Advanced container usage“ des LXC-Entwicklers Stéphane Graber, in dem der Trick (und einige Hintergründe) erklärt werden.

Jeder Container hat eine eigene Prozessnummer (pid). Diese bekommt man mit lxc-info -n container -p heraus.
Der im temporären Dateisystem eingehängte Mount befindet sich unter host:/proc und dort wieder unter der jeweiligen PID.
Also angenommen unser Container hat die PID 1234, dann findet man dessen root-Filesystem (inkl. aller Mounts) unter host:/proc/1234/root/.

Wir benötigen also zuerst die PID des Containers (lxc-info -n container -p) und danach können wir uns das Filesystem anzeigen lassen (ls -lha /proc/PID/root/). – Beide Befehle kann man nun kombinieren.

mit LXC 1.x

In oben genannten Blog-Post wird für das Eruieren der PID lxc-info -n container -p -H (angepasst!) angegeben. Dabei stehen die Schalter -n container für den Containernamen, -p für die Ausgabe der PID und -H (wahrscheinlich; siehe unten) für die numerische Ausgabe der PID.

Die Kombination der beiden Befehle zum Anzeigen des Root-Dateisystems für den Container sieht dann so aus: ls -lha /proc/$(lxc-info -n container -p -H)/root/ (angepasst!).

mit LXC <1.x (in meinem Fall 0.7.5)

Da ich ATM allerdings noch nicht die Version 1.x verwende, funktioniert der Tipp (aus dem Blog-Post für die Version 1.x leider nicht (so ganz).
Denn in 0.7.5 gibt es den Schalter -H bei der Ausgabe der PID mit lxc-info -n container -p nicht, so dass man nicht nur die PID, sondern den Text pid: 1234 zurück bekommt. :-/

Allerdings ist das nicht so dramatisch, denn man kann sich ja mit awk behelfen (und somit den Schalter ersetzen/emulieren). 🙂
lxc-info -n container -p | awk '{print $2}' liefert nur die zweite ‚Spalte‘ der lxc-info-Ausgabe, also die nummerische PID.

Ergo hier nun meine Lösung zum Anzeigen des Root-Dateisystems des Containers:

root@host:~/# ls -lha /proc/$(lxc-info -n container -p | awk '{print $2}')/root/home
total 4.0K
drwxr-xr-x  3 root   root    19 Aug 18  2012 .
drwxr-xr-x 22 root   root  4.0K Feb  7 14:15 ..
drwxr-xr-x  2 user1  user1       […]         user1
drwxr-xr-x  2 user2  user2       […]         user2
drwxr-xr-x  2 user3  user3       […]         user3

… wieder was gelernt … 😉 – Allerdings wohl nicht für lange, denn das Update auf die Version 1.x steht ja vor der Tür …