Gentoo Logo

Guida alla configurazione del kernel Linux in Gentoo

Indice:

1.  Introduzione

Gentoo fornisce due modi per gestire l'installazione e l'aggiornamento del kernel: automatica (genkernel), e manuale. Sebbene il metodo automatico sia un approccio più facile per l'utente, ci sono vari motivi per i quali una vasta fetta di utenti Gentoo sceglie di configurare manualmente il proprio kernel: maggiore flessibilità, kernel di dimensioni minori, tempi di compilazione più brevi, acquisizione di esperienza, tempo da perdere, ecc.

Questa guida non copre il metodo automatico (genkernel). Se si preferisce usare genkernel per compilare ed installare il proprio kernel, si faccia riferimento alla documentazione di Genkernel.

Questa guida non ha lo scopo di documentare il processo di configurazione manuale dall'inizio alla fine: il processo di configurazione fa affidamento ad una buona dose di buonsenso, e ad un livello relativamente alto di conoscenza tecnica riguardo al sistema. Questo documento, invece, introdurrà i concetti di una configurazione manuale, elencando in modo dettagliato le trappole più comuni nelle quali incappano gli utenti.

Questo documento è stato scritto basandosi sui kernel più recenti, per le architetture di computer più comuni. Qualche dettaglio potrebbe differire per i kernel più vecchi o architetture più esotiche, comunque gran parte dei contenuti rimarranno pertinenti.

A questo punto si suppone di avere già scompattato i sorgenti del kernel nel proprio disco fisso (solitamente da qualche parte in /usr/src/linux), e si presume la conoscenza su come accedere allo strumento di configurazione menuconfig e su come muoversi nel menù di sistema. Se non si è ancora a questo livello di esperienza, sono disponibili altre utili guide a riguardo.

2.  Nozioni di configurazione

Le basi

Il processo in generale è alquanto semplice: verrà mostrata una serie di opzioni, categorizzate in menù individuali e sottomenù, e si dovrà selezionare il supporto all'hardware e alle funzionalità del kernel attinenti al proprio sistema.

Il kernel include una configurazione predefinita, che viene proposta la prima volta che si esegue menuconfig in una particolare serie di sorgenti. Le opzioni predefinite sono generalmente essenziali e ragionevoli, per cui la maggioranza degli utenti dovranno apportare solamente poche modifiche alla configurazione di base. Se si decide di disabilitare un'opzione abilitata in modo predefinito, ci si assicuri di avere ben chiaro a cosa serve e le conseguenze della sua disabilitazione.

Se si sta configurando il kernel Linux per la prima volta, è consigliabile avere un approccio prudenziale: non si dev'essere troppo avventati, ed è meglio cercare di apportare il minor numero possibile di modifiche alla configurazione predefinita. Nello stesso tempo si tenga presente che sarà necessario adattare certe parti della configurazione alle caratteristiche del proprio sistema per permettere allo stesso di avviarsi!

Built-in o modulare

Molte opzioni di configurazione sono a tre stati: possono non essere assolutamente compilate, integrate (built-in) nel kernel (Y), o compilate come modulo (M). I moduli sono memorizzati esternamente nel filesystem, mentre gli oggetti built-in sono compilati direttamente all'interno dell'immagine stessa del kernel.

C'è un'importante differenza tra la compilazione nel kernel e quella modulare: tranne qualche eccezione, il kernel non effettua nessun tentativo di caricamento dei moduli all'occorrenza (l'operazione viene demandata all'utente). Mentre certe parti del sistema possono avere strumenti di caricamento su richiesta, e sono disponibili delle utilità per il caricamento dei moduli, è raccomandabile compilare il supporto hardware e alle funzionalità del kernel direttamente all'interno dello stesso. Ciò assicura che i supporti all'hardware e alle funzionalità saranno sempre disponibili quando se ne avrà bisogno.

Ovviamente in certe parti della configurazione la scelta dell'integrazione nel kernel è un requisito assolutamente necessario. Per esempio, se la propria partizione di root è su un filesystem ext2, il sistema non si avvierà se il supporto a ext2 è stato compilato come modulo (il sistema cercherà il modulo ext2 nella partizione di root, ma non ci riuscirà a meno che il supporto a ext2 non sia già stato caricato!).

Supporto Hardware

Oltre a rilevare il tipo di architettura del proprio sistema, lo strumento di configurazione non effettuerà nessun tentativo per identificare l'hardware attualmente presente nella macchina. Sebbene ci siano già delle configurazioni preimpostate per il supporto a diverso hardware, probabilmente sarà necessario individuare e selezionare le opzioni appropriate per la propria configurazione hardware.

Ovviamente questo comporta una conoscenza dei componenti interni e di quelli collegati al proprio computer, o comunque l'identificazione degli stessi. Per molti componenti interni, si dovrà identificare il chipset utilizzato da ognuno, piuttosto che il nome del produttore.

Sono disponibili degli strumenti che possono aiutare in questo processo di riconoscimento. lspci (contenuto nel pacchetto sys-apps/pciutils) identificherà l'hardware basato su PCI e AGP, inclusi i componenti integrati nella scheda madre stessa. lsusb (contenuto nel pacchetto sys-apps/usbutils) identificherà i dispositivi connessi alle porte USB.

La situazione è alquanto confusa poiche il mondo dell'hardware non è propriamente standardizzato. Se la propria configurazione hardware non si discosta molto da quelle più comuni, molto probabilmente il proprio hard disk IDE funzionerà da subito, come il mouse PS/2 o la tastiera o il mouse USB. Si avrà inoltre un supporto grafico VGA di base. Tuttavia alcuni dispositivi, tipo le adattatori ethernet, raramente usano componenti hardware standard, per cui sarà necessario identificare il chipset della propria scheda e abilitare il relativo supporto, al fine di avere una connessione alla rete disponibile.

Inoltre, mentre alcune cose funzioneranno regolarmente con le impostazioni predefinite, si dovranno selezionare ulteriori opzioni per sfruttare tutte le potenzialità dal proprio sistema. Per esempio, se non si abilita il supporto per il giusto chipset IDE, il proprio disco fisso IDE funzionerà molto lentamente.

Funzionalità del kernel

Come per il supporto hardware, bisogna decidere quali funzionalità offerte dal kernel sono necessariamente da abilitare. Un esempio importante riguarda il supporto ai filesystem: si deve selezionare il supporto ai filesystem in uso nel proprio disco fisso, e probabilmente anche a quelli in uso su supporti rimovibili (es. VFAT su flash disk USB).

Un'altro esempio comune sono le funzionalità avanzate di rete. Se si vuole utilizzare qualche tipo di routing o firewalling, ci si assicuri che le voci di configurazione pertinenti siano incluse nella configurazione del kernel.

Pronti?

Ora che sono stati introdotti i concetti, si hanno gli strumenti per cominciare ad identificare il proprio hardware e navigare nel menù di configurazione, selezionando le opzioni del kernel necessarie per il proprio sistema.

Il resto di questo documento mira a chiarire gli aspetti che generalmente possono creare confusione, e dare dei suggerimenti onde evitare i problemi più comuni nei quali gli utenti incorrono spesso. Buona fortuna!

3.  Problemi comuni e aree di confusione

I dischi SATA sono SCSI

Gran parte dei sistemi desktop moderni sono forniti di dispositivi di memorizzazione di massa (dischi fissi e drive CD/DVD) su bus Serial ATA piuttosto che sul vecchio bus di tipo IDE (cavo piatto).

Il supporto SATA in Linux è implementato in uno strato definito libata, posizionato al di sotto del sottosistema SCSI. Per questa ragione, i driver SATA si trovano nella sezione della configurazione relativa ai driver SCSI. Siccome i dispositivi di archiviazione verranno trattati come dispositivi SCSI, è implicitamente richiesto anche il supporto ai dischi/cdrom SCSI. Il proprio disco SCSI verrà chiamato (es.) /dev/sda e il proprio drive CD/DVD SATA verrà chiamato (es.) /dev/sr0.

Sebbene la maggioranza di questi driver sia per i controller SATA, libata non è stato progettato specificatamente per SATA. Tutti i principali driver IDE verranno portati su libata nel prossimo futuro, e a quel punto le considerazioni fatte in precedenza saranno valide anche per tutti gli utilizzatori di dischi IDE.

Codice 3.1: Opzioni di configurazione per libata

Device Drivers  --->
 SCSI device support  --->
  <*> SCSI device support
  <*>   SCSI disk support
  <*>   SCSI CDROM support

  SCSI low-level drivers  --->
   <*> Serial ATA (SATA) support
    Selezionare il proprio chipset tra le voci elencate sotto a questa opzione

Chipset IDE e DMA

Malgrado l'introduzione di SATA, i dispositivi IDE sono ancora molto comuni e utilizzati da molte persone. IDE è una tecnologia abbastanza generica, per cui Linux supporta nativamente pressochè tutti i controller IDE, senza dover selezionare alcuna opzione specifica.

Tuttavia IDE è una tecnologia vecchia, e la sua incarnazione originale del Programmed Input/Output (PIO - "Input/Output Programmato") - non riesce a fornire le velocità di trasferimento necessarie per un accesso veloce ai moderni dispositivi di memorizzazione. Il driver IDE generico si limita a queste modalità di trasferimento PIO, che causano velocità di trasferimento dati bassissime ed un uso elevato della CPU durante il trasferimento dei dati da/sul disco.

A meno che non si abbia a che fare con sistemi precedenti al 1995, il proprio controller IDE supporterà anche un metodo di trasferimento alternativo, denominato Direct Memory Access (DMA - "Accesso Diretto alla Memoria"). DMA è molto più veloce, e l'utilizzo della CPU è scarsamente influenzato mentre vengono effettuati dei trasferimento di dati. Se si stanno riscontrando delle prestazioni del sistema veramente scarse e si sta usando un disco IDE, molto probabilmente la modalità DMA non viene utilizzata.

Nota: Come menzionato in precedenza, libata è disponibile anche per i dischi IDE. Se si sta utilizzando libata, tutti i propri dischi, inclusi quelli IDE, useranno DMA. Non c'è bisogno di nessuna ulteriore verifica o configurazione.

Se non si sta usando libata per i propri dischi IDE, allora bisognerà verificare l'utilizzo del DMA ed eventualmente abilitarlo.

Codice 3.2: Verificare se DMA è abilitato per il proprio disco IDE

# hdparm -d /dev/hda

/dev/hda:
 using_dma    =  0 (off)

Per abilitare il DMA per il proprio dispositivo IDE, si dovrà semplicemente abilitare l'opzione di configurazione per il proprio controller IDE.

Codice 3.3: Opzioni di configurazione per i controller IDE

Device Drivers  --->
 ATA/ATAPI/MFM/RLL support  --->
  <*> ATA/ATAPI/MFM/RLL support
  <*>   Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
  [*]     PCI IDE chipset support
    Selezionare il proprio chipset tra le voci elencate sotto a questa opzione

Controller Host USB

USB è un bus ampiamente utilizzato per connettere periferiche esterne al computer. Uno dei motivi del successo di USB è il suo protocollo unificato, sebbene i dispositivi denominati host controller devices (HCD) che vengono implementati nei computer possano contenere delle lievi variazioni. Le tipologie principali sono 3:

  • UHCI "Universal Host Controller Interface". Supporta USB 1.1, e solitamente si trova nelle schede madri basate su chipset VIA o Intel.
  • OHCI "Open Host Controller Interface". Supporta USB 1.1 e solitamente si trova nelle schede madri basate su chipset Nvidia o SiS.
  • EHCI "Extended Host Controller Interface". È l'unico controller host comune che supporta USB 2.0, e tipicamente si trova in ogni computer che supporta USB 2.0.

Molti sistemi vengono forniti con due delle tipologie di interfacce sopraelencate: EHCI (USB 2.0) e una tra UHCI e OHCI (USB 1.1). È importante che vengano selezionate entrambe le tipologie presenti nel proprio sistema. Mentre tutti i dispositivi USB 2.0 sono retrocompatibili con USB 1.1, una larga fetta dei dispositivi USB (anche quelli venduti al giorno d'oggi) sono basati su un'interfaccia USB 1.1 - perchè un mouse USB dovrebbe necessitare di più di 1,5mbit/sec?

Se non si selezionano le opzioni pertinenti per i tipi di HCD USB presenti nel proprio sistema, si potrebbero riscontrare problemi di porte USB 'morte': si inserisce un dispositivo, ma esso non viene alimentato o non risponde in alcun modo.

Un abile trucchetto con lspci (contenuto nel pacchetto sys-apps/pciutils) rende relativamente facile identificare quali HCD sono presenti nel proprio sistema. Ignorando i controller FireWire, inclusi anch'essi nell'identificazione, è semplice capire che il seguente sistema richiede il supporto a OHCI e EHCI:

Codice 3.4: Usare lspci per individuare i tipi di HCD

# lspci -v | grep HCI
00:02.0 USB Controller: nVidia Corporation CK804 USB Controller (rev a2) (prog-if 10 [OHCI])
00:02.1 USB Controller: nVidia Corporation CK804 USB Controller (rev a3) (prog-if 20 [EHCI])
01:0b.0 FireWire (IEEE 1394): Agere Systems FW323 (rev 61) (prog-if 10 [OHCI])

Codice 3.5: Configurazione per gli HCD USB

Device Drivers  --->
 USB support  --->
  <*> Support for Host-side USB
  ---   USB Host Controller Drivers
  <*>   EHCI HCD (USB 2.0) support
  <*>   OHCI HCD support
  <*>   UHCI HCD (most Intel and VIA) support
  Selezionare gli HCD presenti nel proprio sistema, o tutti e 3 se non si è sicuri.

Sistemi Multiprocessore, Hyper-Threading e Dual Core

Molti computer sono basati su più processori, a volte in modi non immediatamente evidenti.

  • Diverse CPU Intel supportano una tecnologia chiamata hyper-threading, nella quale la CPU viene vista dal sistema come due processori logici.
  • Alcune delle più recenti CPU Intel/AMD attualmente sono composte da più processori fisici inclusi in un singolo involucro, e vengono definiti processori dual core.
  • Qualche computer di alto livello ha diversi processori fisici installati in speciali schede madri per fornire un incremento significativo delle prestazioni rispetto ad un sistema uniprocessore. Probabilmente si saprà se si dispone di un sistema di questo tipo, in quanto ha costi non propriamente economici.

In ogni caso si deve selezionare l'appropriata opzione del kernel per ottenere prestazioni ottimali da queste configurazioni.

Codice 3.6: Configurazione per sistemi multi-processore

Processor type and features  --->
 [*] Symmetric multi-processing support
 Selezionare questa opzione se si ha un sistema multiprocessore (di qualsiasi tipo)
 [*]   SMT (Hyperthreading) scheduler support
 Selezionare questa opzione se si utilizza una CPU Hyper-Threading Intel
 [*]   Multi-core scheduler support (NEW)
 Selezionare questa opzione se la propria CPU è dual core
Power management and ACPI options  --->
 [*] ACPI (Advanced Configuration and Power Interface) Support
 Questa opzione abilita non solo le funzionalità riguardanti la
 gestione energetica, ma potrebbe anche essere un requisito necessario per
 rendere disponibili al proprio sistema tutte le CPU.

Supporto High Memory x86

A causa delle limitazioni nello spazio d'indirizzamento a 32bit delle architetture x86, un kernel con una configurazione standard può solamente supportare fino a 896mb di RAM. Se il proprio sistema ha più memoria, solo i primi 896mb saranno visibili, a meno di non abilitare il supporto all'high memory.

Nota: Questa limitazione è specifica delle architetture x86 (IA32). Altre architetture supportano nativamente grandi quantità di memoria, senza nessuna modifica alla configurazione.

Il supporto all'high memory non è abilitato in modo predefinito, poiche esso introduce un leggero aumento di carico sul sistema. Non ci si deve lasciare fuorviare da ciò, l'aumento di carico è insignificante se comparato all'incremento di prestazioni dovuto alla quantità maggiore di memoria disponibile!

Codice 3.7: Abilitare il supporto all'high memory su x86

Processor type and features  --->
 High Memory Support  --->
  (X) 4GB
  ( ) 64GB
  Scegliere l'opzione 4Gb, a meno che il proprio sistema non abbia più di 4GB di RAM.

4.  Nota sulla stenografia della configurazione del Kernel

Introduzione

Quando si legge riguardo alle configurazioni del kernel, spesso si vedono impostazioni descritte come CONFIG_<qualcosa>. Questa notazione stenografata è quella che il kernel utilizza internamente, ed è ciò che si troverà nel file di configurazione del kernel (sia esso /usr/src/linux/.config o nel caso autogenerato /proc/config.gz). Ovviamente utilizzare una notazione stenografata non sarebbe di molto utile se non si può tradurre questa nella reale locazione nella configurazione del kernel. Fortunatamente lo strumento make menuconfig permette di fare proprio questo.

Tradurre CONFIG_FOO nella reale locazione nella configurazione

Si supponga di dover abilitare CONFIG_TMPFS_XATTR, lanciare il menù di configurazione del kernel (make menuconfig) e digitare /. Questo aprirà il box di ricerca. In questo box di ricerca digitare CONFIG_TMPFS_XATTR (si può anche evitare CONFIG_). Il seguente listato di codice mostra il risultato di questa ricerca.

Codice 4.1: Risultato della ricerca di CONFIG_TMPFS_XATTR

Symbol: TMPFS_XATTR [=n]
Type : boolean
Prompt: Tmpfs extended attributes
 Defined at fs/Kconfig:138
 Depends on: TMPFS [=y]
 Location:
   -> File systems
    -> Pseudo filesystems
	 -> Virtual memory file system support (former shm fs) (TMPFS [=y])
 Selected by: TMPFS_POSIX_ACL [=n] && TMPFS [=y]

Questo output contiene molte informazioni interessanti.

Voce Descrizione
Symbol: TMPFS_XATTR [=n] Questo identifica la voce che si sta cercando nella configurazione del kernel. Informa anche che l'impostazione attualmente non è abilitata ([=n]).
Type: boolean L'impostazione ricercata è di tipo booleano (significa cioè che può essere abilitata o disabilitata). Alcune impostazioni sono numeri o stringhe.
Prompt: Tmpfs extended attributes Questo è il testo che si trova in make menuconfig e simili, è la voce che si sta cercando in un formato più umanamente leggibile.
Depends on: TMPFS [=y] Prima che questa opzione sia visibile è necessario avere CONFIG_TMPFS abilitata. In questo caso è già a posto (si noti [=y]), ma nel caso non lo fosse è necessario prima cercare (e abilitare) CONFIG_TMPFS.
Location: ... Questa è la locazione nella struttura di make menuconfig in cui si trovano le impostazioni. L'opzione che si sta cercando è Tmpfs extended attributes.
Selected by: TMPFS_POSIX_ACL [=n] && TMPFS [=y] Se le opzioni descritte qui sono entrambe abilitate (in questo caso la prima non lo è), CONFIG_TMPFS_XATTR sarà automaticamente abilitato e non sarà possibile disabilitarlo.

Con queste informazioni si dovrebbe essere in grado di tradurre facilmente qualsiasi CONFIG_* richiesto. In breve:

  1. è necessario abilitare le impostazioni descritte nel campo Depends on
  2. spostarsi dove si viene indirizzati da Location:
  3. abilitare il valore riportato da Prompt:

5.  Ulteriore documentazione sulla configurazione del kernel

Finora si è discusso riguardo a concetti generici e problemi specifici riguardo alla configurazione del kernel, senza scendere nei dettagli (si lascia al lettore il compito di farlo!). Tuttavia, altre parti della raccolta di documentazione su Gentoo forniscono informazioni più particolareggiate riguardo alle questioni affrontate in precedenza.

Questi documenti potranno risultare utili durante la configurazione di aspetti specifici, ma se si è nuovi alla configurazione del kernel si raccomanda di non essere troppo avventurosi. È consigliabile iniziare con la preparazione di un sistema di base funzionante, si potrà sempre tornare sui propri passi e aggiungere il supporto all'audio, stampa, ecc.

  • La Guida su ALSA fornisce i dettagli delle opzioni di configurazione richieste per il supporto alle schede audio. È da notare che ALSA è un'eccezione rispetto alla modalità suggerita di compilazione built-in degli oggetti; ALSA attualmente è molto più facile da configurare se i componenti sono modulari.
  • La Guida Gentoo Linux al Bluetooth fornisce i dettagli sulle opzioni necessarie per usare i dispositivi bluetooth nel proprio sistema.
  • La Guida Router IPV6 spiega come configurare il proprio kernel per il routing usando il protocollo di indirizzamento di rete di nuova generazione.
  • Se si utilizzano i driver grafici proprietari di nVidia per migliorare le prestazioni grafiche 3D, la Guida nVidia per Gentoo Linux elenca quali opzioni bisognerebbe e non bisognerebbe selezionare su tali sistemi.
  • Tra le altre cose, la Guida alla Gestione Energetica spiega come configurare il proprio kernel per lo scaling della frequenza della CPU, e per le funzionalità di ibernazione e sospensione.
  • Se si sta utilizzando un sistema PowerPC, le risposte a domande frequenti su Gentoo Linux/PowerPC contengono qualche sezione riguardante la configurazione del kernel.
  • La Guida alla stampa in Gentoo elenca le opzioni del kernel necessarie per il supporto alla stampa in Linux.
  • La guida USB e Gentoo Linux fornisce i dettagli della configurazione richiesta per usare i dispositivi USB più comuni, come mouse/tastiere, supporti di archiviazione e stampanti.

6.  Risoluzione dei problemi

Le modifiche alla configurazione non hanno effetto

È molto comune per gli utenti effettuare una modifica alla configurazione, ma poi fare un piccolo errore nei passaggi successivi. Il sistema viene riavviato con un'immagine del kernel che non è quella appena riconfigurata, viene verificato che il problema che si cercava di risolvere persiste, e si conclude che la modifica alla configurazione non risolve il problema.

Il processo di compilazione e installazione del kernel esula dagli scopi di questo documento, per le linee guida si faccia riferimento alla guida Upgrade del kernel Gentoo Linux. In breve, le operazioni sono: configurare, compilare, montare /boot (se non è già montata), sovrascrivere l'immagine del kernel con quella nuova, riavviare. Se si omette una qualsiasi di queste operazioni conclusive, le modifiche non avranno effetto!

È possibile verificare se il kernel con il quale si ha avviato il sistema combacia con quello compilato nel proprio disco fisso esaminando la data e l'ora di compilazione. Presupponendo che la propria architettura sia x86 e i sorgenti del kernel siano installati in /usr/src/linux:

Codice 6.1: Verificare se si ha avviato il sistema con il kernel modificato

# uname -v
#4 SMP PREEMPT Sat Jul 15 08:49:26 BST 2006
questo comando visualizza la data e l'ora in cui il kernel attualmente avviato è stato compilato.

# ls -l /usr/src/linux/arch/i386/boot/bzImage
-rw-r--r-- 1 dsd users 1504118 Jul 15 08:49 /usr/src/linux/arch/i386/boot/bzImage
questo comando visualizza la data e l'ora in cui è stata compilata l'immagine del kernel nel proprio hard disk.

Se i due orari visualizzati dai precedenti comandi differiscono per più di 2 minuti, vuol dire che è stato commesso un errore durante la reinstallazione del kernel e non si sta eseguendo l'immagine del kernel desiderata!

I moduli non vengono caricati automaticamente

Come menzionato precedentemente in questo documento, selezionare un componente del kernel come modulo (M) piuttosto che built-in (Y) influenza enormemente il comportamento del kernel. Vale la pena ripeterlo, poichè molti utenti cadono in questa trappola.

Quando si seleziona un componente come built-in, il codice viene compilato nell'immagine del kernel (bzImage). Quando il kernel ha bisogno di usare quel componente, può inizializzarlo e caricarlo automaticamente, senza nessun intervento da parte dell'utente.

Quando si seleziona un componente come modulo, il codice viene compilato in un file e installato nel filesystem. Generalmente, quando il kernel ha bisogno di usare quel componente, non ci riesce! Con qualche eccezione, il kernel non fa nessun tentativo di caricare questi moduli, lasciando il compito all'utente

Per cui, se si ha compilato il supporto alla propria scheda di rete come modulo, e non si riesce ad accedere alla rete, la probabile causa è che il modulo non è caricato, perciò si dovrà caricarlo manualmente o configurare il sistema per farlo caricare in automatico durante l'avvio.

A meno che non si abbiano precisi motivi per fare diversamente, si risparmia un bel po' di tempo compilando questi componenti direttamente nell'immagine del kernel, per permettere al kernel stesso di impostarli automaticamente per l'utente.



Stampa

Aggiornato il 26 dicembre 2011

La versione originale di questo documento non è più mantenuta

Oggetto: Lo scopo di questo documento è introdurre le nozioni di base per la configurazione manuale del kernel, e dare i dettagli degli errori di configurazione più comuni.

Daniel Drake
Autore

Curtis Napier
Contributi

Justin Robinson
Contributi

Łukasz Damentko
Contributi

Jonathan Smith
Redazione

Joshua Saddler
Redazione

Davide Cendron
Traduzione

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.