Piero V.

Debian Wiizi

Mi sono accorto che nessuno aveva ancora mai fatto il gioco di parole tra Wheezy e Wiizi, così, prima che Jessie diventi ufficialmente stable (ci sarà il freeze dal 6 novembre), ho deciso di comunicare queste istruzioni, che comunque penso andranno bene anche per il prossimo rilascio.

Premetto che non ho intenzione di rilasciare un’immagine o un archivio pronto per essere decompattato e avviato, visto il peso. Invece scriverò le istruzioni, comunque abbastanza semplici e rilascerò il Kernel (purtroppo non come .deb, in quanto non potremo fare un’installazione standard).

Attenzione: non mi assumo alcuna responsabilità per danni causati dalla guida, né a persone, né a oggetti, né a dati o a qualsiasi altra cosa. L’utente che sceglie di seguire questa guida se ne assume tutta la responsabilità.

Requisiti

Per completare questa guida avrete bisogno di una box con Linux: Debian sarà il nostro target, ma vanno bene anche le sue derivate come Ubuntu, o le ultime versioni di Fedora e derivate da questa: tutte hanno il pacchetto Debootstrap. In realtà qualunque box linux va bene, ma l’installazione di debootstrap sarà più difficile. Seppure tecnicamente anche altri Unix come OS X e BSD dovrebbero poter far girare debootstrap, non sono compatibili perché avremo di un chroot per completare l’operazione.

È mia intenzione spiegare affinché chi è meno esperto possa fare e chi invece è un utente più avanzato possa capire i dettagli. Tuttavia per completare la guida dovrete conoscere alcuni concetti fondamentali di Linux: saper installare il software sulla vostra distribuzione e come si danno i comandi sul terminale. Dopotutto il sistema operativo che risulterà alla fine della guida non avrà un’interfaccia grafica, ma solo a linea di comando.

Come software serviranno i già citati debootstrap (provate a installarlo dal vostro gestore di pacchetti), chroot, normalmente già installato, un editor di partizioni come Gparted e, se non avete un processore PowerPC, l’emulatore QEMU in modalità user. Quest’ultimo consente di eseguire software per architetture diverse da quella del processore. In poche parole ci permetterà di usare gli eseguibili PowerPC su altri processori, come x86, x86_64, ARM etc… Questo non serve se avete già un PowerPC, come quelli dei vecchi Mac o se eseguite la procedura direttamente sulla Wii con Whiite o altre distrivuzioni. In Debian basta installare il pacchetto qemu-user-static, così come in Ubuntu.

Se volete compilare il vostro Kernel, saranno neccesari anche gli strumenti per la compilazione compatibili con PowerPC. Personalmente ho usato Ubuntu in chroot, visto che dispone del cross compiler direttamente nei repository. In ogni caso io allegherò a fine articolo il Kernel che ho compilato io, con le relative note su sorgenti, patch e toolchain.

Sulla Wii vi basterà BootMii, non è importante se in boot2 o come IOS. Io ho testato con quest’ultima modalità e non ho avuto problemi.

In lato hardware è necessaria solamente una scheda SD. Vi consiglio caldamente anche una tastiera USB, almeno per il primo avvio, e un disco esterno per la root, se ne usate uno con un loader USB potreste aggiungere una partizione a quello.

Installazione del sistema base

Procuratevi il supporto di installazione della root: ho provato con la scheda SD, che però sconsiglio per il limitato numero di scritture, e con un hard disk esterno, sia autoalimentato che con alimentazione esterna. Non escludo che però vadano anche le chiavette USB e il network boot, se fatto con ethernet o con un ramdisk.

Prepariamo le partizioni necessarie a Wiizi: apriamo Gparted e creiamo una partizione Ext4, con etichetta GCLinux. Vi consiglio inoltre una partizione di swap, visto l’esigua quantità di RAM della Wii: solo 72MB. Se pensate di non ricordarvi il nome delle partizioni, scrivetevelo da qualche parte.

Dopo il partizionamento, montiamo la root, per esempio in /media/target: o con il mounting automatico, o da root:

mkdir /media/target
mount LABEL=GCLinux /media/target

Adesso è il momento di installare il sistema base. In base alla vostra connessione potrebbe volerci più o meno tempo.

Diamo i seguenti comandi da root (aggiustate eventualmente il percorso):

debootstrap --foreign --arch=powerpc wheezy /media/target http://debian.fastweb.it/debian/
mount -o bind /dev /media/target/dev
cp /usr/bin/qemu-ppc-static /media/target/usr/bin/
chroot /media/target
mount -t proc none /proc
mount -t sysfs none /sys
debootstrap/debootstrap --second-stage
echo wii > /etc/hostname
dpkg-reconfigure tzdata

L’ultimo comando vi chiederà il vostro fusorario, impostate pure Europe/Rome o quello che vi pare. Una volta fatto, non chiudete la shell con il chroot, dovremo tornarci.

Adesso è il momento di configurare alcuni file, lo faremo con l’editor nano. I file si aprono con nano /percorso/file/nome, si salvano con CTRL o e si esce con CTRL x.

Dobbiamo prima di tutto trovare gli UUID delle partizioni interessate.

Torniamo sulla shell aperta: in questo caso segno con # i comandi che bisogna dare, ciò che è riportato di seguito è l’output del comando.

# # ls -l /dev/disk/by-uuid/ -l
total 0
[...]
lrwxrwxrwx 1 root root 10 Oct 19 16:00 af3264ac-a17c-4788-9836-f3998ff7999a -> ../../sdb4
[...]
lrwxrwxrwx 1 root root 10 Oct 19 16:00 bf23041b-5483-4c3b-a01c-58e5c56f7374 -> ../../sdb3
[...]

Adesso modifichiamo il file /etc/fstab e mettiamo questo contenuto: (modificate gli UUID con i vostri!)

# /etc/fstab: static file system information.
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
UUID=bf23041b-5483-4c3b-a01c-58e5c56f7374 /               ext4   rw,errors=remount-ro 0       1
UUID=af3264ac-a17c-4788-9836-f3998ff7999a none            swap    sw              0       0
#/dev/sda4		none			swap	sw				0		0

La quinta linea è commentata: è circa equivalente alla quarta. Usare gli UUID è sempre meglio, così si può identificare univocamente la partizione, anche se ci sono più dischi, tuttavia non mi funzionava per lo SWAP. La quinta linea quindi è una sorta di emergenza; se la usate ricordatevi di aggiustare il numero in base alle vostre esigenze.

In seguito è il turno di modificare /etc/apt/sources.list. Inserite questo contenuto:

deb http://debian.fastweb.it/debian/ wheezy main

Ora possiamo installare e configurare un po’ di cose:

apt-get update
apt-get install bash-completion locales less wpasupplicant openssh-server console-setup wireless-tools bzip2 debian-faq  dnsutils doc-debian file ftp host gettext-base lsof pciutils python telnet time whois lshw
dpkg-reconfigure locales
apt-get clean

La tastiera è 102 tasti italiana. Sui locale invece selezioniamo en_US.UTF-8 e it_IT.UTF-8 o in base a come preferite, purché ci sia sempre anche l’inglese; selezionate il locale predefinito in base ai vostri gusti.

Il sistema è quasi pronto per l’avvio: mancano ancora due cose: la configurazione di rete, per cui serve prima scaricare un file, una passwrod per accedere e il kernel.

Per la prima risolviamo subito con l’installazione del firmware della scheda wireless. Diamo sulla shell di prima:

wget http://downloads.sourceforge.net/project/gc-linux/kernel/2.6.30/openfwwf-5.2-bin.tar.gz -O- -q | tar -xzvf - -C /

Inoltre dobbiamo aggiungere alla fine del file /etc/network/interfaces la configurazione di rete.

Per esempio, per connetterci alla rete SSID protetta con WPA2 e chiave miachiave, con IP dinamico, dovremo scrivere:

allow-hotplug wlan0
iface wlan0 inet dhcp
	wpa-ssid SSID
	wpa-psk "miachiave"

Non ho testato l’adattatore ethernet ufficiale Nintendo, ma di solito quelli non hanno problemi.

Prima di dimenticarcene, settiamo anche la password di root. Se volessimo potremmo anche creare un nuovo utente, in realtà.

Nel terminale diamo:

passwd root

Con questa password potremo fare il login. È importante non dimenticarsi, altrimenti non si può fare il login. Su Wheezy Wiizi root di default può ancora fare il login.

Il sistema base è completo, ma manca ancora una parte fondamentale: il kernel. Non chiudete ancora la shell con il chroot.

Il kernel

Per il kernel e i relativi moduli ci sono invece due soluzioni: o compilarne uno o scaricare il mio archivio.

Innanzitutto dobbiamo ringraziare l’utente DeltaRasero per aver mantenuto almeno fino alla 3.12 i sorgenti del kernel adatti.

Se vi accontentate, potete scaricare un kernel compilato da me.

All’interno dell’archivio ci sono diversi file. Il kernel vero e proprio (linux.elf per il riconoscimento automatico della tv, oppure linux.480p.elf per la modalità 480p), va messo nella SD di Bootmii. Io l’ho estratto nella directory bootmii, ma non dovrebbe essere obbligatorio.

L’archivio modules.tar.gz va estratto nella root del sistema.

Gli altri file invece riguardano la licenza GPL2, hanno solo valore legale.

Per far funzionare la wireless, a causa di un conflitto, dovrete eseguire questo comando, sempre nella shell di prima date questo comando:

echo b43 >> /etc/modules

Se non vi interessano i dettagli sulla compilazione del kernel potete pure proseguire alla prossima sezione.

Qualora voleste compilare una versione personalizzata del kernel vi avviso: può risultare lungo e noioso: più per il tempo di compilazione in sé (pochi minuti per un kernel con la mia configurazione su un i7), per configurarlo e testarlo. Personalmente mi ci sono volute 27 build prima di farlo funzionare come volevo, il kernel stesso lo testimonia ad ogni login 😊 .

Comunque vi consiglio di usare Ubuntu, in quanto ha nei repository il cross compilatore powerpc. Va bene anche se la mettete in un chroot senza né partizionare il vostro disco, né configurarla del tutto, io ho fatto proprio così.

Lo script build-gc-wii-kernel.sh fornito da DeltaRasero fa il suo dovere, ma la configurazione iniziale è piuttosto scarna: è priva del supporto USB e quindi anche di hard disk esterni, scheda Wlan e scheda bluetooth.

Per quanto riguarda l’immagine RAM iniziale, deve essere aggiunta direttamente al kernel. Potete generare il file zImage.initrd così:

make -j 8 ARCH=powerpc GCC_HOST=powerpc-linux-gnu- CROSS_COMPILE=powerpc-linux-gnu- CC="ccache powerpc-linux-gnu-gcc" zImage.initrd

L’immagine deve essere in boot/powerpc/ramdisk.image.gz. Io l’ho generata direttamente dalla Wii con gli strumenti contenuti nel pacchetto initramfs-tools dopo aver avviato con il kernel zImage. Il comando è semplice: mkinitramfs -o ramdisk.image.gz. Il file generato può essere direttamente usato con il kernel.

Un’immagine RAM iniziale è essenziale per poter passare una label o un uuid al parametro root del kernel. Tuttavia, se la volete usare, vi consiglio di impostare i driver wireless b43 come modulo e non come builtin, oppure non vi troveranno il firmware, o almeno così mi è successo.

Se volete soltanto modificare i parametri di avvio non serve ricompilare il kernel, ma basta usare l’hex editor, purché venga mantenuta la lunghezza dei parametri di default. A tal proposito gli sviluppatori di GC-Linux avevano messo un placeholder che io ho lasciato.

Il primo avvio

Il primo avvio è un po’ speciale, nel senso che potrebbe non riconoscere subito tutti i driver.

Preparate ciò che vi serve per l’avvio: la SD nella Wii, l’eventuale disco e tastiera USB connnessi.

Accendete la Wii, aprite il canale Homebrew, aprite il menu con il tasto Home e scegliete di avviare Bootmii.

Qui muovetevi o con il pad Gamecube, oppure con i tasti Power e Reset del pannello frontale della Wii. In particolare con Power andate avanti e Reset significa invio.

In una ventina di secondi dovreste poter fare il login: lo username è root e la password l’avete decisa voi prima.

Probabilmente il wireless non andrà. Date questo comando:

depmod -a

Dato che ci siete potete anche togliere con rm il file /usr/bin/qemu-ppc-static, a meno che non vogliate di nuovo entrate in chroot dal vostro PC non PowerPC.

Con modprobe b43 anche il wireless dovrebbe funzionare, altrimenti riavviate la Wii con il comando reboot.

Dal prossimo riavvio dovrebbe funzionare tutto a dovere: se ce l’avete fatta copmlimenti 😊 ! Altrimenti provate a rileggere il post o a scrivermi nei commenti.

Giusto per curiosità: il sistema in idle, con qualche servizio, come OpenSSH, a me usa 20MB di RAM su 72MB disponibili.

Cosa funziona e cosa no

L’obiettivo era avere un sistema testuale e, almeno per il momento, niente X11.

Come hardware ho provato la wireless, che funziona completamente, anche con IPv6, l’unità ottica, che però né accende il LED all’inserimento di un disco, né lo espelle col mando eject (nessun problema col pulsantino), e il LED blu. Non è possibile configurare la wireless mediante iwconfig. Non ho provato né l’audio, né la sensor bar, né il bluetooth. Li avevo provati con Whiite e funzionavano, non penso ci sia stato un regresso.

A livello software dovrebbe andare tutto. Io ho provato solo SSH e alcuni comandi base. Il processore della Wii non è di certo tra i migliori, quindi il sistema risulterà molto lento, anche con compiti come installare pacchetti. Non ho ancora provato invece a compilare il driver X11 Cube, magari lo farò in futuro; vale lo stesso discorso dell’hardware: con Whiite andava. Un’alternativa è utilizzare direttamente fbdev, anzi, forse è meglio in questo caso, ma come dicevo, non ci ho provato.

Sebbene non ci siano ancora date ufficiali, penso che per inizio 2015, magari verso febbraio, potremmo già avere Debian Jessie come stabile.

I cambiamenti sono tanti, uno su tutti è il passaggio da init di sysV a systemd e non so se onestamente la Wii lo reggerà.

Cosa migliorare

Una cosa da migliorare sarebbero sicuramente i colori, ma non penso ci siano molte possibilità.

Come sfida avevo cercato di andare oltre i limiti di Wii e provare a far andare Linux in 720p, tuttavia non è ci sono riuscito, anche per ignoranza riguardo gli standard dei segnali video. Ho cercato di documentarmi un po’, ma non è una cosa così semplice.

Infine sarebbe interessante vederci girare OpenWRT sulla Wii: stiamo parlando sempre di un dispositivo embedded!

Fonti

La guida è frutto perlopiù di un mio intenso lavoro sull’argomento e delle conoscenze acquisite su Linux durante gli anni. Durante la stesura ho provato personalmente i comandi, quindi dovrebbero funzionare.

Voglio ringraziare tutto il team di GC-Linux. Anche se il progetto sembra morto, quasi tutte le informazioni rimangono valide. Ho preso da lì, per esempio, il link per l’installazione del firmware.

Vorrei ringraziare inoltre DeltaRasero.

Una parte delle informazioni viene direttamente dal codice del kernel.

La creazione dell’immagine RAM iniziale viene dalla pagina Initrd del wiki di Debian e dalla man page di mkinitramfs.

Altri riferimenti sono presenti direttamente nel testo. Spero di non essermi dimenticato di nessuno.