Lavorare con Gentoo

Versione 1.0

Estratto

Si comincia a lavorare con Gentoo: installare software, impostare parametri, cambiare il comportamento di portage ecc.


Sommario

1. Introduzione
Benvenuti in Portage
2. L'albero del Portage
Gli ebuild
Aggiornamento dell'albero del Portage
3. Manutenzione del software
Ricerca del software
Installazione del software
Rimozione del software
Aggiornare il software
Pseudo pacchetti
4. Errori durante l'uso del Portage
Slot, virtualità, branche, architetture e profili
Pacchetti bloccati
Pacchetti mascherati
Dipendenze omesse
Nomi di ebuild ambigui
Dipendenze circolari
Scaricamento non riuscito
Protezione dei profili di sistema
5. Cosa sono i flag USE
L'idea dietro i flag USE
Definizione dei flag USE
Quali sono i flag USE utilizzabili
6. Usare i flag USE
Dichiarare flag USE permanenti
Dichiarare flag USE per pacchetti individuali
Dichiarare flag USE temporanei
Ereditare flag USE
Precedenza
Adattare il vostro sistema alle nuove flag USE
7. flag USE specifici per pacchetto
Visualizzare flag USE disponibili
8. Portage
Caratteristiche di Portage
9. Compilazione Distribuita
Usare distcc
Installare distcc
Attivare il supporto di Portage
10. Compilazione caching
Cosa è ccache
Installare ccache
Attivare il supporto di Portage
Usare ccache per la compilazione di C non-Portage
11. Supporto per pacchetti binari
Creare pacchetti precompilati
Installare pacchetti precompilati
12. Runlevels
Avviare il sistema
Init Scripts
Come lavora init
Cos'è un runlevel?
Lavorare con gli script di Init
13. Lavorare con rc-update
Cos'è rc-update?
Aggiungere e rimuovere servizi
14. Configurare i servizi
Perchè una configurazione extra?
La directory /etc/conf.d
15. Scrivere Init Scripts
E' necessario?
Layout
Dipendenze
Controllare l'ordine
Funzioni Standard
Aggiungere opzioni personalizzate
Variabili di configurazione dei servizi
16. Cambiare il comportamento del Runlevel
Può effettivamente essere utile?
Usare SOFTLEVEL
Usare BOOTLEVEL
17. Variabile d'ambiente
Cosa sono
Esempi importanti
18. Definire variabili globali
La directory /etc/env.d
Lo script env-update
19. Definire variabili locali
Specifiche dell'utente
Specifiche alla sessione
20. Autori

Lista delle Tabelle

17.1. Lista delle variabili

Lista degli Esempi

1.1. Leggere la pagina man di emerge
2.1. Aggiornamento dell'albero del Portage
2.2. Eseguire emerge-webrsync
3.1. Cercare i pacchetti che contengono pdf nel nome
3.2. Cercare i pacchetti che contengono pdf nella descrizione
3.3. Esempio dell'output di 'emerge --search'
3.4. Installare gnumeric
3.5. Fingere di installare gnumeric
3.6. Scaricare il codice sorgente di gnumeric
3.7. Rimozione di gnumeric
3.8. Aggiornare il sistema
3.9. Aggiornare l'intero sistema
3.10. Eseguire un aggiornamento completo
3.11. Rimozione delle dipendenze orfane
3.12. Installazione del pacchetto gentoolkit
4.1. Portage avverte circa i pacchetti bloccati (con --pretend)
4.2. Portage avverte circa i pacchetti bloccati (senza --pretend)
4.3. Portage avverte circa i pacchetti mascherati
4.4. Portage avverte circa i pacchetti mascherati - la ragione
4.5. Portage avverte circa le dipendenze omesse
4.6. Portage avverte circa l'ambiguità di nomi di ebuild
4.7. Portage avverte circa le dipendenze circolari
4.8. Portage avverte circa un download non riuscito
4.9. Portage avverte circa la protezione dei profili
5.1. Un piccolo estratto dei flag USE disponibili
6.1. Variabile USE su un sistema x86 in /etc/make.profile/make.defaults
6.2. Un esempio di dichiarazione USE in /etc/make.conf
6.3. /etc/portage/package.use example
6.4. /etc/portage/package.use secondo esempio
6.5. Usare USE come una variabile ambiente
6.6. Uno spaccato di /etc/make.profile/use.defaults
6.7. Eseguire emerge info
6.8. Ricompilare il sistema
6.9. Rimuovere pacchetti obsoleti
6.10. Eseguire revdep-rebuild
7.1. Vedere i flag USE usati
7.2. Installare gentoolkit
7.3. Usare etcat per vedere i flag USE usati
8.1. Vedere la manpage make.conf
8.2. Scoprire quali caratteristiche sono già impostate
9.1. Installare distcc
9.2. Configurare distcc per usare tre server disponibili DistCC
9.3. Avviare il demone distccd
10.1. Installare ccache
10.2. Editare CCACHE_SIZE in /etc/make.conf
10.3. Esaminare le statistiche di ccache
10.4. Modificare /etc/env.d/00basic
11.1. Impostare PORTAGE_BINHOST in /etc/make.conf
11.2. Installare il pacchetto precompilato gnumeric
11.3. Vedere manpage emerge
12.1. La linea di inizializzazione del sistema in /etc/inittab
12.2. Inizializzazione del sistema, continua
12.3. La linea initdefault
12.4. La definizione del runlevel
12.5. Definizione delle console virtuali
12.6. Avviare Postfix
12.7. Fermare Postfix ma mantenere in esecuzione i servizi dipendenti
12.8. Informazioni di stato per postfix
12.9. reset delle informazioni di stato per postfix
12.10. Richiedere la lista di tutti i servizi da cui Postfix dipende
12.11. Richiedere la lista dei servizi che richiedono Postfix
12.12. Richiedere la lista delle dipendenze mancanti per Postfix
13.1. Rimuovere Postfix dal runlevel default
13.2. Ricevere informazioni sugli init script
14.1. Variabili definite in /etc/conf.d/apache2
15.1. Layout di base di un init script
15.2. Informazioni di dipendenze per Postfix
15.3. La funzione depend() nel servizio Portmap
15.4. Eseguire un init script come primo script nel runlevel
15.5. Esempio di funzione start()
15.6. Ottenere la man page per start-stop-daemon
15.7. Aggiungere l'opzione restartdelay
16.1. Creare la directory di runlevel
16.2. Aggiungere gli init scripts necessari
16.3. Aggiungere una voce per offline runlevel
17.1. Esempio di definizioni
18.1. /etc/env.d/05gcc
18.2. /etc/env.d/99local
18.3. Ordine di aggiornamento di env-update
18.4. Aggiornare l'ambiente
19.1. Estendere PATH per uso locale in ~/.bashrc
19.2. Definire una variabile ambiente specifica per una sessione

Capitolo 1. Introduzione

Benvenuti in Portage

Portage è probabilmente l'innovazione di Gentoo più rilevante nella gestione software. La grande flessibilità e l'enorme quantità di caratteristiche ne fanno uno dei migliori programmi per la gestione del software disponibili per Linux.

Portage è completamente scritto in Python e Bash e perciò completamente visibile agli utenti essendo entrambi linguaggi di scripting.

Molti utenti useranno Portage attraverso il tool emerge. Questo capitolo non è un duplicato delle informazioni disponibili attraverso le pagine man di emerge. Per avere la lista completa delle opzioni di emerge, consultare la pagina man:

Esempio 1.1. Leggere la pagina man di emerge

 

# man emerge

Capitolo 2. L'albero del Portage

Gli ebuild

Quando si parla di pacchetti si intendono spesso titoli software che sono disponibili agli utenti Gentoo attraverso l'albero del Portage. L'albero del Portage è una collezione di file ebuild che contengono tutte le informazioni necessarie al Portage per manutenere il software (installare, ricercare,....). Questi ebuild risiedono di default in /usr/portage.

Ogni qualvolta si chiede al Portage di eseguire alcune azioni riguardanti i titoli software, vengono usati gli ebuild del sistema come base. Diviene, così, importante aggiornare regolarmente gli ebuild del sistema in modo tale che Portage sia a conoscenza del nuovo software, degli aggiornamenti, ecc.

Aggiornamento dell'albero del Portage

L'albero del Portage viene di solito aggiornato con rsync, una utility per il trasferimento incrementale di file. L'aggiornameto è realmente semplice dato che il comando emerge fornisce un'interfaccia per rsync:

Esempio 2.1. Aggiornamento dell'albero del Portage

 

# emerge --sync

Se non si riesce ad usare rsync a causa di un firewall si può aggiornare l'albero del Portage usando lo snapshot che viene generato giornalmente. Il tool emerge-webrsync scarica ed installa automaticamente l'ultimo snapshot dai sistemi Gentoo.

Esempio 2.2. Eseguire emerge-webrsync

 

# emerge-webrsync

Capitolo 3. Manutenzione del software

Ricerca del software

La ricerca dei titoli software attraverso l'albero del Portage si esegue utilizzando la funzione di ricerca di emerge. Di default emerge --search restituisce i nomi dei pacchetti i cui titoli corrispondono (per intero o parzialmente) a quelli forniti per la ricerca.

Per esempio, dovendo cercare tutti i pacchetti che hanno "pdf" nel loro nome:

Esempio 3.1. Cercare i pacchetti che contengono pdf nel nome

 

$ emerge --search pdf

Se si vuole cercare attraverso la descrizione si può usare l'opzione --searchdesc ( o -S):

Esempio 3.2. Cercare i pacchetti che contengono pdf nella descrizione

 

$ emerge --searchdesc pdf

Da uno sguardo all'output si nota che vengono fornite diverse informazioni. I campi sono chiaramente identificati così che non saranno esaminati:

Esempio 3.3. Esempio dell'output di 'emerge --search'

 

*  net-print/cups-pdf
      Latest version available: 1.5.2
      Latest version installed: [ Not Installed ]
      Size of downloaded files: 15 kB
      Homepage:    http://cip.physik.uni-wuerzburg.de/~vrbehr/cups-pdf/
      Description: Provides a virtual printer for CUPS to produce PDF files.
      License:     GPL-2

Installazione del software

Una volta trovato il titolo del software che interessa, lo si può facilmente installare con emerge facendolo seguire dal nome del pacchetto. Per esempio, per installare gnumeric:

Esempio 3.4. Installare gnumeric

 

# emerge gnumeric

Dato che molte applicazioni dipendono da altre ogni tentativo di installare certi pacchetti software potrebbe portare all'installazione di alcuni pacchetti aggiuntivi. Se si vuol sapere cosa verrà installato dal Portage quando viene richiesta un'installazione, si deve aggiungere l'opzione --pretend. Per esempio:

Esempio 3.5. Fingere di installare gnumeric

 

# emerge --pretend gnumeric

Quando si chiede al Portage di installare un pacchetto, verrà scaricato il codice sorgente necessario da internet e memorizzato di default in /usr/portage/distfiles. Il pacchetti verrà quindi scompresso, compilato e installato. Se si vuole che Portage scarichi solo i sorgenti senza installarli, si aggiunga al comando emerge l'opzione --fetchonly:

Esempio 3.6. Scaricare il codice sorgente di gnumeric

 

# emerge --fetchonly gnumeric

Rimozione del software

Se si vuole rimuovere un pacchetto dal sistema, usare emerge --unmerge. Questo comando rimuoverà tutti i file installati dal pacchetto eccetto i file di configurazione che sono stati alterati dopo l'installazione. In questo modo si permette di continuare a lavorare con il pacchetto nel caso si decidesse di installarlo nuovamente.

[Attenzione]Attenzione

Portage non controllerà se il pacchetto che si vuole rimuovere sia richiesto da un altro pacchetto. Verrà solo emesso un avviso del fatto che la rimozione di pacchetti importanti potrebbe danneggiare il sistema.

Esempio 3.7. Rimozione di gnumeric

 

# emerge --unmerge gnumeric

Quando si rimuove un pacchetto dal sistema, le sue dipendenze saranno lasciate. Per far trovare al Portage tutte le dipendenze che potrebbero essere rimosse, usare la funzionalità --depclean di emerge. Se ne parlerà in seguito.

Aggiornare il software

Per mantenere il sistema in perfetta forma (e non solo con gli ultimi aggiornamenti sulla sicurezza) si dovrà mantenere aggiornato il sistema regolarmente. Dato che Portage controlla gli ebuild dell'albero del Portage si dovrà prima aggiornare l'albero. Quindi, si potrà aggiornare il sistema con emerge --update world:

Esempio 3.8. Aggiornare il sistema

 

# emerge --update world

Portage cercherà quindi le nuove versioni delle applicazioni installate. Verranno comunque verificate solo le versioni per le applicazioni che si sono esplicitamente installate e non le dipendenze. Se si vuole aggiornare ogni singolo pacchetto del sistema, occorre aggiungere l'argomento --deep:

Esempio 3.9. Aggiornare l'intero sistema

 

# emerge --update --deep world

Se è stato alterato qualche USE flag si può aggiungere l'opzione --newuse. Portage verificherà se la modifica richiede l'installazione di nuovi pacchetti o la ricompilazione di quelli esistenti:

Esempio 3.10. Eseguire un aggiornamento completo

 

# emerge --update --deep --newuse world

Pseudo pacchetti

Alcuni pacchetti presenti nell'albero del Portage non hanno un contenuto reale ma sono usati per installare una collezione di pacchetti. Per esempio, il pacchetto kde installa un ambiente KDE sul sistema ricercando tra i vari pacchetti legati al KDE come dipendenze.

La rimozione di un tale pacchetto dal sistema usando emerge --unmerge, non avrà successo dato che le numerose dipendenze rimarranno sul sistema.

Portage ha anche la funzionalità di rimozione delle dipendenze orfane, ma dato che la disponibilità del software è dinamicamente dipendente, occorre prima aggiornare completamente l'intero sistema, includendo, se ci sono state, le modifiche alle flag USE. Quindi sarà possibile eseguire emerge --depclean per rimuovere le dipendenze orfane. Fatto ciò, ci sarà bisogno di ricompilare le applicazioni che erano dinamicamente linkate al software rimosso ma non più richiesto.

Tutto ciò può essere fatto con un seguenti tre comandi:

Esempio 3.11. Rimozione delle dipendenze orfane

 

# emerge --update --deep --newuse world
# emerge --depclean
# revdep-rebuild

revdep-rebuild viene provveduto col pacchetto gentoolkit, che deve essere quindi emerso prima:

Esempio 3.12. Installazione del pacchetto gentoolkit

 

# emerge gentoolkit

Capitolo 4. Errori durante l'uso del Portage

Slot, virtualità, branche, architetture e profili

Portage è estremamente potente e supporta molte caratteristiche che altri gestori di software omettono. Si vedranno ora altri aspetti del Portage senza andare troppo nei dettagli.

Portage permette la coesistenza di differenti versioni dello stesso pacchetto. A differenza di altre distribuzioni che tendono a chiamare i propri pacchetti con le versioni (come freetype e freetype2), Portage usa una tecnica chiamata SLOT. Un ebuild dichiara un certo SLOT per le proprie versioni. Ebuild con SLOT differenti possono coesistere sullo stesso sistema. Per esempio, il pacchetto freetype ha un ebuild con SLOT="1" e SLOT="2".

Ci sono anche pacchetti che provvedono la stessa funzionalità ma con un'implementazione diversa. Per esempio, metalogd, sysklogd e syslog-ng, tutti gestori di eventi di sistema. Applicazioni che fanno assegnamento sulla disponibilità di un gestore di eventi di sistema, non possono dipendere da uno in particolare. Per esempio, metalogd, come altri sistemi di gestione di eventi, sono tutti un'ottima scelta. Portage permette l'uso di virtualità: ogni sistema di gestione degli eventi provvede un virtual/syslog in modo tale che le applicazioni possano dipendere da tale virtual/syslog.

Il software all'interno dell'albero del Portage, può risiedere in differenti branche. Di default il sistema accetta solo pacchetti che Gentoo giudica stabili. Molti nuovi software una volta raccomandati, vengono aggiunti ad una branca di test, il che significa che sarà necessario procedere ad ulteriori verifiche prima di marcarli come stabili. Anche se gli ebuild per tali software sono presenti nell'albero del Portage, non vengono aggiornati prima di raggiungere la branca stabile.

Alcuni software sono disponibili solo per alcune architetture. Oppure il software non gira su altre architetture o ha necessità di essere ulteriormente testato o gli sviluppatori che raccomandano il software non sono in grado di verificare se il pacchetto gira su differenti architetture.

Ogni installazione di Gentoo aderisce ad un certo profilo che contiene tra le altre informazioni, la lista dei pacchetti che sono richiesti affinché un sistema funzioni normalmente.

Pacchetti bloccati

Esempio 4.1. Portage avverte circa i pacchetti bloccati (con --pretend)

 

[blocks B     ] gnome-base/bonobo-activation (from pkg gnome-base/libbonobo-2.4.0)

Esempio 4.2. Portage avverte circa i pacchetti bloccati (senza --pretend)

 

!!! Error: the gnome-base/bonobo-activation package conflicts with another package.
!!!        both can't be installed on the same system together.
!!!        Please use 'emerge --pretend' to determine blockers. 

Gli ebuild contengono specifici campi che informano il Portage sulle dipendenze. Ci sono due possibili dipendenze: dipendenze in fase di compilazione dichiarate in DEPEND e dipendenze per l'esecuzione dichiarate in RDEPEND. Quando una di queste dipendenze marca un pacchetto o un virtuale come non compatibile, questo viene bloccato.

Per correggere il blocco, si può scegliere tra il non installare il pacchetto o rimuovere prima il pacchetto che causa il conflitto. Nel precedente esempio si può scegliere tra il non installare libbonobo o rimuovere prima bonobo-activation.

Pacchetti mascherati

Esempio 4.3. Portage avverte circa i pacchetti mascherati

 

!!! all ebuilds that could satisfy "bootsplash" have been masked. 

Esempio 4.4. Portage avverte circa i pacchetti mascherati - la ragione

 

!!! possible candidates are:

- gnome-base/gnome-2.8.0_pre1 (masked by: ~x86 keyword)
- lm-sensors/lm-sensors-2.8.7 (masked by: -sparc keyword)
- sys-libs/glibc-2.3.4.20040808 (masked by: -* keyword)
- dev-util/cvsd-1.0.2 (masked by: missing keyword)
- media-video/ati-gatos-4.3.0 (masked by: package.mask)
- sys-libs/glibc-2.3.2-r11 (masked by: profile)

Quando si desidera installare un pacchetto che non è disponibile per il nostro sistema, si riceverà un errore di pacchetto mascherato. Si dovrà quindi installare un'applicazione differente disponibile per il nostro sistema oppure aspettare finché il pacchetto divenga disponibile. C'è sempre una ragione perché un pacchetto viene mascherato:

  • ~arch keyword significa che l'applicazione non è stata sufficientemente testata per essere inserita nella branca stabile. Aspettare alcuni giorni o alcune settimane e provare nuovamente.

  • -arch keyword o -* keyword significa che l'applicazione non funziona sulla nostra architettura. Se si crede che il pacchetto giri, aprire un bug sul bugzilla di Gentoo.

  • missing keyword significa che l'applicazione non è ancora stata testata sulla nostra architettura. Chiedere al gruppo che si occupa del porting per l'architettura di testare il pacchetto o testarlo per loro e riportare i risultati sul bugzilla di Gentoo.

  • package.mask significa che il pacchetto è corrotto, instabile o difettoso ed è stato deliberatamente marcato come non-usare.

  • profile significa che il pacchetto non è stato trovato appropriatamente nel vostro profilo. Le applicazioni potrebbero danneggiare il sistema se installate o sono solo non compatibili col profilo in uso.

Dipendenze omesse

Esempio 4.5. Portage avverte circa le dipendenze omesse

 

emerge: there are no ebuilds to satisfy ">=sys-devel/gcc-3.4.2-r4".

!!! Problem with ebuild sys-devel/gcc-3.4.2-r4
!!! Possibly a DEPEND/*DEPEND problem. 

L'applicazione che si sta provando ad installare dipende da un altro pacchetto che non è disponibile per il sistema. Controllare su bugzilla se la cosa è segnalata altrimenti la si può riportare. A meno che non si stia mescolando le branche, questo non dovrebbe accadere ed è perciò un bug.

Nomi di ebuild ambigui

Esempio 4.6. Portage avverte circa l'ambiguità di nomi di ebuild

 

!!! The short ebuild name "aterm" is ambiguous.  Please specify
!!! one of the following fully-qualified ebuild names instead:

    dev-libs/aterm
    x11-terms/aterm

L'applicazione che si vuole installare ha un nome che corrisponde con un altro pacchetto. Occorre specificare la categoria. Portage informa sulle scelte possibili.

Dipendenze circolari

Esempio 4.7. Portage avverte circa le dipendenze circolari

 

!!! Error: circular dependencies: 

ebuild / net-print/cups-1.1.15-r2 depends on ebuild / app-text/ghostscript-7.05.3-r1
ebuild / app-text/ghostscript-7.05.3-r1 depends on ebuild / net-print/cups-1.1.15-r2 

Due (o più) pacchetti che si vuole installare dipendono l'uno dall'altro e non possono perciò essere installati. Questo è probabilmente un bug del Portage. Provare ad eseguire un rsync e provare nuovamente. Si può anche controllare su bugzilla se è un caso conosciuto oppure no, nel qual caso lo si può riportare.

Scaricamento non riuscito

Esempio 4.8. Portage avverte circa un download non riuscito

 

!!! Fetch failed for sys-libs/ncurses-5.4-r5, continuing...
(...)
!!! Some fetch errors were encountered.  Please see above for details.

Portage non è riuscito a scaricare i sorgenti per una data applicazione e proverà a proseguire con l'installazione delle altre applicazioni se ci sono. Questo problema può essere causato da un mirror che non è stato sincronizzato appropriatamente o perché l'ebuild punta ad una locazione incorretta. Il server dove risiedono i sorgenti potrebbe anche non essere disponibile per qualche ragione.

Riprovare dopo un'ora e vedere se la situazione persiste.

Protezione dei profili di sistema

Esempio 4.9. Portage avverte circa la protezione dei profili

 

!!! Trying to unmerge package(s) in system profile. 'sys-apps/portage'
!!! This could be damaging to your system.

Si è richiesto la rimozione di un pacchetto che fa parte del core del sistema. Tale pacchetto è listato nel vostro profile come richiesto e dovrebbe perciò non essere rimosso dal sistema.

Capitolo 5. Cosa sono i flag USE

L'idea dietro i flag USE

Durante l'installazione di Gentoo (o di altre distribuzioni o comunque di altri sistemi operativi), sono possibili diverse scelte a seconda dell'ambiente di lavoro. Le impostazioni per un server differiscono da quelle per una workstation, così come una stazione per giocare differisce da una per il rendering 3D.

Questo non è vero soltanto per la scelta dei pacchetti da installare, ma anche per le caratteristiche che un certo pacchetto dovrebbe supportare. Per esempio, se l'uso delle OpenGL non è richiesto, non dovrebbe essere necessario né preoccuparsi di installare le OpenGL nè tantomento abilitarne il supporto nei pacchetti che ne farebbero uso. Per lo stesso motivo, se non vogliamo usare il KDE, non vorremmo neanche preoccuparci di compilare i pacchetti col supporto per il KDE se questi pacchetti funzionano tranquillamente senza.

Per aiutare gli utenti a decidere cosa installare/attivare e cosa no, è necessario che l'utente specifichi il proprio ambiente nel modo più semplice. Questo forza l'utente a decidere cosa desidera realmente e facilita Portage, il sistema per la gestione dei pacchetti, a prendere le decisioni appropriate.

Definizione dei flag USE

Concettualmente un flag USE è una parola chiave che racchiude l'idea di supporto e di informazione sulla dipendenza. Se si definisce un certo flag USE, si indica al Portage la volontà di avere il supporto per la parola chiave scelta. Questo, naturalmente, altera anche le informazioni sulle dipendenze per un dato pacchetto.

Prendiamo un esempio specifico: la parola chiave kde. Se questa parola chiave non è presente nella variabile USE, tutti i pacchetti che hanno il supporto opzionale per il KDE vengono compilati senza tale supporto. Di conseguenza tutti i pacchetti cha hanno una dipendenza opzionale con KDE vengono installati senza le relative librerie KDE. Se invece la parola chiave kde è stata definita, questi pacchetti vengono compilati col supporto del KDE e di conseguenza anche le sue librerie vengono installate come dipendenze.

La conseguenza di una corretta definizione delle parole chiave, è di avere un sistema configurato specificamente per le proprie necessità.

Quali sono i flag USE utilizzabili

Ci sono due tipi di flag USE: globali e locali.

  • Un flag USE globale è usato da alcuni pacchetti a livello di sistema. Questo è ciò che molte utenti vedono come flag USE.

  • Un flag USE locale è usato da un singolo pacchetto per prendere decisioni specifiche al pacchetto.

Una lista di flag USE globali disponibile può essere trovata online o localmente in /usr/portage/profiles/use.desc. Segue un estratto molto incompleto:

Esempio 5.1. Un piccolo estratto dei flag USE disponibili



gtk     - Aggiunge il supporto per x11-libs/gtk+ (Il GIMP Toolkit)
gtk2    - Usa gtk+-2.0.0 invece di  gtk+-1.2 nel caso dei programmi che hanno il supporto per entrambe.
gtkhtml - Aggiunge il supporto per gnome-extra/gtkhtml
guile   - Aggiunge il supporto per dev-util/guile (interprete per Scheme)
icc     - Usa il compilatore  Intel C++ Compiler se il pacchetto lo supporta
icc-pgo - Abilita la generazione di dati PGO o usare insieme a icc
imap    - Aggiunge il  supporto per IMAP

Un elenco delle flag USE locali disponibili può essere trovato in /usr/portage/profiles/use.local.desc.

Capitolo 6. Usare i flag USE

Dichiarare flag USE permanenti

Seguono le informazioni su come dichiarare i flag USE in modo permanente.

Come precedentemente menzionato, tutti i flag USE sono dichiarati attraverso la variabile USE. Per facilitare la ricerca e la scelta dei flag USE, viene fornita una configurazione USE predefinita. Questa configurazione è una collezione di flag USE che dovrebbe essere comunemente usata dagli utenti Gentoo ed è dichiarata nel file /etc/make.profile/make.defaults. Segue la configurazione predefinita:

Esempio 6.1. Variabile USE su un sistema x86 in /etc/make.profile/make.defaults



USE="x86 oss apm arts avi berkdb crypt cups encode foomaticdb gdbm gif gpm
 gtk gtk2 imlib jpeg kde gnome libg++ libwww mad mikmod motif mpeg ncurses
 nls oggvorbis opengl pam pdflib png python qt quicktime readline sdl
 slang spell ssl svga tcpd truetype X xml2 xmms xv zlib"

Come è evidente, questa variabile contiene già una serie di parole chiave. Non alterare il file /etc/make.profile/make.defaults per adattare la variabile USE alle proprie necessità dato che le modifiche a questo file vengono sovrascritte ad ogni aggiornamento del Portage.

Per cambiare la configurazione predefinita, è necessario aggiungere o rimuovere parole chiave dalla variabile USE e può essere fatto globalmente definendo la variabile USE nel file /etc/make.conf. In questa variabile è possibile aggiungere flag USE extra, richiesti o rimuoverne di non richiesti nel qual caso occorre anteporre alla parola chiave il segno meno ("-").

Per esempio, per rimuovere il support per KDE e QT ed aggiungere il supporto per ldap, può essere definita la seguente dichiarazione USE in /etc/make.conf:

Esempio 6.2. Un esempio di dichiarazione USE in /etc/make.conf



USE="-kde -qt ldap"

Dichiarare flag USE per pacchetti individuali

Qualche volta si desidera dichiarare una determinata flag USE per una (o per più) applicazione ma non per tutto il sistema. Per fare questo, si deve creare la directory /etc/portage (se ancora non esiste) e modificare /etc/portage/package.use.

Per esempio, se non si vuole che berkdb sia supportato globalmente, ma si desidera per mysql, si dovrebbe aggiungere:

Esempio 6.3. /etc/portage/package.use example



dev-db/mysql berkdb

Si possono naturalmente anche disabilitare le flag USE per una certa applicazione. Per esempio, se non si desidera il supporto java in PHP:

Esempio 6.4. /etc/portage/package.use secondo esempio



dev-php/php -java

Dichiarare flag USE temporanei

In certi casi è utile dichiarare flag USE una sola volta. Invece di editare /etc/make.conf due volte (una per la modifica e l'altra per riportare il tutto all'origine) è possibile dichiarare la variabile USE come fosse una variabile ambiente. Si ricordi che, quando si ri-emerge o si aggiorna questa applicazione (in modo esplicito o parte di un aggiornamento del sistema), i cambiamenti saranno persi!

Segue un esempio di come rimuovere temporaneamente il supporto java durante l'installazione di mozilla.

Esempio 6.5. Usare USE come una variabile ambiente



# USE="-java" emerge mozilla

Ereditare flag USE

Alcuni pacchetti non solo si aspettano flag USE ma ne forniscono a loro volta. Quando uno di questi viene installato, il flag USE che è fornito viene aggiunto alla configurazione di USE. Per avere la lista dei pacchetti che aggiungono flag USE, fare riferimento al file /etc/make.profile/use.defaults:

Esempio 6.6. Uno spaccato di /etc/make.profile/use.defaults



gnome           gnome-base/gnome
gtk             x11-libs/gtk+
qt              x11-libs/qt
kde             kde-base/kdebase
motif           x11-libs/openmotif

Precedenza

Naturalmente esiste un ordine definito riguardante quali dichiarazioni abbiano la priorità nelle configurazioni USE. Non è necessario dichirare USE="-java" solo per vedere se "java" è usato comunque, ecco l'ordine di precedenza per la configurazione USE (i primi hanno la priorità più bassa):

  • USE predefinita dichiarata in /etc/make.profile/make.defaults

  • configurazione USE ereditata se viene installato un pacchetto da /etc/make.profile/use.defaults

  • Configurazione USE definita dall'utente in /etc/make.conf

  • Configurazione USE definita dall'utente in /etc/portage/package.use

  • Dichiarazione USE definita dall'utente come variabile ambiente

Per vedere la configurazione finale di USE che viene usata dal Portage, eseguire emerge info che visualizzerà una lista di tutte le variabili rilevanti (incluso la variabile USE) col valore usato dal Portage.

Esempio 6.7. Eseguire emerge info

 

# emerge info

Adattare il vostro sistema alle nuove flag USE

Se si sono cambiate le proprie flag USE e si desidera aggiornare l'intero sistema, affinchè utilizzi le nuove flag USE, si può usare l'opzione --newuse di emerge:

Esempio 6.8. Ricompilare il sistema

 

# emerge --update --deep --newuse world

Dopo, eseguire il depclean del Portage per rimuovere le dipendenze condizionali che erano state emerse nel vecchio sistema, ma che sono diventate obsolete con l'uso delle nuove flag USE.

[Attenzione]Attenzione

Eseguire emerge depclean è una operazione pericolosa e dovrebbe essere fatta con cura. Si ricontrolli la lista fornita di pacchetti "obsoleti" per assicurarsi che non si rimuovano pacchetti di cui si ha bisogno. Nell'esempio seguente si è aggiunto -p per avere solo la lista dei pacchetti senza rimuoverli.

Esempio 6.9. Rimuovere pacchetti obsoleti

 

# emerge -p depclean

Quando il depclean ha finito, eseguire revdep-rebuild per ricompilare le applicazioni che sono collegate agli oggetti forniti dai pacchetti rimossi. revdep-rebuild è parte del pacchetto gentoolkit; non dimenticarsi di emergerlo prima.

Esempio 6.10. Eseguire revdep-rebuild

 

# revdep-rebuild

Quando tutto è finito, il sistema userà le nuove flag USE.

Capitolo 7. flag USE specifici per pacchetto

Visualizzare flag USE disponibili

Ecco l'esempio di mozilla per vedere quali flag si aspetta. Per questo usare emerge con le opzioni --pretend e --verbose:

Esempio 7.1. Vedere i flag USE usati

 

# emerge --pretend --verbose mozilla
These are the packages that I would merge, in order:

Calculating dependencies ...done!
[ebuild  N    ] net-www/mozilla-1.5-r1 +java +crypt -ipv6 -gtk2 +ssl +ldap 
+gnome -debug +mozcalendar -mozaccess -mozxmlterm -moznoirc -moznomail
-moznocompose -moznoxft 

emerge non è il solo strumento che fa questo, infatti ci sono strumenti dedicati alla gestione delle informazioni sui pacchetti come etcat che fa parte del pacchetto gentoolkit. Occorre prima installare gentoolkit:

Esempio 7.2. Installare gentoolkit

 

# emerge gentoolkit

Ora è possibile usare etcat con l'argomento uses per avere la lista dei flag USE usati da un dato pacchetto. Ad esempio per il pacchetto gnumeric:

Esempio 7.3. Usare etcat per vedere i flag USE usati

 

# etcat uses gnumeric
[ Colour Code : set unset ]
[ Legend      : (U) Col 1 - Current USE flags        ]
[             : (I) Col 2 - Installed With USE flags ]

 U I [ Found these USE variables in : app-office/gnumeric-1.2.0 ]
 - - libgda  : Adds GNU Data Access (CORBA wrapper) support for gnumeric
 - - gnomedb : unknown
 + + python  : Adds support/bindings for the Python language
 + + bonobo  : Adds support for gnome-base/bonobo (Gnome CORBA interfaces)

Capitolo 8. Portage

Caratteristiche di Portage

Portage ha molte altre caratteristiche che rendono Gentoo ancora migliore. Molte di queste comprendono tool software che migliorano le prestazioni, l'affidabilità, la sicurezza, ...

Per abilitare o disabilitare alcune caratteristiche di Portage, bisogna modificare la variabile FEATURES di /etc/make.conf. In molti casi si devono installare ulteriori tool sui quali sono basate le caratteristiche.

Non sono elencate qui tutte le caratteristiche che Portage supporta. Per una descrizione completa si veda la manpage make.conf:

Esempio 8.1. Vedere la manpage make.conf

 

$ man make.conf

Per scoprire quali sono le caratteristiche di default, eseguire emerge info e cercare la variabile FEATURES o eseguire un grep:

Esempio 8.2. Scoprire quali caratteristiche sono già impostate

 

$ emerge info | grep FEATURES

Capitolo 9. Compilazione Distribuita

Usare distcc

distcc è un programma per distribuire la compilazione su diverse macchine, non necessariamente identiche, su una rete. Il client distcc trasmette tutte le informazioni necessarie ai server distcc che vengono resi disponibili tramite l'esecuzione di distccd, in modo che possano compilare parte del codice sorgente per il client. Il risultato è un tempo di compilazione inferiore.

E' possibile trovare più informazioni su distcc (e informazioni su come deve funzionare con Gentoo) nella nostra Documentazione Gentoo su distcc.

Installare distcc

Distcc include un tool grafico per tenere sotto controllo i task che il computer sta inviando per la compilazione. Se si usa Gnome si inserisca 'gnome' nella variabile USE. Se non si usa Gnome e si desidera comunque utilizzare il monitor, si inserisca 'gtk' nella variabile USE.

Esempio 9.1. Installare distcc

 

# emerge distcc

Attivare il supporto di Portage

Aggiungere distcc alla variabile FEATURES in /etc/make.conf. Modificare la variabile MAKEOPTS a proprio piacimento. In "-jX" la X è il numero di CPU che eseguono distccd (incluso l'host attuale) più uno, ma si potrebbero avere migliori risultati con altri numeri.

Eseguire distcc-config e impostare la lista di server distcc disponibili. Per esempio si assume che i server distcc disponibili sono 192.168.1.102 (l'host attuale), 192.168.1.103 and 192.168.1.104 (due host remoti):

Esempio 9.2. Configurare distcc per usare tre server disponibili DistCC

 

# distcc-config --set-hosts "192.168.1.102 192.168.1.103 192.168.1.104"

Non dimenticarsi di eseguire anche il demone distccd:

Esempio 9.3. Avviare il demone distccd

 

# rc-update add distccd default
# /etc/init.d/distccd start

Capitolo 10. Compilazione caching

Cosa è ccache

ccache è un veloce compilatore di cache. Dopo aver compilato un programma, esso immagazzina i risultati intermedi, in modo che se si dovesse ricompilare lo stesso programma, il tempo di compilazione sia notevolmente ridotto. Nelle compilazioni comuni, il tempo di compilazione risulta di 5-10 volte più veloce.

Per maggiori informazioni su ccache, è possibile consultare la homepage di ccache.

Installare ccache

Per installare ccache, eseguire emerge ccache:

Esempio 10.1. Installare ccache

 

# emerge ccache

Attivare il supporto di Portage

Aprire /etc/make.conf e aggiungere ccache alla variabile FEATURES. Poi, aggiungere una nuova variabile chiamata CCACHE_SIZE e impostarla a "2G":

Esempio 10.2. Editare CCACHE_SIZE in /etc/make.conf

 

CCACHE_SIZE="2G"

Per controlare se ccache funziona, si possono vedere le statistiche:

Esempio 10.3. Esaminare le statistiche di ccache

 

# ccache -s

Usare ccache per la compilazione di C non-Portage

Se si desidera usare ccache per compilazioni non-Portage, si aggiunga /usr/lib/ccache/bin all'inizio della variabile PATH (prima di /usr/bin). Può essere fatto modificando /etc/env.d/00basic:

Esempio 10.4. Modificare /etc/env.d/00basic

 

PATH="/usr/local/bin:/opt/bin:/usr/lib/ccache/bin"

Capitolo 11. Supporto per pacchetti binari

Creare pacchetti precompilati

Portage supporta l'installazione di pacchetti precompilati. Anche se Gentoo non fornisce pacchetti precompilati (tranne GRP), Portage può essere informato dei pacchetti precompilati.

Per creare un pacchetto precompilato si può usare quickpkg se il pacchetto è già installato sul sistema, o emerge con le opzioni --buildpkg o --buildpkgonly.

Se si desidera che Portage crei pacchetti precompilati di ogni singolo pacchetto che si installa, aggiungere buildpkg alla variabile FEATURES.

Supporto più esteso per le impostazioni sui pacchetti precompilati può essere ottenuto con il catalyst. Per ulteriori informazioni sul catalyst leggere Catalyst Reference Manual e Catalyst Howto.

Installare pacchetti precompilati

Anche se Gentoo non li fornisce, si può creare un repository centrale dove mettere i pacchetti precompilati. Se si desidera usare questo repository, si deve far puntare la variabile PORTAGE_BINHOST ad esso. Per esempio, se i pacchetti precompilati sono su ftp://buildhost/gentoo:

Esempio 11.1. Impostare PORTAGE_BINHOST in /etc/make.conf

 

PORTAGE_BINHOST="ftp://buildhost/gentoo"

Quando si desidera installare un pacchetto precompilato, si deve aggiungere l'opzione --getbinpkg al comando emerge accanto all'opzione --usepkg. Il primo (--getbinpkg) dice a emerge di scaricare il pacchetto precompilato dal server precedentemente definito mentre il secondo (--usepkg) chiede a emerge di cercare di installare il pacchetto precompilato prima di scaricare i sorgenti e compilarlo.

Per esempio, per installare gnumeric con i pacchetti precompilati:

Esempio 11.2. Installare il pacchetto precompilato gnumeric

 

# emerge --usepkg --getbinpkg gnumeric

Più informazioni sulle opzioni di emerge con i pacchetti precompilati possono essere trovate nella manpage emerge:

Esempio 11.3. Vedere manpage emerge

 

$ man emerge

Capitolo 12. Runlevels

Avviare il sistema

All'avvio del sistema, ci sono molte scritte che scorrono e il testo è il medesimo ad ogni avvio. La sequenza di tutte queste azioni viene chiamata boot sequence ed è (più o meno) definita staticamente.

Per prima cosa, il boot loader carica l'imagine del kernel, definita nella configurazione in memoria, dopo di che dice alla CPU di eseguire il kernel. Quando il kernel è caricato e in esecuzione, inizializza la struttura del kernel e i task e avvia il processo init.

Questo processo si assicura che tutti i filesystem (definiti in /etc/fstab) siano montati e pronti per l'uso. Poi esegue alcuni script situati in /etc/init.d, che avviano i servizi necessari per un corretto avvio del sistema.

Alla fine, quando tutti gli scripts sono eseguiti, init attiva i terminali (nella maggior parte dei casi solo le console virtuali che sono nascoste in Alt-F1, Alt-F2, ecc.) attaccandogli un processo chiamato agetty. Questo processo per prima cosa si assicura che sia possibile eseguire il login su questi terminali eseguendo login.

Init Scripts

Ora init non esegue gli script in /etc/init.d casualmente. Inoltre, non lancia tutti gli script in /etc/init.d, ma solo quelli che gli è stato detto di eseguire. Decide che script eseguire guardando in /etc/runlevels.

Prima, init esegue tutti gli scripts da/etc/init.d che hanno un link simbolico in /etc/runlevels/boot. Solitamente, esegue gli scripts in ordine alfabetico, ma alcuni scripts hanno delle informazioni di dipendenze all'interno, che dicono al sistema che un altro script deve essere avviato prima che possa essere avviato.

Quando tutti gli script refenziati in /etc/runlevels/boot sono stati eseguiti, init continua eseguendo gli script che hanno un link simbolico in /etc/runlevels/default. Ancora, usa l'ordine alfabetico per decidere che script avviare prima, a meno che lo script non abbia dipendenze, nel qual caso l'ordine viene cambiato per fornire una valida sequenza di boot.

Come lavora init

Certamente init non decide tutto da solo. Ha bisogno di un file di configurazione che specifica quali azioni debba eseguire. Questo file di configurazione è /etc/inittab.

La prima azione di init è di montare tutti i filesystems. Questo è definito nella seguente linea di /etc/inittab:

Esempio 12.1. La linea di inizializzazione del sistema in /etc/inittab

 

si::sysinit:/sbin/rc sysinit

Questa linea dice a initche deve eseguire /sbin/rc sysinit per inizializzare il sistema. Lo script /sbin/rc si occupa dell'inzializzazione, init infatti non fa molto -- esso delega altri task come l'inizializzazione del sistema a un'altro processo.

In secondo luogo init esegue gli scripts che hanno un link in /etc/runlevels/boot. Questo è definito dalla seguente linea:

Esempio 12.2. Inizializzazione del sistema, continua

 

rc::bootwait:/sbin/rc boot

Ancora lo script rc provvede ai task necessari. Notare che l'opzione passata a rc (boot) è la stessa della sottodirectory /etc/runlevels.

Ora init controlla il suo file di configurazione per vedere quale runlevel deve eseguire. Per deciderlo, legge la seguente linea da /etc/inittab:

Esempio 12.3. La linea initdefault

 

id:3:initdefault:

In questo caso (che la maggioranza di utenti Gentoo usa), l'id del runlevel è 3. Usando questa informazione, init vede che deve avviare il runlevel 3:

Esempio 12.4. La definizione del runlevel

 

l0:0:wait:/sbin/rc shutdown
l1:S1:wait:/sbin/rc single
l2:2:wait:/sbin/rc nonetwork
l3:3:wait:/sbin/rc default
l4:4:wait:/sbin/rc default
l5:5:wait:/sbin/rc default
l6:6:wait:/sbin/rc reboot

La linea che definisce il livello 3, ancora, usa lo script rc per avviare il servizio (ora con argomento default). L'argomento di rc è ancora lo stesso della sottodirectory in /etc/runlevels.

Quando rc ha finito, init decide quale console virtuale attivare e quali comandi devono essere esguiti su ciascuna console:

Esempio 12.5. Definizione delle console virtuali

 

c1:12345:respawn:/sbin/agetty 38400 tty1 linux
c2:12345:respawn:/sbin/agetty 38400 tty2 linux
c3:12345:respawn:/sbin/agetty 38400 tty3 linux
c4:12345:respawn:/sbin/agetty 38400 tty4 linux
c5:12345:respawn:/sbin/agetty 38400 tty5 linux
c6:12345:respawn:/sbin/agetty 38400 tty6 linux

Cos'è un runlevel?

Init usa uno schema numerico per decidere quale runlevel attivare. Un runlevel è uno stato nel quale il sistema viene avviato e contiene una collezione di scripts (runlevel script o initscripts) che devono essere eseguiti quando si entra o si lascia un runlevel.

In Gentoo, ci sono sette runlevel definiti: tre runlevel interni, e quattro runlevel definiti dall'utente. I runlevel interni si chiamano sysinit, shutdown ereboot e fanno esattamente quello che i nomi implicano: inizializzano il sistema, spengono il sistema e riavviano il sistema.

I runlevel definiti dall'utente sono delle sottodirectory di /etc/runlevels: boot, default, nonetwork e single. Il runlevel boot avvia tutti i servizi necessari al sistema che tutti gli altri runlevel usano. I rimanenti tre differiscono per i servizi avviati: default viene usato per le operazioni di tutti i giorni, nonetwork è usato in caso non sia necessaria alcuna connettività, e single viene usato per riparare il sistema.

Lavorare con gli script di Init

Gli script che il processo rc avvia sono chiamati init script. Ogni script in /etc/init.d può essere eseguito con gli argomenti start, stop, restart, pause, zap, status, ineed, iuse, needsme, usesme o broken.

Per avviare, fermare o riavviare un servizio (e tutti i servizi dipendenti), vengono usati start, stop e restart:

Esempio 12.6. Avviare Postfix

 

# /etc/init.d/postfix start

[Nota]Nota
Solo i servizio necessari al servizio dato saranno fermati o riavviati. Gli altri servizi dipendenti (quelli che usa ma non gli sono necessari) non vengono toccati.

Per fermare un servzio, ma non i servizi che dipendono da lui si può usare l'argomento pause:

Esempio 12.7. Fermare Postfix ma mantenere in esecuzione i servizi dipendenti

 

# /etc/init.d/postfix pause

Per vedere un servizio in che stato si trova (started, stopped, paused, ...) si può usare l'argomento status:

Esempio 12.8. Informazioni di stato per postfix

 

# /etc/init.d/postfix status

Se le informazioni di stato dicono che un servizio è in esecuzione, ma non è così, si può fare il reset delle informazioni di stato a "stopped" con l'argomento zap:

Esempio 12.9. reset delle informazioni di stato per postfix

 

# /etc/init.d/postfix zap

Per sapere quali dipendenze ha un servizio si può usare iuse o ineed. Con ineed vengono mostrati i servizi veramente necessari per il corretto funzionamento del servizio. iuse invece mostra i servizi che vengono usati ma non sono necessari al servizio per il corretto funzionamento.

Esempio 12.10. Richiedere la lista di tutti i servizi da cui Postfix dipende

 

# /etc/init.d/postfix ineed

In modo simile si può chiedere la lista dei servizi che dipendono da lui (needsme) o possono usarlo

Esempio 12.11. Richiedere la lista dei servizi che richiedono Postfix

 

# /etc/init.d/postfix needsme

Infine, si possono chiedere quali dipendenze che sono mancanti richiede un servizio:

Esempio 12.12. Richiedere la lista delle dipendenze mancanti per Postfix

 

# /etc/init.d/postfix broken

Capitolo 13. Lavorare con rc-update

Cos'è rc-update?

Il sistema di init in Gentoo usa un albero di dipendenze per decidere quali dipendenze vanno avviate prima. Essendo un task tedioso da eseguire manualmente c'è un tool che rende semplice l'amministrazione dei runlevel e init scripts.

Con rc-update si possono aggiungere e rimuovere init scripts da un runlevel. Il tool rc-update automaticamente interroga depscan.sh per ricostruire l'albero delle dipendenze.

Aggiungere e rimuovere servizi

Lo script rc-update richiede un secondo argomento che definisce l'azione: add, del o show.

Per aggiungere o rimuovere un'init script, bisogna passare a rc-update l'argomento add o del, seguito dallo script di init e dal runlevel. Per esempio:

Esempio 13.1. Rimuovere Postfix dal runlevel default

 

# rc-update del postfix default

Il comando rc-update show mostra tutti gli script init disponibili e in quale runlevel vengono eseguiti:

Esempio 13.2. Ricevere informazioni sugli init script

 

# rc-update show

Capitolo 14. Configurare i servizi

Perchè una configurazione extra?

Gli Init scripts possono essere complessi. Qui non si è interessati a far modificare direttamente gli init script, dato che sono piuttosto proni a errori. E' comunque importante saper configurare bene un servizio. Ad esempio per per dare più opzioni al servizio stesso.

Un secondo motivo è di avere la configurazione al di fuori dell'init script per aggiornare gli init scripts senza preoccuparsi di perdere i cambiamenti alla configurazione.

La directory /etc/conf.d

Gentoo fornisce un modo semplice per configurare i servizi: ogni init script che può esser configurato ha un file in /etc/conf.d. Per esempio, l'init script di apache2 (chiamato /etc/init.d/apache2) ha un file di configurazione chiamato /etc/conf.d/apache2, che contiene le opzioni che volete dare al server Apache 2 quando viene avviato:

Esempio 14.1. Variabili definite in /etc/conf.d/apache2

 

APACHE2_OPTS="-D PHP4"

I file di configurazione contengono variabili e solo quello (tipo /etc/make.conf), e rendono davvero facile configurare un servizio. Permettono inoltre di aggiungere molte informazioni sulle variabili (come commenti).

Capitolo 15. Scrivere Init Scripts

E' necessario?

No. Scrivere init script non è solitamente necessario dato che Gentoo fornisce init scripts pronti all'uso per ogni servizio. Comunque, si potrebbe installare un servizio senza usare Portage, nel qual caso probabilmente è necessario creare un init script.

E' consigliabile non usare init script forniti dal servizio se non sono scritti esplicitamente per Gentoo: gli init scripts di Gentoo non sono compatibili con gli init scripts usati dalle altre distribuzioni!

Layout

Il layout di base di un init script è mostrato sotto.

Esempio 15.1. Layout di base di un init script

 

#!/sbin/runscript

depend() {
  (Informazioni di dipendenza)
}

start() {
  (Comando necessario per avviare un servizio)
}

stop() {
  (Comando necessario per fermare un servizio)
}

restart() {
  (Comando necessario per riavviare un servizio)
}

Ogni init script richiede che la funzione start() sia definita. Tutte le altre sezioni sono opzionali.

Dipendenze

Ci sono due tipi di dipendenze che possono essere definite: use e need. Come menzionato sopra, la dipendenza need è più restrittiva della dipendenza use. Secondo questo tipo di dipendenza si definisce il concetto di dipendenza virtuale.

Una dipendenza virtual è una dipendenza che fornisce un servizio, ma non è fornita solo da quel servizio. L'init script può dipendere da un system logger, ma ci sono molti system loggers disponibili (metalogd, syslog-ng, sysklogd, ...). Dato che non è possibile mettere need per ognuno di loro (nessun sistema ha tutti questi system loggers installati e in esecuzione) ci si assicura che tutti questi servizi forniscano una dipendenza virtuale.

Esempio 15.2. Informazioni di dipendenze per Postfix

 

depend() {
  need net
  use logger dns
  provide mta
}

Il servizio postfix:

  • richiede la dipendenza (virtuale) net(che è fornita, per esempio, da /etc/init.d/net.eth0)

  • usa la dipendenza (virtuale) logger (che è fornita per esempio, da /etc/init.d/syslog-ng)

  • usa la dipendenza (virtuale) dns (che è fornita, per esempio da /etc/init.d/named)

  • fornisce la dipendenza (virtuale) mta (che è comune a tutti i mail server)

Controllare l'ordine

In alcuni casi si potrebbe non aver bisogno di un servizio, ma si può voler avviare un servizio prima (o dopo) un'altro se disponibile sul sistema (notare il condizionale - questa non è un'altra dipendenza) e eseguirle nello stesso runlevel. Si possono fornire queste informazioni usando before o after.

Esempio 15.3. La funzione depend() nel servizio Portmap

 

depend() {
  need net
  before inetd
  before xinetd
}

Si può anche usare "*" per selezionare tutti i servizi nello stesso runlevel, ma non è consigliabile.

Esempio 15.4. Eseguire un init script come primo script nel runlevel

 

depend() {
  before *
}

Funzioni Standard

Dopo la funzione depend(), è necessario definire la funzione start(). Questa contiene tutti i comandi necessari ad inizializzare il servizio. E' consigliabile usare le funzioni ebegin e eend per informare l'utente su cosa sta accadendo:

Esempio 15.5. Esempio di funzione start()

 

start() {
  ebegin "Starting my_service"
  start-stop-daemon --start --quiet --exec /path/to/my_service
  eend $?
}

Per maggiori esempi sulla funzione start(), si possono leggere i sorgenti degli init script disponibili in /etc/init.d. Per start-stop-daemon, è disponibile un'eccellente man page per maggiori informazioni:

Esempio 15.6. Ottenere la man page per start-stop-daemon

 

# man start-stop-daemon

Altre funzioni che si possono definire sono: stop() e restart(). Non si è obbligati a definire queste funzioni! Il sistema di init è abbastanza intelligente da inserire da solo queste funzioni se si usa start-stop-daemon.

Aggiungere opzioni personalizzate

Se si ha bisogno di maggiori opzioni negli init script, si può aggiungere l'opzione alla variabile opts, e creare una funzione con lo stesso nome dell'opzione. Per esempio, per il supporto di un'opzione chiamata restartdelay:

Esempio 15.7. Aggiungere l'opzione restartdelay

 

opts="${opts} restartdelay"

restartdelay() {
  stop()
  sleep 3    # Wait 3 seconds before starting again
  start()
}

Variabili di configurazione dei servizi

Non c'è bisogno di aggiungere un file di configurazione in /etc/conf.d: se l'init script è eseguito, vengono automaticamente processati i seguenti file (i.e. the variables are available to use):

  • /etc/conf.d/<vostro init script>

  • /etc/conf.d/basic

  • /etc/rc.conf

Inoltre, se l'init script fornisce una dipendenza virtuale (come net), viene processato anche il file associato a questa dipendenza (come /etc/conf.d/net).

Capitolo 16. Cambiare il comportamento del Runlevel

Può effettivamente essere utile?

Molti utenti di portatili conoscono la situazione: a casa si ha bisgno di avviare net.eth0 ma non si vuole avviare net.eth0 quando si è per strada (se non c'è nessuna rete disponibile). Con Gentoo si può alterare il comportamento del runlevel per venire incontro alle proprie esigenze.

Per esempio si può creare un secondo "default" runlevel nel quale eseguire il boot che altri init scripts assegnati. Si può selezionare al momento del boot quale defalt runlevel usare.

Usare SOFTLEVEL

Per prima cosa, si crea la directory di runlevel per il secondo "default" runlevel. Per esempio per creare il runlevel offline:

Esempio 16.1. Creare la directory di runlevel

 

# mkdir /etc/runlevels/offline

Aggiungere i necessari init scripts al nuovo runlevel creato. Per esempio, per avere una copia del corrente runlevel default ma senza net.eth0:

Esempio 16.2. Aggiungere gli init scripts necessari

 

# ls /etc/runlevels/default
acpid  domainname  local  net.eth0  netmount  postfix  syslog-ng  vixie-cron
# rc-update add acpid offline
# rc-update add domainname offline
# rc-update add local offline
# rc-update add syslog-ng offline
# rc-update add vixie-cron offline

Ora bisogna configurare il bootloader e aggiungere una nuova voce per il runlevel offline. Per esempio in /boot/grub/grub.conf:

Esempio 16.3. Aggiungere una voce per offline runlevel

 

title Gentoo Linux Offline Usage
  root (hd0,0)
  kernel (hd0,0)/kernel-2.4.25 root=/dev/hda3 softlevel=offline

Se per il boot del sistema si seleziona la nuova voce il runlevel offline viene usato al posto del default.

Usare BOOTLEVEL

Usare bootlevel è completamente analogo a softlevel. L'unica differenza è che si sta definendo un secondo runlevel di "boot" invece di un secondo runlevel "default".

Capitolo 17. Variabile d'ambiente

Cosa sono

Una variabile ambiente è un oggetto nominale che contiene informazioni usate da una o più applicazioni. Questo viene trovato un po' misterioso o di difficile gestione da parte di molti utenti, specialmente coloro che si avvicinano per la prima volta a Linux. L'uso di variabili ambiente, invece, può facilitare la modifica della configurazione per una o più applicazioni.

Esempi importanti

Segue una tabella con la lista delle variabili usate su un sistema Linux e la loro descrizione. I valori di esempio sono presentati di seguito.

Tabella 17.1. Lista delle variabili

VariabileDescrizione
PATH Variabile che contiene una lista di directory, separate dai due punti (:), nelle quali il sistema cerca file eseguibili. Se si digita un comando (come ls, rc-update o emerge) che non è presente nella lista, il sistema non può essere in grado di eseguirlo, a meno che non si digiti il comando preceduto da tutto il percorso, come /bin/ls.
ROOTPATH Variabile che ha la stessa funzione di PATH, con la sola differenza che le directory specificano il percorso di ricerca per comandi digitati dall'utente root.
LDPATH Variabile che contiene la lista di directory, separate dai due punti (:), per la ricerca delle librerie da parte del linker dinamico.
MANPATH Variabile che contiene la lista di directory, separate dai due punti (:), per la ricerca delle pagine man da parte del comando man.
INFODIR Variabile che contiene la lista di directory, separate dai due punti (:), per la ricerca delle pagine info da parte del comando info.
PAGER Variabile che contiene il percorso del programma usato per visualizzare il contenuto di file di testo (come less o more).
EDITOR Variabile che contiene il percorso del programma usato per modificare il contenuto di file di testo (come nano o vi).
KDEDIRS Variabile che contiene la lista di directory, separate dai due punti (:), nelle quali si trova materiale specifico al KDE.
CLASSPATH Variabile che contiene la lista di directory, separate dai due punti (:), conteneti le classi JAVA.
CONFIG_PROTECT Variabile che contiene la lista di directory, separate da spazi, che vengono protette durante il processo di aggiornamento del sistema da parte del Portage.
CONFIG_PROTECT_MASK Variabile che contiene la lista di directory, separate da spazi, che non dovranno essere protette durante il processo di aggiornamento del sistema da parte del Portage.

Segue un esempio di definizione di tutte queste variabili:

Esempio 17.1. Esempio di definizioni

 

PATH="/bin:/usr/bin:/usr/local/bin:/opt/bin:/usr/games/bin"
ROOTPATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
LDPATH="/lib:/usr/lib:/usr/local/lib:/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"
MANPATH="/usr/share/man:/usr/local/share/man"
INFODIR="/usr/share/info:/usr/local/share/info"
PAGER="/usr/bin/less"
EDITOR="/usr/bin/vim"
KDEDIRS="/usr"
CLASSPATH="/opt/blackdown-jre-1.4.1/lib/rt.jar:."
CONFIG_PROTECT="/usr/X11R6/lib/X11/xkb /opt/tomcat/conf \
                /usr/kde/3.1/share/config /usr/share/texmf/tex/generic/config/ \
                /usr/share/texmf/tex/platex/config/ /usr/share/config"
CONFIG_PROTECT_MASK="/etc/gconf

Capitolo 18. Definire variabili globali

La directory /etc/env.d

Per centralizzare la definizione di queste variabili, è stata introdotta in Gentoo la directory /etc/env.d. All'interno di questa directory si trovano un certo numero di file, come 00basic, 05gcc, ecc. che contengono le variabili necessarie alle applicazioni menzionate nel nome del file.

Per maggiore chiarezza; quando si installa il gcc, viene anche creato dall'ebuild un file chiamato 05gcc, che contiene la definizione delle seguenti variabili:

Esempio 18.1. /etc/env.d/05gcc

 

PATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2"
ROOTPATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2"
MANPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/man"
INFOPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/info"
CC="gcc"
CXX="g++"
LDPATH="/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"

In altre distribuzioni la definizione di variabili ambiente viene fatta con modifiche o aggiunte al file /etc/profile o ad altre locazioni. D'altra parte l'uso di Gentoo facilita la manutenzione e la gestione delle variabili ambiente, dato che non occorre fare attenzione ai numerosi file che possono contenere variabili ambiente.

Per esempio, durante l'aggiornamento del gcc viene anche aggiornato il file /etc/env.d/05gcc senza nessuna richiesta di interazione da parte dell'utente.

Di questo sono beneficiari il Portage e anche l'utente. Occasionalmente potrebbe nascere l'esigenza di configurare una variabile ambiente a livello globale. Prendiamo per esempio la variabile http_proxy. Invece di modificare l'/etc/profile, basta creare un file /etc/env.d/99local, e inserire la seguente definizione:

Esempio 18.2. /etc/env.d/99local

 

http_proxy="proxy.server.com:8080"

L'uso dello stesso file per tutte le variabili utente, aiuta ad avere una panoramica delle variabili definite in seguito dall'utente stesso.

Lo script env-update

Alcuni file in /etc/env.d definiscono la variabile PATH. L'esecuzione di env-update appende le diverse definizioni prima di aggiornare le varabili ambiente, rendendo semplice l'aggiunta di variabili ambiente ai pacchetti (o agli utenti) senza interferire con i valori già presenti.

Lo script env-update appende i valori dei file in /etc/env.d in ordine alfabetico. Questo è il motivo per cui i nomi dei file in /etc/env.d iniziano con un numero.

Esempio 18.3. Ordine di aggiornamento di env-update

 

         00basic        99kde-env       99local
     +-------------+----------------+-------------+
PATH="/bin:/usr/bin:/usr/kde/3.2/bin:/usr/local/bin"

Durante l'esecuzione di env-update vengono create tutte le variabili ambiente e verranno poste in /etc/profile.env (usato a sua volta da /etc/profile). Vengono inoltre estratte le informazioni dalla variabile LDPATH per creare il file /etc/ld.so.conf. Dopo di che, viene eseguito il comando ldconfig per ricreare il file /etc/ld.so.cache usato dal linker dinamico.

Per vedere l'effetto immediato di env-update dopo il suo uso, eseguire il seguente comando per aggiornare l'ambiente. Utenti che hanno installato Gentoo, si ricordano probabilmente questo dalle istruzioni di installazione:

Esempio 18.4. Aggiornare l'ambiente

 

# env-update &amp;&amp; source /etc/profile

Capitolo 19. Definire variabili locali

Specifiche dell'utente

Non sempre è conveniente definire variabili ambiente a livello globale. Per esempio, l'aggiunta di /home/mioutente/bin alla variabile PATH non dovrebbe riflettersi su tutti gli altri utenti. E' necessario definire una variabile ambiente locale e per questo occorre usare i file ~/.bashrc o ~/.bash_profile:

Esempio 19.1. Estendere PATH per uso locale in ~/.bashrc

 

PATH="${PATH}:/home/mioutente/bin"

Dopo un nuovo login, la variabile PATH viene aggiornata.

Specifiche alla sessione

A volte sono necessarie anche definizioni più ristrette. Potrebbe essere il caso in cui è necessario usare file binari di una directory temporanea senza usare il percorso dei binari di sistema o senza editare ~/.bashrc per la temporaneità dell'uso.

In questo caso si può definire la variabile PATH nella sessione corrente usando il comando export. Finché non si esegue un'operazione di logout, la variabile PATH manterrà la configurazione temporanea.

Esempio 19.2. Definire una variabile ambiente specifica per una sessione

 

# export PATH="${PATH}:/home/my_user/tmp/usr/bin"

Capitolo 20. Autori

Sommario

Autore: Sven Vermeulen

Autore: Daniel Robbins

Autore: Chris Houser

Autore: Jerry Alexandratos

Sviluppo x86: Seemant Kulleen

Sviluppo Alpha: Tavis Ormandy

Sviluppo Alpha: Aron Griffis

Sviluppo AMD64: Jason Huebel

Sviluppo HPPA: Guy Martin

Sviluppo PPC: Pieter Van den Abeele

Sviluppo SPARC: Joe Kallar

Redazione: John P. Davis

Redazione: Pierre-Henri Jondot

Redazione: Eric Stockbridge

Redazione: Rajiv Manglani

Redazione: Jungmin Seo

Redazione: Stoyan Zhekov

Redazione: Jared Hudson

Redazione: Colin Morey

Redazione: Jorge Paulo

Redazione: Carl Anderson

Redazione: Jon Portnoy

Redazione: Zack Gilburd

Redazione: Jack Morgan

Redazione: Benny Chuang

Redazione: Erwin

Redazione: Joshua Kinard

Redazione: Tobias Scherbaum

Revisione: Grant Goodyear

Revisione: Gerald J. Normandin Jr.

Revisione: Donnie Berkholz

Revisione: Ken Nowack

Contributi: Lars Weiler

Traduzione: Marco Mascherpa

Traduzione: Stefano Rossi

Traduzione: Enrico Morelli