Wenn der Kernel 2.6.26 offiziell in Debian gepackt ist, wird es viel einfacher sein, frame buffer auf dem EeePC zu betreiben, aber mit dem aktuellen Kernelpaket 2.6.25 (Stand 17. Juli 2008) sind einige Kernel-Änderungen notwendig und einige Pakete (z.B. klibc) müssen neu kompiliert werden um zu funktionieren. Es sind auch einige andere Veränderungen notwendig, damit sowohl dmcrypt als auch splashy im initramfs gut arbeiten. Lasst uns loslegen:
Frame buffer: uvesafb-Modul
uvesafb ist nicht standardmäßig mit dem 2.6.25er Debian-Kernel kompiliert. Somit müssen wir zuerst die Kernel-Quellen besorgen. Sie müssen nicht das gesamte Paket neu erstellen, nur das Modul, aber in jedem Fall müssen Sie den Kernel später für einige andere Pakte neu bauen. Das Re-Kompilieren des Kernels würde auf Ihrem EeePC viel Speicherplatz benötigen und sehr lange dauern. Daher empfehlen wir, dies auf einer andere Maschine zu tun.
Bitte reparieren: bitte die folgendenen Anweisungen durchsehen, damit sie den selben Debian Kernel-tree wie module-assistant verwenden - falls möglich. Dies wird die Dinge vereinfachen.
apt-get install linux-source-2.6.25 cd /usr/src/ tar xfj linux-source-2.6.25.tar.bz2 cd linux-source-2.6.25
Jetzt kopieren Sie ihre tatsächliche Kernel-Konfigurationsdatei in den Quell-tree und starten das Kernel-Konfigurationsmenü:
cp /boot/config-2.6.25-2-686 .config make menuconfig
Gehen Sie jetzt zu Device Driver -> Graphics support -> Support for frame buffer devices und wählen Sie "Userspace VESA VGA graphics support" als Modul <M>.
Verlassen und speichern Sie die Kernel-Konfiguration.
Bauen Sie Ihren Kernel. Sie müssen nicht das Paket neu bauen, sondern nur einen Quell-tree mit dieser aktivierten Option kompilieren.
make
... und warten ... Zeit für einen Kaffee!
Wenn das Kompilieren abgeschlossen ist, kopieren Sie das Modul uvesafb.ko auf Ihren EeePC. Das Modul befindet Sie unter /usr/src/linux-source-2.6.25/driver/video/ und heisst uvesafb.ko.
cp driver/video/uvesafb.ko /lib/modules/`uname -r`/kernel/driver/video/ depmod -a
Die Auflösung des Eee PC ist 800x480. Dies ist keine Standart VGA-Auflösung und wird deshlab von uvesafb nicht unsterstützt. Damit alles so funktioniert, wie wir es uns vorstellen müssen wir das 915resolution Binärpaket benutzen und dafür sorgen, dass es die richtige Auflösung benutzt. Für Sid wurde das 915resolution Paket gedropped da es obsolet ist. Es kann nicht installiert werden, das es einen Konfikt mit dem xserver-xorg-video-intel-Treiber verusacht, der zum Betreiben des X-Servers auf einem EeePC aber benötigt wird.
Die Lösung ist es den Tarball des 915resolution Pakets herunterzuladen.
cd /usr/src wget http://www.geocities.com/stomljen/915resolution-0.5.3.tar.gz tar xfz 915resolution-0.5.3.tar.gz cd 915resolution-0.5.3
Dieses Paket kann nach Bedarf mit einem make kompiliert werden. Dieser Schritt ist nicht umbedingt nötig, da der Tarball bereits ein funktionsfäiges Binärpaket enthält. Dieses kopieren wir an die passende Stelle:
cp 915resolution /usr/sbin
Jetzt können wir unseren framebuffer testen!
915resolution 5c 800 480 32 modprobe uvesafb mode=800x480-32@60
Jetzt sollte alles funktionieren und wir können den Framebuffer in Arbeit sehen.
Framebuffer über initramfs initialisieren
Wie schon zuvor erwähnt, müssen ein paar Pakete kompiliert werden um das starten des Framebuffers über das initramfs zu ermöglichen. Der Grund dafür ist, dass uvesafb aus dem userspace mit v86d geladen werden muss. Damit aber v86d im initramfs funktioniert müssen wir klibc gegen einen Kernel kompilieren der uvesafb aktiviert hat.
Also, auf geht's:
cd /usr/src apt-get source v86d libklibc cd klibc-1.5.12
Schmutzig, aber funktioniert: Damit klibc auf den richtige Version des Kernelquellcodes zeigt editieren wir debian/rules, gehen zur der Zeile die mit "pre-build::" beginnt und ändern den daran anschliessenden Abschnitt wie folgt ab:
pre-build:: if [ ! -e linux ]; then \ rm -rf linux/include; \ mkdir -p linux/include ;\ ln -s /usr/src/linux-source-2.6.25/include/linux/ linux/include; \ for x in /usr/src/linux-source-2.6.25/include/asm*; do \ ln -s $${x} linux/include; \ done ;\ fi ; \
Speichern, den Editor schließen und nun das Paket neu bauen:
debuild
Danach kann es installiert werden:
cd .. dpkg -i klibc-utils-1.5.12-1_i386.deb libklibc_1.5.12-1_i386.deb
Jetzt ist es Zeit auch das v86d-Paket zu bauen:
cd v86d-0.1.5 vim debian/rules
Hier fügen wir unterhalb der Zeile "config-stamp: configure" findet sich folgender Aufruf: "./configure", den wir wie folgt abändern:
./configure --with-klibc
Speicher und das Paket neu bauen:
debuild
und installieren:
cd .. dpkg -i v86d_0.1.5-1_i386.deb
Jetzt haben wir alles für unser initramfs gebaut und installiert. Für die weiteren Schritte müssen wir noch die "initramfs tools" installieren:
apt-get install initramfs-tools
Ebenso sind noch ein paar Veränderungen am initramfs image nötig.
Die folgende Skripte sind nicht perfekt, aber sie funktionieren. Schreibt sie ruhig um - Keine Scheu!
Wir müssen:
- uvesafb.ko, v86d, 915resolution in das Image integrieren
- dafür sorgen, dass der Framebuffer startet, wenn wir den richtigen Aufruf absetzen
Um uvesafb.ko in das Image zu integrieren fügen wir es unter /etc/initramfs-tools/modules hinzu:
echo uvesafb >> /etc/initramfs-tools/modules
Für das 915resolution- und das v86d-Paket erzeugen wir folgendes Skript /etc/initramfs-tools/hooks/915resolution. Dieser Datei fügen wir folgendes hinzu:
PREREQ="" prereqs() { echo "$PREREQ" } case $1 in # get pre-requisites prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions copy_exec /usr/sbin/915resolution /sbin copy_exec /sbin/v86d /sbin
Wir sollten auf uvesafb laden, sobald es gebraucht wird. Dazu erzuegen wir ein weiteres Skript in userem initramfs. Ich möchte nciht video=something in meiner kernel command line benutzen, da ich befürchte, dass das Framebuffer-Skript für Probleme sorgen könnte. Deshalb verwende ich eine andere Option. Ich habe sie "fbhack" genannt.
Hierzu erzeugen wir die Datei /etc/initramfs-tools/scripts/init-top/framebuffer und schreiben folgendes hinein:
PREREQ="" prereqs() { echo "$PREREQ" } case $1 in # get pre-requisites prereqs) prereqs exit 0 ;; esac echo "FBHACK FOR EeePC" for x in $(cat /proc/cmdline); do case $x in fbhack|video=*) echo "creating /dev/mem file" mknod /dev/mem c 1 1 if [ -e /dev/zero ] ; then echo "Dev Zero Exists" else mknod /dev/zero c 1 5 fi if [ -e /dev/tty1 ] ; then echo "tty1 exists" else mknod /dev/tty1 c 4 1 fi if [ -e /dev/console ] ; then echo "console exists" else mknod /dev/console c 5 1 fi echo "Set 915resolution to 800x480" /sbin/915resolution 5c 800 480 32 depmod -a #/sbin/modprobe fbcon echo "modprobe uvesafb" chk=`cat /proc/modules | grep uvesafb` if [ "x$chk" != "x" ] ; then rmmod uvesafb fi /sbin/modprobe uvesafb mode=800x480-32@60 echo "Done!" ;; esac done
Wenn nun alles funktioniert (bitte testen) bauen wir unser initramfs erneut mit:
update-initramfs -u -k `uname -r`
Jetzt editieren wir die grub menu.lst, kopieren den bisherigen Kerneleintrag, und fügen fbhack als Kerneloption hinzu:
title Debian GNU/Linux, kernel 2.6.25-2-686 fb root (hd0,0) kernel /vmlinuz root=/dev/mapper/rootfs ro fbhack initrd /initrd.img
Nach einem Reboot wählen wir den "fb" Kernel und nun sollte der Framebuffer mit Start des initramfs mit der richtigen Auflösung funktionieren!
Splashy in initramfs mit dmcrypt
Jetzt können wir noch splashy installieren. Dazu müssen wir folgenden Befehl ausführen:
apt-get install splashy
Wenn wir jetzt unser initramfs neu bauen und die richtigen Parameter zur boot command line hinzufügen, scheint splashy zu funktionieren. Wenn wir aber ein ein verschlüsseltes Dateisystem haben, können wir noch kein Passwort eingeben.
Continue translation soon
- The result is you can't boot into your system. This is because the initramfs script cryptmount by default can't manage splashy at all. It uses askpass to get your password used by cryptsetup, but askpass doesn't work with splashy, at least in the way that splashy is managed by initramfs default script.
We will make some changes in both scripts to make it all work as we want.
Get the original splashy script and put it inside your initramfs:
cd /etc/initramfs-tools/scripts/init-top cp /usr/share/initramfs-tools/scripts/init-top/splashy .
Create a new patch file called splashy.patch and put it inside this file:
--- splashy.old 2008-07-17 20:49:09.000000000 +0000 +++ splashy 2008-07-17 15:26:18.000000000 +0000 @@ -1,6 +1,6 @@ #!/bin/sh -PREREQ="" +PREREQ="framebuffer" prereqs() { echo "$PREREQ" @@ -37,7 +37,7 @@ nosplash) SPLASH=false ;; - vga=*|video=*) + vga=*|video=*|fbhack) FBMODESET=true ;; esac @@ -46,9 +46,9 @@ test $SPLASH = "true" || exit test $FBMODESET = "true" || exit -depmod -a -silent modprobe fbcon -silent modprobe vesafb +#depmod -a +#silent modprobe fbcon +#silent modprobe vesafb if [ -s /proc/fb ]; then while read fbno desc; do
Save the patch file, apply it to splashy and remove the patch file:
patch -p0 < splashy.patch rm splashy.patch
Now we work on dmcrypt. We make some changes in order to let cryptsetup use splashy_update instead of askpass to get the root file system password.
Copy the original script:
cd /etc/initramfs-tools/scripts/local-top cp /usr/share/initramfs-tools/scripts/local-top/cryptroot . }} Copy and paste this patch file inside cryptroot.patch: {{{ --- cryptroot.old 2008-07-17 20:54:12.000000000 +0000 +++ cryptroot 2008-07-17 16:28:18.000000000 +0000 @@ -29,6 +29,8 @@ { if [ -p /dev/.initramfs/usplash_outfifo ] && [ -x /sbin/usplash_write ]; then usplash_write "TEXT-URGENT $@" + elif [ -x /sbin/splashy_update ] && [ ! -z "`pidof splashy`" ] ; then + /sbin/splashy_update "print $@" else echo "$@" >&2 fi @@ -224,16 +226,27 @@ fi if [ -z "$cryptkeyscript" ]; then - cryptkeyscript="/lib/cryptsetup/askpass" + if [ -x /sbin/splashy_update ] && [ ! -z "`pidof splashy`" ] ; then + cryptkeyscript="/sbin/splashy_update" + else + cryptkeyscript="/lib/cryptsetup/askpass" + fi cryptkey="Enter passphrase to unlock the disk $cryptsources ($crypttarget): " fi - - if ! crypttarget="$crypttarget" cryptsource="$cryptsource" \ - $cryptkeyscript "$cryptkey" | $cryptcreate --key-file=- ; then - message "cryptsetup: cryptsetup failed, bad password or options?" - continue - fi + if [ -x /sbin/splashy_update ] && [ ! -z "`pidof splashy`" ] ; then + if ! crypttarget="$crypttarget" cryptsource="$cryptsource" \ + $cryptkeyscript "getpass $cryptkey" | $cryptcreate --key-file=- ; then + message "cryptsetup: cryptsetup failed, bad password or options?" + continue + fi + else + if ! crypttarget="$crypttarget" cryptsource="$cryptsource" \ + $cryptkeyscript "$cryptkey" | $cryptcreate --key-file=- ; then + message "cryptsetup: cryptsetup failed, bad password or options?" + continue + fi + fi if [ ! -e "$NEWROOT" ]; then message "cryptsetup: unknown error setting up device mapping"
Save it, apply it and remove the patch file:
patch -p0 < cryptroot.patch rm cryptroot.patch
Now rebuild your initramfs:
update-initramfs -u -k `uname -r`
Re-edit the grub menu.lst and make these changes to the "fb" kernel entry in the kernel line:
title Debian GNU/Linux, kernel 2.6.25-2-686 fb root (hd0,0) kernel /vmlinuz root=/dev/mapper/rootfs ro splash quiet video=uvesafb:800x480-32@60 initrd /initrd.img
Finally, reboot!
You will now have your splashy and dmcrypt working from initramfs on your Eee PC!