Problem: Ein alter Xen-Server unter Ubuntu 7.10 (Gutsy Gibbon) mit diversen Hardy-Gästen, neuerdings zickig und nicht mehr unterstützt. Ein vorsichtiges Update auf Hardy Heron machte Xen erst richtig instabil, mindestens eine VM war immer down.
Ein Wechsel zu KVM lag also nahe, zumal er schon lange auf der Todo-Liste stand und nur aus Zeitgründen noch nicht umgesetzt wurde. Da ich die KVM-Unterstützung in Hardy auch nicht in allzu guter Erinnerung hatte, Lucid Lynx in wenigen Tagen released werden wird und ich mit KVM unter Lucid schon gute Erfahrungen gemacht habe, wurde also erst einmal auf Lucid aktualisiert.
Dann mussten zunächst die Disk-Images der Xen-Maschinen konvertiert werden. Das geht nicht automatisch, aber es gibt im Netz beispielsweise unter [1] und [2] gute Hinweise dazu. Wir haben uns nicht ganz daran gehalten, vor allem, weil wir die VMs unter Xen teilweise gar nicht mehr booten konnten, um sie vorbereitend zu modifizieren.
Zur Konvertierung und Inbetriebnahme eines Images hat sich dieser Ablauf bewährt:
Neues Image erstellen, etwas größer als das Xen-Image zzgl. gewünschter Swap-Partition. Für ein 150GB-Image:
# dd if=/dev/zero of=kvm.img bs=1M count=163840
Image partitionieren:
# parted kvm.img mklabel msdos
# parted kvm.img mkpart primary ext2 0 162000 -a minimal
# parted kvm.img mkpart primary linux-swap 162000 163840
# parted kvm.img set 1 boot on
Block-Devices für das Image erstellen:
# losetup /dev/loop0 kvm.img
# kpartx -a /dev/loop0
Inhalt des Xen-Images kopieren und an Partition ausrichten:
# dd if=/opt/domain/domains/alter-xen-server/disk.img of=/dev/mapper/loop0p1 bs=1M
# fsck.ext3 -f /dev/mapper/loop0p1
# resize2fs /dev/mapper/loop0p1
# fsck.ext3 -f /dev/mapper/loop0p1
Swap anlegen:
# mkswap /dev/mapper/loop0p2
Grub und Kernel in Partition installieren:
# mount /dev/mapper/loop0p1 /mnt
# mkdir -p /mnt/boot/grub
# cp /boot/grub/stage1 /mnt/boot/grub/
# cp /boot/grub/stage2 /mnt/boot/grub/
# cp /boot/grub/e2fs_stage1_5 /mnt/boot/grub/
# chroot /mnt
# apt-get install grub linux-server
# update-grub
# exit
# umount /mnt
Block-Devices entfernen:
# kpartx -d /dev/loop0
# losetup -d /dev/loop0
Boot-Sektor installieren:
# echo "device (hd0) kvm.img
root (hd0,0)
setup (hd0)
quit" > /tmp/grub.input
# grub --device-map=/dev/null < /tmp/grub.input
Eine Instanz in libvirt bekanntmachen:
Vorher wurde "roge-subnet-1" definiert, so wie das Subnetz unter [3].
# virt-install -n mein-toller-server -r 512 --vcpus=1 --os-type=linux --os-variant=ubuntuhardy --virt-type=kvm --import --disk /opt/kvm/mein-toller-server/kvm.img --network network=roge-subnet-1,model=virtio --vnc --noautoconsole
Mit etwas Glück läuft anschließend die virtuelle Maschine und ist erreichbar. Falls eine Firewall auf dem Server läuft, sollte man daran denken, die Interfaces entsprechend der neuen Netzwerk-Konfiguration anzupassen.
Für die dd-Aufrufe muss Zeit eingeplant werden. Der erste dauert für diese Größe etwa 30 Minuten, der zweite einige Stunden.
[1] http://searchnetworking.techtarget.com.au/articles/35011
[2] http://blog.pregos.info/2009/09/06/migration-virtueller-maschinen-von-xen-zu-kvm/
[3] http://wiki.hetzner.de/index.php/Netzkonfiguration_für_Xen_und_KVM_mit_libvirt
In the recent Debian Weekly News I found a reference to a book project called Debian GNU/Linux Desktop Survival Guide. It seems that the author's intent was to write down everything he would otherwise forget. Other people use weblogs for that. Anyway, I tend to like the book a lot and will recommend it to everyone who is bugging me with questions about Debian all the time. A german translation is missing, but I don't want to complain about it because the logical answer would be "Do it yourself!" and it would be hard to object that.
As I promised in a comment to my previous entry I want to show you how I configured spamassassin to use an inexistant mail address as a spam trap to gain better quality of the database it uses for the bayesian filtering. One day I was fed up with the false negatives I had to feed to sa-learn manually to keep the bayes database up to date. So I decided to publish a mail address that I will never use for anything other than poisoning spambots and then let spamassassin score mail to this address so high that it will ever be classified as spam. As a result, spamassassin will remember these messages as spam in its database. In my case the trap address is s.pemtrep@rompe.org. I realized that there are some other addresses that seem to exist in some spammers address lists only, so I simply applied them to the same rule. The rule for spamassassin is quite simple:
header ROMPE_BADRECIPS To =~ /(kuk|s.pemtrep|ballepromp)\@rompe\.org/i
score ROMPE_BADRECIPS 9.0
describe ROMPE_BADRECIPS Spam trap recipient
Add something like this to your /etc/spamassassin/local.cf and you are done. Publish the address on the web (but don't forget to mark it as a spam trap since you don't want humans to write to this address!) and soon the spambots will begin to feed your database with high quality spam. This will, of course, increase your traffic a bit, but it will definately lower your amount of false negatives.
The next logical step would be to combine this with something like teergrube and/or temporary host blocking, but we will have to accept the first mail for our database before we can start sanctioning. I will have to think about this. Comments are welcome.
Schon seit Wochen nervt mich das: Seit einem der letzten großen Dist-Upgrades scrollt mein Galeon nicht mehr horizontal, wenn man das Mausrad in die entsprechende Richtung benutzt. Stattdessen wird in der History herumgeblättert. Das ist besonders störend, wenn man einen Trackball mit Wheel-Emulation benutzt, weil man dann kaum noch in der Lage ist, eine Seite nach unten zu scrollen, ohne dauernd versehentlich in der Chronik zurückzublättern. Nun habe ich endlich die Lösung dafür gefunden: Mozilla hat neue Defaulteinstellungen bekommen, die man aber auch in keiner Config-Datei findet. Stattdessen findet man sie, wenn man als URL about:config eingibt und dort nach "wheel" sucht. Genaugenommen muss man diese beiden Einträge...
mousewheel.horizscroll.withnokey.action default integer 2
mousewheel.horizscroll.withnokey.numlines default integer -1
...mittels Doppelklick so ändern:
mousewheel.horizscroll.withnokey.action user set integer 0
mousewheel.horizscroll.withnokey.numlines user set integer 1
Danach ist alles wieder so, wie man es kennt.
Inspired by the comments to this NewsForge article about concatenating PDF files I wrote this little script which allows you to find patterns in PDF documents in exactly the same manner that you know from the grep utility with plain text files. If you never heard about grep, then you probably won't be interested in this script.
The syntax is as follows:
pdfgrep [grep options] <pattern>[file ...]
A comment poster hardcoded the grep options "--context=4 --color=always", but I don't hardcode these because I want to be able to give the context size myself (for four lines just try "pdfgrep -4 ...") and for the colour I have this line in my .bashrc anyway:
export GREP_OPTIONS="--color=auto"
Finally, here comes the script:
#!/bin/sh # 2004-06-22 Ulf Rompe <ulf@@@@rompe.org> # Updated for filenames containing whitespace 2005-07-18 if [ $# -lt 2 ]; then echo 'Syntax: pdfgrep [grep options] <pattern> <file> [file ...]' exit 1 fi grepopts="" while [ `echo $1 | cut -c1` == "-" ]; do grepopts="$grepopts $1" shift done pat="$1" shift if [ $# -gt 1 ]; then shownames=1; else shownames=0; fi while [ $# -gt 0 ]; do [ "$shownames" == 1 ] && echo $1":" pdftotext -layout "$1" - | egrep $grepopts "$pat" shift done
For the search engines: If you just upgraded your Debian Sid installation including clamav and amavisd-new, and now your virus scan doesn't work anymore and instead logs messages like the following:
(30235-03) Clam Antivirus-clamd FAILED - unknown status: /var/lib/amavis/amavis-.../parts: Can't access the file ERROR (30235-03) WARN: all primary virus scanners failed, considering backups
...then you can fix it with this simple command:
adduser clamav amavis
This adds the user "clamav" (which is now the default user that clamav sets it's effective UID to) to the group "amavis" so that the temporary files generated by amavis are readable for the scanner.
Das Problem ist alt: Suns Java-Lizensierung ist nicht mit den Debian-Richtlinien kompatibel. Deshalb gibt es keine offiziellen Debian-Pakete mit dem Java Runtime Environment. Wer ohne viel Arbeit eine aktuelle Java-Umgebung auf seiner Debian-Installation haben wollte, die sich trotzdem in die Paketverwaltung einfügt, legt sich daher üblicherweise einen Mirror der Blackdown-Java-Pakete für Debian ind die /etc/apt/sources.list. Etwa so:
deb ftp://ftp.tux.org/java/debian sid main non-free
Diese Pakete sind aber leider nicht immer brandaktuell. Das musste ich feststellen, weil die aktuelle Version von Eclipse (darüber werde ich bald auch noch ein wenig berichten) nicht mehr mit ihnen funktioniert, und auch schon früher schrieb ich über Schwierigkeiten. Eher zufällig stolperte ich nun über eine sinnvolle Entwicklung namens j2se-package, die in etwa das mit einem Java-Paket von Sun oder Blackdown macht, was make-kpgk mit einem Kernel tut: Es baut mit einem einfachen Aufruf ein fertiges Debian-Paket daraus.
Dies sind die Schritte zum Erfolg:
deb http://www.stud.uni-karlsruhe.de/%7eude2 debian/apt-get update && apt-get install j2se-packagej2se-package j2re-1_4_2_03-linux-i586.bindpkg -i sun-j2re1.4_1.4.2+03_i386.debapt-get install sun-j2re1.4debianupdate-alternatives --config javaDas Paket sun-j2re1.4debian ist notwendig, weil darin die alternatives-Einträge für die Binaries enthalten sind. Wenn man statt des re ein sdk installiert hat, muss man auch entsprechend ein sun-j2sdk1.4debian installieren und die alternatives für javac und andere benötigte Binaries auch anpassen.
Will man keine anderen Java-Pakete parallel installiert haben und stößt dabei auf Abhängigkeitsprobleme, kann man diese mit dem Paket j2se-dummy auflösen.
Gerade habe ich den Einzeiler, mit dem ich ab und zu meine sämtlichen MP3-Files beackere, um die den Inhalt der ID3-Tags in die ID3V2-Tags zu kopieren, in diesem Eintrag aktualisiert, da dachte ich mir, dass das doch einen eigenen Eintrag wert sein sollte, weil's sonst doch niemand mitkriegt. So sei es, hier ist die aktuelle Kommandozeile:
find . -type f -name \*.mp3 | while read bla; do id3v2 -C "$bla"; id3v2 -T `basename "$bla"|sed -e 's/^\([0-9]*\).*/0\1/'|xargs expr 0 +` "$bla"; done
Neu ist daran, dass jetzt auch Filenamen mit Leerzeichen korrekt behandelt werden, ohne dass hinterher Mülldateien im Filesystem herumgammeln, und dass die Tracknummernerkennung etwas robuster ist. Dateien, deren Namen nicht mit Zahlen beginnen, erhalten eine "0" als Tracknummer.
BTW noch ein kleiner Tipp, falls Ihr CDs mit grip oder ähnlichen Tools rippt: Man achte von Anfang an darauf, dass man sowohl für die ID3-Tags als auch für die Dateinamen den richtigen Zeichensatz eingestellt hat. Weiterhin stelle man sich die Frage, ob man Dateien und Verzeichnisse überhaupt mit Umlauten und ähnlichen Krankheiten kontaminieren will, weil soetwas nämlich spätestens dann zum PITA wird, wenn man sein ganzes System einmal von ISO-8859-* auf UTF-8 umstellt. Dann darf man nämlich sowohl im Filesyystem als auch in den Playlisten alles konvertieren...
Was soll ich noch sagen: Auch dieser Kernel funktioniert erwartungsgemäß problemlos. Das "make oldconfig" brachte wenige, neue Optionen zu Tage. Interessant klingt allenfalls das neue Kernel-Modul für den I2C-Bus des Nvidia nforce2, nur habe ich den leider noch nicht zum funktionieren überreden können (Das braucht man vor allem, um dauern so wichtige Informationen wie CPU- und Gehäusetemperatur auf dem Schirm zu haben).
Ein generelles Problem bei der 2.6er Reihe ist mir allerdings doch noch aufgefallen: Verbindet man sich per NFS auf einen 64bit-IRIX-Server, dann schlagen manche Verzeichnisoperationen fehl. Genaugenommen hakt es beim getdents64(), wie man schnell mittels strace herausfinden kann. In der glibc werden nämlich gerüchteweise in diesem Bereich munter 32bit- und 64bit-Operationen gemischt, was dann dieses Problem ergibt. Das war früher natürlich auch schon sichtbar. Der 2.2er Kernel war davon betroffen, aber da gab es dann irgendwann einen Patch, der reparierte, wofür der Kernel gar nicht verantwortlich war. Das gleiche Spiel beim 2.4er Kernel, und nun bei der 2.6 auch wieder. Offensichtlich benutzen nicht viele Leute eine SGI als Fileserver und versuchen dann, von Linux aus mit CVS darauf zuzugreifen.
Dieses Wochenende ist auch eine neue glibc in Debian Sid hereingekommen. Ich mache mir zwar eigentlich keine Hoffnungen mehr, was diesen alten Bug angeht (der ist ja nun wirklich schon seit Jahren drin), aber trotzdem werde ich es morgen noch einmal versuchen.
Auch der aktuelle Linux-Kernel 2.6.0-test2 ließ sich problemlos
installieren und läuft auf einem Arbeitsrechner schon seit mehreren
Tagen. Auf dem Rechner mit Nvidia nforce2, vor dem ich gerade sitze,
läuft dieser Kernel nun auch und hat dort durch die verbesserte
Unterstützung des nforce-Chipsatzes für deutlich mehr Performance
gesorgt:
Bisher hatte die Festplatte laut "hdparm -Tt" einen
physikalischen Durchsatz von etwa 30 MB/sec, nun sind es 40.87 MB/sec.
OK, Benchmarks sagen nichts über die wirkliche Brauchbarkeit eines
Systems aus, aber ich bilde mir zumindest ein, den
Geschwindigkeitszuwachs auch spüren zu können. Auch habe ich den
Eindruck, dass die CPU-Last bei intensiven Schreibzugriffen gesunken
ist. Um das genau sagen zu können, müsste ich noch einmal den alten
Kernel booten und dann auf beiden einen "bonnie++" starten.
Wenn sich jemand für die Zahlen interessiert, bitte melden, dann mache
ich das.