[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [violazione licenza] [translators] [docinfo] [indice analitico] [volume] [parte]
Il kernel è il nocciolo del sistema operativo. I programmi utilizzano le funzioni fornite dal kernel e in questa maniera sono sollevati dall'agire direttamente con la CPU.
Il kernel Linux è costituito normalmente da un file soltanto, il cui nome può essere vmlinuz
, oppure zImage
, bzImage
e altri ancora, ma può comprendere anche moduli aggiuntivi per la gestione di componenti hardware specifici che devono poter essere attivati e disattivati durante il funzionamento del sistema.
Quando si fa riferimento a un kernel in cui tutte le funzionalità che servono sono incluse nel file principale, si parla di kernel monolitico, mentre quando parte di queste sono poste all'interno di moduli esterni, si parla di kernel modulare. Il kernel monolitico ha il vantaggio di avere tutto in un file, ma nello stesso modo è rigido e non permette di liberare risorse quando le unità periferiche gestite non servono. Il kernel modulare ha il vantaggio di poter disattivare e riattivare i moduli a seconda delle esigenze, in particolare quando moduli distinti gestiscono in modo diverso lo stesso tipo di unità periferica. Tuttavia, a causa della frammentazione in molti file, l'uso dei moduli può essere fonte di errori.
In generale, l'uso dei kernel modulari dovrebbe essere riservato agli utilizzatori che hanno già un'esperienza sufficiente nella gestione dei kernel monolitici. In ogni caso, ci possono essere situazioni in cui l'uso di un kernel modulare è praticamente indispensabile, per esempio quando un certo tipo di dispositivo fisico può essere gestito in vari modi differenti e conflittuali, ma si tratta di situazioni rare.
Le distribuzioni GNU/Linux tendono a fornire agli utilizzatori un kernel modulare per usi generali. Anche se questo tipo di kernel si adatta sicuramente alla maggior parte delle configurazioni, ci sono situazioni particolari dove è preferibile costruire un proprio kernel, monolitico o modulare che sia.
Per poter comprendere il procedimento di compilazione descritto in questo capitolo, occorre sapere come si compila e si installa un programma tipico distribuito in forma sorgente, come descritto nel capitolo 24.
Il procedimento descritto in questa sezione serve per generare un kernel monolitico, cioè un kernel in un solo file.
Per poter procedere alla compilazione del kernel è necessario avere installato gli strumenti di sviluppo software, cioè il compilatore e i sorgenti del kernel. In particolare, i sorgenti del kernel possono anche essere reperiti presso vari siti che offrono l'accesso attraverso il protocollo FTP. In tal caso si può fare una ricerca per i file che iniziano per linux-x.y.z.tar.bz2
, dove x.y.z sono i numeri della versione.
Il numero di versione del kernel Linux è strutturato in tre livelli: x.y.z, dove il primo, x, rappresenta il valore più importante, mentre l'ultimo, z, rappresenta quello meno importante. Quello che conta, è porre attenzione al valore intermedio: y. Se si tratta di un numero pari, la versione si riferisce a un kernel ritenuto sufficientemente stabile, mentre un numero dispari rappresenta una versione destinata agli sviluppatori e non ritenuta adatta per l'utilizzo normale.
Se i sorgenti sono stati installati attraverso un disco (un CD-ROM) di una distribuzione, questi si potrebbero trovarsi da qualche parte a partire da /usr/src/
, ma attualmente la loro compilazione non richiede una collocazione particolare nel file system, tanto che anche un utente comune, senza privilegi, può farlo, collocando i sorgenti nell'ambito della propria directory personale.
La distribuzione GNU/Linux Debian si limita a piazzare un archivio (un file compresso) nella directory |
Riquadro 34.1. Procedura superata. |
Si parte con l'estrazione dell'archivio che li contiene; naturalmente l'utente deve estrarre l'archivio in una posizione in cui gli sia concesso di farlo in base ai permessi che lo riguardano:
$
tar xjvf linux-x.y.z.tar.bz2
[Invio]
Si tenga presente che i sorgenti possono essere estratti da un utente comune e compilati dallo stesso utente. Ciò che tale utente non dovrebbe poter fare è l'installazione effettiva del kernel. |
Una volta installati i sorgenti del kernel, si può passare alla configurazione che precede la compilazione. Per questo, ci si posiziona nella directory dei sorgenti; quindi, dopo aver letto il file README
, si può procedere.
$
cd linux-x.y.z
[Invio]
La directory corrente deve essere quella a partire dalla quale si diramano i sorgenti del kernel.
$
make mrproper
[Invio]
Serve a eliminare file e collegamenti vecchi che potrebbero interferire con una nuova compilazione. In particolare, elimina la configurazione data in precedenza alla compilazione del kernel.
$
make config
[Invio]
È l'operazione più delicata attraverso la quale si definiscono le caratteristiche e i componenti del kernel che si vuole ottenere. Ogni volta che si esegue questa operazione viene riutilizzato il file .config
contenente la configurazione impostata precedentemente, mentre alla fine la nuova configurazione viene salvata nello stesso file. Di conseguenza, ripetendo il procedimento make config, le scelte predefinite corrispondono a quelle effettuate precedentemente.
Il comando make mrproper elimina il file |
Figura 34.2. Il menù principale della configurazione del kernel attraverso il comando make menuconfig.
|
Dopo la definizione della configurazione, si può passare alla compilazione del kernel relativo, utilizzando la sequenza di comandi seguente:
$
make clean
[Invio]
$
make bzImage
[Invio]
Si tratta di due operazioni che non richiedono alcun tipo di interazione con l'utente. Al termine della compilazione, se questa ha avuto successo, il nuovo kernel si trova nella directory arch/i386/boot/
con il nome bzImage
(questo vale naturalmente nel caso si utilizzi l'architettura i386).
La sigla bzImage sta per big zImage, a indicare che si tratta di un'estensione del formato zImage. Il formato zImage si ottiene con il comando make zImage, ma attualmente lo si considera obsoleto. |
Naturalmente, per fare in modo che il kernel possa essere utilizzato, questo va collocato dove il sistema che si occupa del suo avvio può trovarlo. Di solito lo si copia nella directory radice o in /boot/
, dandogli il nome vmlinuz
(come di consueto), sistemando poi ciò che serve per il sistema di avvio che si utilizza.
Una volta realizzato un kernel è necessario fare una prova per vedere se funziona. Il modo più semplice per il principiante per verificarne il funzionamento, con la garanzia di non poter fare dei danni, è quello di farne una copia in un dischetto di avvio (ovvero un dischetto di boot), ammesso che la dimensione del kernel lo consenta.
È probabile che servano dei privilegi particolari per poter scrivere sul file di dispositivo corrispondente all'unità a dischetti, come si vede nel comando successivo:
#
cp arch/i386/boot/bzImage /dev/fd0
[Invio]
Per utilizzare correttamente questo dischetto di avvio è molto probabile che si debba intervenire prima con il programma rdev o con knl.
Il procedimento per la creazione di un kernel modulare inizia nello stesso modo di quello monolitico e giunge alla creazione di un file che in più ha dei riferimenti a moduli esterni che vengono compilati a parte. Questi moduli, per poter essere gestiti correttamente, necessitano di programmi di servizio che si occupano della loro attivazione e disattivazione.
In questo caso, oltre ai sorgenti del kernel sono necessari i programmi per la gestione dei moduli. Questi si trovano normalmente in archivi il cui nome è organizzato in modo simile a quello dei sorgenti del kernel: modules-x.y.z.tar.gz
. La struttura della versione rappresentata dai numeri x.y.z rispecchia lo stesso meccanismo utilizzato per i sorgenti del kernel, però non ne vengono prodotte altrettante versioni, pertanto si deve badare a utilizzare la versione più vicina a quella del kernel che si utilizza. Questo archivio si trova normalmente nella stessa directory del sito dal quale si ottengono i sorgenti del kernel.
Anche i programmi contenuti nell'archivio modules-x.y.z.tar.gz
sono in forma sorgente e prima di poterli utilizzare devono essere compilati e installati.
Per ottenere un kernel modulare, dopo la preparazione del file principale del kernel attraverso lo stesso procedimento visto nel caso di un kernel monolitico, si devono compilare i moduli:
$
make modules
[Invio]
Quindi si installano, ma con i privilegi dell'utente root:
#
make modules_install
[Invio]
Quello che si ottiene sono una serie di file oggetto, il cui nome ha un'estensione .o
, raggruppati ordinatamente all'interno di directory discendenti da /lib/modules/x.y.z/
, dove x.y.z rappresenta il numero della versione dei sorgenti del kernel. La posizione di questi file non deve essere cambiata.
Teoricamente, la distribuzione GNU/Linux Debian consente di compilare il kernel e i moduli secondo il procedimento standard; tuttavia ciò non conviene, se non altro perché l'installazione dei moduli va a rimuovere un collegamento simbolico nella directory /lib/modules/
che punta a /etc/modprobe.conf
.
La distribuzione GNU/Linux Debian mette a disposizione uno strumento per facilitare la compilazione del kernel, passando per la creazione di un pacchetto Debian vero e proprio, che poi può essere installato secondo la procedura comune della distribuzione stessa. Il pacchetto in questione è denominato kernel-package e per questo scopo può essere usato direttamente senza bisogno di alcuna configurazione. È sufficiente procedere nel modo seguente:
cd directory_iniziale_dei_sorgenti |
ci si sposta nella directory iniziale dei sorgenti del kernel;
make {config|menuconfig|xconfig|...} |
si procede con la configurazione del kernel che si vuole ottenere;
make-kpkg clean |
ci si prepara alla compilazione;
make-kpkg --revision=versione kernel_image |
si esegue la compilazione generando l'archivio Debian corrispondente, nella directory precedente (la directory genitrice), completo di moduli se previsti.
Questo ultimo passaggio richiede però i privilegi dell'utente root per arrivare alla creazione del pacchetto Debian. |
L'esempio seguente si riferisce alla compilazione di un kernel 2.6.7 (compresi i moduli eventuali) collocato nella directory ~/linux-2.6.7/
.
Questa collocazione è volutamente differente da quella standard per la distribuzione GNU/Linux Debian, che invece dovrebbe essere |
$
cd ~/linux-2.6.7
[Invio]
$
make-kpkg clean
[Invio]
$
su root
[Invio]
#
make-kpkg --revision=custom.1.0 kernel_image
[Invio]
Si può osservare che la versione è stata definita dalla stringa custom.1.0. Questo è ciò che viene suggerito nella documentazione originale. In particolare, il numero «1.0» va incrementato ogni volta che si predispone una versione successiva.
Al termine si ottiene l'archivio kernel-image-2.6.7_custom.1.0_i386.deb
, collocato nella directory precedente a quella dei sorgenti da cui è stato ottenuto; per installarlo basta procedere come segue, usando naturalmente i privilegi dell'utente root:
#
dpkg -i ../kernel-image-2.6.7_custom.1.0_i386.deb
[Invio]
Gli elementi richiesti per la configurazione del kernel prima della sua compilazione, dipendono molto dalla versione che si possiede. In particolare, può capitare che alcune voci vengano spostate da una versione all'altra del kernel.
Le varie opzioni sono raggruppate in alcuni gruppi principali, che dovrebbero guidare intuitivamente nella configurazione prima della compilazione del kernel:
{Code maturity level options
}
selezione del dettaglio con cui si vogliono definire le voci della configurazione;
{General setup
}
caratteristiche generali, sia fisiche, sia logiche del sistema;
{Loadable module support
}
{Processor type and features
}
caratteristiche del microprocessore o dei microprocessori;
{Power management options (ACPI, APM)
}
controllo del sistema di alimentazione e del risparmio energetico;
{Bus options (PCI, PCMCIA, EISA, MCA, ISA)
}
{Executable file formats
}
formati dei file eseguibili;
{Device Drivers
}
controllo dei dispositivi di vario genere;
{Generic Driver Options
}
opzioni generali riferite alla gestione dei dispositivi;
{Memory Technology Devices (MTD)
}
gestione di memorie MTD, ovvero memoria speciale che ha la proprietà di non essere volatile come la RAM comune;
{Parallel port support
}
gestione delle porte parallele;
{Plug and Play configuration
}
{Block devices
}
gestione dei dispositivi a blocchi;
{ATA/IDE/MFM/RLL support
}
gestione di dischi ATA/ATAPI e simili;
{SCSI support
}
gestione di unità SCSI;
{Old CD-ROM drivers (not for SCSI or IDE/ATAPI drives)
}
gestione di vecchi tipi di lettori CD-ROM, che non sono compatibili con gli standard ATA/ATAPI e nemmeno con lo standard SCSI;
{Multi-device support (RAID and LVM)
}
gestione software di unità multiple di memorizzazione, come nel caso dei dischi RAID;
{Fusion MTP device support
}
{IEEE 1394 (FireWire) support
}
gestione di un bus IEEE 1394, noto anche con il nome FireWire;
{I2O device support
}
gestione di dispositivi periferici speciali denominati «I2O»;
{Network support
}
funzionalità di rete e gestione delle interfacce relative;
{ISDN subsystem
}
gestione di alcune schede speciali per la connessione a una rete ISDN (non è necessario utilizzare queste opzioni se si dispone di un «modem» ISDN esterno);
{Telephony Support
}
gestione di hardware speciale per la telefonia digitale su IP;
{Input device support
}
gestione di hardware per l'inserimento dati (tastiere, mouse ecc.);
{Character devices
}
gestione dei dispositivi a caratteri (terminali, porte seriali, porte parallele, mouse, ecc.);
{Multimedia devices
}
gestione di dispositivi multimediali;
{Graphics support
}
gestione della console;
{Sound
}
gestione dell'audio;
{USB support
}
{File systems
}
{Profiling support
}
{Kernel hacking
}
configurazione particolare per chi vuole lavorare attivamente allo sviluppo del kernel;
{Security options
}
{Cryptographic options
}
funzionalità crittografiche;
{Library routines
}
librerie.
Nelle sezioni seguenti vengono descritte in parte solo alcuni di questi gruppi di configurazione, mostrando qualche esempio che comunque non può esaurire il problema.
Questa sezione della procedura di configurazione si riferisce al livello di dettaglio a cui si è interessati, per quanto riguarda le opzioni di configurazione che possono essere richieste. Se si è interessati a funzionalità relativamente nuove, conviene abilitare il dettaglio massimo nella selezione delle opzioni di configurazione.
|
Questa sezione raccoglie una serie di opzioni di importanza generale, che non hanno trovato una collocazione specifica in un'altra posizione della procedura di configurazione.
|
Questa sezione della procedura di configurazione permette di attivare il sistema di gestione dei moduli. I moduli sono blocchetti di kernel separati che possono essere attivati e disattivati durante il funzionamento del sistema. Solo alcune parti del kernel possono essere gestite in forma di modulo.
Se si intende creare un kernel modulare, è evidente la necessità di attivare questa gestione all'interno della parte principale del kernel stesso.
|
Questa sezione serve a definire il tipo di microprocessore utilizzato. In generale, se si utilizza un'architettura di tipo ix86, la selezione del tipo di microprocessore 386 garantisce la creazione di un kernel compatibile nella maggior parte delle situazioni, a discapito però delle prestazioni.
Sempre nel caso di architettura di tipo ix86, è possibile abilitare l'emulazione per il coprocessore matematico (i387), che in alcuni elaboratori molto vecchi non è incluso. Di solito, l'inclusione del codice di emulazione non crea problemi di conflitti, perché viene individuata automaticamente la presenza dell'hardware relativo e l'emulazione non viene attivata se non quando necessario. In tal modo, includendo questa funzionalità si genera un kernel più compatibile.
L'esempio che si vede sotto si riferisce a una compatibilità limitata a microprocessori i586 o superiori:
|
Questa sezione permette di accedere alle funzionalità legate al controllo dell'alimentazione e al risparmio energetico. In generale si tratta di opzioni delicate che dipendono molto dalle caratteristiche fisiche dell'elaboratore.
|
L'esempio mostra l'attivazione delle funzionalità in generale, che però devono essere specificate all'interno di altri menù. In generale, dovrebbe essere possibile attivare le funzioni che consentono di spegnere l'elaboratore via software, senza problemi particolari di incompatibilità, selezionando la voce {APM (Advanced Power Management) BIOS Support
} e compilando la maschera relativa nel modo seguente:
|
Si osservi che l'attivazione della voce {Use real mode APM BIOS call to power off
} può essere controproducente con alcune schede madri che dispongono del BIOS AMI.
Questa sezione permette di selezionare la gestione di alcuni tipi di bus. Generalmente è necessario abilitare l'uso di bus ISA e PCI:
|
Per quanto riguarda la gestione di schede PCMCIA, è necessario attivare la gestione dei vari tipi di integrati che sono in grado di gestire un bus di questo tipo. Si accede a queste voci da {PCMCIA/CardBus support
}:
|
Il kernel deve essere predisposto per il tipo di eseguibili che si vogliono usare. In generale, se possibile, conviene abilitare tutti i tipi disponibili:
|
La gestione della porta parallela non riguarda solo la stampa, dal momento che consente anche l'uso di altri tipi di unità periferiche. In questo gruppo di opzioni è possibile abilitare l'uso delle porte parallele, stabilendo eventualmente il grado di compatibilità di queste.
|
La gestione del Plug & Play permette al kernel di configurare automaticamente alcuni dispositivi che aderiscono a queste specifiche.
|
Un dispositivo a blocchi è quello che utilizza una comunicazione a blocchi di byte di dimensione fissa, contrapponendosi al dispositivo a caratteri con cui la comunicazione avviene byte per byte. Il dispositivo a blocchi tipico è un'unità a disco.
Merita attenzione particolare anche il dispositivo definito loopback,(1) che rappresenta in pratica un file contenente l'immagine di un disco, che viene letto come se fosse un disco o una partizione reale. Questa possibilità, tra le altre cose, consente di gestire direttamente i file che contengono la riproduzione esatta di dischetti, senza bisogno di trasferire questi file su dischetti reali.
Infine, è qui che si può abilitare e configurare la gestione dei dischi RAM, ovvero di dischi che vengono rappresentati nella memoria RAM.
|
La gestione di unità a blocchi tradizionali ed economiche, ATA/ATAPI, viene inserita in un menù apposito. In particolare, è possibile includere una gestione specifica per alcuni integrati, specialmente per quelli che hanno dimostrato di avere dei difetti di funzionamento. È molto importante anche la possibilità di gestire secondo il protocollo SCSI alcuni dispositivi ATA.
|
Questa sezione riguarda la gestione del kernel delle unità SCSI. Le interfacce SCSI non hanno uno standard comune come avviene nel caso di quelle ATA e derivate, per cui è indispensabile includere il codice specifico per tutte le interfacce che si intendono utilizzare.
In certe situazioni può essere necessario abilitare la «gestione generica» SCSI. In particolare, questo serve nel caso si preveda l'uso di un masterizzatore SCSI.
|
La gestione software di più unità di memorizzazione in modo combinato richiede la selezione di un gruppo speciale di opzioni. Può trattarsi di dischi o partizioni ridondanti come forma di protezione dalle perdite di dati, oppure può essere un modo per fondere assieme più partizioni in una partizione logica più grande. Se c'è la possibilità, conviene attivare almeno le funzionalità necessarie a gestire il livello RAID 1.
|
La configurazione delle funzionalità di rete è importante anche se il proprio elaboratore è isolato. Quando è attiva la gestione della rete, il kernel fornisce implicitamente le funzionalità di inoltro dei pacchetti, consentendo in pratica il funzionamento come router. Tuttavia, l'attivazione di ciò dipende dall'inclusione della gestione del file system /proc/
e dell'interfaccia sysctl. Inoltre, durante il funzionamento del sistema è necessario attivare espressamente l'inoltro IPv4 attraverso un comando simile a quello seguente:
#
echo '1' > /proc/sys/net/ipv4/ip_forward
[Invio]
Esiste anche un comando analogo per IPv6, che però va usato soltanto quando serve veramente, perché con la funzionalità di inoltro attiva il nodo non prende in considerazione la configurazione automatica di Radvd:
#
echo 1 > /proc/sys/net/ipv6/conf/interfaccia/forwarding
[Invio]
|
Le opzioni di funzionamento della rete sono raccolte in un menù a cui si accede dalla voce {Networking options
}:
|
La gestione relativa a IPTables, diventa accessibile in un menù separato, dopo aver attivato la voce {Network packet filtering
}:
|
Per accedere alla gestione di filtro IPv4, occorre selezionare la voce {IP: Netfilter Configuration
}:
|
Naturalmente, dal menù principale di questo gruppo è necessario accedere ad altri menù secondari per la selezione delle interfacce di rete utilizzate effettivamente.
I dispositivi per l'inserimento dati richiedono la selezione di una serie di opzioni, che fanno capo a questo menù:
|
Un dispositivo a caratteri è quello che utilizza una comunicazione byte per byte e si contrappone a quello a blocchi con cui la comunicazione avviene attraverso l'uso di blocchi di byte di dimensione fissa.
|
Questa sezione riguarda la gestione della console, dal punto di vista grafico:
|
Può essere importante verificare la configurazione contenuta nel menù a cui si accede dalla voce {Console display driver support
}:
|
Questo gruppo di opzioni consente di gestire le funzionalità audio, specificando l'uso di una scheda audio particolare.
|
Attraverso la voce {Advanced Linux Sound Architecture
} si raggiunge un menù specifico; l'altro menù, riferito alla voce {Open Sound System
}, non è più consigliato.
|
Questo gruppo di opzioni consente la gestione di adattatori USB e delle unità periferiche relative. In generale conviene prevedere l'uso di tutti i tipi di adattatori USB, assieme all'accesso a memorie di massa (dischi esterni), che sono componenti abbastanza comuni.
|
Attraverso questa sezione si definiscono i tipi di file system che si vogliono gestire. In particolare, anche i file system virtuali, come /proc/
e /dev/pty/
, vengono definiti qui.
Il file system standard dei sistemi GNU/Linux è il tipo Second-extended, ovvero Ext2 o Ext3. La gestione di questo tipo di file system deve essere inclusa nel kernel, a meno che si stia cercando di produrre del codice specifico per un'applicazione particolare. |
In questo gruppo di opzioni trovano posto anche quelle necessarie alla condivisione attraverso la rete, per esempio con il protocollo NFS.
È interessante osservare che è necessario specificare anche i sistemi di partizionamento dei dischi. In generale è indispensabile la gestione delle partizioni tipiche dei sistemi Dos.
Infine, è importante anche tenere in considerazione il tipo di codifica che si vuole poter utilizzare nell'ambito del file system. La codifica in questione riguarda il modo di rappresentare i nomi dei file, che potrebbe richiedere estensioni particolari. In generale viene abilitata la codifica UTF-8, ma per il momento assieme a ISO 8859-1, che è ancora quella più frequente nel mondo occidentale.
|
La voce {Pseudo filesystems
} consente di accedere alle funzioni relative a file system virtuali:
|
Il kernel Linux è molto dinamico e il suo sviluppo prende spesso delle strade imprevedibili. Questa vitalità è molto importante per il futuro del software libero; senza di essa non ci sarebbe modo di usare domani le nuove tecnologie proposte. In questo senso, diventa difficile dare delle indicazioni precise e durature sul modo corretto di configurare il kernel prima della compilazione.
L'unica documentazione sicura sotto questo aspetto è quella che si può consultare in modo contestuale quando si utilizza il comando make menuconfig, oppure make xconfig. Eventualmente, può essere utile sapere che le informazioni che si leggono lì sono contenute nel file Documentation/Configure.help
(nell'ambito dei sorgenti), fino alle versioni 2.4.*, mentre in quelle successive si trovano suddivise in vari file Kconfig
contenuti nelle directory contenenti il codice relativo al contesto a cui si riferiscono. Segue un estratto di uno di questi file Kconfig
, precisamente si tratta di drivers/usb/Kconfig
:
|
Quando si parte da zero, è sufficiente accertarsi di eliminare il file .config
, che comunque viene eliminato con il comando make mrproper. In questo modo, il programma che guida alla configurazione del kernel offre già le risposte più ovvie alle domande che fa. Naturalmente è sempre necessario leggere le prime volte il testo delle spiegazioni disponibili, fino a che si raggiunge una dimestichezza adeguata al tipo di esigenze che si hanno.
Come la documentazione interna suggerisce spesso, nella directory Documentation/
sono contenuti tanti file di testo contenenti spiegazioni particolareggiate rispetto a problemi specifici della configurazione. A questo punto dovrebbe essere evidente che non si può configurare e compilare un kernel se non si conosce minimamente la lingua inglese.
Questo tipo di lavoro passa poi necessariamente per una lunga serie di tentativi falliti (avendo cura di conservare i file .config
, per poter ripartire almeno dall'ultima configurazione tentata). Tuttavia, il principiante non deve pensare di essersi messo involontariamente nei guai, perché queste difficoltà riguardano tutti, anche gli esperti, proprio perché la dinamicità nello sviluppo del kernel Linux porta continue novità.
Linus Torvalds, /usr/src/linux symlink
<http://www.linuxmafia.com/faq/Kernel/usr-src-linux-symlink.html>
The Answer Gang, /usr/src/linux symlink considered harmful, Linuxgazette, n. 62
Appunti di informatica libera 2006.01.01 --- Copyright © 2000-2006 Daniele Giacomini -- <daniele (ad) swlibero·org>, <daniele·giacomini (ad) poste·it>
1) Il termine loop device usato qui, non deve essere confuso con loopback device usato nella configurazione dei servizi di rete.
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome kernel_linux_1.htm
[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [violazione licenza] [translators] [docinfo] [indice analitico]