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:

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

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!