[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 682.   Sistema GNU/Linux fai da te: programmi binari

Di solito si incontra il problema della realizzazione di un sistema GNU/Linux, partendo da zero, quando si vogliono recuperare apparecchiature molto vecchie, che dispongono di poca memoria centrale. Infatti, non esiste una distribuzione GNU/Linux curata e seguita come quelle standard, che sia specializzata per questi problemi; pertanto, anche se esistono diversi lavori in tal senso, nulla è mai perfettamente adeguato alle esigenze di ognuno.

In questo capitolo si vuole mostrare un percorso che dovrebbe consentire di costruire il proprio sistema GNU/Linux, cercando di risparmiare risorse, passando attraverso la compilazione dei sorgenti degli applicativi che interessano. I passaggi realizzativi non sono spiegati completamente, pertanto il lettore deve avere già qualche conoscenza in merito, soprattutto deve sapere come mettere insieme i pezzi di una procedura di avvio (Init), oltre che conoscere i file di configurazione principali che si devono trovare nella directory /etc/.

682.1   Librerie C

I sistemi GNU/Linux attuali sono sviluppati utilizzando la libreria C nota con il nome Glibc, o anche Libc6 (/lib/libc.so.6), ovvero GNU C Library. (1) Questa libreria ha caratteristiche qualitative molto elevate, ma ha il difetto di richiedere una grande quantità di risorse al sistema. Per questa ragione, quando si vuole realizzare il proprio «mini» sistema operativo, si può considerare la possibilità di usare librerie C alternative, meno impegnative, anche se meno sicure.

Tabella 682.1. Librerie C sviluppate appositamente per risparmiare risorse.

Libreria Descrizione
µClibc Si tratta di una libreria che offre la compatibilità massima e consente di compilare la maggior parte dei programmi senza difficoltà.
Dietlibc Si tratta di una libreria ridotta all'indispensabile, che però non consente di compilare molti applicativi. Questa libreria viene usata soprattutto per realizzare eseguibili statici, ovvero completamente autonomi, che solitamente hanno anche dimensioni molto ridotte.
Newlib Un'altra libreria C, sviluppata da Red Hat.

Oltre al problema di scegliere una libreria C, ci si deve organizzare in modo da poter produrre dei programmi con queste librerie, dal momento che di solito non sono le stesse che si stanno utilizzando nel proprio sistema GNU/Linux usato normalmente per lavorare.

682.1.1   Sviluppo attraverso µClibc

La libreria µClibc (2) viene distribuita a partire da <http://www.uclibc.org> e da <http://www.kernel.org/pub/linux/libs/uclibc/>. Tra le altre cose, è possibile ottenere un file che contiene l'immagine di un file system contenente un sistema GNU/Linux basato su µClibc e organizzato per consentire la produzione di altro software con la stessa libreria C. Il file in questione è ottenibile precisamente dall'indirizzo <http://www.kernel.org/pub/linux/libs/uclibc/root_fs_i386.ext2.gz> oppure <http://www.kernel.org/pub/linux/libs/uclibc/root_fs_i386.ext2.bz2> e, prima di essere utilizzato, deve essere estratto dall'archivio compresso che lo contiene.

Teoricamente, il file-immagine potrebbe servire per preparare un elaboratore con questo sistema GNU/Linux, continuando poi da lì per la produzione del software che si desidera. In pratica, può essere più conveniente copiare il contenuto di questo file system in una directory, da utilizzare attraverso chroot. Supponendo di volere agire in questo modo, si potrebbe decidere di copiare il file system a partire da /home/uclibc/, organizzando anche un meccanismo abbastanza semplice per passare a lavorare al suo interno:

bunzip2 root_fs_i386.bz2[Invio]

mkdir /tmp/loop[Invio]

mount -o loop -t auto root_fs_i386 /tmp/loop [Invio]

mkdir /home/uclibc[Invio]

cd /tmp/loop[Invio]

cp -dpRv * /home/uclibc[Invio]

cd[Invio]

umount /tmp/loop[Invio]

rmdir /tmp/loop[Invio]

A questo punto, rimane da risolvere il problema del passaggio all'interno del contesto della directory /home/uclibc/, come se fosse la radice del file system. Per questo si propone la creazione di un utente apposito, abbinato però al numero UID e GID zero (pertanto si tratta di un'utenza equivalente a quella di root), con il quale si vuole passare automaticamente all'interno di questa directory. Si comincia predisponendo lo script /home/uclibc/chroot, che serve a usare chroot e ad avviare la shell in modo appropriato:

#!/bin/sh 
/usr/sbin/chroot /home/uclibc /bin/sh -l

Successivamente si crea manualmente l'utente uclibc, modificando i file /etc/passwd e /etc/shadow, aggiungendo rispettivamente le due righe seguenti:

uclibc:x:0:0:uclibc:/home/uclibc:/home/uclibc/chroot
uclibc:QAJNdxerY3Ozxc:12386:0:99999:7:::

Nel file /etc/passwd si deve osservare che la directory personale è /home/uclibc/; questo percorso va riprodotto anche all'interno della porzione di file system che si trova effettivamente a partire proprio da /home/uclibc/, in modo che punti alla directory /root/ che si ottiene subito dopo l'avvio di chroot. In pratica, occorre che esista il percorso /home/uclibc/home/uclibc, che punti realmente alla directory /home/uclibc/root/ usando possibilmente un percorso relativo: ../root.

Probabilmente è anche necessario intervenire nella configurazione dell'utente root (ovvero nella directory /home/uclibc/root/), per fare in modo che alcune variabili di ambiente contengano devi valori appropriati.

In generale, fatti questi passaggi è possibile «entrare» nell'ambiente di sviluppo µClibc semplicemente utilizzando l'utenza uclibc, mentre per «uscire» basta concludere l'attività della shell (exit). Naturalmente è il caso di predisporre una directory /usr/src/ (ovvero /home/clibc/usr/src) per la compilazione dei sorgenti che si vogliono elaborare.

682.2   Busybox

Quando si vuole sviluppare in proprio un sistema GNU/Linux, oltre al problema eventuale del risparmio di risorse si aggiunge la difficoltà di raccogliere tutti i pacchetti che compongono un sistema standard elementare. A questo si pone rimedio facilmente utilizzando Busybox, (3) che raccoglie le funzionalità dei programmi di servizio principali, semplificandone anche la compilazione.

Busybox è distribuito a partire da <http://busybox.net/downloads/> con un file che dovrebbe corrispondere al modello seguente:

busybox-versione.tar.bz2

Come per tutti i pacchetti sorgenti, si colloca il file nella directory /usr/src/ e si procede all'estrazione del suo contenuto. L'esempio si riferisce alla versione 1.00:

tar xjvf busybox-1.00.tar.bz2[Invio]

Si ottiene così la directory busybox-1.00/.

Prima di passare alla compilazione, si deve specificare ciò che si vuole ottenere, infatti Busybox non è un pacchetto standard da compilare in un modo «normale»; per questa ragione, prima della compilazione si passa per una configurazione che ricorda l'organizzazione utilizzata nei sorgenti del kernel Linux;

cd busybox-1.00[Invio]

make menuconfig[Invio]

In base alle scelte che si fanno, si incorporano più o meno funzionalità nell'eseguibile busybox che si va a creare. Al termine della configurazione, si compila:

make all[Invio]

Al termine della compilazione, se tutto è andato bene, si ottiene l'eseguibile busybox e il file busybox.links, che elenca i collegamenti da realizzare per simulare i vari programmi di servizio che in realtà fanno capo tutti allo stesso eseguibile.

In pratica, l'eseguibile busybox può essere utilizzato mettendo come primo argomento il nome del programma di servizio che si vorrebbe avviare, seguito dagli argomenti di questo. In alternativa, se Busybox viene avviato con il nome di uno dei programmi di servizio previsti, tutto funziona come se si trattasse direttamente di quello.

Per generare i collegamenti si può usare il comando seguente:

make install[Invio]

In condizioni normali, se non viene stabilito diversamente durante la fase di configurazione, si ottiene la directory _install/ con uno scheletro che riproduce la collocazione corretta dei collegamenti all'eseguibile busybox.

A volte, quando si vuole realizzare un sistema GNU/Linux molto piccolo, si preferisce mettere tutti gli eseguibili in una sola directory; in tal caso, conviene produrre i collegamenti a mano. Per fare questo conviene preparare la directory di destinazione e copiarvi all'interno sia l'eseguibile busybox, sia il file busybox.links:

mkdir /tmp/bin[Invio]

cp busybox busybox.links /tmp/bin[Invio]

cd /tmp/bin[Invio]

for i in `cat busybox.links` ; \
  \do ln -s busybox `basename $i` ; done
[Invio]

682.3   Util-linux

Busybox dovrebbe offrire quasi tutte le funzionalità fondamentali di un sistema GNU/Linux elementare. Eventualmente, se si preferisce produrre programmi «standard», ci si può procurare il pacchetto sorgente di Util-linux (4) e procedere alla sua compilazione.

Util-linux è raggiungibile presso <http://www.kernel.org/pub/linux/utils/util-linux/> e il file che contiene il pacchetto dovrebbe avere un nome conforme al modello seguente:

util-linux-versione.tar.bz2

Una volta copiato il pacchetto nella directory /usr/src/, si procede all'estrazione e alla compilazione. Negli esempi seguenti si suppone si tratti della versione 2.12:

tar xjvf util-linux-2.12.tar.bz2[Invio]

cd util-linux-2.12[Invio]

./configure[Invio]

make all[Invio]

Se tutto procede come dovrebbe, si ottengono gli eseguibili distribuiti in varie sottodirectory.

682.4   E2fsprogs

Purtroppo, almeno per ora, Busybox non include alcuni programmi fondamentali per la gestione dei file system di un sistema GNU/Linux tipico. Per questa ragione, diventa necessario procurarsi i sorgenti del pacchetto E2fsprogs (5) (Second extended file system management programs) e procedere alla loro compilazione.

E2fsprogs è raggiungibile presso <http://e2fsprogs.sourceforge.net> e il file che contiene il pacchetto dovrebbe avere un nome conforme al modello seguente:

e2fsprogs-versione.tar.gz

Una volta copiato il pacchetto nella directory /usr/src/, si procede all'estrazione e alla compilazione. Negli esempi seguenti si suppone si tratti della versione 1.34; come si può osservare, il procedimento previsto per la compilazione è un po' insolito:

tar xzvf e2fsprogs-1.34.tar.gz[Invio]

cd e2fsprogs-1.34[Invio]

mkdir build[Invio]

cd build[Invio]

../configure[Invio]

make all[Invio]

La compilazione dovrebbe andare a buon fine; tuttavia il risultato sono degli eseguibili di dimensione molto grande. Se ci si accontenta di meno funzionalità, forse si può preferire una versione più vecchia, come la 1.21: il procedimento di compilazione rimane lo stesso.

682.5   PCMCIA-cs

Per poter utilizzare un elaboratore portatile con schede PCMCIA è necessario avvalersi del pacchetto PCMCIA-cs. (6)

PCMCIA-cs è raggiungibile presso <http://pcmcia-cs.sourceforge.net/ftp/> e il file che contiene il pacchetto dovrebbe avere un nome conforme al modello seguente:

pcmcia-cs-versione.tar.gz

Una volta copiato il pacchetto nella directory /usr/src/, si procede all'estrazione e alla compilazione, ma prima occorre affiancare i sorgenti del kernel Linux che si intende usare. Si osservi che i sorgenti del kernel devono già essere stati utilizzati per preparare il kernel da usare assieme a PCMCIA-cs, che verifica la configurazione e utilizza alcuni dei suoi file. Negli esempi seguenti si suppone si tratti della versione 3.2.7:

tar xzvf pcmcia-cs-3.2.7.tar.gz[Invio]

cd pcmcia-cs-3.2.7[Invio]

make config[Invio]

make all[Invio]

Eventualmente, se si vuole avere il controllo completo della situazione, si può usare direttamente lo script Configure, con l'opzione --target, al posto di make config:

./Configure --target=/tmp[Invio]

Se fosse questo il caso, dopo la compilazione, con il comando make install si otterrebbe tutto a partire dalla directory /tmp/, da copiare a mano nelle destinazioni finali.

make install[Invio]

682.6   Conclusione

A seconda di ciò che si vuole fare, ci sono certamente altri pacchetti applicativi da prelevare e compilare. Se però si vogliono utilizzare librerie C diverse da quella che è lo «standard» generale, si rischia di non riuscire a compilare tutto ciò che si vorrebbe.

682.7   Riferimenti

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


1) GNU C Library   GNU LGPL

2) µClibc   GNU LGPL

3) Busybox   GNU GPL

4) util-linux   GNU GPL e UCB BSD

5) e2fsprogs   GNU GPL

6) PCMCIA-cs   GNU GPL


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome sistema_gnu_linux_fai_da_te_programmi_binari.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!