My Universe Logo

My Universe Blog » Entries Tagged as Linux

Portable Shell-Skripte mit absoluten Pfaden

Posted by Jesco Freund at Oct. 3, 2009 2:23 p.m.

Gute Shell-Skripte sprechen Binaries mit dem absoluten Pfad an. Dadurch wird das Skript unabhängig von der Umgebungsvariablen $PATH und funktioniert auch manierlich, wenn es beispielsweise üder die Crontab oder unter einem andere User aufgerufen wird. Soweit die Theorie, doch in der Praxis gibt es einen gemeinen Fallstrick, der den Wanderer zwischen den Unix-Welten das Leben bzw. Skripten schwer macht. Betrachten wir einmal das folgende Beispiel:

#!/bin/sh

b_uname="/bin/uname"
b_awk="/bin/awk"

name=`$b_uname -n | $b_awk -F. '{print $1}'`

echo "Das System heisst ${name}."
exit 0

Dieses kleine Skript ist ein (zugegebenermaßen etwas umständlicher) Ersatz für den Befehl hostname -s – das tut aber eigentlich nichts zur Sache. Viel spannender ist die Frage, wie portabel dieses Skript arbeitet. Unter CentOS 5.3 kann ich es fehlerfrei ausführen. Anders sieht es aus, wenn dieses Skript auf einer Maschine mit FreeBSD oder Solaris aufgerufen wird: Unter FreeBSD erhält man Fehlermeldungen („Command not found“), da uname und awk nicht wie bei CentOS und Solaris in /bin liegen, sondern in /usr/bin (bei Solaris kommt es ebenfalls zu Problemen, die aber darin begründet sind, dass die Solaris-Implementierungen von uname und awk von den GNU-Implementierungen abweichen – doch dazu später).

Unter den verschiedenen Unix-Derivaten und sogar Linux-Distributionen liegen Binaries also nicht immer am selben Ort. Müssen portable Skripte also darauf verzichten, absolute Pfade zu verwenden und sich auf $PATH verlassen? Natürlich nicht. Allerdings funktioniert der Schnellschuss „dann definiere ich Binaries eben systemabhängig“ auch nicht so ohne weiteres – man sieht ja, dass das häufig dazu herangezogene uname schon nicht sehr portabel gelagert ist. Es gibt jedoch einen eleganteren Weg, der sich nur auf Shell-interne Funktionen stützt und daher tatsächlich komplett portabel ist:

#!/bin/sh

detect_binary() {
    local BINDIRS="/bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin /opt/csw/bin /opt/sfw/bin /usr/openwin/bin"

    for i in $BINDIRS; do
        if [ -x "${i}/${1}" ]; then
            echo "${i}/${1}"
            break
        fi
    done
}

b_uname=$(detect_binary "uname")
b_awk=$(detect_binary "awk")

Die Funktion detect_binary probiert alle angegebenen Pfade durch, bis sie in einem auf eine ausführbare Datei mit dem gesuchten Namen stößt. Anschließend gibt sie den absoluten Pfad des gefundenen Binaries zurück. Auf diese Weise wird zum einen sichergestellt, dass nur Binaries aus den vorgegebenen Pfaden verwendet werden, und zum anderen, dass die Binaries weiterhin unabhängig von der Umgebungsvariable $PATH gefunden werden können.

Eines löst dieser Code-Schnipsel jedoch nicht: Das unterschiedliche Verhalten von gleichnamigen Binaries unter verschiedenen Unix-Derivaten. Auf vielen Nicht-Linux Systemen stehen Binaries der GNU-Implementierung zur Verfügung, oder zumindest Binaries, die das Verhalten der GNU-Implementierungen nachahmen. Unter FreeBSD beispielsweise findet man in gsed und gawk die GNU-Implementierungen, während sich hinter sed und awk die traditionellen BSD-Implementierungen verbergen. Die <programm>-Binaries findet man im übrigen auch unter Linux. Benötig man also in einem Skript explizit das GNU-Verhalten (beispielsweise beim Einsatz von sed -i, so sollte man auch die GNU-Binary-Namen verwenden.

Happy Scripting!

4 comments | Defined tags for this entry: code, FreeBSD, Linux, programming, scripting, shell, Solaris

Bye bye, Atuan

Posted by Jesco Freund at July 2, 2009 12:06 p.m.

Heute darf einer meiner Server in den Ruhestand gehen, der es sich auch redlich verdient hat:

uptime
12:02:24 up 416 days, 11:04,  1 user,  load average: 2.00, 2.00, 2.00

Die Kiste lief übrigens mit einem frisierten Gentoo Linux (~x86) und einem monolitischen Eigenbau-Kernel.

No comments | Defined tags for this entry: Gentoo, Linux, server

Test-vServer-Kontingent von EUServ

Posted by Jesco Freund at Feb. 25, 2009 9:42 p.m.

Vor einiger Zeit hatte ich bereits über das vServer-Betatestprogramm von EUServ berichtet. Mittlerweile hat mir EUServ einen eigenen Bestellcode zugesendet, hinter dem ein Kontingent von 100 Test-vServern steht. Da immer noch Anfragen nach Codes bei mir eingehen, habe ich mich entschlossen, den Code jetzt doch hier online zu stellen. Somit ist eine Bestellung jetzt ohne Interaktion meinerseits möglich; ich werde daher auch nicht mehr auf Kommentare im alten Beitrag reagieren. Bei Interesse bitte einfach den erweiterten Beitrag beachten…

continue reading Test-vServer-Kontingent von EUServ

1 comment | Defined tags for this entry: Linux, server, hardware virtualization

EUServ stellt kostenlose Test-vServer bereit

Posted by Jesco Freund at Dec. 25, 2008 4:11 p.m.

Die Rahmendaten lesen sich mit 10GB Plattenspeicher und garantierten 512MB RAM gar nicht so übel. Beim OS stehen derzeit Gentoo und Debian zur Wahl. Mal sehen, was die Kiste über Zabbix und Nagios hinaus noch so verkraften kann… Weitere Details zur Aktion gibt's hier; wer einen Test-Gutschein haben möchte, kann hier einfach einen Kommentar hinterlassen (bitte mit gültiger E-Mailadresse, damit ich den Code auch zusenden kann) möge bitte meinen entsprechenden Blog-Eintrag beachten.

16 comments | Defined tags for this entry: Linux, server, hardware virtualization

Kernel-Konfiguration für x86_64 mit NUMA-Unterstützung

Posted by Jesco Freund at March 3, 2008 7:13 p.m.

/assets/user/jfreund/img/png/thumb/128x128/screen-menuconfig-kernel-2.6.23-hardened-r8-amd64.png

Eine nette kleine Falle stellt make menuconfig für den ahnungslosen Kernel-Bastler bereit: Aktiviert man NUMA und vor allem ACPI NUMA detection, wird zwar korrekt der ACPI-Support in den Power Management Optionen aktiviert – selbige aber nicht. Power Management Support muss also händisch aktiviert werden, sonst beschwert sich make mit folgendem Fehler:

undefined reference to `pm_flags'

Näheres gibt's auch auf der Linux Kernel Mailing List.

No comments | Defined tags for this entry: kernel, Linux

Ubuntu 7.10 und Xen "Quick 'n Dirty"

Posted by Jesco Freund at Feb. 3, 2008 1:28 a.m.

Seit eben gibt es ein neues HowTo zur Installation von Ubuntu 7.10 mit Xen. Das HowTo ist während einer heute durchgeführten Installation entstanden. Das dabei angefertigte Installationsprotokoll habe ich etwas überarbeitet und einmal durch AsciiDoc gejagt.

No comments | Defined tags for this entry: Linux, Ubuntu, Xen

Ü-30-Party

Posted by Jesco Freund at Dec. 26, 2007 12:47 a.m.

Die wäre eigentlich schon gestern fällig gewesen, aber da heute gleich Nummer 31 hinzugekommen ist… Übrigens, die Rede ist von Kerneln auf einem meiner Linux-Server. Auf einem haben sich seit Inbetriebnahme im Laufe eines guten Jahres doch ganze 31 Kernel-Images angesammelt (die Source-Verzeichnisse habe ich zwischendrin immer mal wieder entrümpelt). Und so sieht das ganze dann in /boot aus:

-rw-r--r--  1 root root 1.7M 2006-11-30 18:38 vmlinuz-2.6.18-hardened-r1
-rw-r--r--  1 root root 1.5M 2007-01-13 12:57 vmlinuz-2.6.19-hardened-r3
-rw-r--r--  1 root root 1.5M 2007-01-15 22:27 vmlinuz-2.6.19-hardened-r4
-rw-r--r--  1 root root 1.5M 2007-01-24 22:07 vmlinuz-2.6.19-hardened-r5
-rw-r--r--  1 root root 1.5M 2007-02-19 19:19 vmlinuz-2.6.19-hardened-r6
-rw-r--r--  1 root root 1.5M 2007-03-27 22:13 vmlinuz-2.6.20-hardened
-rw-r--r--  1 root root 1.5M 2007-04-05 15:58 vmlinuz-2.6.20-hardened-r1
-rw-r--r--  1 root root 1.5M 2007-04-14 17:40 vmlinuz-2.6.20-hardened-r2
-rw-r--r--  1 root root 1.5M 2007-04-14 17:34 vmlinuz-2.6.20-hardened-r2.old
-rw-r--r--  1 root root 1.5M 2007-05-26 08:57 vmlinuz-2.6.21-hardened
-rw-r--r--  1 root root 1.5M 2007-05-06 12:42 vmlinuz-2.6.21-hardened.old
-rw-r--r--  1 root root 1.5M 2007-05-26 09:08 vmlinuz-2.6.21-hardened-r1
-rw-r--r--  1 root root 1.4M 2007-06-10 12:32 vmlinuz-2.6.21-hardened-r2
-rw-r--r--  1 root root 1.4M 2007-05-27 18:17 vmlinuz-2.6.21-hardened-r2.old
-rw-r--r--  1 root root 1.4M 2007-08-14 19:22 vmlinuz-2.6.21-hardened-r3
-rw-r--r--  1 root root 1.4M 2007-08-12 16:16 vmlinuz-2.6.21-hardened-r3.old
-rw-r--r--  1 root root 1.5M 2007-08-14 19:30 vmlinuz-2.6.22-hardened
-rw-r--r--  1 root root 1.5M 2007-08-12 16:21 vmlinuz-2.6.22-hardened.old
-rw-r--r--  1 root root 1.5M 2007-08-17 00:43 vmlinuz-2.6.22-hardened-r1
-rw-r--r--  1 root root 1.5M 2007-08-17 12:52 vmlinuz-2.6.22-hardened-r2
-rw-r--r--  1 root root 1.5M 2007-08-25 08:25 vmlinuz-2.6.22-hardened-r3
-rw-r--r--  1 root root 1.5M 2007-09-20 22:44 vmlinuz-2.6.22-hardened-r4
-rw-r--r--  1 root root 1.5M 2007-09-23 08:27 vmlinuz-2.6.22-hardened-r5
-rw-r--r--  1 root root 1.5M 2007-09-27 08:19 vmlinuz-2.6.22-hardened-r6
-rw-r--r--  1 root root 1.5M 2007-10-04 12:19 vmlinuz-2.6.22-hardened-r7
-rw-r--r--  1 root root 1.5M 2007-10-15 22:38 vmlinuz-2.6.23-hardened
-rw-r--r--  1 root root 1.5M 2007-11-02 21:52 vmlinuz-2.6.23-hardened-r1
-rw-r--r--  1 root root 1.5M 2007-11-27 00:13 vmlinuz-2.6.23-hardened-r2
-rw-r--r--  1 root root 1.5M 2007-12-06 23:27 vmlinuz-2.6.23-hardened-r3
-rw-r--r--  1 root root 1.5M 2007-12-25 00:55 vmlinuz-2.6.23-hardened-r4
-rw-r--r--  1 root root 1.5M 2007-12-26 00:43 vmlinuz-2.6.23-hardened-r5

1 comment | Defined tags for this entry: Gentoo, kernel, Linux

Debianisiert

Posted by Jesco Freund at Dec. 17, 2007 3:13 p.m.

Wie gestern schon angedeutet, habe ich mir mehr als nur die halbe Nacht damit um die Ohren geschlagen, noch verschiedene Linux-Distributionen zu testen. Fedora hat sich relativ fix selbst disqualifiziert – Hetzner bietet zwar die Installation von FC8 via VNC an, aber mehrfache unmotivierte Abbrüche durch Fehler beim erzeugen der Dateisysteme waren dann zu viel des Guten. Mit Gentoo habe ich noch einmal sehr viel Zeit zugebracht, aber die xen-sources wollten sich partout nicht booten lassen. Als letzte Option habe ich jetzt noch mal Debian 4.0 installiert (und auf Anhieb zum laufen bekommen). Die genaue Vorgehensweise habe ich im RootForum-Wiki dokumentiert.

No comments | Defined tags for this entry: Debian, Linux, hardware virtualization, Xen

The One and Only…

Posted by Jesco Freund at Dec. 16, 2007 12:02 p.m.

… gibt es nicht. Jedenfalls nicht unter den unixoiden Betriebssystemen. Für ein umfangreicheres Xen-Setup ein geeignetes Basis-System zu finden gestaltet sich schwieriger, als ich zunächst dachte. Favorit wäre für mich ein BSD-System; das einzige, das zur Zeit mit Xen-Unterstützung daherkommt, ist NetBSD. Nicht schlecht, aber NetBSD fehlt ein tauglicher Volume Manager, nachdem vinum mit 4.0 endgültig aus dem System fliegt – nicht weiter verwunderlich, da das Projekt seit 2004 nicht mehr weiterentwickelt wurde. Und bei dem Gedanken an eine Datenbank-DomU unter Volldampf auf einem Disk Image File kommt mir irgendwie das kalte Grausen. Richtig schick wäre ja ein System mit ZFS-Unterstützung, aber da käme nur OpenSolaris in Frage, und das ist mir wiederum für ein Produktivsystem zu wackelig und zu viel Bastelei.

continue reading The One and Only…

No comments | Defined tags for this entry: Gentoo, Linux, NetBSD, Ubuntu, unix, hardware virtualization, Xen, ZFS

Ein gefräßiger Affe für den Server

Posted by Jesco Freund at Nov. 24, 2007 10:06 p.m.

Nein, dieser Beitrag soll kein neuerliches Ubuntu-Bashing sein – für den Server finde ich Ubuntu nämlich durchaus sehr brauchbar. Gegenüber „purem“ Debian besteht der Vorteil regelmäßiger Releases, kürzerer Release-Zyklen und damit aktuellerer Software. Speziell die relativ aktuellen Xen-Pakete, die der gefräßige Primat (wer denkt sich eigentlich diese Namen aus?) mitbringt, üben auf mich eine gewisse Anziehungskraft aus.

Da die Installation aus dem Rettungssystem ein bisschen anstrengend ist (nur mit debootstrap allein ist es ja noch nicht getan), habe ich mir ein Installationsskript zusammengebastelt, das mit den meisten Linux-basierten Rettungssystemen funktionieren dürfte. Installiert wird damit je nach Wahl ein 32- oder 64-bittiges Ubuntu (auch die Version ist wählbar) mit Server-Kernel und Lilo als Bootloader. Getestet habe ich das Skript mit einem Hetzner-Server im 64-Bit Rettungssystem. Hier erkennt das Skript alle benötigten Einstellungen selbst; alle Vorgabewerten können einfach bestätigt werden.

wget http://svn.my-universe.com/scripts/trunk/ubuntu-tools/src/ubuntu-installer.sh
chmod 0700 ubuntu-installer.sh
./ubuntu-installer.sh

No comments | Defined tags for this entry: Linux, server, Ubuntu