Nov/070
[Quickie] ISO unter Linux mounten
Im Gegensatz zu Windows wird bei Linux kein extra Programm ala Daemon Tools zum Mounten/Einbinden von ISO Images benötigt. Der Standard-Kernel bringt das Feature schon mit. Zum Einhängen des ISO-Images kann der Befehl mount genutzt werden. Man muss eben nur die richtigen Parameter übergeben. Da ich diese selbst immer vergesse, halte ich den hier endlich mal fest:
root@mobile:/# mount -o loop -t iso9660
.iso /mnt
Jetzt ist die ISO unter /mnt eingehängt, der INhalt kann nun unter dem Pfad eingesehen werden. Schließen kann man die Datei dann mit:
root@mobile:/# umount /mnt
Oct/071
TABs vs. Spaces
Sobald mehrere Personen an einem Script/Code arbeiten, geht es über kurz oder lang in die Diskusion, wie der Code denn formatiert werden sollte, damit er lesbar bleibt. Jeder hat da ja so seine Eigenheiten und seinen eigenen Stil, oftmals ist das auch davon abhängig von welcher Programmiersprache man kommt. Man sollte in einem Projekt, an dem man gemeinsam arbeitet aber gewissen Namenskonventionen definieren um nicht zu große Inkonsistenzen in der Code-Formatierung zu haben.
Oft geht es um das setzen (oder weglassen) von Klammern, benennen von Dateien, definieren von Verzeichnisstrukturen, setzen und formatieren von Kommentaren. Ich möchte hier auf einen weiteren Diskusionspunkt eingehen: Das Einrücken von Code.
Erst durch das Einrücken von Code in Code-Blöcken, Klassen und Funktionen wird Code für den Menschen überhaupt gut lesbar. Der Maschine ist das bekanntlich ja meißt egal, da könnte auch eine 1000 Zeilen-Datei in einer Zeile zusammen gefasst sein. Der Mensch braucht aber eine gewisse Struktur im Code um auch in großen Dateien den Durchblick zu behalten.
Den Code kann man mit Tabs oder Spaces einrücken. Jeder hat da seine Vorlieben, das ist auch OK. Letztendlich ist es egal, ob Tabs oder Spaces (2, 4 oder 8 Leerzeichen) genutzt werden, das sollte nur konsequent in allen beteiligten Dateien verwendet werden. Es geht eben “nur” darum den Code lesbar zu machen.
Ich persönlich nutze aktuell Tabs zum Einrücken von Code. Da kann dann jeder seinen Editor (Vorausgesetzt es ist nicht notepad
) so konfigurieren, dass die Tabs eben zwei, vier oder mehr Leerzeichen breit sind. Das ist aus meiner Sicht immer noch am flexibelsten.
Wichtig ist noch: Das Einrücken von Code (Anfang des Codes in einer Zeile) kann man wie oben beschrieben nach Belieben gestalten. Im Gegensatz dazu sollte man zur Ausrichtung von Code (Strukturierung innerhalb der Zeilen und über mehrere Zeilen) z.B. bei der Deklaration von Variablen auf jeden Fall Leerzeichen nutzen. Denn, sobald die Ausrichtung mit Tabs gemacht wird, wird die Ausrichtung beim Ändern der Tab-Breite zerstört.
Oct/070
OpenSuSE 10.3 RSSOwl von Pacman
Mein (aktuell) liebster Feed-Reader ist, wie schonmal berichtet, RSSOwl. Ich habe auf dem frischen OpenSuSE 10.3 auch gleich RSSOwl installiert. Es war im Pacman Repository als fertiges RPM-Paket (rssowl-1.2.3-0.pm.2) zu finden. Beim herunterladen gab es eine seltsame Fehlermeldung von irgendwelchen Abhängigkeiten zu “…1212…” oder so ähnlich. Ich habe mir erstmal nichts weiter dabei gedacht, das Paket trotzem installiert. Bei Start von RSSOwl gab es nach der Installation auch immer einen Fehler: “…/bin/sh1212…”. Seltsam.
Ich habe mir das mal genauer angeschaut. Gestartet wird RSSOwl über ein Shell-Script, schauen wir uns das also mal (als root) genauer an:
1 2 3 | mobile:/ # type rssowl.sh rssowl.sh is /usr/bin/rssowl.sh mobile:/ # vi /usr/bin/rssowl.sh |
Hier der Inhalt der Datei:
1 | #!/bin/sh12#12# startscript for rssowl12#1212cd /usr/share/rssowl12java -jar -Djava.library.path=/usr/lib rssowl.jar12 |
Okay, kein Wunder… Da ist irgendwas mit der Zeichencodierung krumm. Ich habe das dann notdürftig im vi geflickt. Wie? Einfach alle 12 durch normale Zeilenumbrüche ersetzen, entweder manuell oder mit einem einfachen “Suchen & Ersetzen”-Befehl:
:s/12/^M/g
Das mit Enter bestätigen. Anschließend noch mit :wq speichern und vi beenden. Der Inhalt der Datei sieht dann so aus:
1 2 3 4 5 6 7 | #!/bin/sh # # startscript for rssowl # cd /usr/share/rssowl java -jar -Djava.library.path=/usr/lib rssowl.jar |
Jetzt lässt sich RSSOwl auch ganz normal starten.
Wie erreiche ich jetzt jemanden um den Bug in dem RPM-Paket zu melden? Keine Ahnung … im Paket selbst konnte ich keine Informationen finden. Na dann fragen wir doch mal auf www.rssowl.org nach.
Nachtrag: Mit einem Befehl lässt sich ganz einfach der Maintainer/Packager eines RPM-Paketes herausfinden: rpm -qi
Nachtrag #2: Mittlerweile gibt es ein neues RPM-Paket, in diesem ist der Fehler beseitigt. Die Version wurde nicht erhöht, so muss man das Paket manuell neu installieren.
Oct/072
OpenSuSE 10.3: WLAN auf IBM T42 (11 b/g Wireless LAN Mini PCI)
Heute habe ich mir mal das (brandneue) OpenSuSE 10.3 auf einem IBM T42 installiert. Sieht auch ohne “Personalisierung” schon ganz nett aus. Als erstes ist mir aufgefallen, dass mein Wireless-LAN nicht auf Anhieb ansprechbar war. Kein Weltuntergang, wenn man auch Netz über die Strippe zur Hand hat.
Also wie war das noch vor Monaten bei OpenSuSE 10.2? Da war irgendwas mit atheros und madwifi … kurz per lspci mal den Chipsatz anzeigen lassen, nicht dass ich da was durcheinander bekomme.
Ethernet controller: Atheros Communications, Inc. AR5212/AR5213
Atheros stimmt also… kurzerhand YaST angeschmissen, in der Paketverwaltung nach “madwifi” gesucht, im Packman-Repository wurde auch was gefunden – fix installiert, leider ohne Erfolg: Unter iwconfig war nichts zu finden.
Hm, da war doch was mit einem Kernel Modul. Also mal den Inhalt des vorhin installierten RPM-Paketes anzeigen lassen modprobe -l | grep ath. Nix. Kein Kernel-Modul, da fehlt also was…
Auf madwifi.org habe ich dann die Antwort gefunden: Als weitere Installationsquelle “http://madwifi.org/suse/10.3/” einbinden. Nochmal in der Paketverwaltung nach “madwifi” gesucht – siehe da, mehrere Pakete mit dem Namen “madwifi-kmp-…”. Das ists, da sind die Kernel-Module drin. Also das ganze installiert, anschließend noch das Modul laden modprobe ath_pci. Dann, die Freude war groß, iwconfig | grep ath0:
ath0 IEEE 802.11g ESSID:"" Nickname:""
Mode:Managed Frequency:2.437 GHz Access Point: Not-Associated
Bit Rate:0 kb/s Tx-Power:17 dBm Sensitivity=1/1
Retry:off RTS thr:off Fragment thr:off
Encryption key:off
Power Management:off
Link Quality=0/70 Signal level=-96 dBm Noise level=-96 dBm
Rx invalid nwid:27910 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
Jetzt funktioniert auch mein W-LAN! “Sie sind nun mit dem Drahtlosnetzwerk “x” verbunden.” – War mir ein Vergnügen.
Es bleibt noch zu erwähnen, dass ich gestern kurz mit Ubuntu 7.04 experimentiert habe, da wurde die Wifi-Karte zwar auf anhieb erkannt, entsprechende Treiber wurden auch gleich installiert, ich konnte mich aber auf Biegen und Brechen nicht mit einem WPA-PSK Netz verbinden – schade. Aber vielleicht ist dann mit Ubuntu 7.10 auch das dann erledigt. Ich bin gespannt…
Oct/071
Postfix: SMTP Relay – quick ‘n dirty redirect ALL mails
A software in a developement environment is sending mails to productive mail adresses of several domains. Due to some tests the software generates thousands of mails which would flood the mailboxes. The software has no debug-mode which rewrites the reciep mail adress. The only chance is to add a special smtp server. Therefore we need to create a special smtp-relay which rewrites the receptor adress (“To:”) in the mail header to a special mail address. I’ve used a small SuSE Linux machine with postfix to realize this.
Note: I’m not very expierienced with postfix administration so there could be a better solution. It took some time to find this solution, I tried out several things. The virtual tables seemed to be a possible solution.
Sep/077
Syslog-NG + phpSyslog-NG + MySQL
Ich habe einen Syslog-Server mit einem Syslog-NG Server laufen. Dieser Server empfängt brav Logs von entfernten Servern, Routern und sonstigen Geräten im Netz. Im Hintergrund werden die empfangenen Logs unter anderem an eine MySQL-Datenbank weiter geleitet. Syslog-NG schreibt die Informationen in eine Pipe, ein MySQL-Prozess zieht sich die Daten aus dieser Pipe und speichert sie ab. Aufgesetzt ist dieses System nach einem Howto im deutschen Nagios-Wiki (Artikel). Der MySQL-Prozess, der die Datenbank mit den Informationen aus der Pipe befüllt wird durch ein seperates Init-Script gesteuert. Es passierte hin und wieder mal, dass sich der MySQL-Prozess erhängt oder in Luft aufgelößt hat. Leider bin ich der Ursache des Problems nicht auf die Schliche gekommen. Durch Zufall hat sich mir aber eine andere Lösung aufgetan: Syslog-NG kann den MySQL-Prozess selbst steuern.
Ergänzt man folgende Zeile in der Destination d_mysql in der syslog-ng.conf:
program("/usr/bin/mysql --user=syslogfeeder --password='' syslog > /var/syslog-ng-mysql.pipe");
Das Ergebnis sollte dann in etwa so aussehen:
1 2 3 4 5 6 7 | destination d_mysql { program("/usr/bin/mysql --user=syslogfeeder --password='' syslog > /var/syslog-ng-mysql.pipe"); pipe("/var/syslog-ng-mysql.pipe" template("INSERT INTO logs (host, facility, priority, level, tag, datetime, program, msg) VALUES ( '$HOST', ' $FACILITY', '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC','$PROGRAM', '$MSG' );\n") template-escape(yes)); }; |
Jetzt kann man das Init-Script /etc/init.d/sqlsyslogd für den “sqlsyslog Daemon” entfernen, da der MySQL-Prozess jetzt durch Syslog-NG gesteuert wird.
Seit der Umstellung vor einigen Wochen läuft der Dienst durch – eine Sorge weniger.
Jul/075
USB-Drive mit NTFS und Truecrypt unter openSuSE 10.2
Ich habe mir vor ein paar Tagen eine interessante Aufgabe gestellt: Schreibender Zugriff auf NTFS Dateisysteme unter Linux. Okay, im Nachhinein betrachtet war das ganze unspektakulärer, als ich erwartet hatte. Aber fangen wir am Anfang an…
May/070
MySQL Monitoring und Tuning
Ich beobachte auf einem Server mit einer MySQL Datenbank (SLES9, MySQL 4.1.x) eine relativ hohe Last durch den mysqld, vermutlich laufen dort ein paar nicht optimierte Querys bzw. Tabellen regelmäßig gegen die Wand bzw. zwingen die Datenbank zum Auslagern auf die Festplatte. Bis dato lief der MySQL Server ohne individuelle Konfiguration ohne Auffälligkeiten und verrichtete seinen Dienst, mittlerweile habe ich angefangen an ein paar Werten zu schrauben um die Last und vor Allem das Auslagern auf die Festplatten zu minimieren. Interessante Werte sind hierbei in meinem Fall key_buffer_size, table_cache und tmp_table_size.
Bei meinen Tests haben mir die folgenden Artikel als gute Informationsquelle gedient:
- Optimizing MySQL: Hardware and the Mysqld Variables
- Optimizing MySQL: Optimizing the mysqld variables
Zum Beobachten der laufenden Querys habe ich zunächst das freie Tool mtop genutzt. Hierbei handelt es sich um ein Monitoring-Tool, dass dem Programm top ähnelt. Die SF.net Seite beschreibt das Tool wie folgt:
mtop (MySQL top) monitors a MySQL server showing the queries which are taking the most amount of time to complete. Features include ‘zooming’ in on a process to show the complete query, ‘explaining’ the query optimizer information for a query and ‘killing’ queries. In addition, server performance statistics, configuration information, and tuning tips are provided.
Mtop ist mehr zum On-Demand Monitoring geeignet, es verfügt zwar über eine farbliche Highlight-Funktion von long-queries, geloggt werden diese allerdings nicht.
Nach einigem Suchen habe ich das Perl-Script dbmon.pl gefunden. Dieses Script kann man sowohl als Daemon, als auch direkt an der Konsole laufen lassen. Im Daemon-Modus wird der Output in 3 verschiedene Logs geschrieben:
- dbmon.err
Querys, die errors produzieren bzw. vom Script gekillt werden - dbmon.log
Einzelne Events mit einer eindeutigen Prüfsumme, Start-, Laufzeit und der Event-ID - dbmon.sql
Prüfsumme mit den kompletten SQL Querys
Hier ein kurzer Auszug aus der dbmon.log:
Prüfsumme Typ Zeit Benutzer@Host Typ Event-ID Dauer
9494d0a84860066360989c45e188fd7b Start 2007-05-02 13:41:23 nagios@localhost Query id=23567
9494d0a84860066360989c45e188fd7b Finish 2007-05-02 13:41:23 nagios@localhost Query id=23567 0.032 sec
Anhand der Prüfsumme kann man dann die lange laufenden Querys aus der dbmon.log in der dbmon.sql zuordnen.
Es gibt in dem Script auch die Möglichkeit lang laufende Querys automatisch zu “killen”, das habe ich aber nicht benutzt, da es für diesen Anwendungsfall keinen Sinn macht.
Man sollte unbedingt darauf achten das Tool nicht dauerhaft laufen zu lassen, da es ganz gut an der CPU zieht. Zum vorrübergehenden Monitoring der Datenbank und der Querys, die dort auflaufen ist das Script aber genau das Richtige.
Apr/072
Procurve: Update Firmware via SFTP/SCP
Finally it was no problem at all. The firmware was already downloaded to nearly all switches (old firmware in secondary image, new firmware in primary). I just had to reboot with other image and it was updated.
Oh, i said “nearly”.
And thats the interesting thing. To update the firmware on the already updated switches I downloaded the images via TFTP from my client. Not very secure, but this was not the problem in this case. The problem was that the switch couldn’t access my client with TFTP. Now, how to get the firmware image on it?
SFTP/SCP is the solution.
Configure the switch to allow file transfer via SSH (in my case it already was):
ip ssh
ip ssh filetransfer
Then conenct via SFTP to the switch. First I tried to connect via WinSCP (SFTP/SCP Client for Windows) from my client, renamed the image file to “primary” and copied it in os/ folder to replace the primary image with it. I couldn’t transfer the file because WinSCP tries to create a temporary <filename>.part in order to rename it when the transfer is completed – the problem: The switch doesn’t allow file creation.
No Problem, uploaded the image to a linux system and tried from there:
scp /path/to/image user@switch.fqdn.com:/os/primary
And it worked!
The switch checked the image and then, simply reboot the switch:
system boot flash primary
Now waitin’ for the switch to be booted with the firmware – That’s all the magic…



























