Fork me on GitHub Fork me on GitHub

uninformativ.de

GNU, Linux, Shell und Co.

Shared Libraries updaten

Pingu-Avatar

2014-04-12, 10:24:17

Im Zuge der ganzen Heartbleed-Updaterei kam die Frage auf, ob man den Apache nach dem OpenSSL-Update neustarten muss. Ja, muss man. Aber warum eigentlich? Wenn zwei Prozesse eine Datei öffnen und beide darin rumschreiben, dann sehen sie gegenseitig ihre Änderungen. Wenn also nun der Apache die libssl.so geöffnet hat und gleichzeitig das Paketmanagement die Datei aktualisiert, warum stürzt der Apache dann nicht ab, weil sich alle möglichen Adressen geändert haben?

[…]

Die IMHO stressärmste Art, einen Arch-USB-Stick zu erstellen

Pingu-Avatar

2014-04-06, 12:29:37

Es gibt dazu einen Artikel im Arch-Wiki, der aufzeigt, dass das Vorhaben ohnehin schon ziemlich einfach umzusetzen ist. Insbesondere dann, wenn man Arch bereits auf seinem Rechner laufen hat, ist es mit den arch-install-scripts wirklich nicht mehr weit.

Was mich trotzdem gestört hat:

  1. Die Installation ist vermutlich höllisch lahm, weil USB-Sticks halt in der Regel lahm sind. Das war für mich der Showstopper schlechthin.
  2. Man muss aufpassen, dass man sich nicht aus Versehen seine Festplatte oder seinen Bootloader grillt.
  3. Bootet es hinterher wirklich? Dazu muss ich an einen Rechner gehen und es ausprobieren...

Ich habe daher einen anderen Weg gewählt: Ganz normale Installation in einer VM und dann das Festplattenimage mit dd auf den Stick schubsen. Das eliminiert alle Punkte oben – gut, okay, ob der Stick dann wirklich bootet, muss man auch testen. Aber wenn man vorher einen dummen Fehler gemacht hat (zum Beispiel das Root-Device im Bootloader nicht richtig angegeben hat ;)), ist es viel leichter zu beheben. Überhaupt hat man mehr Freiheiten, kann nebenher den Browser offen lassen und so weiter.

Wie läuft’s ab?

  1. Arch-Installationsmedium herunterladen.
  2. Stick-Image erstellen, hier 2GiB groß:
    $ dd if=/dev/zero of=stick.img bs=1M count=2k
  3. Die VM starten und vom Arch-Setup booten:
    $ qemu-system-x86_64 -enable-kvm -cpu host -m 2048 -smp 4 \
    	-hda stick.img -cdrom archlinux-2014.04.01-dual.iso -boot d
  4. Ganz normal das Setup durchlaufen. Allerdings darauf achten, was im USB-Guide im Wiki erwähnt ist, insbesondere:
    • Überall konsequent UUIDs für die Blockdevices verwenden.
    • Es bietet sich an, das Fallback-Kernel-Image als Standard zu konfigurieren.
  5. Die VM wie gewünscht einrichten.
  6. Am Ende das Image auf den Stick kopieren:
    # dd if=stick.img of=/dev/sdc bs=100k
    Bei einem langsamen USB-Stick muss man erst jetzt wirklich warten.

s/urlview/&2

Pingu-Avatar

2014-03-23, 09:35:18

urlview ist ein kleines, praktisches Programm, das vermutlich jeder mutt-Nutzer verwendet. Man kann ihm einen Datenstrom auf STDIN zuwerfen, es sammelt alle Links darin und bietet dem User danach ein einfache Liste mit curses an, aus der er einen Link auswählen kann. Nach der Auswahl wird dann in der Regel der Browser gestartet.

Meine Probleme mit dem Tool: Erstens ist es „bloated“ durch die Autotools. Um es zu kompilieren, muss ich aus dem AUR erst noch automake-1.11 nachinstallieren. Muss das wirklich sein? So komplex ist das Tool jetzt nicht, dass es den ganzen Autotools-Overhead benötigen würde.

Zweitens hätte ich eigentlich gerne die Auswahlfunktionalität in einem eigenständigen Programm. Das hätte ich schon ein paar Mal gebrauchen können: Ein kleines Tool, das Zeilen von STDIN liest und mich dann interaktiv auswählen lässt. Ich habe sowas zwar in Form von pick schon, aber pick ist mir für eine schnelle Auswahl zu umständlich – wenn ich aus mutt heraus einen Link öffnen will, dann will ich nur Enter drücken müssen. Dafür verzichte ich dann auch gerne auf die Mächtigkeit von regulären Ausdrücken bei der Auswahl.

Enter choose. Ein kurzes Python-Skript, das genau die obige Aufgabe löst. Die Auswahlfunktionalität ist minimal mächtiger als die von urlview, weil choose auch Mehrfachauswahl kann.

Mit choose geht dann eben sowas wie „find | choose - | xargs -Ia rm a“. Und man kann darauf aufbauend auch den Rest des ursprünglichen urlview nachbauen, als Filter für die URLs kann auch grep dienen. Zack, schon sind wir bei urlview2.

inline thumbnail

Vim-Tipp des Jahrtausends

Pingu-Avatar

2014-01-11, 12:57:11

Habe zwar das Gefühl, dass das schon jedem bekannt sein dürfte, aber auf dotshare.it habe ich es dann doch nur bei drei Leuten gesehen. Insofern kann man ja nochmal darauf hinweisen.

if isdirectory('/tmp/vim-' . $USER) == 0
	:silent !install -dm700 /tmp/vim-$USER >/dev/null 2>&1
endif
set directory=/tmp/vim-$USER//

Bewirkt, dass Swapfiles an einer zentralen Stelle gespeichert werden. Nie wieder peinliche Commits, weil man vergessen hat, so ein Ding auszuschließen. Überhaupt weniger Gewusel beim Einsatz von VCSs, weil man eben nichts mehr von Vim ignorieren muss. Ich finde sowieso, dass ein Editor im Arbeitsverzeichnis maximal die Datei schreiben sollte, die er gerade bearbeitet. Deswegen habe ich auch „nobackup“ und „nowritebackup“ gesetzt und verwende kein persistentes Undo, trotzdem seien in dem Zusammenhang auch „backupdir“ und „undodir“ erwähnt.

Wichtig sind die zwei Slashes am Ende, die einen vollen Namen generieren:

$ ls -al /tmp/vim-void
total 57,344
drwx------  2 void users    120 Jan 11 13:10 .
drwxrwxrwt 17 root root     700 Jan 11 13:09 ..
-rw-r--r--  1 void users 16,384 Jan 11 12:52 %home%void%work%dotfiles-pub%.vimrc.swp
-rw-r--r--  1 void users 16,384 Jan 11 13:10 %home%void%work%ruby%gitodo%gitodo.swp
-rw-r--r--  1 void users 12,288 Jan 11 13:11 %home%void%www%web%www.uninformativ.de%blogdata%store%post.00193.content.swp
-rw-r--r--  1 void users 12,288 Jan 11 12:57 %home%void%www%web%www.uninformativ.de%blogdata%store%post.00193.meta.swp

Ja, in konstruierten Fällen kann es zu Namenskonflikten kommen, ja, bei einem modernen System ist „/tmp“ ein tmpfs und nach einem Neustart oder Crash weg. Wenn es notwendig ist, kann man letzteres ja beheben, indem man ein anderes Basisverzeichnis wählt. :-)

overqemu

Pingu-Avatar

2013-12-15, 17:09:22

Seit einigen Monaten habe ich immer wieder die Situation, dass ich eine VM brauche, dort nur kurz etwas machen will und die VM dann eigentlich wieder wegschmeißen kann. Außerdem habe ich nach vielen Jahren dann doch mal einen neuen Rechner gekauft, wodurch Virtualisierung insgesamt wieder viel interessanter geworden ist, weil jetzt Hardware-Virtualisierung richtig gut funktioniert und viel RAM vorhanden ist. Ich kann jetzt endlich bedenkenlos mehrere VMs gleichzeitig laufen lassen. Auf der anderen Seite habe ich eine SSD, die ich schonen möchte.

QEMU, das mit KVM ziemlich performant und gleichzeitig leichtgewichtig ist, bringt von Hause aus die Option „-snapshot“ mit. Dadurch wird das Festplattenimage überhaupt nicht angefasst, es sei denn, man setzt ausdrücklich einen „commit“ ab. Das ist schon einmal nicht schlecht. Der Default hierbei ist dann, dass nach dem Herunterfahren der VM alles weg ist. Problem: Ich weiß gar nicht, ob ich das will. Vielleicht will/muss ich die VM mal zwei Stunden ausschalten und dann später damit weitermachen – aber immernoch will ich das Basis-Image nicht anfassen.

Hier kommt jetzt overqemu ins Spiel. Das Skript tut folgendes:

  • Beim ersten Mal wird ein Overlay-Image erstellt und in „/tmp“ abgelegt. „/tmp“ ist bei mir ein tmpfs. Bei darauffolgenden Starts wird dieses Image weiterbenutzt.
  • Automatische Einrichtung von Portforwardings für SSH oder mehr.
  • Organisation in „Slots“: Dasselbe Basis-Image kann mehrfach gestartet werden. Dabei werden Portforwardings automatisch angepasst. SSH-Ports haben also die Form „22xx“, wobei die „xx“ durch die zweistellige Slot-ID ersetzt werden. Die Slots gelten global, es gibt insgesamt 100 Stück.
  • VNC als Display, damit bei Bedarf direkt auf die VM zugegriffen werden kann.
  • Noch ein kleines bisschen Unterstützung bei der Erstellung von QEMUs Multicast-Socket-Netzwerken, weil die eine sehr einfache Möglichkeit darstellen (lies: keine weitere Einrichtung oder Root-Rechte auf dem Host nötig), um VMs miteinander kommunizieren zu lassen.
  • Als Alternative ist auch Support für TAP-Interfaces drin, damit eine VM auch ein vollwertiges Interface bekommen kann. Falls man eine Bridge will, damit die VM auch von anderen Hosts aus erreichbar ist, muss man diese aber manuell anlegen. TAP-Interfaces habe ich bis jetzt aber sehr selten tatsächlich gebraucht, noch seltener als Multicast-Socket-Netzwerke.

Es ist damit sehr leicht, zum Beispiel zehn Instanzen von Arch zu starten:

for i in {1..10}; do overqemu -b ~/VMs/archlinux-dhcp.qcow2 $i & done

Das „-b“ zeigt standardmäßig auf dieses Image. Soll zusätzlich noch Port „80xx“ an die VM weitergeleitet werden, wobei das „xx“ hier wie bei den SSH-Ports durch die Slot-ID ersetzt wird:

for i in {1..10}; do overqemu -f 80xx:80 $i & done

Oder alle VMs in ein Multicast-Netzwerk, damit sie sich sehen können (erzeugt eine zusätzliche NIC – Portforwardings auf die erste NIC wären weiterhin möglich):

for i in {1..10}; do overqemu -m 230.0.0.1:1337 $i & done

-m“ geht auch mehrfach. Es ist auch wichtig zu erwähnen, dass auf einem anderen Host dasselbe Multicast-Netzwerk konfiguriert werden kann. Die VMs sehen sich dann, sofern kein Router dazwischensitzt, der Multicast verwirft – was im Internet die Regel ist, man hat zuhause also seine Ruhe.

In diesen Fällen würde ich tatsächlich die Overlay-Images wegschmeißen wollen. Oder? Vielleicht auch nicht. Vielleicht ergibt sich in einer VM etwas, das ich behalten möchte. Dann kann ich diese VM ausschalten, das Overlay-Image rebasen und somit eine neue VM/Festplatte erstellen, in die ich die Änderungen dann dauerhaft committen kann:

cd /tmp
cp ~/VMs/archlinux-dhcp.qcow2 arch-neu.qcow2
qemu-img rebase -b arch-neu.qcow2 overqemu-00.qcow2
qemu-img commit overqemu-00.qcow2

Die neue VM liegt weiterhin in „/tmp“, bis ich mich dann irgendwann mal entscheide und sie tatsächlich auf die SSD zur dauerhaften Aufbewahrung kopiere.

Das finde ich schon ziemlich fancy. :-)

Die vielen verfügbaren Slots zahlen sich auch aus. Natürlich starte ich keine 100 VMs auf einen Schlag. Aber ich weiß, dass ich genügend Platz habe – anfangs konnte das Skript nur mit 10 Stück umgehen, was von der Gesamtzahl auch gereicht hätte, aber da fühlt man sich ja immer gleich so eingesperrt. Das ist wie mit den Zeilennummern im alten BASIC. Jetzt aber habe ich immer Luft. Wenn ich bei irgendwas unterbrochen werde und noch eine VM brauche, dann kann ich sie ohne nachzudenken starten.

Weitere Notizen für overqemu habe ich drüben im Gopher-Space.