Samsung Q330 Hotkeys
Emerge app-laptop/samsung-tools (more precise app-laptop/easy-slow-down-manager) for the samsung-backlight module, or try the SAMSUNG_LAPTOP option in the staging drivers area.
Put
{
/* Samsung Q330 */
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
DMI_MATCH(DMI_PRODUCT_NAME, "Q330"),
},
.callback = atkbd_setup_forced_release,
.driver_data = atkbd_samsung_forced_release_keys,
}
in the /usr/src/linux/drivers/input/keyboard/atkbd.c file around line 1675. Recompile and reboot.
Use
setkeycodes e008 225 setkeycodes e009 224
to make this keys known.
Advanced DHCP Options: Pushing static routes to clients
The DHCP protocol contains several more or less options to configure the clients (e.g. PAC-Files, NTP-Servers, etc.). One of these cool options is the ability to push static routes to clients. This can be done in two different ways:
- Single route (DHCP Option 33)
- Classless Static Route (DHCP Option 121)
Single route
Pushing a single route is very easy. The configuration value consists of two ip address pairs in hex. The first address is the destination host, the second is the router.
Example:
Destination: 192.168.123.234 (Hex: C0:A8:7B:EA)
Router: 10.34.72.42 (Hex: 0A:22:48:2A)
The value is: C0:A8:7B:EA:0A:22:48:2A
If you configure a pfsense box, go to Services -> DHCP Server and add the value to the box "Additional BOOTP/DHCP Options". Its important to choose the type "String"!

Classless Static Routing
The DHCP option 121 follows a slightly different format. The format is <width of the subnetmask>:<netaddress>:<router address> (again, in hex).
Example:
Destination: 192.168.123.0 (Hex: C0:A8:7B:0)
Router: 10.34.72.42 (Hex: 0A:22:48:2A)
Subnet mask width: 24
Value: 24.192.168.123.10.34.72.42, in hex 18:C0:A8:7B:0A:22:48:2A

To provide multiple static routes, just concat all encoded values. According to RFC 3442, you should include the default route in the DHCP option 121, since clients are allowed to ignore the "default route" DHCP option if the server provides a value for the classless static routing option. The default route option is: 00:0A:0A:0A:02 (the routers ip is 10.10.10.2, the last 4 bytes), combined: 00:0A:0A:0A:02:18:C0:A8:7B:0A:22:48:2A.
Note: Windows systems up to Windows XP/Windows Server 2003 do not request the dhcp option 121 (they have to be tweaked manually to request this option). The linux dhcp client "dhcpcd" requests this option per default (if not, set option classless_static_routes in /etc/dhcpcd.conf).
Blogvorstellung
Heute stelle ich mal ein paar der Blogs aus dem Blogroll vor (in beliebiger Reihenfolge):
Im Bestatterweblog kann man interessante, traurige aber informative Geschichten (gerne auch in mehreren Teilen) über den Tod, Bestattungen und dem ganzen Drumherum lesen. Hin und wieder kommen erheiternde Geschichten über den Nachwuchs des Bestatters hinzu. Passend dazu das Buch "Gestatten, Bestatter: Bei uns liegen sie richtig".
Im Blog Code Inside dreht sich alles um Microsoft .NET Technologien und deren Anwendung. Immer informativ, allerdings sehr Microsoft-lastig.
Der Shopblogger schreibt aus und über einen Spar-Markt in Bremen. Neben Geschichten über Ladendiebe und Leergutautomaten gibt es hier Einblicke in das schon fast alltägliche Chaos eines (ehemals 24h)-Supermarkts.
Diego E. Pettenò schreibt über Gentoo Development, Build-Probleme und Continuous Integration (wenn er sich nicht gerade über DRM/propietäre Ebook-Reader aufregt). Nicht immer leichte Lektüre, hat aber immer Hand und Fuß.
Im Law Blog erfährt man so einiges über Stilblüten der deutschen Justiz und öfter differenzierte Kommentare und Einschätzungen zu aktuellen Themen.
Aus dem Taxi-Blog kommen herrliche Geschichten über den Alltag eines Taxifahrers in Paderborn.
Partitionstabelle clonen
Damit ich das nicht wieder vergesse:
sfdisk -d /dev/sda > layout_sda
sfdisk /dev/sdb < layout_sda
Nützliche Webseiten
Wenn man an einem Nameserver oder Mailserver schraubt, kommt man oft in die Situation testen zu müssen wie es denn von "aussen" aussieht. Hierzu ein paar nützliche Seiten:
- IPTools.com: Verschiedene Möglichkeiten Routen, Domains, etc. zu testen
- intoDNS: Verschiedene Tests für Nameserver
- DNSsy: Prüft ähnlich wie intoDNS verschiedene Einstellungen von Nameservern
- MXToolbox: Verschiedene Tests für Mailserver
- Open Relay Test: Prüft auf verschiedene Arten ob ein Mailserver Mails von/für beliebige Adressen annimmt.
How to boot a gentoo LiveCD via PXE
Today i will show you how to boot a Gentoo LiveCD via PXE (aka network boot).
- Download a minimal install iso
- Prepare a TFTP Server
- Mount the ISO file as a loopback device (
mount -o loop /path/to/install-x86-minimal-20100216.iso /mnt/cdrom/) - Copy the Kernel (/mnt/cdrom/isolinux/gentoo) to your TFTP-Root
- Copy the InitramFS and the squash'ed root fs to a temp dir (/mnt/cdrom/isolinux/gentoo.igz and /mnt/cdrom/image.squashfs)
- Unpack the initramfs (
gunzip -c gentoo.igz | cpio -idv) - Patch the init script with this patch.
- Copy the RootFS to mnt/cdrom inside the initramfs (
mkdir -p mnt/cdrom; cp image.squashfs mnt/cdrom/) - Repack the initramfs (
find . -print | cpio -o -H newc |gzip -9 -c - > /path/to/tftp/root/initramfs.gz) - Edit your pxelinux.cfg/default file:
kernel gentoo append initrd=initramfs.gz root=/dev/ram0 init=/linuxrc loop=/image.squashfs looptype=squashfs cdroot=1 real_root=/
Mailserver, Root-Alias und die üblichen Merkwürdigkeiten
Bevor man das nächste Mal stundenlang rumprobiert, warum der Root-Alias nicht richtig funktioniert, sollte man in die /etc/mail.rc schauen!
PXE-Boot
Ich habe mich ein wenig mit PXE-Boot und initramfs auseinander gesetzt, und ich muss sagen: das macht echt Spass!
Damit ich das nicht wieder vergesse, hier eine Step-by-Step-Anleitung wie man einen Rechner mit einem selbstgebauten Kernel und initramfs per PXE booten lässt:
Kernel-Konfiguration
Diese Konfiguration bezieht sich auf den Kernel der über das Netzwerk geladen und auf dem Client gestartet wird. Der Kernel muss alle Treiber beinhalten, die der Client zum booten und laden des initramfs braucht. Die Treiber müssen dabei einkompiliert werden; Module können zu diesem Zeitpunkt logischerweise noch nicht verwendet werden.
Die einzig wichtige Option in dem Kernel ist:
General Setup --> Initial RAM filesystem and RAM disk (initramfs/initrd) support (=y)
Initramfs erstellen
Für das initramfs legen wir uns ein paar Verzeichnisse an:
mkdir /usr/src/initramfs
cd /usr/src/initramfs
mkdir -p bin lib dev etc mnt/root proc root sbin sys
In dieses root-fs kopieren wir jetzt einfach alle Programme die wir
in unserer initrd benötigen. Idealerweise baut man die Programme mit
+static/+livecd so dass man nur das Executable kopieren muss. Falls das
Ebuild das USE-Flag nicht bereitstellt, muss man entweder schauen ob
das (hoffentlich vorhandene) configure-Script eine solche Option
bereitstellt, oder mittels ldd <executable> herausfinden welche
Dateien noch benötigt werden.
Anschliessend müssen wir nur noch das eigentliche Init-Script (PID=1) anlegen. Dieses Script wird nach dem mounten des initramfs gestartet und ist dafür verantwortlich, das neue Root zu mounten und den Init-Prozess an jemand anderen abzugeben.
#!/bin/busybox sh
# Mount the /proc and /sys filesystems.
mount -t proc none /proc
mount -t sysfs none /sys
# Mount the root filesystem.
mount -o ro /dev/sda1 /mnt/root
# Clean up.
umount /proc
umount /sys
# Boot the real thing.
exec switch_root /mnt/root /sbin/init
Das init-Script mountet momentan einfach /dev/sda1 und startet den
normalen Init-Prozess. Sicherlich nichts wildes, aber der Fantasie sind
da keine Grenzen gesetzt :) Anschliessend noch +x setzen und fertig.
Das initramfs-File ist ein gzip-komprimiertes cpio-Archiv. Ein find . -print0 | cpio -ov -0 --format=newc | gzip -9 > /tmp/initramfs.cpio.gz erstellt das passende Archiv.
TFTP-Server konfigurieren
Ich habe hier als TFTP-Server net-ftp/atftp verwendet.
In /etc/conf.d/atftp stellt man ein beliebiges Verzeichnis ein, das als
Root des TFTP dienen soll. In diese Verzeichnis kopiert man den
gebauten Kernel, das initramfs-Image und /usr/share/syslinux/pxelinux.0 (PXE Bootloader aus sys-boot/syslinux). Weiterhin legt man ein Verzeichnix pxelinux.cfg
an, das die Configs für die Clients behinhalten wird. Der Bootloader
sucht automatisch nach einer Datei mit seiner MAC-Adresse in dem
Verzeichnis. Falls er die nicht findet, nimmt der die Datei default.
Das ist ganz praktisch, da man so Client-spezifische Konfigurationen
anlegen kann.
Die default-Datei beinhaltet folgendes:
prompt 0 timeout 30 label linux menu label Freaky PXE kernel bzImage append initrd=initramfs.cpio.gz vga=0x307
DHCP-Server konfigurieren
Während eines PXE-Boots stellt der Client eine DHCP-Anfrage. Daher müssen wir noch dem DHCP-Server sagen, was er denn einem Client antworten soll. Für dnsmasq gibt man folgendes an:
dhcp-boot=pxelinux.0,,192.168.0.123
Dies weist den Client an von dem Server 192.168.0.123 den Bootloader in pxelinux.0 zu laden.
Durchkicken
Nun kann man den Client neustarten. Wenn man im BIOS das booten vom Netz aktiviert hat, sollte der Rechner nun vom Netz sich das initramfs holen, und danach lokal weiterbooten. Je nachdem was noch in init steht, kann man hier noch die abgefahrensten Sachen machen.
Zum weiterlesen:
How to parse a syslog logfile in python
Thanks to the incredible pyparsing module it is really easy to parse arbitrary files without the hassle of regular expressions.
The following code parses a standard syslog-ng logfile:
from pyparsing import Word, alphas, Suppress, Combine, nums, string, Optional, Regex
month = Word(string.uppercase, string.lowercase, exact=3)
integer = Word(nums)
serverDateTime = Combine(month + " " + integer + " " + integer + ":" + integer + ":" + integer)
hostname = Word(alphas + nums + "_" + "-")
daemon = Word(alphas + "/" + "-" + "_") + Optional(Suppress("[") + integer + Suppress("]")) + Suppress(":")
message = Regex(".*")
bnf = serverDateTime + hostname + daemon + message
with open('/path/to/logfile') as syslogFile:
for line in syslogFile:
fields = bnf.parseString(line)
print fields
Bash-Autocompletion per PageUp
Wenn die Autocompletion in Bash per PageUp nicht mehr funktioniert, hat das i.d.R. nichts mit den X-Treibern oder der keymap zu tun: Dann wird die /etc/inputrc nicht verarbeitet.
Wenn man eine ~/.inputrc hat, dann wird die globale in /etc/ auch nicht verwendet - hier müssen also alle Befehle kopiert, oder die global angepasst werden
libvirt: Nützliche Befehle
Hier ein paar nützliche Befehle um den libvirtd in meinem neuen KVM/Qemu/libvirtd-Setup von der Console aus zu steuern (hauptsächlich für mich als Erinnerung):
virsh define <vm-xml>: Neuladen oder Hinzufügen einer VM ohne den libvirtd neustarten zu müssen virsh undefine <vm-xml>: Entfernen einer VM ohne den libvirtd neustarten zu müssen virsh pool-refresh <storage-name>: Neuladen eines Storage-Pools
Wenn man eine VM-Definition (=XML-Datei) kopiert muss man die uuid anpassen, da die Datei sonst nicht vom libvirtd verwendet werden kann, wenn die uuid kollidiert. Eine neue UUID kann man sich mittels uuidgen aus sys-apps/util-linux generieren.
Rsync über SSH
Um ein lokales Verzeichnis per Rsync über SSH auf einen anderen Rechner zu pusten, kann man dem rsync Kommando einen Tunnel mitgeben:
rsync -r -v -z --progress -t -e "ssh -i <YOUR-PRIVATE-KEYFILE> -l <REMOTEUSER>"
<LOCAL-DIR> <REMOTE-USER>@<REMOTE-HOST>:<REMOTE-DIR>
MySQL: Insert or Update
INSERT INTO <tabelle> (spalte1, spalte2, spalte3) VALUES('a','b', 'c')
ON DUPLICATE KEY UPDATE spalte2='blah';
Siehe auch:
Mehrere IPs
Um mehrere IPs an eine NIC zu binden muss man in der /etc/conf.d/net folgendes eintragen:
config_ethN=(
"192.168.0.1 netmask 255.255.255.0 brd 192.168.0.255"
"192.168.0.2 netmask 255.255.255.0 brd 192.168.0.255"
"192.168.0.3 netmask 255.255.255.0 brd 192.168.0.255"
"192.168.0.4 netmask 255.255.255.0 brd 192.168.0.255"
)
routes_ethN=( "default gw 192.168.0.1" )
Dann nur noch das Netzwerkinterface neustarten und fertig.
Eclipse SVN auto keywords
In ~/.subversion/config unter
[miscellany] enable-auto-props = yes
setzen und unter
[auto-props] *.java = svn:eol-style=native;svn:keywords=Id *.php = svn:eol-style=native;svn:keywords=Id
eintragen. Dann wird bei jedem svn add auch die Properties auf *.java gesetzt.
