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 folgenden 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 heißt 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 Standard VGA-Auflösung und wird deshalb von uvesafb nicht unterstü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 Konflikt mit dem xserver-xorg-video-intel-Treiber verursacht, 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 unbedingt nötig, da der Tarball bereits ein funktionsfähiges 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 anschließenden 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:

#!/bin/sh
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 erzeugen wir ein weiteres Skript in unserem initramfs. Ich möchte nicht 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:

#!/bin/sh
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.

Nun können wir aber nicht dieses System booten, weil das initramfs script cryptmount nicht ohne weiteres mit splashy arbeiten kann. Es benutzt askpass um an das Benutzerpasswort zu kommen das vom cryptsetup benutzt wird. Leider funktioniert askpass nicht mit splashy, jedenfalls nicht so, dass splashy von initramfs default script ohne weiteres benutzt wird.

Deshalb werden wir Veränderungen an beiden Skripten vornehmen, damit alles so funktioniert, wie wir es wollen.

Wir holen uns das original splashy script und legen is in unser initramfs:

cd /etc/initramfs-tools/scripts/init-top
cp /usr/share/initramfs-tools/scripts/init-top/splashy .

Danach erzeugen wir einen neuen Patch und nennen in splashy.patch. In diese Datei schreiben wir folgendes:

--- 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

Nach dem Abspeichern, wenden wir den Patch auf splashy an. Danach kann der Patch gelöscht werden:

patch -p0 < splashy.patch
rm splashy.patch

Nun müssen wir noch dmcrypt bearbeiten. Wir machen ein paar Veränderungen damit cryptsetup splashy_update an Stelle von askpass benutzt um an das Passwort für das Dateisystem zu kommen.

Dazu kopieren wir das original Script:

cd /etc/initramfs-tools/scripts/local-top
cp /usr/share/initramfs-tools/scripts/local-top/cryptroot .
}}
Via "Copy und paste" fügen wir das folgende in die Datei (bitte erzeugen) cryptroot.patch ein:
{{{
--- 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"

Wir speichern diese Datei ab und wenden Patch auf cryptroot an. Danach kann der Patch gelöscht werden:

patch -p0 < cryptroot.patch
rm cryptroot.patch

Jetzt bauen wir unser initramfs neu:

update-initramfs -u -k `uname -r`

Überarbeiten noch einmal die grub menu.lst und führen ein paar Veränderungenn am "fb" Kerneleintrag in der Kernelzeile:

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

Abschließend, rebooten!

Jetzt sollten splashy und dmcrypt über initramfs auf dem Eee PC funktionieren!