Dienstag Aug. 07, 2012

Redis PHP Session Handler

Anstatt mit Sticky-Sessions am Loadbalancer zu arbeiten oder PHP-Session-Informationen in einer MySQL zu speichern, bietet sich die sehr schnelle Redis-Extension an

extension=redis.so
session.save_handler = redis
session.save_path = "tcp://localhost:6379

Samstag Aug. 04, 2012

Linux und MacBook Pro Retina Display (10,1)

Nachdem ich demnächst auf mein MacBook ein vernünftiges Betriebssystem spendieren (Funtoo/Gentoo) möchte, hier schon mal ein paar Links (mehr oder weniger interessant) für Leute, die das auch vorhaben. Die Links sind erstmal eine Sammlung an Infos, die so existieren. Das MacBook mit Retina ist ja noch relativ neu und das macht die Sache mit Linux oft nicht einfacher. Das ArchLinux Wiki scheint hier mal wieder am Weitesten zu sein, aber es gibt auch ein paar andere interessante Infos. Sobald ich Linux drauf habe bzw. hoffe drauf zu bekommen, schreibe ich wieder was...

Arch Linux Forum: MacBook Pro 2012 Retina
Arch Wiki: MacBookPro Retina
2012 Retina Display Macbook Pro and openSUSE Linux
Ubuntu MactelSupportTeam/AppleIntelInstallation
How to install Ubuntu on MacBook using USB Stick
Ubuntu 12.04 dual boot on Macbook Pro
wiki-AT-ubunutuusers-DOT-de
Ubuntu Forums: ubuntu on new retina macbook : any experience
cberner.com: Installing Ubuntu 12.04 on Macbook Pro Retina (10,1) <- Relativ gute Anleitung
Und als Nicht-Mac-Jünger brauch ich das hier: Startup key combinations for Intel-based Macs
Ubuntu: How to create a bootable USB stick on OS X

Kernel Hacker Greg Kroah-Hartman mischt auch mit auf Google+: Macbook retina booting with gummiboot to Gentoo. Now I can get more work done on this box as it's easier to install a new kernel.
Dann haben wir noch das Gentoo BlueDragonX / fm-overlay mit div. Patches für Kernel 3.5 (BTW: Ubuntu 12.10 Alpha3 hat auch Kernel 3.5. Damit könnte man auch Glück haben. Kernel 3.5 scheint im Allgemeinen nicht verkehrt zu sein).

Und dann noch dieser wunderschöne Post von Greg KH: "I booted it (MacBook) the first time on OS-X, saw that the screen and wireless worked (wanted to verify that), and registered for the warranty, then wiped the disk clean. ..." ;-)

Update 20120807

Wenn man Mac OS drauf lassen will, muss man zuerst mal die Partition verkleinern bzw. besser gesagt spalten, damit wir Linux irgendwo drauf bekommen. Ich hab das im Mac Terminal gemacht mit diskutil (ja ich weiß, geht alles viel schöner mit GUI, aber ich lebe halt auf der Konsole ;-) ). Hier die Orginal-Konfiguration:

mbpro:~ user$ diskutil list

/dev/disk0

   #:                       TYPE NAME                    SIZE      IDENTIFIER

0:      GUID_partition_scheme                        *251.0 GB   disk0
1:                        EFI                         209.7 MB  disk0s1
2:                  Apple_HFS Macintosh HD            250.1 GB  disk0s2
3:                 Apple_Boot Recovery HD             650.0 MB  disk0s3

Interessant hier ist also die Partition disk0s2. Die hat 250 GB und die wollen wir spalten. Dazu müssen wir aber auch erst wissen, wie viel wir für Mac OS übrig lassen müssen, wir brauchen also die Minimale Größe in GB, also die Anzahl an GByte, die wir nicht nutzen können und das geht dann so:

mbpro:~ user$ diskutil resizevolume disk0s2 limits

For device disk0s2 Macintosh HD:
        Current size:  250.1 GB (250140434432 Bytes)
        Minimum size:  48.8 GB (48755404800 Bytes)
        Maximum size:  250.1 GB (250140434432 Bytes)

Wir haben hier also ca. 50 GB, die Mac OS benötigt und die wir nicht nutzen können. Ich habe mich entschieden, für Mac OS 100 GB zu verwenden und 150 GB für Linux. Dann spalten wir also mal ;-)

mbpro:~ user$ diskutil resizevolume disk0s2 100GB JHFS+ linux 150GB

Started partitioning on disk0s2 Macintosh HD
Verifying the disk
Checking file system
Performing live verification
Checking Journaled HFS Plus volume
Checking extents overflow file
Checking catalog file
Checking multi-linked files
Checking catalog hierarchy
Checking extended attributes file
Checking volume bitmap
Checking volume information
The volume Macintosh HD appears to be OK
Resizing
Waiting for the disks to reappear
Formatting disk0s4 as Mac OS Extended (Journaled) with name linux
Initialized /dev/rdisk0s4 as a 140 GB HFS Plus volume with a 16384k journal
Mounting disk
Finished partitioning on disk0s2 Macintosh HD

/dev/disk0

   #:                       TYPE NAME                    SIZE      IDENTIFIER

   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            100.0 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s5
   4:                  Apple_HFS linux                   150.0 GB   disk0s4

Wir haben hier jetzt also eine Partition disk0s4 bekommen und da soll dann mal Linux drauf... 

Nachdem ich ja Funtoo (ein Gentoo Derivat) draufspielen möchte und Funtoo/Gentoo man ja nicht "mal so" installiert, brauchen wir als nächstes erstmal eine Distribution, von der wir booten können. Mein erster Versuch ist die neueste Ubuntu 12.10 Quantal Quetzal (noch in der Entwicklung). Die hat Kernel 3.5 dabei, damit sollte man hoffentlich Glück beim Booten haben. Ziel Kernel für mich ist jetzt aktuell dann 3.6 (Update: Kernel 3.6-rcX funktioniert nicht zusammen mit dem Binary Nvidia Treiber. Der Treiber kompiliert nicht. Deshalb bleibe ich bei Kernel 3.5). Genommen habe ich dieses Image hier von Ubuntu 12.10 (Quantal Quetzal) Daily Build 64-bit Mac (AMD64) desktop CD . Das ISO-File kopieren wir dann erstmal auf einen USB-Stick, der größer/gleich 1 GByte sein sollte. Ich hab das mit Linux und dd probiert, aber das mag das MacBook nicht booten, deshalb so, dann geht's: USB in Mac rein und dann erscheint der bei mir als /dev/disk1:

mbpro:~ user$ diskutil list

/dev/disk0

   #:                       TYPE NAME                    SIZE      IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            100.0 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
   4:                  Apple_HFS linux                   150.0 GB   disk0s4

/dev/disk1

   #:                       TYPE NAME                    SIZE      IDENTIFIER
   0:     FDisk_partition_scheme                        *1.0 GB     disk1
   1:                       0x17                         797.2 MB   disk1s1

Dann müssen wir das ISO-Image konvertieren:

mbpro:~ user$ hdiutil convert -format UDRW -o ubuntu.img quantal-desktop-amd64+mac.iso 

Master Boot Record (MBR : 0) lesen …
Ubuntu 12.10 amd64               (Apple_ISO : 1) lesen …
 (Windows_NTFS_Hidden : 2) lesen …

...........................................................

Dauer:  5.075s
Geschwindigkeit: 149.8M Byte/s
Ersparnis: 0.0 %
created: /Users/d790026/ubuntu.img.dmg

Und dann können wir mit dd das Image auf den Stick schreiben und wenn das fertig ist, auswerfen:

mbpro:~ user$ sudo dd if=ubuntu.img.dmg of=/dev/disk1 bs=1m
Password:

diskutil eject /dev/disk2

Dann spielt man sich erstmal rEFIt drauf (Download rEFIt-0.14.dmg). Einfach runterladen und Paket unter Mac OS installieren (einfach den Anweisungen folgen). Das macht es die Sache einfacher, später Linux zu starten. Wenn man das MacBook bootet, dann bekommt man gleich zu Beginn ein Menü, mit dem man Linux (jetzt erstmal vom USB-Stick, später taucht auch die Linux Installation auf Platte im Menü auf) starten kann. 

Dann starten wir mal das Ubuntu von Stick. Sobald der Bootscreen

boot_screen_ubuntu.png

erscheint, irgend eine Taste drücken, damit man drei Kernel-Optionen setzen kann: noapic nomodeset. Hierzu drückt man, nachdem man die Sprache ausgewählt hat, auf F6, klickt das Auswahlmenü weg mit den Kerneloptionen und gibt sie unten in der Boot Options Zeile am Besten vor den beiden "--" am Schluss ein. Dann "Try Ubuntu without installing" auswählen, Return drücken und los geht's. Je nachdem, wie schnell der Stick ist, dauerts mal länger mal weniger lang, bis dann die GUI kommt. Bei mir blieb er vorher ca. 30 Sek. auf dem Prompt stehen, bis die GUI endlich kam.

Hier dann mal der erste Screenshot (1024x768 Auflösung) nach dem ersten Booten von Ubuntu vom USB Stick:

mac_retina_ubuntu_001.jpg

Dann kann man jetzt Ubuntu installieren wenn man will. Einfach "Install Ubuntu 12.10" doppelklicken und im Laufe der Installation erkennt Ubuntu selber, das da Mac OS schon drauf ist und installiert selbstständig auf der freien Partition, die wir oben angelegt haben, Ubuntu drauf. Wenn man dann rebootet und von Disk das Ubuntu startet, darf man nicht vergessen, wieder die o.g. Kerneloptionen einzubauen, sonst kommt man nicht weit (Update 20121017: Kernel 3.6 final bootet bei mir inszwischen ganz ohne Kerneloptionen - soweit man nicht den Nvidia Orginal-Treiber installieren möchte. Ansonsten sind folgende Kernel-Optionen sinnvoll: i915.modeset=1 rdblacklist=nouveau nouveau.modeset=0). Irgendwann ist man dann wieder im Ubuntu Desktop mit er 1024x768 Auflösung. Also die Intel-Grafik konnte ich überhaupt nicht aktivieren. Da hilft auch kein Projekt Bumblebee aktuell.

Ich dann noch kurz mal die Nvidia-Treiber installiert. Wenn man das tut, sollte man vorher am besten ssh installieren und aktivieren, root ein Passwort verpassen und root-Login erlauben. Wenn nämlich der Bildschirm vom MacBook schwarz bleibt, kann man sich von einem anderen Rechner aus einloggen und noch was reparieren. Ansonsten könnte es für immer schwarz bleiben oder man muss halt wieder vom Stick booten. Man bindet am besten dieses PPA ein: ppa:ubuntu-x-swat/x-updates . Ich hatte dann einmal die Auflösung 800x600, dann 640x480 und als ich die Treiber dann einmal deinstalliert und wieder installiert hatte, hatte ich dann irgendwann 1600x1200:

mac_retina_ubuntu_nvidia_1600x1200_1.jpg

Aber das war's dann auch erstmal. Gut, ich hab jetzt nicht weiter experimentiert, weil ich will ja Funtoo drauf. Wichtig für den Nvidia-Treiber ist, das folgende Option in der xorg.conf gesetzt wird:

Option "UseDPLib" "off"

Das Touchpad reagiert auch manchmal recht sensibel, d.h. etwas eigensinnig und ich hatte jetzt auch nicht das Gefühl, das mit 3D viel läuft... Naja, das mal für alle Leute, die mit Ubuntu arbeiten wollen. Vielleicht hilft es was. Ich hab dann das MacBook mal voll aufgeladen und dann einfach mal im Batteriebetrieb laufen lassen (Monitor immer an). Der Akku hielt genau 4 Std. Mit dem Bug in Mac OS X Mountain Lion läuft das MacBook unter Mac OS X aktuell nur ca. 30 Min. länger. Bin mal gespannt, ob das mit dem versprochenen Update von Mac OS X besser wird. 7 Std. sollen das ja angeblich sein. Dann wären 4 Std. vs. 7 Std. natürlich schon ein dramatischer Abstand...

Ich habe übrigends diesen USB 2.0 Ethernet Adapter verwendet, da Thunderbolt über Ethernet in dieser Phase vermutlich noch nicht funktionert:

USB 2.0 Netzwerk Adapter auf 10,100,1000 Gigabit LAN Kabel, RJ45 Fast Ethernet

Der Adapter arbeitet einwandfrei und wird sofort erkannt. DHCP klappt auch gleich. Nur GBit über USB2.0 darf man jetzt nicht erwarten. Wie viel letztendlich drüber geht, habe ich noch nicht getestet. (Update 20121018: Mit Kernel 3.6.2 funktioniert der von Apple angebotene Thunderbolt/Ethernet-Adapter, wenn man ihn schon eingesteckt hat, bevor Linux startet. Ob Hotplug funktioniert und der Adapter nach dem Suspend wieder funktioniert, hab ich noch nicht getestet.)

Und jetzt probieren wir es mal mit Funtoo :-) Mal schauen, wie weit wir damit kommen. Bevor ich Ubuntu wieder gelöscht habe, habe ich mir die Kernel-Config unter /boot von Ubuntu geklaut ;-) Das ist ein 3.5er Kernel. Die .config könnt ihr euch hier runterladen: config-3.5.0-8-generic.gz . Alternativ: Hier die Kernel 3.5 .config von Sabayon (auch ein Gentoo Derivat). Update 20121017: Ganz unten findet ihr eine Kernel .config für Kernel 3.6.2. Der sollte komplett ohne Patches und Kernel-Parameter laufen (tut er bei mir zumindest).

Nachdem Ubuntu ja die Partitionen eingerichtet hat im vorhergehenden Schritt, übernehme ich das gleich so. In gparted sieht das dann so aus:

mac_partition_ubuntu_final.jpg

Ich werde jetzt mal die Funtoo Linux Installation Anleitung wie gewohnt abarbeiten und dann sehen wir schon, ob was bootet nachher. Hier jetzt ohne große Erklärung eine Auflistung der ausgeführten Kommandos:

mkfs.ext4 /dev/sda5
mkdir /mnt/funtoo
mount /dev/sda5 /mnt/funtoo
cd /mnt/funtoo
mkdir tmp
chmod 1777 /mnt/funtoo/tmp
date 080922352012
wget http://ftp.osuosl.org/pub/funtoo/funtoo-current/x86-64bit/corei7/stage3-latest.tar.xz
tar xJpf funtoo.stage3-latest.tar.xz
cd /mnt/funtoo
mount --bind /proc proc
mount --bind /dev dev
cp /etc/resolv.conf etc/
env -i; HOME=/root; TERM=$TERM; chroot . bash -l
export PS1="(chroot) $PS1"
emerge --sync

vi /etc/fstab
/dev/sda6               none            swap            sw              0 0
/dev/sda5               /               ext4            noatime         0 1

rm /etc/localtime
ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime

vi /etc/make.conf
MAKEOPTS="-j9"

LINGUAS="en de"

rc-update add dhcpcd default

emerge -av genkernel gentoo-sources # Kernel 3.6.x verwenden, 3.7-rc1 tut aktuell auch
cd /usr/src/linux
wget http://www.tauceti.net/kernel-config-x86_64-3.6.2-gentoo.gz
gunzip kernel-config-x86_64-3.6.2-gentoo.gz
mv kernel-config-x86_64-3.6.2-gentoo .config
genkernel --menuconfig --lvm --oldconfig all
passwd # root Passwort setzen nicht vergessen!
emerge -av boot-update

vi /etc/boot.conf
boot {
        generate grub
        default "Funtoo Linux genkernel"
        timeout 3 
}

"Funtoo Linux" {
        kernel bzImage[-v]
        # params += nomodeset
}

"Funtoo Linux genkernel" {
        kernel kernel[-v]
        initrd initramfs[-v]
        params += real_root=auto
        params += nomodeset
        params += noapic

Hier fehlt jetzt noch die Sache mit dem Bootloader. Das hat mich etwas genervt, da der installierte Ubuntu Grub nicht mit den Dateien, die grub-install von Funtoo unter /boot/grub/ installiert hatte, zusammenarbeiten wollte (Ubuntu hat grub2 und Funtoo ist noch auf 1.98... Aber mehr dazu weiter unten, deshalb mit der Installation vom Grub vielleicht noch warten bzw. hier lesen, wie's richtig geht - nach dieser Anleitung habe ich es gemacht: Grub with EFI support installation). Aber ich hab das erstmal falsch gemacht, weil man, wenn man nicht gleich den Grub mit EFI-Support installiert, im Bios Kompatibiltätsmodus startet und dann is nix mit der Installation vom Nvidia Orginal-Treiber z.B. ;-) Ich war mir aber zu dem Zeitpunkt nicht ganz sicher, ob ich Grub auf sda4 oder sda5 installieren soll. sda4 ging nicht, aber sda5 schien zu tun:

grub-install --no-floppy --force /dev/sda5
boot-update

Der grup-install meckert zwar, das das eine schlechte Idee ist, wenn man den MBR auf eine Partition schreibt, aber das tut wohl nichts zur Sache. Eine ganz schlecht Idee dürfte sein, wenn man Grub auf /dev/sda installiert. Ich vermute, dann bootet Mac OS X auf jeden Fall nicht mehr. Den Grub auf /dev/sda5 erkennt rEFIt aber.

cd /
umount /mnt/funtoo/boot /mnt/funtoo/dev /mnt/funtoo/proc /mnt/funtoo
reboot

Jetzt aber: Funtoo First Light!!! :-)

macbook_pro_retina_funtoo_first_light_1.jpg

Und damit man mal eine Grundbasis für das grafische Zeuch hat:

emerge -av xorg-x11 

Update 20120810

Ja spinn ich! Welcher Oberwahnsinnige hat denn (U)EFI erfunden? So etwas Krankes hab ich schon lange nicht mehr gesehen... Also Grafikkarte lief deshalb nicht, weil ich im BIOS Kompatibiltätsmodus gebootet hatte und nicht im neuen (U)EFI Modus. Ich hatte zuerst nicht gecheckt, das man für (U)EFI noch eine ganze Reihe weiterer Schritte notwendig sind, damit das funktioniert. Da braucht man Grub 2.0 (bzw. ich habe einen gepatch'ten Grub 1.99 von flow-Overlay: layman -a flow). Die Installation ist hier ganz gut beschrieben.

Derweilen habe ich jetzt twm in 2880er Auflösung am Laufen (aber noch ohne Touchpad, nur die Tasten funken) ;-) Hier die Screens:

mac_retina_kms_1.jpg mac_retina_twm_1.jpg

KDE 4.9 ist am Kompilieren! :-) Mal morgen wieder guggen... Das kann ja heiter werden, wenn sich die UEFI PC's mal weiter verkaufen. Da muss man ja fast eine fertige Distribution nehmen, das blickt ja kein normaler Mensch mit dem BIOS-Nachfolger (U)EFI. Einfach krank, mehr fällt mir da nicht ein...

Update 20120819
Also KDE 4.9 läuft wunderbar:

kde49_macbook_retina.png

Ich hab noch ein paar kleinere Probleme mit dem Touchpad, den Tastenbelegungen und bei manchen Programmen mit den Fonts (sind einfach zu klein ;-) ). Aber an sich läuft KDE gut. :-) Man muss aber in den System Settings ziemlich spielen, das man die Fonts im Allgemeinen annehmbar hinbekommt. U.a. habe ich folgende Datei erstellt:

echo "Xft.dpi 75.0" >> $HOME/.Xdefaults 

Die Intel-Grafik habe ich noch nicht zum Laufen bekommen. Aktuell benutze ich die Nvidia Binary Driver und damit natürlich auch den Nvidia Chip. Das kostet aber unnötig Strom. Mal weiter schauen...

Update 20120826:
Ich verwende als Treiber für das Touchpad nicht xf86-input-synaptics sondern xf86-input-mtrack. Das funktioniert wesentlich besser. Damit das Ganze nicht zu empfindlich reagiert, hier meine Einstellungen für den Treiber in der xorg.conf:

Section "InputClass"
    MatchIsTouchpad "true"
    MatchDevicePath "/dev/input/event*"

    Identifier      "Touchpads"
    Driver          "mtrack"
    Option "ThumbSize" "35"
    Option "PalmSize" "55"
    Option "ClickTime" "25"
    Option "ScrollDistance" "300"
    Option "TapButton1" "0"
    Option "Sensitivity" "0.85"
    Option "TapButton2" "0"
    Option "TapButton3" "0"
    Option "ScrollDistance" "175"
    Option "FingerHigh" "10"
    Option "FingerLow" "10"
    Option "IgnorePalm" "true"
EndSection

Update 20121017: Inzwischen hab ich noch eine bessere Konfiguration gefunden (hat nur einen Hacken: Die rechte Maustaste zu emulieren, ist etwas umständlich):

Section "InputClass"
    MatchIsTouchpad "on"
    Identifier      "Touchpads"
    Driver          "mtrack"
    Option          "Sensitivity" "0.35"
    Option          "IgnoreThumb" "true"
    Option          "IgnorePalm" "true"
    Option          "TapButton1" "0"  
    Option          "TapButton2" "0"
    Option          "TapButton3" "0"
    Option          "TapButton4" "0"
    Option          "ClickFinger1" "0"
    Option          "ClickFinger2" "3"
    Option          "ClickFinger3" "2"
    Option          "ButtonMoveEmulate" "false"
    Option          "ClickTime" "25"
    Option          "BottomEdge" "25"
EndSection

Damit Suspend to RAM (Sleep) mit dem Nvidia Binary Treiber funktioniert, erstellt man noch eine Datei /etc/pm/config.d/99local mit folgenden Inhalt (Update 20121017: Soll angeblich nicht mehr notwendig sein mit Kernel >=3.6, noch nicht probiert):

DISPLAY_QUIRK_DPMS_ON="true"
QUIRKOPTS="true"

Update 20121017: Also mit Kernel 3.6 bzw. 3.7-rc1 hab ich den Intel- und Nvidia-Chip im Prinzip jetzt soweit, das es funktionieren sollte, ohne den Nvidia-Binary Treiber. Bevor man hier experimentiert, unbedingt den Orginal Nvidia-Treiber deinstallieren! Dann den Kernel ohne weitere Parameter booten (also den Treiber "nouveau" für den Nvidia-Chip nicht mehr blacklisten). Ich musste dann den "nouveau"-Treiber mit modprobe laden, nachdem der Kernel gestartet ist. Das System wechselt dann auf den Nvidia-Chip. Das funktoniert noch und man sieht mit "dmesg", das er vgaswitcheroo aktiviert hat (also damit kann man theoretisch dann zwischen Intel- und Nvidia Chip hin- und herschalten). Wenn vgaswitcheroo aktiv ist, sieht man das auch daran, das es jetzt folgenden Eintrag gibt:

cat /sys/kernel/debug/vgaswitcheroo/switch

Und nun sollte eigentlich Folgendes möglich sein:

# Nvidia Chip aktivieren
echo DDIS > /sys/kernel/debug/vgaswitcheroo/switch
# Intel Chip aktivieren
echo DIGD > /sys/kernel/debug/vgaswitcheroo/switch
# Den deaktivierten Chip ausschalten (spart Strom)
echo OFF > /sys/kernel/debug/vgaswitcheroo/switch
Den deaktivierten Chip einschalten
echo ON > /sys/kernel/debug/vgaswitcheroo/switch

Leider verabschiedet sich das System dann mit einem schwarzen Bildschirm... Reboot über Ctrl+Alt+Del is aber noch möglich. Deshalb gehe ich da von aus, das nur der Bildschirm schwarz ist, aber das Betriebssystem noch da ist... Das ist wirklich zum Haare raufen. Falls jemand eine Idee hat, warum das so ist, immer her damit :-)

Falls jemand noch eine Kernel .config braucht, hier ist meine für Kernel 3.6.2 (ist so ziemlich alles aktiviert ;-) ): kernel-config-x86_64-3.6.2-gentoo.gz

Will man den Nvidia Orginal-Treiber benutzen, nimmt man den nouveau-Treiber am Besten auf die Blacklist. Folgende 3.6er Kernel-Parameter benutze ich zusammen mit den Nvidia Original-Treiber:

i915.modeset=1 rdblacklist=nouveau nouveau.modeset=0

Wie schon erwähnt, wenn man den Nvidia Orignal-Treiber nicht mehr verwenden möchte und mit vgaswitcheroo spielen will, dann nimmt man diese Kernelparameter alle wieder raus.

Donnerstag Juli 26, 2012

Wie SSD Disks Architekturen verändern

Ein sehr interessanter Artikel auf High Scalability über die neue Amazon EC2 High I/O 2TB SSD Instanz und wie div. Firmen wie z.B. Netflix damit umgehen bzw. welche neue Möglichkeiten sich auftun. Ist schon interessant zu erfahren, das z.B. plötzlich nicht mehr die Platte der Flaschenhals ist sondern eventl. der Java Garbage Collector...

Mittwoch Juli 25, 2012

Factory Design Pattern - An Effective Approach

In diesem JAVA Developer Journal Artikel von Debadatta Mishra wird gezeigt, wie man das Factory Design Pattern früher und heute implementiert und welche Performance Unterschiede die beiden Methoden haben.

Parallelisierter S3 Multipart Upload mit Python-boto

Wie man mit der Python boto Lib eine große Datei parallel in Amazon AWS S3 hochlädt, sieht man hier auf github.

Dienstag Juli 24, 2012

Gentoo: Alle installierten Pakete auflisten

equery list '*'

Dienstag Juli 03, 2012

Cloud-Backup in Amazon S3 mit Duplicity

Mit Hilfe von Duplicity kann man Backups gepackt und verschlüsselt direkt in Amazon AWS S3 speichern und eignet sich deshalb gut als Offsite-Backupprogramm. Und so richtet man das Ganze unter Ubuntu bzw. Gentoo ein:

Installation 

apt-get install duplicity bzw emerge -av duplicity
apt-get install python-boto bzw. emerge -av boto

s3cmd installieren und einrichten

Das ist nur notwendig, wenn man von einem Rechner aus checken will, ob alles im S3 gelandet ist. s3cmd ist ein sehr praktisches Tool, wenn man von der Kommandozeile aus mit S3 interagieren will.

apt-get install s3cmd bzw. emerge -av s3cmd

Weiterhin braucht man eine $HOME/.s3cfg (auch nur, wenn man s3cmd nutzen will, wird nicht für Duplicity benötigt, aber praktisch, wenn man sich die S3 Buckets anguggen will...). Hierzu die s3cmd Anleitung lesen. Dort drin sind der access_key und der secret_key, denn man für den Zugriff auf S3 benötigt. Ihn findet man auch, wenn man sich in die AWS Console einloggt und dann auf die Credientials geht.

GnuPG installieren und einrichten

apt-get install gpg bzw. emerge -av gnupg

GnuPG einrichten

gpg --gen-key (Und dann den Anweisungen folgen)

Key anzeigen mit: 

gpg --list-keys

...
pub   2048R/xxxxxxxx 2012-06-29
      Key fingerprint = E870 xxxx xxxx xxxxx
uid                  BACKUP_$HOST 

sub   2048R/xxxxxxxx 2012-06-29 

Die wichtige Info hier ist in der ersten Zeile der achtstellige Key: 2048R/xxxxxxxx. 

Ein Verzeichnis bzw. besser gesagt ein Bucket im S3 für das Backup einrichten (wo Duplicity die gepackten und verschlüsselten Files ablegt):

s3cmd mb $HOST s3://backup

Das eigentliche Backup

Damit Duplicity auf S3 zugreifen kann, muss es im Env. bzw. Shell-Umgebung folgende Variabeln finden:

export PASSPHRASE="..." # PW für Zugriff auf das GnuPG PW (bei --key-gen angegeben)
export AWS_ACCESS_KEY_ID="..." # Access Key für S3
export AWS_SECRET_ACCESS_KEY="..." # Secretkey für S3

Dann das Backup selbst:

duplicity -v5 --volsize 500 --asynchronous-upload --s3-use-multiprocessing --s3-use-new-style /VERZEICHNIS_ZU_SICHERN s3+http://backup/$HOST

--s3-use-multiprocessing kam erst mit Duplicity 0.6.17 rein, aber da ist ein Bug drin. Deshalb lieber 0.6.18 verwenden! Das Multiprocessing (oder besser gesagt bei S3 Multipartupload) braucht man, wenn man eine 100 oder 1 GBit-Leitung voll ausnutzen möchte und man ein paar hundert GigaByte oder TerraByte zu Amazon S3 hochladen möchte. Ansonsten bekommt man nicht mehr als 30-40 MBit/s über die Leitung. --asynchronous-upload sorgt dafür, das der Upload schon stattfindet, während in eine weitere Datei schon wieder geschrieben wird (ist nicht nicht freigegen, aber funktioniert recht gut). Das bedeutet aber auch, das man den doppelten Platz benötigt! Ich habe hier z.B. --volsize 500 angegeben, was in /tmp (default) ein 500 MB File erzeugt. Ist das voll, dann wird nochmal ein 500 MB File angelegt, während das Erste hochgeladen wird. Ist auch das zweite File voll und das Erste noch nicht fertig hochgeladen, wartet der Backupprozess. --s3-use-new-style wird benötigt (in neueren Versionen vielleicht nicht mehr), wenn man nach Amazon Eu (Irland) ins S3 hochladen möchte.

Das Ganze sieht dann so aus, wenn man Files/Verzeichnisse ausschließen möchte:

duplicity -v5 --volsize 500 --asynchronous-upload --s3-use-multiprocessing --s3-use-new-style --exclude "DIR1" --exclude "DIR2" / s3+http://backup/$HOST

Aktuelle Files im Backup anzeigen:

duplicity list-current-files --s3-use-new-style s3+http://backup/$HOST

Restore eines Files

duplicity --s3-use-new-style --file-to-restore DATEINAME s3+http://backup/$HOST /RESTORE_PFAD_INKL_DATEINAME

Restore eines Verzeichnisses

Zielverzeichnis darf noch nicht existieren!
duplicity --s3-use-new-style s3+http://backup/$HOST /VERZEICHNIS

UND JETZT KOMMT DAS WICHTIGSTE:

Das Verzeichnis $HOME/.gnupg ist irgendwo an einem sicheren Platz zu sichern! Wenn der Rechner, der mit Duplicity gesichert wurde, diese Dateien nicht mehr findet, weil er in Rauch aufgegangen ist, dann kommt man nicht mehr an seine Daten ran, weil das Backup mit diesem Schlüssel verschlüsselt wurde!

Mittwoch Mai 23, 2012

Kernel dmesg Timestamp umwandeln

Wenn man so einen dmesg Output hier 

[120150.785488] nfs: server 10.232.218.3 not responding, timed out
[120450.903514] nfs: server 10.232.218.3 not responding, timed out
[120452.071783] nfs: server 10.232.218.3 not responding, timed out
[120462.577351] nfs: server 10.232.218.3 not responding, timed out

in ein lesbares Datumsformat umwandeln will

Wed May 23 07:52:55 2012 nfs: server 10.232.218.3 not responding, timed out
Wed May 23 07:57:55 2012 nfs: server 10.232.218.3 not responding, timed out
Wed May 23 07:57:57 2012 nfs: server 10.232.218.3 not responding, timed out
Wed May 23 07:58:07 2012 nfs: server 10.232.218.3 not responding, timed out

nimmt man das hier: 

alias tmesg='dmesg|perl -ne "BEGIN{\$a= time()- qx!cat /proc/uptime!};s/\[\s*(\d+)\.\d+\]/localtime(\$1 + \$a)/e; print \$_;"'

Freitag Feb. 03, 2012

Oracle - Statements ohne Bindungsvariablen

Größere Performanceprobleme bei Oracle können sich ergeben, wenn man nicht konsequent Queries mit Bindungsvariablen einsetzt. Um mal schnell rauszufinden, welche davon so laufen, kann man folgende Statements nutzen:

create table t1 as select sql_text from v$sqlarea;

alter table t1 add sql_text_wo_constants varchar2(1000);


create or replace function

remove_constants( p_query in varchar2 ) return varchar2
as
    l_query long;
    l_char  varchar2(1);
    l_in_quotes boolean default FALSE;
begin
    for i in 1 .. length( p_query )
    loop
        l_char := substr(p_query,i,1);
        if ( l_char = '''' and l_in_quotes )
        then
            l_in_quotes := FALSE;
        elsif ( l_char = '''' and NOT l_in_quotes )
        then
            l_in_quotes := TRUE;
            l_query := l_query || '''#';
        end if;
        if ( NOT l_in_quotes ) then
            l_query := l_query || l_char;
        end if;
    end loop;
    l_query := translate( l_query, '0123456789', '@@@@@@@@@@' );
    for i in 0 .. 8 loop
        l_query := replace( l_query, lpad('@',10-i,'@'), '@' );
        l_query := replace( l_query, lpad(' ',10-i,' '), ' ' );
    end loop;
    return upper(l_query);
end;
/
update t1 set sql_text_wo_constants = remove_constants(sql_text);

select sql_text_wo_constants, count(*)

  from t1
 group by sql_text_wo_constants
having count(*) > 100
 order by 2
/


Dienstag Jan. 25, 2011

tar I/O limitieren mit dem Pipe Viewer

Wenn man tar etwas einbremsen möchte, damit es nicht die Platte blockiert, dann kann man das u.a. mit dem Pipe Viewer (Gentoo: emerge -av pv) machen:

tar pcf - <verzeichnis_zum_packen> | pv -s $(du -sb home | awk '{print $1}') --rate-limit 500k | gzip > datei.tar.gz

Ich nehm für sowas auch immer ganz gerne rsync her. Da ruft man das Ganze einfach mit der Option --bwlimit auf z.B. folgender Befehl reduziert die Übertragungsgeschwindigkeit auf ~10MB/sec.:

rsync -av --bwlimit=10000 ...


Freitag Jan. 14, 2011

Welche IP kommt am haeufigsten im Accesslog vor

Wenn man rausfinden möchte, welche IPs am häufigsten auf eine Website zugreifen, hilft folgender Bash Einzeiler um das Apache Access-Log durchzugrasen:

cat apache.access_log |awk '{print $1}' | sort | uniq -c | sort -n | tail -20

Freitag Jan. 15, 2010

32bit Anwendung auf 64bit Linux mit GCC kompilieren

Wenn man mal in die Verlegenheit kommt, auf einem 64bit Linux OS ein 32bit Programm kompilieren zu müssen, dann ist das unter Gentoo mit multilib USE-Flag (also installierter 32bit und 64bit Unterstützung) kein Problem. Bevor man einen configure aufruft, exportiert man einfach zwei Variablen:

export CFLAGS="-m32"
export LDFLAGS="-m32"

Unter Ubuntu/Debian sollten folgende Pakete installiert sein, damit das tut:

libstdc++.i386
libgcc.i386
glibc.i386
glibc-devel.i386

Unter SuSE haben die Pakete immer 32bit im Paketnamen also z.B.:

glibc-32bit
glibc-devel-32bit

I.d.R. wird man bei einem größeren Projekt wie den Apache Webserver u.U. aber noch weitere andere 32bit Pakete nachinstallieren müssen.

Donnerstag Jan. 07, 2010

HP Officejet 6500 und Linux

Drucker hinüber, Neuer dringend benötigt... Also schnell zum Mediamarkt. Klar war, das es ein HP sein sollte. Die funzen i.d.R. ohne Probleme unter Linux. Ohne genau zu wissen, welchen ich eigentlich kaufen soll, hab ich mir dir 5-6 Typen angeschaut, die da so rumstehen. Gelandet bin ich dann beim 119 Euro teuren Officejet 6500 mit Ethernet-Anschluss, Fax, Scanner und Kopierer. Vorallem der Ethernet-Anschluss hat es mir angetan. Damit ließ sich dann der iMac auch noch anschließen und man hat nicht das Problem, das man das USB-Kabel ständig umstecken muss zwischen zwei Rechnern.

Also daheim IP-Adresse, Netzmaske und Default-Gateway eingestellt (DHCP hätte es auch getan, hab ich aber nicht eingerichtet). Anpingen ging dann schon mal. Dann die Treiber des HP Linux Imaging and Printing System installiert. Die hplip-Treiber laufen mit fast 2000 HP-Druckern und fast jedem Linux-System. Unter Gentoo/Funtoo muss man einfach ein

emerge -av hplip

starten. Ausserdem habe ich in der Datei /etc/portage/package.use noch folgende USE-Flags gesetzt:

net-print/hplip ppds fax qt4

Dann kann man mit CUPS den Druckertreiber einrichten. Dazu ruft man im Webbrowser einfach die Admin-Oberfläche von CUPS unter http://localhost:631 auf. Dort kann man dann nach dem Drucker einfach suchen lassen. Die Testseite kam ohne Probleme raus.

Für die Inbetriebnahme des Scanners habe ich nicht lange experimentiert und den Drucker/Scanner gleich per USB angeschlossen. Soweit Sane/XSane installiert ist, kann man dann gleich mit sane-find-scanner checken, ob der Scanner gefunden wird (hierzu muss man unter Gentoo in der Gruppe lp sein). Wird der Scanner gefunden (sicherheitshalber auch als User root probieren, wenn es als normaler User nicht funktioniert), kann man xsane starten und loslegen mit dem Scannen.

Summasummarum: Der Officejet 6500 läuft wunderbar unter Linux. Und für etwas über 100 Euro bekommt man 4 Geräte in Einem. Feine Sache :-)

Donnerstag Okt. 29, 2009

Verzeichnisse ohne Dateien kopieren mit rsync

Mit Version 3 von rsync lassen sich relativ einfach ganze Verzeichnisbäume inkl. Rechte und User-/Gruppen-IDs ohne Inhalt sprich ohne Dateien kopieren:

rsync -a -f"+ */" -f"- *" source/ destination/

Soweit ich weiß, gibt es die Option -f in Version 2 von rsync noch nicht. Drum wird das in div. Enterprise Linux Versionen nicht funktionieren.

Mittwoch Okt. 07, 2009

3D Support Radeon HD 2000 - HD 4000 bzw. R6xx - R7xx

Endlich ist es soweit! Nachdem ich die ATI Radeon Grafikkarte (Radeon HD 3650 - RV635) in meinem Laptop (siehe auch: Elitebook 8530p, Gentoo, Sabayon, Kubuntu - Teil 1 / Elitebook 8530p, Gentoo, Funtoo - Teil 2) am Anfang am liebsten an die Wand geklatscht hätte, weil die propritären ATI einfach nur übel sind und mit neueren sowie (teilweise) selbstkompilierten Kernel überhaupt nicht tun (im Gegensatz zu Nvidia), hab ich das Teil dann doch noch zum Laufen bekommen mit den OpenSource Treibern (radeonhd). Die laufen wirklich gut und die 2D Performance ist inzwischen super. Nur mit 3D war halt nix. Das ist mir prinzipiell egal, aber sowas wie die Desktopeffekte von KDE 4 oder Compiz Fusion is halt dann nicht so richtig (schnell) - und ich mag die Dinger echt gerne, da sie wirklich auch produktiv sind.

Wer Funtoo/Gentoo als Linux-Distribution nutzt und sich rantraut, kann die nötigen Treiber für 3D Unterstützung aber jetzt nutzen. Ich wollte zunächst wie hier beschrieben vorgehen, aber das Ganze kompilierte leider nicht ganz fertig.

Aber Gentoo "to the rescue"! Zunächst habe ich mir mal einen Kernel 2.6.32 (git-sources-2.6.32_rc3-r1) installiert und kompiliert. Verwendet habe ich eine Kernel-Config von Sabayon 5.0, das auf Gentoo aufsetzt, für Desktop-Systeme ist und Kernel 2.6.31 verwendet. Die .config (x86_64 / x86) habe ich fast unverändert übernommen - nur die KMS (Kernel Mode Settings) im Staging-Bereich habe ich aktiviert und alles andere im Staging-Bereich ausgeschaltet, da die Android-Treiber bei mir das Kompilieren des Kernel verhindern (bricht mit Error ... ab).

Das ist prinzipiell eine feine Sache. Man hat hiermit praktisch auf der Console schon die volle Auflösung - in meinem Fall 1600x1050 - und wenn man zwischen X-Server und Konsole mit CTRL+ALT+F1 oder CTRL+ALT+F7 hin und her wechselt, flackert nix, da nicht mehr zwischen den Auflösungen umgeschaltet werden muss. Das Ganze funkt auch wunderbar - prinzipiell. Nur leider sieht der X-Server nach dem Start recht bunt aus und der Cursor ist ziemlich viereckig ;-) Aber gut, das ist ja auch alles noch ziemlich experimentell. Man kann KMS über einen Kernel-Bootparameter wieder ausschalten. Dazu fügt man in der /boot/grub/grub.conf den Parameter radeon.modeset=0 hinten an. Wenn es dann doch mal tut, kann man ja den Parameter wieder weglassen.

Nun aber zur 3D Unterstützung: Zunächst habe ich das X11-Overlay hinzugefügt:

layman -a x11
layman -S


Da man Mesa und die Xorg-Treiber in den neuesten Versionen braucht, habe ich die Pakete unmasked (mit Hilfe des Tools autounmask):

autounmask x11-base/xorg-drivers-9999
autounmask media-libs/mesa-9999


Dann installiert man Folgendes:

emerge -av xorg-server xorg-drivers mesa libdrm


Und schließlich sollte man noch einen

revdep-rebuild

hinterherschicken. Dann muss man eigentlich nur noch Durchstarten und in den System Settings die Desktop Effekte einschalten (soweit nicht schon passiert [waren bei mir bisher auf XRender eingestellt]) und auf OpenGL umstellen. Das war's eigentlich :-) Bei mir laufen fast alle Effekte sehr schnell.

Und fall es jemanden interessiert: glxgears läuft bei mir jetzt mit 2123 FPS ;-)