Nuovo Kernel per l'EeePC

Oggi mi sono imposto di ricompilare il kernel per l'Asus eeePC 701 ma la cosa non è stata immediata nonostante vi siano anche della documentazione sull'argomento che ho cercato di aggiornare. Infatti l'Asus ha rilasciato i sorgenti del kernel e di alcuni componenti come la scheda di rete, la webcam e l'ACPI ma apparentemente non per la scheda wifi. Asus rilascia attraverso archivi RAR i quali però spesso contengono archivi debian o tarballe. Alla fine, tolto il superfluo, si arriva alla lista dei seguenti pacchetti:

A cui io di mia iniziativa ho aggiunto due patch per portare il kernel dalla versione 2.6.21.4 alla 2.6.21.7 giusto per distinguerlo dall'installato e un pacchetto per la scheda Wi-Fi che comunque non produce i medesimi moduli per il kernel distribuiti con l'Eee PC anche se pare funzionare:

Passare dalla versione 2.6.21.4 alla .7 non aggiunge grandi novità ma evita completamente il rischio andare a confondere il kernel originale. Se però si desidera utilizzare il modulo binario Atheros per la scheda Wi-Fi integrata allora queste patch e il driver madwifi sono superflui. Se mantenete la stessa versione del kernel questo verrà installato nella partizione /dev/sda2 mentre il vecchio rimarrà sulla /dev/sda1 e con i dovuti accorgimenti saranno entrambi utilizzabili. Invece i moduli installati andranno a mascherare quelli originali (tranne l'atheros il quale però potreste doverlo ricopiare per poterlo vedere). Comunque in questa pagina e nei successivi commenti è spiegato come fare in lingua inglese.

Infine un modulo aggiuntivo e sperimentale per la gestione del Front Side Bus Speed, ventola del processore e altre amenità (così com'è questo modulo AFAIK non funziona nemmeno a breve ne caricherò una versione modificata e adattata ai kernel 2.6.21.x con procedura di compilazione adeguata):

ATTENZIONE: è pericoloso giocare con questo modulo perché si può distruggere la CPU facendola surriscaldare al punto di fonderla irrimediabilmente. Il modulo hsfmodem invece è stato inserito per completezza perché in realtà pare che il modem interno non sia collegato alla bocchetta esterna la quale risulta per altro chiusa con un tappino di gomma (almeno nel mio modello 4G 701) ma può essere interessante per verificare l'effettiva esistenza e funzionalità del modem interno.

Preparare l'Eee PC per la compilazione

Per poter compilare sull'Eee PC occorre installare due fondamentali pacchetti build-essential (per l'ambiente di building minimo necessario) e libncursers5-dev (per il make menuconfig). Per poter installare questi pacchetti occorre aggiungere nel file /etc/apt/sources.list:

sudo -s
echo "deb ftp://ftp.it.debian.org/debian/ stable main contrib non-free" » /etc/apt/sources.list
apt-iget update
apt-get install build-essential libncurses5-dev
exit

Istruzioni in lingua inglese si trovano su questa pagina dalle quali mi sono inizialmente ispirato.

Difficoltà incontrate

Due sono state le cose particolarmente faticose: abilitare grub in maniera che offrisse l'opzione di lanciare il nuovo kernel e trovare un driver funzionante almeno all'apparenza per al scheda Wi-Fi. In particolare pare che il router NETGEAR DG834GT abbia lo stesso modulo ath_rate_atheros.ko e quindi probabilmente la medesima scheda wifi. Quindi si può cercare quel driver nei 52Mb di sorgenti rilasciati da Netgear piuttosto che nell'archivio da 1.8Gb rilasciato da Asus. NOTA: pare che il driver utilizzato dall'Eee Pc e dal Netgear sia proprietario e nessuno dei due produttori si sono preoccupati di accordarsi con Atheros rilasciarlo.

Ovviamente ci sono state delle difficoltà anche a posteriori all'installazione del nuovo kernel ma queste sono state affrontate, risolte e descritte nella sezione apposita in fondo a questa pagina.

Compilare e installare il kernel

Prima di compilare il nuovo kernel occorre scompattarlo e anche applicare le patch necessarie, supponendo che lo abbiate scaricato e copiato su una chiavetta USB collegata all'Eee PC:

tar xvjf /media/*/linux-source-2.6.21.4-eeepc.tar.bz2
cd linux-source-2.6.21.4-eeepc.tar.bz2
bunzip -c patch-2.6.21.4.bz2 | patch -p1 -R
bunzip -c patch-2.6.21.7.bz2 | patch -p1

Per compilare il kernel è stata usata una Ubuntu 6.10 sul mio portatile Acer Aspire 5051. Ovviamente ho configurato il nuovo kernel con il supporto netfilter abilitato, low lantency desktop preemption e il supporto usb mass storage integrato:

gunzip -c /media/*/config-2.6.21.7-eeepc.gz >.config
make menuconfig
make && make modules

Una volta compilato il problema era come installarlo infatti l'eee pc viene fornito con unionfs il quale fa l'unione di due partizioni /dev/sda1 e /dev/sda2. La prima contiene il sistema operativo così come rilasciato da Asus mentre la seconda partizione contiene le modifiche successive. Per evitare di scrivere il nuovo kernel e i suoi moduli nella partizione di "restore factory" è stato necessario copiare però alcuni files da quella partizione a quella scrivibile:

sudo -s
mkdir -p /mnt/sda1
mount -o ro /dev/sda1 /mnt/sda1
cd /mnt/sda1/boot
cp -af shutdown.fb startup.fb initramfs-eeepc.img /boot
cd
umount /mnt/sda1
exit

Se avete compilato direttamente sull'eeepc allora l'installazione si riduce a dare questi comandi:

sudo make install modules_install

Altrimenti conviene installare in una directory a parte e poi copiare copiare i files necessari sull'Eee PC e il modo più facile per farlo è creare un archivio compresso con tar di tutto quanto da installare:

sudo -s
mkdir -p /eeepc/tmp/boot
make INSTALL_PATH=/tmp/eeepc/boot INSTALL_MOD_PATH=/tmp/eeepc install modules_install
# prima di fare l'archivio seguire le istruzioni su
# come compilare e installare i moduli aggiuntivi
cd /tmp/eeepc
tar cvjf ../new_kernel.tar.bz2 .
exit

copiare il file kernel.tar.bz2 e poi sull'Eee PC scompattare il tutto:

sudo -s (cd /; tar xvjf /media/*/kernel.tar.bz2)

Compilare e installare i moduli aggiuntivi

(ancora da fare)

Reinstallare grub e lanciare il nuovo kernel

A questo punto una piccola modifica a /boot/grub/menu.lst era fondamentale:

+++ /boot/grub/menu.lst 2008-01-27 19:50:31.000000000 +0100
--- /mnt/sda1/boot/grub/menu.lst 2008-01-27 19:38:30.000000000 +0100
@@ -1,12 +1,12 @@
#
# Configured by Xandros Configuration system.
#
+#hiddenmenu
-hiddenmenu
# default boot entry
default=0

# Boot automatically after 1 second.
+timeout=2
-timeout=1

# Fallback to Configure.
fallback=2
@@ -26,8 +26,3 @@ title Restore Factory Settings
kernel /boot/vmlinuz-2.6.21.4-eeepc quiet rw vga=normal nosplash=y irqpoll root=/dev/sda1 XANDROSRESTORE=y
initrd /boot/initramfs-eeepc.img

+ title Personal Boot
+ root (0x80,1)
+ kernel /boot/vmlinuz-2.6.21.7-eeepc quiet rw vga=785 irqpoll root=/dev/sda1
+ initrd /boot/initramfs-eeepc.img

Quindi affinché diventasse operativa già al prossimo riavvio:

sudo grub
root (hd0,1)
setup (hd0)
quit

Conclusione

Al riavvio successivo ho dovuto reimpostare i livelli audio con alsamixer, non ho potuto ancora provare la Wi-Fi ma per tutto quanto il resto il risultato non si è fatto attendere:

istantanea3.jpg

con questo nuovo kernel, timeout=1 e boot boster attivato in bios il tempo di avvio da spento risulta essere di circa 22 secondi cioè del 18.5% in meno rispetto al tempo di fabbrica!!!

Problemi riscontrati a posteriori

  • RISOLTO: l'opzione boot booster attivato in bios mette fuori uso la gestione della batteria e il relativo monitor che compare sulla barra delle applicazioni.
  • RISOLTO: la compilazione del support mass storage integrato nel kernel (che permette di montare una root anche da chiavetta USB o SD card, da verificare) in particolare in concomitanza con l'attivazione del supporto integrato per gli ?HCI impedisce il corretto funzionamento del lettore di SD card quindi queste tre opzioni sono da scegliere sempre come moduli:

CONFIG_USB_EHCI_HCD=m
CONFIG_USB_OHCI_HCD=m
CONFIG_USB_UHCI_HCD=m

  • CAPITO: il comando iwconfig ath0 mostra un messaggio, anche con il kernel originale, di attenzione sotto riportato per il quale la soluzione è compilare e installare i wireless tools in versione 30 beta 6 oppure successiva. Essendo una versione ancora sperimentale per il momento ho preferito non attuare nessuna modifica giacché il Wi-Fi pare comunque funzionare egregiamente. In particolare però io mi sono premurato di aggiornare il wpa_supplicant come descritto in questa pagina.

Warning: Driver for device ath0 has been compiled with version 22
of Wireless Extension, while this program supports up to version 20.
Some things may be broken…

  • DA AFFRONTARE: il driver madwifi pare avere un comportamento differente da quello originale in particolare circa la rilevazione del segnale e la comunicazione con le icone nella barra delle applicazioni. Non è necessariamente vero che il madwifi renda la scheda Wi-Fi meno sensibile potrebbero, invece, essere solo le informazioni fornite in userspace a essere diverse come si vede da questi due screenshoot:
    atheroswifi.jpg
    madwifi.jpg
  • DA AFFRONTARE: configurare il kernel in maniera da accettare anche moduli binari compilati per altri tipi di kernel in particolare utilizzando la seguente opzione commentata (fare attenzione alla tipologia di premption attivata):

# CONFIG_MODVERSIONS is not set

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.