Old:La mia prima settimana con Debian: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
 
(17 versioni intermedie di 6 utenti non mostrate)
Riga 1: Riga 1:
''Torna all'indice: [[Linux Kernel in a Nutshell]]''
{{Old}}
 
Questa piccola guida nasce con l'idea di rendere meno traumatico l'approccio al mondo debian da parte dell'utente principiante e alle prime armi con sistemi basati su GNU/Linux. L'idea è di dare la possibilità all'utente di installare un sistema debian funzionante sul proprio computer e di apprenderne le basi. In sintesi, la trascrizione dei primi pensieri e delle prime operazioni nel nuovo sistema operativo.
Uno dei punti pi� delicati e difficili nella creazione della propria versione del kernel Linux � quello di determinare esattamente quali driver e quali opzioni di configurazione sono richiesti per il corretto funzionamento dalla macchina su cui viene installato.
Questo capitolo guider� il lettore attraverso questo processo di selezione e scelta dei driver corretti.
 
==Usare un kernel di una distribuzione==
 
Uno dei metodi pi� semplici, per determinare quali moduli siano necessari, � quello di partire dalla configurazione che viene installata dal pacchetto del kernel della distribuzione che si sta usando. � infatti molto pi� semplice determinare di quali driver si ha bisogno basandosi su quelli installati in un sistema in funzione, in cui i driver corretti sono gi� associati all'hardware in utilizzo.
 
Se invece si sta personalizzando un kernel per una macchina sulla quale non � installata una distribuzione Linux, allora conviene partire dalla versione LiveCD di una distribuzione. Questo consente all'utente di far partire Linux sulla macchina in oggetto e di determinare in maniera semplice le opzioni di configurazione del kernel e che consentono il funzionamento ottimale della macchina stessa.
 
===Dove si trova la configurazione del kernel?===
 
Quasi tutte le distribuzioni forniscono il file di configurazione nello stesso pacchetto del kernel. Si consiglia di leggere la documentazione relativa alla distribuzione stessa per sapere dove viene installato il file di configurazione. Solitamente si trova da qualche parte in una sotto-directory di <tt>/usr/src/linux/</tt>.
 
{{Box|Nota per Debian (NdT)|In debian il file di configurazione di ogni kernel installato si trova in <tt>/boot/</tt> ed ha come nome <tt>config-''versione''</tt>.}}
 
Se avete difficolt� a trovare la configurazione del kernel, allora guardate nel kernel stesso. I kernel di molte distribuzioni sono compilati in modo da includere il file di configurazione dentro il filesystem <tt>/proc</tt>. Per verificare se questo � il vostro caso, digitate:
 
<pre>
$ ls /proc/config.gz
/proc/config.gz
</pre>
 
Se il file ''/proc/config.gz'' � presente, allora copiatelo nella directory del sorgente kernel ed estraetelo:
 
<pre>
$ cp /proc/config.gz -/linux/
$ cd -/linux
$ gzip -dv config.gz
config.gz:      74.9% - - replaced with config
</pre>
 
Copiate questo file di configurazione nella vostra directory del kernel e rinominatelo in ''.config''.
Ora potrete utilizzare questo file come base di partenza nella personalizzazione della configurazione del kernel cos� come descritto nel [[LKN:_Configurare_e_Compilare|Capitolo 4]].
 
Usando questo file di configurazione si dovrebbe ottenere sempre un file immagine del kernel (un ''kernel ricompilato'', NdT) funzionante sulla propria macchina.
Lo svantaggio di questa immagine � che verranno compilati quasi tutti i moduli e driver presenti nei sorgenti del kernel. Ci� non � quasi mai necessario per una singola macchina, quindi sarebbe meglio disabilitare tutti i driver e le opzioni non necessarie. Si raccomanda di disabilitare solo quelle opzioni che si � sicuri non serviranno, poich� ci sono parti del sistema che richiedono l'abilitazione di certe opzioni.
 
===Determinare quali moduli siano necessari===
Usando il file di configurazione fornito dalla vostra distribuzione il tempo richiesto per la compilazione del kernel � molto lungo poich� tutti i possibili driver vengono abilitati. Si dovrebbe cercare di abilitare solo i driver per l'hardware presente nel sistema, cos� da ridurre i tempi di compilazione del kernel. Inoltre, compilando ''staticamente'' (invece che come moduli) alcuni o tutti i driver necessari, si riduce la memoria utilizzata ed in alcune architetture si velocizza il funzionamento del sistema. Per escludere i driver dal kernel � necessario per� determinare quali moduli sono indispensabili per il funzionamento dell'hardware installato. Attraverso l'utilizzo di due esempi, cercheremo di spiegare come determinare quali driver siano indispensabili al controllo dell'hardware.
 
Le informazioni che mettono in relazione i dispositivi ai driver presenti nel kernel sono conservate in varie parti del sistema. Uno dei posti pi� importanti dove sono salvate queste informazioni � il filesystem virtuale ''sysfs''. All'avvio di Linux, ''sysfs'', dovrebbe essere montato dagli script di inizializzazione della vostra distribuzione nella directory ''/sys''. ''sysfs'' consente di dare un'occhiata a come le varie parti del kernel sono legate l'una a l'altra, questo lo si deduce grazie ai vari collegamenti simbolici (''symlink'' NdT) che puntano all'interno dell'intero filesystem.
 
In tutti gli esempi di seguito, saranno riportati i veri percorsi (''path'' NdT) di ''sysfs'' corrispondenti ad hardware specifico. La vostra macchina sar� certamente diversa, ma la posizione  relativa delle informazioni sar� la stessa. Non ci si deve allarmare se i nomi di file nel ''sysfs'' non sono i medesimi, ci� � normale e prevedibile.
 
Inoltre, la struttura interna del file di sistema ''sysfs'' subisce modifiche, a causa sia della riorganizzazione dei driver sia del fatto che gli sviluppatori del kernel trovano nuovi modi per meglio presentare in ''user space'' le strutture interne del kernel. A causa di questo, col tempo, alcuni dei ''symlink'', precedentemente menzionati in questo capitolo, possono non essere presenti. Tuttavia, le informazioni sono ancora tutte presenti, al massimo sono state un po' spostate.
 
====Esempio: Come determinare il driver di rete====
 
Uno degli elementi pi� comuni ed importanti in un sistema � la scheda di rete. � essenziale capire quale driver la controlla ed attivarlo nella configurazione in maniera da consentire un corretto funzionamento delle connessioni di rete.
 
Primo: partendo dalle connessioni di rete si risale al device PCI
<pre>$ ls /sys/class/net/
eth0  eth1  eth2  lo</pre>
 
La directory ''lo'' rappresenta il dispositivo di rete loopback, ed non � dipendente da nessun dispositivo di rete realmente installato. Invece si dovrebbe riservare particolare attenzione alle directory ''eth0'', ''eth1'' e ''eth2'', dato che si riferiscono a dispositivi realmente esistenti
 
Per determinare di quali dispositivi ci si deve occupare, si utilizza il comando ''ifconfig'':
 
<pre>$ /sbin/ifconfig -a
eth0 Link  encap:Ethernet  HWaddr 00:12:3F:65:7D:C2
inet  addr:192.168.0.13  Bcast:192.168.0.255  Mask:255.255.255.0
UP BROADCAST NOTRAILERS RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:2720792 errors:0 dropped:0 overruns:0 frame:0
TX packets:1815488 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:3103826486 (2960.0 Mb) TX bytes:371424066 (354.2 Mb)
Base address:0xdcc0 Memory:dfee0000-dff00000
eth1 Link  encap:UNSPEC  HWaddr 80-65-00-12-7D-C2-3F-00-00-00-00-00-00-00-00
BROADCAST MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
eth2 Link  encap:UNSPEC  HWaddr 00-02-3C-04-11-09-D2-BA-00-00-00-00-00-00-00
BROADCAST MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
lo Link  encap:Local Lookback
        inet addr:127.0.0.1  Mask:255.0.0.0
UP  LOOPBACK  RUNNING  MTU:16436  Metric:1
RX packets:60 errors:0 dropped:0 overruns:0 frame:0
TX packets:60 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:13409 (13.0 Kb) TX bytes:13409 (13.0 Kb)</pre>
 
Da questo listato si pu� riconoscere nel dispositivo di rete <tt>eth0</tt>, quello attivo e funzionante, infatti nelle righe;
 
<pre>eth0 Link  encap:Ethernet  HWaddr 00:12:3F:65:7D:C2
inet  addr:192.168.0.13  Bcast:192.168.0.255  Mask:255.255.255.0</pre>
 
Questo risultato dimostra che il dispositivo Ethernet si vede assegnato un indirizzo IP valido (<tt>inet</tt>).
 
Ora, dopo che abbiamo individuato il dispositivo <tt>eth0</tt> e ci siamo accertati di volerlo abilitare nel nostro nuovo kernel, dobbiamo individuare quale driver lo controlla. Ci� si realizza con una semplice procedura, che � quella si seguire i link nel filesystem sysfs, basta digitare un comando di una sola riga:
 
<pre>$ basename `readlink /sys/class/net/eth0/device/driver/module`
e1000</pre>
 
Il risultato mostra che il modulo <tt>e1000</tt> controlla il dispositivo di rete <tt>eth0</tt>. Il comando ''basename'' racchiude in un'unica linea di comando i seguenti passaggi:
 
: 1. Individua il symlink ''/sys/class/net/eth0/device'' contenuto all'interno della directory ''/sys/device/'', la quale contiene le informazioni relative al dispositivo che controlla ''eth0''. Fate attenzione al fatto che nelle nuove versioni del kernel la directory ''/sys/class/net/eth0'' potrebbe essere un symlink.
 
: 2. All'interno della directory che descrive il dispositivo in sysfs, c'� un symlink che punta al driver relativo a questo dispositivo. Questo symlink � nominato ''driver'', pertanto si segue questo collegamento.
 
: 3. All'interno della directory che descrive il driver in sysfs, c'� un symlink che punta al modulo che si trova all'interno del driver in oggetto. Questo symlink � chiamato <tt>module</tt>. Noi cerchiamo l'oggetto a cui punta questo symlink, per ottenerlo ci serviamo del comando ''readlink'', il quale produce un risultato simile a questo:
:<pre>$ readlink /sys/class/net/eth0/device/driver/module </pre>
:<pre> ../../../../module/e1000</pre>
 
: 4. Dato che a noi interessa solo il nome del modulo e ci disinteressiamo del resto del risultato ottenuto con il comando ''readlink'', tenendo solo la parte pi� a destra del risultato. Questo � appunto ci� che il comando ''basename'' realizza. Applicandolo direttamente all'intero percorso, questo comando ci ritorna quanto segue:
: <pre>$ basename ../../../../module/e1000</pre>
: <pre>e1000</pre>
 
Cos� abbiamo inserito il lungo risultato del symlink, ottenuto da ''readlink'', quale parametro nel programma ''basemane'', permettendo cos� l'intero processo di essere realizzato in una sola riga.
 
Ora che abbiamo identificato il nome del modulo, si dovrebbe trovare l'opzione della configurazione del kernel che lo controlla. Si pu� cercare nei vari menu di configurazione dei dispositivi di rete oppure cercare nel codice sorgente del kernel stesso per essere sicuri di avere l'opzione giusta.
 
<pre>
$ cd ~/linux/linux-2.6.17.8
$ find -type f -name Makefile | xargs grep e1000
./drivers/net/Makefile:obj-$(CONFIG_E1000) += e1000/
./drivers/net/e1000/Makefile:obj-$(CONFIG_E1000) += e1000.o
./drivers/net/e1000/Makefile:e1000-objs := e1000_main.o e1000_hw.o e1000_ethtool.o e1000_param.o
</pre>
 
Si precisa che "e1000'', usato in questo esempio, deve essere sostituito con il nome del modulo che state analizzando.
 
La cosa che ci interessa nel risultato del precedente comando ''find'' sono le righe dove compaia il termine <tt>'''CONFIG_'''</tt>. Questa � l'opzione di configurazione che il kernel deve aver attivato per poter compilare il modulo. Nell'esempio precedente l'opzione di configurazione che c'interessa � pertanto <tt>CONFIG_E1000</tt>.
 
Adesso si dispone dell'informazione necessaria per poter configurare il kernel. Si esegue lo strumento menu di configurazione:
 
<pre>$ make menuconfig</pre>
 
Dopodich� si prema il tasto / (slash) (che ha il compito di far partire una ricerca), e si digita l'opzione di configurazione, senza la parte di testo <tt>CONFIG_</tt>. Questo processo � mostrato nella [[:Immagine:Config_search.png|figura 7-1]].
 
[[Immagine:Config_search.png|center|frame|''Figura 7-1. Ricerca in menuconfig.'']]
 
Il sistema di configurazione del kernel vi dir� ora esattamente dove selezionare l'opzione per abilitare questo modulo. Vedi [[:Immagine:Config_search_found.png|figura 7-2]].
 
[[Immagine:Config_search_found.png|center|frame|''Figura 7-2. Risultato della ricerca in menuconfig.'']]
 
Il primo elemento nella schermata mostra l'opzione che stavate cercando. Le informazioni mostrate dalla schermata vi dicono che, per attivare il modulo <tt>E1000</tt> nel kernel,  la seguente opzione di configurazione deve essere abilitata:
 
  Device Drivers
      Network device support
      [*] Network device support
          Ethernet (1000 Mbit)
      [*] Intel(R) PRO/1000 Gigabit Ethernet support
 
Questo modo di procedere funziona per ogni tipo di dispositivo attivo nel kernel.
 
====Esempio: Un dispositivo USB====
 
Come secondo esempio, esaminiamo ora un convertitore USB-seriale che � presente nel nostro sistema preso ad esempio. Attualmente il convertitore � collegato alla porta ''/dev/ttyUSB0'', pertanto si deve prendere in esame la sezione tty del ''sysfs''.
<pre>$ ls /sys/class/tty/ | grep USB
ttyUSB0</pre>
Potete ora eseguire una ricerca di questo dispositivo nel ''sysfs'' allo scopo di trovare il modulo che lo gestisce, utilizzando la stessa procedura mostrata nella sezione precedente:
 
<pre>$ basename `readlink /sys/class/tty/ttyUSB0/device/driver/module`
pl2303</pre>
Dopodich�, per poter individuare l'opzione di configurazione che si deve abilitare, si cerca nell'albero del codice sorgente del kernel:
<pre>$ cd ~/linux/linux-2.6.17.8
$ find -type f -name Makefile | xargs grep pl2303
./drivers/usb/serial/Makefile:obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o</pre>
 
Si utilizzi lo strumento di configurazione del kernel, come indicato in [[:Immagine:Config_search_pl2303.png|figura 7-3]], per trovare l'opzione adeguata da abilitare relativa al settaggio dell'opzione CONFIG_USB_SERIAL_PL2303.
 
[[Immagine:Config_search_pl2303.png|center|frame|''Figura 7-3. Ricerca di USB_SERIAL_PL2303''.]]
 
Nel nostro caso il risultato � mostrato nella [[:Immagine:Config_search_pl2303_found.png|figura 7-4]].
 
[[Immagine:Config_search_pl2303_found.png|center|frame|''Figura 7-4. Risultato della ricerca di USB_SERIAL_PL2303'']]
 
Ci� mostra esattamente dove trovare l'opzione <tt>USB Profilic 2303 Single Port Serial Driver</tt> che � necessaria alla corretta gestione di questo dispositivo.
 
====Riassunto: Alla scoperta del dispositivo====
 
Riassumendo, ecco i vari passaggi che servono per identificare il driver funzionante di un dispositivo ad esso collegato:
: 1. Trovate la corretta classe di dispositivi in ''sysfs'' relativa al dispositivo che ci interessa. I dispositivi di rete sono elencati in ''/sys/class/net'', mentre i dispositivi tty sono elencati in ''/sys/class/tty''. Gli altri vari dispositivi si trovano in altre sotto-directory di ''/sys/class'', a seconda del tipo.
: 2. Ricercate nell'albero di ''sysfs''  il nome del modulo che controlla il dispositivo in oggetto. Lo si trova in ''/sys/class/class_name/device_name/device/driver/module'', la ricerca � agevolata se si utilizzano i comandi ''readlink'' e ''basename''.
:<pre>$ basename `readlink /sys/class/class_name/device_name/device/driver/module`</pre>
: 3. Ricercate nei file Makefile con ''find'' e ''grep'' le opzioni <tt>CONFIG_</tt> che abilitano il modulo
:<pre>$ find -type f -name Makefile | xargs grep ''module_name''</pre>
: 4. Ricercate l'opzione trovata nel sistema di configurazione del kernel, dopodich� andate dove indicato dal menu per attivare il driver in oggetto.
 
====Lasciamo che il kernel ci dica ci� di cui abbiamo bisogno====
Dopo esserci infilati nel ''sysfs'' e aver seguito i sui symlinks per ricercare passo passo i nomi dei moduli, presentiamo un semplice script che far� per noi tutto il lavoro in un modo leggermente diverso:
 
<pre>
#!/bin/bash
#
# find_all_modules.sh
#
for i in `find /sys/ -name modalias -exec cat {} \;`; do
    /sbin/modprobe --config /dev/null --show-depends $i ;
done | rev | cut -f1 -d '/' | rev | sort -u
</pre>
 
Si pu� scaricare un file d'esempio, contenente questo script, dal sito web del libro, riportato nella sezione ''Come contattarci'' che si trova nella prefazione.
 
Questo script cerca nel ''sysfs'' tutti file chiamati ''modalias''. Il file ''modalias'' contiene gli alias dei moduli e comunica al comando ''modprobe'' quali moduli debbano essere caricati per ogni dispositivo. L'alias del modulo � composto da una combinazione di: produttore del dispositivo, ID, tipo di classe ed altri identificativi univoci per il tipo di dispositivo in questione. Tutti i moduli del driver del kernel hanno una lista interna dei dispositivi che supportano, che � generata automaticamente dalla lista dei dispositivi che il driver comunica al kernel di poter supportare. Il comando ''modprobe'' ricerca tutti i dispositivi nella lista di tutti i driver e cerca di trovare una corrispondenza confrontando l'alias. Se trova una corrispondenza, allora provvede al caricamento del modulo (questa procedura � la stessa seguita dal caricamento automatico dei driver in Linux).
 
Lo script prevede l'arresto del programma ''modprobe'' prima di caricare il modulo, e visualizza a schermo solo le azioni che eseguirebbe. Questo ci d&agrave; una lista di tutti i moduli che sono necessari al controllo di tutti i dispositivi del sistema. Eseguendo una piccola pulizia della lista, ordinandola e selezionando i campi adeguati,
otteniamo il seguente risultato:


==Lunedì: partizioniamo il disco==
Dopo anni passati con il Mac, ormai ho deciso: questa settimana installerò Debian! Il problema è che, almeno per il momento, non vorrei abbandonare del tutto il mio vecchio sistema operativo... chissà se è possibile? E chissà quali complicate operazioni dovrò affrontare?
===Premessa: BIOS, MBR e File System===
L'accensione di un computer è il risultato di alcuni processi in ordine definito:
# Subito dopo l'accensione parte il '''[http://it.wikipedia.org/wiki/BIOS BIOS]''' (Basic Input-Output System): un programma che gestisce l'accesso all'hardware del computer e trova il disco di avvio.
# Dando inizio all'avvio parte il '''[http://it.wikipedia.org/wiki/Master_boot_record MBR]''' (Master Boot Record): questo programma si trova all'inizio dell'hard-disk e avvia il boot loader.
# Il '''[http://it.wikipedia.org/wiki/Boot_loader boot loader]''' è un programma che ci permetterà di avviare un sistema operativo su una determinata partizione del disco.
Non facciamoci spaventare da queste prime righe: volevo solo dare un'introduzione (del resto molto semplificata), citando boot loader e partizioni che ci serviranno per installare Debian. Tra l'altro ormai il BIOS nei nuovi PC è stato rimpiazzato dall'[http://it.wikipedia.org/wiki/Extensible_Firmware_Interface EFI], che usa un altro metodo di gestione delle partizioni (cioè il [http://it.wikipedia.org/wiki/GUID_Partition_Table GPT], ma può sempre usare il MBR se opportunamente configurato). In ogni caso, andiamo avanti e concentriamoci sui file system.
====File System====
Un [http://it.wikipedia.org/wiki/File_system file system] è un metodo d'immagazzinamento e organizzazione dei file su un dispositivo d'archiviazione, come ad esempio un hard disk: in questo caso si parlerà di file system del disco. Tra i file system del disco più conosciuti troviamo:
<pre>
<pre>
$ find_all_modules.sh
FAT, FAT32  ->  DOS e Microsoft Windows
8139cp.ko
NTFS        ->  Microsoft Windows NT
8139too.koo
HFS+        ->  Mac OS X
ehci-hcd.ko
ext3, ext4  ->  GNU/Linux</pre>
fimware_vlass.ko
Per un sistema misto dovremo ricordarci che sia da OSX che da Windows non è possibile visualizzare direttamente le partizioni ext4. Qualche "trucco" esiste comunque, anche se la soluzione più semplice è quella di creare una partizione in FAT32 (sarebbe anche meglio in [http://it.wikipedia.org/wiki/ExFAT exFAT], detta anche FAT64, ma purtroppo Linux non la supporta ancora al meglio) visibile da tutti e tre i sistemi (e quindi utilizzabile per accedere ai file da qualsiasi sistema operativo o per trasferirli da un sistema all'altro). Nel prossimo capitolo vedremo come fare.
i2c-i801.ko
ieee80211.ko
ieee80211_crypt.ko
ipw2200.ko
mii.ko
mmc_core.ko
pcmcia_core.ko
rsrc_nonstatic.ko
sdhci.ko
snd-hda-codec.ko
snd-hda-intel.ko
snd-page-alloc.ko
snd-pmc.ko
snd-timer.ko
snd.ko
soundcore.ko
uhci-hcd.ko
usbcore.ko
yenta_socket.ko
</pre>


Questa � la lista di tutti i moduli che sono necessari alla gestione dell'hardware della macchina.
===Boot loader===
 
Il boot loader, come detto sopra, è un programma che ci permette l'avvio di un sistema operativo su una determinata partizione; nel caso di più sistemi operativi (su partizioni diverse), il boot loader ci permetterà di scegliere il sistema operativo da avviare. Nei sistemi GNU/Linux il boot loader per eccellenza è [http://it.wikipedia.org/wiki/GNU_GRUB GRUB] (GRand Unified Bootloader). Se abbiamo già installato MacOSX o Windows potremo utilizzarlo per il multi-boot (vedi [[La_mia_prima_settimana_con_Debian#Marted.C3.AC:_installiamo_Debian|martedì]]). GRUB sarà scritto nel MBR ed andrà a sovrascrivere il boot loader già presente. Una volta installato, GRUB penserà a gestire i vari sistemi operativi: all'avvio del computer potremo scegliere da un menu quale sistema operativo avviare.
Lo script mostrer� probabilmente alcuni messaggi di errore che possono essere del tipo:
 
<pre>FATAL: Module pci:v00008086d00002592sv000010CFsd000012E0bc03sc00i00 not found.
FATAL: Module serio:ty01pr00id00ex00 not found.</pre>
 
Questo ci dice che non si trova un modulo che gestisce quel dispositivo. Questo non deve comunque interessare pi� di tanto, poich� alcuni dispositivi non hanno driver nel kernel che lavorino per loro.
 
==Determinare il modulo corretto partendo da zero==
Talvolta non c'� la possibilit� di avere un kernel funzionante su una macchina in modo da determinare quali moduli del kernel siano necessari per gestire l'hardware. Oppure si � aggiunto del nuovo hardware al sistema e bisogna trovare le opzioni della configurazione necessarie a farlo funzionare correttamente. Questa sezione illustrer� come determinare le opzioni di configurazione necessarie ad far funzionare l'hardware.
 
Il modo pi� semplice per capire quale driver controlla un nuovo dispositivo � quello di compilare come moduli tutti i driver di quel tipo disponibili nei sorgenti del kernel, e lasciare che il processo di avvio tramite ''udev'' associ il driver al dispositivo. Una volta fatto ci�, si dovrebbe essere in grado di risalire al driver necessario seguendo i passi descritti precedentemente, ed infine ricompilare il kernel abilitando il solo driver necessario.
 
Se invece non si vogliono compilare tutti i driver, o questo meccanismo non funziona per qualche motivo, sar� necessario un p� pi� di lavoro per individuare il driver necessario. I passi successivi sono complessi e richiedono talvolta di dover cercare nei sorgenti del kernel. Non abbiate timore di ci�, sar� solo di aiuto a comprendere meglio l'hardware ed i sorgenti del kernel.
 
I passi necessari per trovare il driver corrispondente di un dispositivo cambiano a seconda del tipo di dispositivo in questione. In questo capitolo discuteremo le due tipologie  di dispositivi pi� comuni: PCI e USB. I metodi descritti qui saranno validi anche per altri tipi di dispositivi.
 
&Egrave; inoltre molto importante per il kernel di essere in grado di trovare tutti i filesystem presenti nel sistema, ed in particolare il filesystem di root. Approfondiremop questo aspetto successivamente in [[LKN: Personalizzare un Kernel#Root filesystem|"Root filesystem"]].
 
 
===Dispositivi PCI===
I dispositivi PCI si distinguono per ''vendor ID'' e ''device ID''; ogni combinazione di  ''vendor ID'' e di ''device ID'' pu� richiedere un driver unico. Questa � la base per la ricerca mostrata in questa sezione.
 
Per questo esempio useremo un scheda di rete PCI che supporremo non funzionante con l'attuare versione del kernele in esecuzione. Questo esempio sar� diverso dalla vostra situazione, con differenti device PCI e valori ID del bus, ma i passi salienti dovrebbero essere rilevanti per ogni tipo di dispositivo PCI per il quale vogliate trovare un driver funzionante.
 
In primo luogo troviamo nel sistema il dispositivo PCI che non st� funzionando. Per ottenere una lista di tutti i dispositivi PCI usiamo il programma <code>lspci</code>. Poich� a noi interessano solo dispositivi PCI ethernet restringeremo la nostra ricerca filtrado tra i risultati solo quelli che conterranno la parola ''ethernet'' (case-insensitive):


===Partizioni necessarie===
Per concludere questa prima giornata vediamo ora le partizioni che necessitiamo per installare il nostro nuovo sistema operativo:
<pre>
<pre>
$ /usr/sbin/lspci | grep -i ethernet
NTFS  -> se teniamo il nostro Windows XP, 7 o 8.x, lo ritroveremo su una partizione con questo file system
06:04.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/
HFS+  -> se teniamo il nostro MacOS X, lo ritroveremo su una partizione con questo file system
8139C/8139C+ (rev 10)
ext4  -> sarà il file system per la partizione sulla quale installeremo Debian
</pre>
FAT32  -> potremmo creare questa partizione per leggere o scambiare dei file fra i vari sistemi operativi
 
swap  -> collocata su un file system swap, si tratta di una memoria virtuale che ci servirà per Debian</pre>
Questo � il dispositivo che vorremmo fare funzionare.
Tutte queste partizioni possono essere create con l'installer di Debian (anche volendo lasciare il vecchio sistema operativo); dunque, visto che siamo agli inizi, non andiamo a complicarci la vita e corriamo a prendere il CD d'installazione ([[Installare_Debian_da_pendrive_USB_o_SD_card|o la chiavetta USB]])!


{{Box|Nota:|Potreste anche provare a cercare in tutta la configurazione del kernel un dispositivo che corrisponde alla stringa mostrata sopra (un dispositivo della Realtek Semiconductors con nome prodotto RTL-8139/8139C/8139C+), ma questo non funziona sempre. Per questo motivo useremo la via lunga in questo capitolo.}}
==Martedì: installiamo Debian==
Cavoli! Non sto più nella pelle! Ieri mi sono ben documentato sulle partizioni; ho deciso così: voglio mantenere MacOSX e mi farò una bella partizione FAT32 per condividere i file fra i due sistemi operativi. Poi installerò GRUB e lo utilizzerò per scegliere il sistema operativo all'avvio. Per fortuna non dovrò fare niente di difficile: penserà a tutto l'installer di Debian! Ma dove lo trovo?
===Reperire un CD d'installazione Debian===
Tutte le informazioni riguardo Debian si trovano sul sito principale della distribuzione: http://www.debian.org/. Se abbiamo a disposizione un accesso ad internet, potremo scaricare una versione minimale del sistema ([https://www.debian.org/distrib/netinst netinst]) e installare il resto dalla rete. Altrimenti possiamo scaricare i CD (o DVD) con tutti i pacchetti a disposizione. In entrambi i casi dovremo scaricare una versione adatta all'architettura del nostro processore (ad es. "powerpc", "i386", ecc.). Oltre alla rete ci sono varie riviste che potrebbero offrire i CD d'installazione, così come negozi specializzati ai quali è possibile indirizzarsi.


::[[Immagine:Warning_65x68.jpg|left]] Quasi tutte le distribuzioni mettono il programma <tt>lspci</tt> in <tt>/usr/sbin/</tt>, ma alcune lo mettono in altri percorsi. Per trovare in quale posizione � stato messo digitare:
===Incomincia l'installazione!===
Come tutte le nuove installazioni cominceremo con un bel back-up del nostro vecchio sistema con tutti i nostri dati... Ok, si parte! Inseriamo il CD nel computer e riavviamo. Quest'ultimo dovrà sopportare il boot da CD. Se non riusciamo nell'intento, un doppio-clic sul CD e ci verrà proposta l'installazione di un installer sul nostro computer: questo ci farà un "riavvia" e ci darà la possibilità di avviare l'installer all'inizio del boot.<br />
Per quanto riguarda poi l'installazione vera e propria ci sono centinaia di guide in rete e non commenterò dunque punto per punto, dando solo delle indicazioni per i punti più importanti:
====Prima schermata====
"Press F1 for help, or ENTER to boot". Leggere gli aiuti sarebbe sempre una cosa importante... In ogni caso, se tralasciate questo punto e premete ENTER per incominciare vi ritroverete in modalità testuale. Per la comoda interfaccia grafica, dare il comando: installgui ENTER.
====Partizionamento del disco====
v. sotto.
====Scelta dei Software====
Assolutamente da installare è il sistema standart e l'ambiente Desktop. Se si ha un laptop si sceglie evidentemente anche questa opzione.
====GRUB====
Assolutamente rispondere di sì; GRUB verrà installato nel MBR permettendo il multi-boot (avvio del sistema operativo a scelta).
{{ Warningbox | Se si re-installa Windows (o Mac) il MBR verrà sovrascritto e bisognerà re-installre GRUB. }}
===Partizionamento del disco===
Dopo le prime impostazioni del sistema, arriviamo infine al partizionamento del disco. L'installer ci propone di formattare tutto il disco per installare il nuovo sistema operativo (non che sia una brutta idea, ma per incominciare...). Per mantenere il nostro vecchio sistema dovremo dunque scegliere la modalità manuale. A questo punto dobbiamo ridimensionare la partizione contenente il sistema operativo per avere dello spazio libero sul quale creare le nuove partizioni. Ciò, semplicemente seguendo le proposte dell'installer. Una volta ottenuto dello spazio libero possiamo creare le nuove partizioni. Si potrebbe fare in modo automatico dicendo all'installer di utilizzare tutto lo spazio libero per installare debian (forse la scelta migliore, ma io volevo ancora avere una partizione FAT32...). Se vogliamo invece crearci le partizioni in modo manuale dovremo prestare attenzione solo ad alcune cosette:
* la partizione su cui installeremo la debian deve avere un file system Ext3, essere "bootabile" (vedremo una "B" nell'indice, prima era nella partizione del vecchio sistema), essere "primaria" e avere come indice di partenza "/".
* la swap deve avere un file system swap, essere "locale" ed essere grande almeno quanto la memoria RAM.
* la partizione con file system FAT32 deve essere "primaria".
'''N.B.''': un'opzione semplificata potrebbe essere quella di dire all'installer di utilizzare tutto lo spazio libero per il nuovo sistema operativo; avrete così la partizione ext3 e swap "gestita" dall'installer; poi, per creare la partizione con FAT32, potete ridimensionare la ext3 guadagnando spazio e utilizzando quest'ultimo per creare l'ultima partizione in modo manuale.


::<tt>$ '''which lspci'''</tt>
==Mercoledì: tastiera, risoluzione schermo e shell==
::<tt>/usr/sbin/lspci</tt>
Oggi accendo finalmente il pc dopo aver installato la mia prima debian. Un po' di scritte... ecco, adesso posso loggarmi... e finalmente ecco il mio bel desktop! Peccato che la mia eccitazione già si arresta appena provo a scrivere due cosettine... i caratteri visualizzati non corrispondono ai tasti premuti... mhmm... lo sapevo che non potevo utilizzare la tastiera del mac...
===La tastiera===
Per "sintonizzare" la tastiera abbiamo due possibilità: utilizzare le preferenze di GNOME o modificare il file /etc/X11/xorg.conf
====Preferenze GNOME====
Dal menu nella barra superiore scegliere: sistema > preferenze > tastiera. Sotto "Layouts" scegliere il modello (ad es. per mac, macintosh) e la lingua predefinita. Sempre nel caso Apple, per configurare il tasto "Alt-Gr" si può andare sotto "Layout Options" > "Third level choosers" e scegliere Left win-key o Right win-key per avere il tasto "mela" di sinistra o destra come un "Alt-Gr".
====/etc/X11/xorg.conf====
In questo file troviamo la configurazione del sistema grafico. La tastiera la troviamo sotto Identifier "Generic Keyboard" o qualcosa del genere. A destra di Option "XkbModel" avremo il modello, ad esempio "macintosh", con Option "XkbLayout" avremo la lingua, ad esempio "it". Se si volesse ancora una volta abilitare un tasto "mela" con la funzione di "Alt-Gr", bisognerà aggiungere l'opzione Option "XkbOptions" "lv3:lwin_switch" per la "mela" di sinistra o "lv3:rwin_switch" per quella di destra.<br /><br />
A questo punto una domanda è però lecita: come si modifica il file /etc/X11/xorg.conf? Dalla shell... vediamo quasi subito...
===La risoluzione dello schermo===
In questo caso si può scegliere da sistema > preferenze > risoluzione monitor un valore. Se non dovrebbe esserci quello che cerchiamo bisognerà ancora una volta modificare il file /etc/X11/xorg.conf. Questa volta cercheremo la parte con Identifier "Default screen". Nelle susseguenti Subsection "Display" andremo sotto "Modes" ad inserire la risoluzione cercata.
{{ Warningbox | non è detto che inserendo una risoluzione sotto "Modes" venga correttamente accettata; questo perchè la risoluzione è dipendente anche dai drivers utilizzati. In altre parole, se dovreste avere problemi a riguardo, consultate la rete per accertare il vostro driver ed eventuali istruzioni per aggiornarlo/cambiarlo. }}
===La shell===
Giusto per chiarire i termini, la shell è la linea di comando (= terminale). In debian si chiama bash. È uno strumento molto potente e alla base di tutte le impostazioni del sistema operativo. Come citato sopra, utilizzeremo la shell per avere i diritti di superuser per poter modificare il file /etc/X11/xorg.conf. Per prima cosa controlliamo se abbiamo installato sudo (superuser do; questo comando ci permette di fare delle azioni come superuser, senza però doverci "loggare" in quanto tale):
<pre>~$ su (invio), dare la password, ~# apt-get install sudo</pre>
Se è già installato il sistema ci avviserà, altrimenti si potrà installare il programma (maggiori dettagli sull'installazione dei programmi si trovano nell'ultima giornata). Per fare il logout da superuser semplicemente scrivere "exit" ed invio. Poi dobbiamo dare al nostro utente i diritti di superuser. Per fare ciò dovremo loggarci dapprima come superuser e poi modificare il file /etc/sudoers tramite un editor di testo su shell. Per questioni di semplicità utilizzeremo "nano":
<pre>~$ su (invio), dare la password, ~# nano /etc/sudoers</pre>
A questo punto otterremo una mini interfaccia grafica; fra le righe troveremo la seguente linea:
<pre>root      ALL=(ALL) ALL ; dove sotto aggiugeremo (spostando il cursore con le frecce)
<nostronomeutente>  ALL=(ALL) ALL</pre>
Per concludere, ctrl+O per salvare ed infine ctrl+X per uscire.
Quando vorremo ora eseguire un'azione con diritti da superuser (amministratore) basterà digitare "sudo" e poi l'azione voluta.<br />
Torniamo ora alla modifica del nostro xorg.conf. Il modo più semplice è di modificarlo con gedit (gnome). Daremo il comando:
<pre>~$ sudo gedit /etc/X11/xorg.conf</pre>
Avremo così aperto il file con un editor grafico, gedit appunto, e grazie a sudo avremo i diritti di scrittura per modificarlo. Nel capitolo relativo ai permessi vedremo altri comandi base della shell ed un chiarimento sui permessi di scrittura di un file.


Se state usando una distribuzione che mette ''lspci'' in una altra posizione usate il percorso corretto per il vostro caso negli esempi seguenti.
==Giovedì: allacciamoci alla rete==
Con il cavo dell'ethernet conficcato nella scheda ho potuto per fortuna installare sudo... ora però vorrei capire meglio come funziona la rete e come potrei configurarla. E se volessi anche un Wireless? Già non ci capisco più niente...
===Configurare la rete tramite il file /etc/network/interfaces===
====Rete ethernet cablata====
Per configurare una rete esistono varie applicazioni grafiche (come network-manager), ma il consiglio è quello di configurarla con il file sopracitato (che verrà "caricato" durante l'accensione del pc); una volta capito il sistema non avrete così mai un problema. Come prima cosa, onde evitare spiacevoli interazioni con il sistema grafico, andremo a disinstallare il network-manager:
<pre>~$ sudo apt-get remove network-manager network-manager-gnome</pre>
Avendo fatto l'installazione tramite la net-install e la rete diamo per scontato che la scheda ethernet funziona. Per vedere le schede di rete del nostro sistema diamo il comando:
<pre>~$ sudo ifconfig -a</pre>
Otterremo una lista con a sinistra i nome delle interfacce e a destra la loro configurazione (con ifconfig senza "-a" vedremo solo le schede attive). La scheda ethernet dovrebbe avere un nome tipo "eth0" (o "eth1", ...). La scheda con il nome di "lo" al momento la lasceremo perdere, non ci servirà. Per configurare ora la scheda andiamo a editare il file /etc/network/interfaces (alias lo apriamo con gedit in modalità amministratore, così da poterlo modificare; volutamente non vi scrivo come fare, ma è la stessa cosa di come abbiamo fatto con /etc/X11/xorg.conf, vero?). Otterremo qualcosa del genere:
<pre># This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).


Le primi bit d'informazione che l'output di ''lspci'' ci mostra sono l'ID del bus PCI per questo dispositivo, <tt>06:04.0</tt>. Questo � il valore che useremo quando guarderemo nel ''sysfs'' per trovare pi� informazioni riguardo questo dispositivo.
# The loopback network interface
auto lo
iface lo inet loopback


Andiamo in ''sysfs'' dove tutti i dispositivi PCI sono elencati, e guardiamo i loro nomi:
# The primary network interface
 
auto eth0
<pre>
iface eth0 inet dhcp
$ cd /sys/bus/pci/devices/
$ ls
0000:00:00.0 0000:00:1d.0  0000:00:1e.0 0000:00:1f.3 0000:06:03.3
0000:00:02.0 0000:00:1d.1  0000:00:1f.0 0000:06:03.0 0000:06:03.4
0000:00:02.1 0000:00:1d.2  0000:00:1f.1 0000:06:03.1 0000:06:04.0
0000:00:1b.0 0000:00:1d.7  0000:00:1f.2 0000:06:03.2 0000:06:05.0
</pre>
</pre>
La scheda viene "caricata" all'accensione del sistema (auto eth0) e viene utilizzata tramite dhcp (inet dhcp). Per configurare una rete con ip fisso vi lascio a guide più dettagliate, presenti ovunque e dovunque in rete (a partire da debianizzati).
====Rete Wireless====
Come prima cosa dobbiamo installare un pacchetto per la gestione del wireless:
<pre>~$ sudo apt-get install wireless-tools</pre>
Fatto questo, un requisito fondamentale è avere una scheda wireless riconosciuta dal sistema. Per verificare daremo il comando:
<pre>~$ sudo iwconfig</pre>
Come abbiamo visto con ifconfig, avremo sulla sinistra le sigle delle interfacce di rete e sulla destra le loro caratteristiche. La scheda ethernet avrà la descrizione "no wireless extensions.", così come "lo". La nostra scheda wireless non avrà dunque questa scritta, ma un elenco di parametri (tipo ESSID, Mode, ...). Il nome può variare a seconda dei drivers utilizzati (wlan0, ra0, eth1, eth2, ...).<br />
{{ Warningbox | se la scheda wireless non viene visualizzata bisogna installare dei drivers (o magari anche solo un firmware). La procedura varia molto a seconda della scheda utilizzata. Il procedimento non verrà dunque descritto. Un buon inizio è dare il comando "lspci" per visualizzare il chipset della scheda e consultare la rete (alias google, forum, ...) per il procedimento d'installazione. }}
Per vedere le reti wireless accessibili alla nostra scheda diamo il comando:
<pre>~$ sudo iwlist scan</pre>
Sceglieremo poi la rete alla quale vogliamo collegarci e annoteremo il nome ESSID e il numero di canale (Channel). A questo punto, editiamo ancora una volta il nostro file /etc/network/interfaces e aggiungeremo le seguenti righe (ammettiamo di avere la scheda wireless "wlan0":
<pre>auto wlan0                          (vogliamo "caricare" la scheda all'avvio)
iface wlan0 inet dhcp              (chiediamo un ip tramite dhcp)
wirless-essid <nomerete>            (scegliamo a che rete collegarci)
wireless-channel <numerocanale>    (scegliamo il canale)
wireless-key s: <password rete>    (diamo la password se necessario)</pre>
Questo sistema funziona con una rete aperta o con chiave WEP. Per una rete con WPA si può configurare "wpasupplicant" (divertitevi con le ricerche: google, forum, ...); il metodo forse però più semplice è quello di editare il nostro file nel modo seguente;
<pre>auto wlan0                              (vogliamo "caricare" la scheda all'avvio)
iface wlan0 inet dhcp                  (chiediamo un ip tramite dhcp)
pre-up ifconfig wlan0 up                (carichiamo "al volo" l'interfaccia)
pre-up iwconfig wlan0 essid <nomerete>  (scegliamo a che rete collegarci)
pre-up iwconfig wlan0 mode Managed      (scegliamo il modo [visibile con lo scanning])
pre-up iwconfig wlan0 channel 1        (scegliamo il canale)
pre-up iwpriv wlan0 set AuthMode=WPAPSK (scegliamo il tipo di WPA)
pre-up iwpriv wlan0 set EncrypType=TKIP (scegliamo il tipo di criptazione)
pre-up iwpriv wlan0 set WPAPSK=xxxxxxxx (diamo la password)</pre>
{{ Warningbox | la password deve venire scritta in modo criptato! }}
Per fare ciò possiamo installare in ogni caso il pacchetto "wpasupplicant" e poi criptare la nostra password con:
<pre>~$ sudo apt-get install wpasupplicant    ; dopo aver installato il pacchetto digitiamo:
~$ wpa_passphrase <nomerete> <password></pre>
L'output sarà la password criptata. Non ci resta che ricopiarla nel nostro /etc/network/interfaces. Per utilizzare ora la nostra scheda dobbiamo riavviare la rete con:
<pre>~$ sudo /etc/init.d/networking restart</pre>
Onde evitare interazioni potete disabilitare la scheda ethernet, mettendo il segno "#" davanti alle righe che la concernono (auto eth0 e iface eth0 inet dhcp). Come già detto, per la configurazione di wpasupplicant e tutte le reti più complesse, spazio ad altre guide ;-) !


Il kernel numera i dispositivi PCI con un <tt>0000:</tt> iniziale che non viene mostrato nell'output di ''lspci''. Dunque, aggiungiamo un <tt>0000:</tt> al numero datoci da ''lspci'' e entriamo in quella directory:
==Venerdì: permessi e spostamento files/cartelle==
 
Con il week end alle porte sono oggi invogliato a "fare un giretto" nella mia nuova debian. Provo a spostarmi fra le cartelle, ordinare dei file... ma... alcuni file non me li lascia spostare... Non ho i diritti... Ma se il computer è il mio?! Uffa... e adesso che faccio? Vorrei magari viaggiare anche un po' con la shell, ma con tutti questi comandi assurdi, non ci si capisce niente!
  $ cd 0000:06:04.0
 
In questa directory vogliamo conoscere il valori dei file ''vendor'' e ''device''.
 
<pre>
$ cat vendor
0x10ec
$ cat device
0x8139
</pre>
 
Questi sono il ''vendor ID'' ed il ''device ID'' per questo dispositivo PCI. Il kernel usa questi valori per associare correttamente un driver ad un dispositivo. I driver PCI dicono al kernel quale vendor e device ID supporteranno cos� che il kernel sappia come collegare il driver al dispositivo corretto. Scriveteli da qualche parte, dato che ci riferiremo a loro pi� tardi.
Ora che sappiamo il vendor e il product ID per questo dipositivo PCI, abbiamo bisogno di trovare i driver del kernel corretto che dica che supporta questo dispositivo. Tornate indietro alla directory di source del kernel:
 
      <B>$ cd ~/linux/linux-2.6.17.8/</B>
 
Il posto pi� comune per gli ID PCI nell'albero sorgente del kernel � include/linux/pci_ids.h. Cercate in quel file il vostro product number vendor:
 
      <B>$ grep -i 0x10ec include/linux/pci_ids.h</B>
      #define PCI_VENDOR_ID_REALTEK                  0x10ec
 
* Alcuni processori 64-bit mostreranno il "leading bus number" per i dispositivi PCI nell'output di lspci, ma per la maggiorparte delle comuni macchine Linux, non verr� mostrato di default.
 
Il valore qui definito, PCI_VENDOR_ID_REALTEK � ci� che probabilmente sar� usato in qualsiasi kernel driver che ha la pretesa di supportare i dispositivi di quel produttore.
Per essere sicuri, cercate il nostro device ID anche in questo file , dato che � a volte descritto la:
 
      <B>$ grep -i 0x8139 include/linux/pci_ids.h</B>
      #define PCI_DEVICE_ID_REALTEK_8139        0x8139
 
 
Questa definizione verr� utile pi� tardi.
Ora cercate nei file sorgenti dei driver relativi a questo produttore:
 
      <B>$ grep -Rl PCI_VENDOR_ID_REALTEK *</B>
      include/linux/pci_ids.h
      drivers/net/r8169.c
      drivers/net/8139too.c
      drivers/net/8139cp.c
 
Non dobbiamo guardare nel primo file riportato qui, pci_ids.h, dato che � dove abbiamo trovato la definizione originale. Ma i file r8139.c, 8139too.c, e 8169cp.c nella sottodirectory drivers/net/ dovrebbero essere esaminati pi� da vicino.
Aprite uno di questi dile in un editor e cercate PCI_VENDOR_ID_REALTEK. Nel file drivers/net/r8169.c, si vede nella seguente sezione di codice:
 
      static struct pci_device_id rtl8169_pci_tbl[] = {
              { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8169), },
              { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8129), },
              { PCI_DEVICE(PCI_VENDOR_ID_DLINK,      0x4300), },
              { PCI_DEVICE(0x16ec,                  0x0116), },
              { PCI_VENDOR_ID_LINKSYS,              0x1032, PCI_ANY_ID, 0x0024, },
              {0,},
      };
 
Tutti i driver PCI contengono una lista di dispositivi differenti che supportano. Questa lista � contenuta in una struttura di valori struct pci_device_id, come questa. Questo � ci� che dobbiamo cercare per determinare se il nostro dispositivo � supportato da questo driver. Il valore del vendor corrisponde qui, ma il secondo valore dopo il vendor � il valore di dispositivo. Il nostro dispositivo ha il valore 0x8139, mentre questo driver supporta i valori di dispositivi per 0x8169 e 0x8129 con il vendor ID di PCI_VENDOR_ID_REALTEK. Per cui questo driver non supporter� il nostro dispositivo.
Spostandoci al prossimo file, drivers/net/8139too.c, possiamo trovare la stringa PCI_VENDOR_ID_REALTEK nel seguente pezzo di codice:
 
<pre>
if (pdev->vendor == PCI_VENDOR_ID_REALTEK &&
pdev->device == PCI_DEVICE_ID_REALTEK_8139 && pci_rev >= 0x20) {
  dev_info(&pdev->dev,"This (id %04x:%04x rev %02x) is an enhanced 8139C+ chip\n",
      pdev->vendor, pdev->device, pci_rev);
  dev_info(&pdev->dev, "Use the \"8139cp\" driver for improved performance and stability.\n");
}}
</pre>
 
L'utilizzo del valore di PCI_VENDOR_ID_REALTEK qui corrisponde anche con il codice che controlla se il dispositivo PCI ID corrisponde al valore PCI_DEVICE_ID_REALTEK_8139. Se corrisponde, il driver stamper� un messaggio che dice: "Use the 8139cp for improved performance and stability." Forse dovremmo guardare a quel driver di seguito. Anche se non avessimo tale visibile consiglio, il driver 8139too.c non ha la coppia vendor e device ID che stiamo cercando in una variabile del tipo struct pci_device_id, ci� ci dice che non supporta il nostro dispositivo.
Infine, guardate nel file drivers/net/8139cp.c. Usa la definizione PCI_VENDOR_ID_REALTEK nel seguente pezzo di codice:
 
<pre>
static struct pci_device_id cp_pci_tbl[] = {
              { PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_8139,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
              { PCI_VENDOR_ID_TTTECH, PCI_DEVICE_ID_TTTECH_MC322,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
              { },
    };
    MODULE_DEVICE_TABLE(pci, cp_pci_tbl);
</pre>
 
Qui c'� l'uso di entrambi i valori del nostro vendor e device ID in una variabile struct pci_device_id. Questo driver dovrebbe supportare il nostro dispositivo.
Ora che abbiamo il nome del driver, possiamo lavorare a ritroso, come mostrato nella prima sezione del capitolo, per trovare l'appropriato valore di configurazione del kernel che dovrebbe abilitare la compilazione di questo driver.
Riassumendo, qui ci sono i passaggi necessari al fine di trovare quale driver PCI pu� controllare uno specifico dispositivo PCI:<br>
1. Trovate il bus PCI ID del dispositivo pere il quale volete trovare il driver, usate lspci.<br>
2. Andate nella directory /sys/bus/pci/devices/0000:bus_id, dove bus_id � il bus PCI trovato nel passaggio precedente.<br>
3 Leggete i valori del vendor e dei file dei dispositivi nella directory dei dispositivi PCI.<br>
4. Tornate all'albero sorgente del kernel guardate in include/linux/pci_ids.h per il vendor PCI e device ID trovato nel passaggio precedente.<br>
5. Cercate nell'albero sorgente del kernel per le referenze a quei valori nei driver. Sia il vendor che il device ID devono essere in una struttura struct pci_device_id.<br>
6. Cercate nel Makefile del kernel la regola CONFIG_ che compila questo driver usando find e grep:<br>
<B>$ find -type f -name Makefile | xargs grep DRIVER_NAME</B><br>
7. Cercate nel sistema di configurazione del kernel quel valore di configurazione e andate nel posto di menu che specifica per abilitare il driver da compilare.<br>
 
===Dispositivi USB===
 
Trovare il driver specifico per un dispositivo USB � come trovare un driver per un dispositivo PCI come descritto nella precedente sezione, con solo differenze minori nel trovare il valore di bus ID.
In questo esempio, troviamo il driver che � necessario per un dispositivo USB wireless. Come per l'esempio del dispositivo PCI, i dettagli in questo esempio saranno differenti dalla vostra situazione, ma i passi necessari saranno pertinenti per ogni tipo di dispositivo USB per il quale desiderate trovare un driver funzionante.
Come per il dispositivo PCI, il bus ID deve essere trovato per il dispositivo USB per il quale volete trovare il driver. Per fare ci�,  potete usare il programma lsusb che si trova nel package usbutils.
Il programma lsusb mostra tutti i dispositivi USB attaccati al sistema. Dato che voi non conoscete come il dispositivo specifico che state cercando � chiamato, cominciate a guardare a tutti i dipsoitivi:
 
    <B>$ /usr/sbin/lsusb</B>
    Bus 002 Device 003:  ID 045e:0023 Microsoft Corp. Trackball Optical
    Bus 002 Device 001:  ID 0000:0000
    Bus 005 Device 003:  ID 0409:0058 NEC Corp. HighSpeed Hub
    Bus 005 Device 001:  ID 0000:0000
    Bus 004 Device 003:  ID 157e:300d
    Bus 004 Device 002:  ID 045e:001c Microsoft Corp.
    Bus 004 Device 001:  ID 0000:0000
    Bus 003 Device 001:  ID 0000:0000
    Bus 001 Device 001:  ID 0000:0000
 
I dispositivi con un ID di 0000:0000 possono venir ignorati, dal momento che sono USB host controller che guidano il bus stesso. Filtrandoli ci lascia con quattro dispositivi:
 
      <B>$ /usr/sbin/lsusb |  grep -v 0000:0000</B>
      Bus 002 Device 003:  ID 045e:0023 Microsoft Corp. Trackball Optical
      Bus 005 Device 003:  ID 0409:0058 NEC Corp. HighSpeed Hub
      Bus 004 Device 003:  ID 157e:300d
      Bus 004 Device 002:  ID 045e:001c Microsoft Corp.
 
Dato che i dispositivi USB sono facili da rimuovere, fate l'unplug del dispositivo di cui volete trovare il driver ed eseguite lsusb ancora:
 
      <B>$ /usr/sbin/lsusb |  grep -v 0000:0000</B>
      Bus 002 Device 003:  ID 045e:0023 Microsoft Corp. Trackball Optical
      Bus 005 Device 003:  ID 0409:0058 NEC Corp. HighSpeed Hub
      Bus 004 Device 002:  ID 045e:001c Microsoft Corp.
 
Il terzo dispositivo ora manca, che significa il dispositivo mostrato come:
 
  Bus 004 Device 003: ID 157e:300d
 
� il dispositivo per cui volete trovare il driver.
 
Se voi riattaccate il dispositivo e guardate all'output di lsusb ancora, il numero del dispositivo sar� cambiato:
 
      <B>/usr/sbin/lsusb | grep 157e</B>
    Bus 004 Device 004: ID 157e:300d
 
Questo � dovuto al fatto che i numeri dei dispositivi USB non sono unici, ma cambiano ogni volta che un dispositivo viene inserito dentro. Ci� che � fisso � il vendor e product ID, mostrato qui da lsusb come valore a due quattro cifre con un : tra loro. Per questo dispositivo, il vendo ID e' 157e e il product ID e' 300d. Scrivetevi i valori che trovate dato che li userete nei passi successivi.<br>
Come per i dispositivi PCI, cercheremo il codice sorgente del kernel per il vendor USB e per il product IDs per trovare il driver adeguato e controllare questo dispositivo. Sfortunatamente, nessun singolo file contiene tutti gli ID vendor USB, come invece PCI ha. Cos� una ricerca nel codice sorgente dell'intero kernel � necessaria:
 
      <B>$ grep -i -R -l 157e drivers/*</B>
      drivers/atm/pca200e.data
      drivers/atm/pca200e_ecd.data
      drivers/atm/sba200e_ecd.data
      drivers/net/wireless/zd1211rw/zd_usb.c
      drivers/scsi/ql1040_fw.h
      drivers/scsi/ql1280_fw.h
      drivers/scsi/qlogicpti_asm.c
 
Sappiamo che questo � un dispositivo USB wireless, e non un dispositivo ATM o SCSI, per cui in questo modo noi possiamo sicuramente ignorare i file trovati nelle directory atm e scsi. Quindi resta il file drivers/
net/wireless/zd1211rw/zd_usb.c da controllare.
zd_usb.c mostra la stringa 157e nel seguente pezzo di codice:
 
      static struct usb_device_id usb_ids[]    ={
              /* ZD1211 */
              { USB_DEVICE(0x0ace, 0x1211),  .driver_info =  DEVICE_ZD1211  },
              { USB_DEVICE(0x07b8, 0x6001),  .driver_info =  DEVICE_ZD1211  },
              { USB_DEVICE(0x126f, 0xa006),  .driver_info =  DEVICE_ZD1211  },
              { USB_DEVICE(0x6891, 0xa727),  .driver_info =  DEVICE_ZD1211  },
              { USB_DEVICE(0x0df6, 0x9071),  .driver_info =  DEVICE_ZD1211  },
              { USB_DEVICE(0x157e, 0x300b),  .driver_info =  DEVICE_ZD1211  },
              /* ZD1211B */
              { USB_DEVICE(0x0ace, 0x1215),  .driver_info = DEVICE_ZD1211B },
              { USB_DEVICE(0x157e, 0x300d),  .driver_info = DEVICE_ZD1211B },
              {}
      };
 
Come per i driver PCI, i driver USB dicono al kernel quali dispositivi supportano affinch� il kernel possa associare il driver al dispositivo. Ci� viene fatto usando una struct usb_device_id variabile, come mostrato qui. Questa � una lista dei differenti vendor e product ID che sono supportati da questo driver. La linea:
 
      { USB_DEVICE(0x157e, 0x300b), .driver_info = DEVICE_ZD1211 },
 
mostra che il nostro vendor e product ID sono supportati da questo driver.
Una volta che avete il nome del driver che � necessario per controllare il dispositivo, lavorate al contrario attraverso i Makefile del kernel, come descritto precedentemente nel capitolo, su come abilitare il driver per compilarlo appropriatamente.
Riassumendo, i passaggi necessari per trovare quale driver USB controller� uno specifico dispositivo USB sono:
 
1. Trovare il vendor USB e il product ID del dispositivo per il quale volete trovare il driver, usando lsusb dopo aver aggiunto e rimosso il dispositivo per vedere cosa � cambiato nella lista.<br>
2. Cercate l'albero del codice sorgente del kernel per il vendor e il product ID del dispositivo USB. Sia il vendor e il product ID dovrebbero essere in una definizione struct usb_device_id.<br>
3. Cercate i Makefile del kernel per la regola CONFIG_ che compila questi driver, usando find e grep:
 
    <B>$ find -type f -name Makefile | xargs grep DRIVER_NAME</B>


4. Cercate nella configurazione di sistema del kernel il valore di quella configurazione e andate alla locazione ,nel menu, specifica per abilitare il driver da compilare.
===comandi base shell===


===Root filesystem===
A metà settimana abbiamo imparato i primi comandi della shell (sudo e editare un testo con diritti d'amministratore); oggi vedremo dei comandi semplici per muoverci all'interno del sistema.


Il filesystem root � il filesystem dal quale la porzione principale del sistema caricante fa il boot. Contiene tutti i programmi iniziali che fanno partire la distribuzione e solitamente contiene anche l'intero sistema di configurazione per la macchina. In breve, � molto importante, e deve essere capace di esser trovato dal kernel a boot time affinch� le cose funzionino propriamente.
<pre>~$ cd [percorso] => per spostarci fra le cartelle.</pre>
Se il vostro nuovo kernel configurato muore a boot time con un errore del tipo:
Ad es. cd /home/[nostro nome utente] ci porterà nella nostra cartella d'utente (quella che di default è "selezionata" quando apriamo una sessione di shell), cd / ci porterà nella cartella principale del sistema. Con il comando cd .. "retrocediamo" di una cartella. Non hai capito? Prova...<br />


VFS: Cannot open root device hda2 (03:02)
Per "percorrere" le cartelle esiste un metodo molto pratico che ci farà risparmiare tempo ed errori: il tasto "TAB" (quello per fare i rientri, sulla tastiera in alto a sinistra), che completerà automaticamente le parole. Ad es. per editare il file /etc/network/interfaces "tippiamo": sudo ged [tab] /e [tab] net [tab] / in [tab].
    Please append a correct "root=" boot option
    Kernal panic: VFS: Unable to mount root fs on 03:02


significa che il root filesystem non e' stato trovato. Se non state usando una immagine ramdisk a boot time, � solitamente raccomandabile che compiliate sia il filesystem che usate come partizione di root, e il disk controller per quel disco, nel kernel, invece di averlo come modulo. Se usate un ramdisk a boot time, voi dovreste di sicuro compilare queste porzioni come moduli.
<pre>~$ ls => ci mostra il contenuto della cartella attuale.</pre>Con il comando ls -a vedremo anche le cartelle o i file nascosti (preceduti da un punto), con ls -l vediamo dei dati supplementari per ogni elemento della cartella (dettagli in "permessi").
::[[Immagine:Warning_65x68.jpg|left]]Come potete determinare se state usando un ramdisk a boottime? Nel capitolo 5 abbiamo menzionato l'uso dell'installation script della distribuzione per installare il kernel contro il fare l'installazione per proprio conto. Se state usando l'installation script della distribuzione, state probabilmente usando un ramdisk. se lo state installando per vostro conto, probabilmente non lo state usando.
Le seguenti sottosezioni mostrano come lasciare che il kernel trovi il root filesystem durante il boot.


====Tipo del filesystem====
<pre>~$ mv [file/cartella] [nuova location o nuovo nome file] => sposta o rinomina un file o una cartella.</pre>
È anche possibile eseguire entrambe le operazioni dando un nuovo nome al file/cartella ed una nuova location. Attenzione ai permessi... (vedi sotto).


Primo, il tipo di filesystem che la partizione di root sta usando necessita di esser determinata. Per fare ci�, guardate nell'output del comando di mount:
<pre>~$ rm [file] => rimuove un file. Per rimuovere cartelle, rm -r [cartella].</pre>
Attenzione ai permessi... (vedi sotto).


$mount |grep " / "
<pre>~$ cp [file] [location e nome file] => copia un file. Per copiare cartelle, cp -r [cartella] [location e nome cartella].</pre>
/dev/sda2 on / type ext3 (rw,noatime)
Come con mv, è possibile rinominare "al volo" (dando un nuovo nome) la copia del file. Attenzione ai permessi... (vedi sotto).<br />


Siamo interessati al tipo di filesystem, che viene mostrato dopo la parola type. In questo esempio, � ext3. Questo � il tipo di filesystem che la partizione di root sta usando. Andate nel sistema di configurazione del kernel e siate sicuri che questo tipo di filesystem sia abilitato, come descritto ne lCapitolo 8.
Per tutti gli altri comandi troverete istruzioni su debianizzati e nella rete. Per capire la sintassi di un comando o visualizzare le opzioni possibili esistono due comandi molto comodi:


====Controller del disco====
<pre>~$ man [comando] => mostra il funzionamento del comando. Ad es. man cp (premere "q" per uscire).
~$ [comando] --help => più o meno la stessa cosa, forse qualche dettaglio in meno.</pre>


Nell'output del comando appena mostrato, la prima porzione di linea mostra su quale dispositivo a blocchi il root filesystem � montato. In questo esempio, � /dev/sda2. Ora che il filesystem � correttamente configurato nel vostro kernel, dovete essere sicuri che questo dispositivo a blocchi funzioner� correttamente. Per trovare quali driver sono necessari per questo, dovete guardare in sysfs ancora.
===Permessi===
Tutti i dispositivi a blocchi mostrati in sysfs sia in /sys/block o in /sys/class/block, dipendono dalla versione del kernel che state usando. In entrambi i posti, i dispositivi a blocchi sono un albero, con le partizioni differenti essendo figli del dispositivo principale:


$ tree -d /sys/block/ | egrep "hd|sd"
Per avere un'idea, proviamo a dare il comando ls -l nella cartella principale (sapete come "andarci", vero?). Fra tutte le cartelle prendiamo in analisi la home:
|-- hdc
|-- hdd
`-- sda  |-- sda1
  |-- sda2  |-- sda3


Data l'informazione nel comando di mount, dovete essere sicuri che il dispositivo sda2 � configurato correttamente. Poich� questa � una partizione (le partizioni di un disco sono numerate, mentre i dispositivi a blocchi principali non lo sono), l'intero dispositivo sda deve essere configurato. (Senza il dispositivo a blocchi principale, non c'� possibilit� di accedere alle partizioni individuali su quel dispositivo).
<pre>drwxr-xr-x  3 root root  4096 2007-12-05 17:41 home</pre>
Il dispositivo a blocchi sda � rappresentato semplicemente come il dispositivo di rete che abbiamo visto precedentemente in questo capitolo. Esiste un symlink nella directory del dispositivo chiamato device che punta al dispositivo logico che controlla il dispositivo a blocchi:


$ ls -l /sys/block/sda
Da sinistra verso destra otteniamo le segunti informazioni:
...
device -> ../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0
...


Ora avete bisogno di iniziare a scorrere la catena dei sispositivi nel sysfs per trovare quale driver sta controllando questo dispositivo:
* d: sta per directory -> l'elemento è una cartella.


$ ls -l /sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0
Le prossime lettere si leggono a tre a tre, rispettivamente per proprietario, gruppo, tutti gli altri. Le lettere significano:
...
driver -> ../../../../../../bus/scsi/drivers/sd
...


Qui vediamo che il driver del controller del disco SCSI � responsabile per il funzionamento di questo dispositivo. Cos� sappiamo che dobbiamo configurare il supporto ai dischi SCSI nella nostra configurazione del kernel. Continuando a salire la catena delle directory in sysfs, provate a trovare dove � il driver che controlla l'hardware:
* r: sta per read -> è possibile leggere l'elemento.
* w: sta per write -> è possibile scrivere/manipolare l'elemento.
* x: sta per executable -> è possibile far eseguire l'elemento.


$ ls -l /sys/devices/pci0000:00/0000:00:1f.2/host0
Nel nostro esempio, la home ha i seguenti attributi:
...


Ancora, nessun driver qui. Continuando di un livello in su:
* proprietario: può leggere, scrivere/manipolare e "eseguire" l'elemento.
* gruppo: può leggere e "eseguire" l'elemento, ma non scriverlo/manipolarlo.
* tutti: possono leggere e "eseguire" l'elemento, ma non scriverlo/manipolarlo.


$ ls -l /sys/devices/pci0000:00/0000:00:1f.2
* 3: sta per il numero degli elementi inclusi. Se è una cartella è il numero dei file in essa, se è un file i valore sarà 1.
...
driver -> ../../../bus/pci/drivers/ata_piix


Ecco! Questo � il controller del disco di cui abbiamo bisogno da assicurare che sia nella nostra configurazione del kernel.
* root: è il nome del proprietario del file o della cartella.  
Cos� per questo root filesystem, abbiamo bisogno di abilitare l'ext3, sd, e ata_piix driver nella nostra configurazione del kernel cos� che saremo capaci di fare il boot con successo del nostro kernel su questo hardware.
* root: (il secondo nome) è il nome del gruppo al quale appartiene l'elemento.
* 4096: è la dimensione dell'elemento in bytes. N.B. per una cartella, non si tratta della somma di tutti gli elementi in essa, ma solo dello spazio che occupa la cartella vuota.
* 2007-12-05 17:41: data e orario di creazione/modifica.
* home: nome dell'elemento.


===Un aiuto dallo script===
A questo punto capiamo perchè non ci era possibile modificare il file /etc/network/interfaces; questo appartiene a root (-rw-r--r-- 1 root root  719 2007-12-11 10:21 interfaces) e solo root può scriverlo. Perciò dobbiamo avere i privilegi da root (ottenuti con sudo, grazie al file /etc/sudoers) per modificarlo. La stessa cosa vale per spostare dei files dei quali non siamo il proprietario. In generale, l'unica cartella del sistema che ci appartiene (come utente) è la cartella /home/[nostro nome utente] con tutto il suo contenuto.


Come menzionato all'inizio del capitolo, file e directory nel sysfs cambiano da una versione del kernel a un altra. Qui c'� uno script che � alla portata di mano per determinare il driver del kernel necessario e il module name per ogni dispositivo nel sistema. E' stato sviluppato con gli sviluppatori del kernel responsabili per il sysfs e dovrebbe funzionare con successo con tutte le versioni future del kernel 2.6 .
====Cambiare permessi/proprietario====
Per esempio, fa un "short work" del precedente esempio, quando dovete prendere tutti i driver appropriati per i dispositivi a blocco sda:


<strong>$ get-driver.sh sda</strong>
Per cambiare i permessi di un elemento abbiamo il comando chmod. Questo comando ha due sintassi possibili: una con ugo+/-rwx e l'altra con 3 numeri (4,2,1). In questa guida vi indicherò come si utilizza il sistema "numerico", per l'altro metodo, vi ricordate come si "studia" un comando? man...<br />
looking at sysfs device: /sys/devices/pci0000:00/0000:00:1f.2/host0/
I numeri rappresentano i permessi:  
target0:0:0/0:0:0:0
found driver: sd
found driver: ata_piix


Posso anche trovare tutto sui driver appropriati necessari per cose complicate come i dispositivi USB-toserial:
* 4: sta per read -> leggere.
* 2: sta per write -> scrivere/manipolare.
* 1: sta per executable -> eseguibile.


<strong>$ get-driver.sh ttyUSB0</strong>
Per dare i permessi ad un elemento non faremo nient'altro che calcolare la somma dei permessi che si vogliono attribuire e darli nell'ordine: proprietario, gruppo, altri. Per dare un esempio, per dare i permessi ad un file uguali alla cartella home (vedi sopra), daremo:
looking at sysfs device: /sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2.
3/4-2.3:1.0/ttyUSB0
found driver: pl2303 from module: pl2303
found driver: pl2303 from module: pl2303
found driver: usb from module: usbcore
found driver: usb from module: usbcore
found driver: usb from module: usbcore
found driver: uhci_hcd from module: uhci_hcd


Potete scaricare un file di esempio contenente questo script dal web site del libro, fornito nella sezione "How to Contact Us" in Preface.
<pre>~$ chmod 755 [file] ; per una cartella ~$ chmod -R 755 [cartella]</pre>


#!/bin/sh
Mi sembra inutile aggiungere che per modificare i diritti di un elemento bisogna essere il proprietario o averne i diritti (v. sudo).<br />
#
# Find all modules and drivers for a given class device.
#
if [ $# != "1" ] ; then<br>
  echo<br>
  echo "Script to display the drivers and modules for a specified sysfs
  class device"
  echo "usage: $0 <CLASS_NAME>"
  echo
  echo "example usage:"
  echo " $0 sda"
  echo "Will show all drivers and modules for the sda block device."
  echo
  exit 1
fi
DEV=$1
if test -e "$1"; then
  DEVPATH=$1
else
  # find sysfs device directory for device
  DEVPATH=$(find /sys/class -name "$1" | head -1)
  test -z "$DEVPATH" && DEVPATH=$(find /sys/block -name "$1" | head -1)
  test -z "$DEVPATH" && DEVPATH=$(find /sys/bus -name "$1" | head -1)
  if ! test -e "$DEVPATH"; then
  echo "no device found"
  exit 1
  fi
fi
echo "looking at sysfs device: $DEVPATH"
if test -L "$DEVPATH"; then
  # resolve class device link to device directory
  DEVPATH=$(readlink -f $DEVPATH)
  echo "resolve link to: $DEVPATH"
fi
if test -d "$DEVPATH"; then
  # resolve old-style "device" link to the parent device
  PARENT="$DEVPATH";
  while test "$PARENT" != "/"; do
  if test -L "$PARENT/device"; then
    DEVPATH=$(readlink -f $PARENT/device)
    echo "follow 'device' link to parent: $DEVPATH"
    break
  fi
  PARENT=$(dirname $PARENT)
  done
fi
while test "$DEVPATH" != "/"; do
  DRIVERPATH=
  DRIVER=
  MODULEPATH=
  MODULE=
  if test -e $DEVPATH/driver; then
  DRIVERPATH=$(readlink -f $DEVPATH/driver)
  DRIVER=$(basename $DRIVERPATH)
  echo -n "found driver: $DRIVER"
  if test -e $DRIVERPATH/module; then
    MODULEPATH=$(readlink -f $DRIVERPATH/module)
    MODULE=$(basename $MODULEPATH)
    echo -n " from module: $MODULE"
  fi
  echo
  fi
  DEVPATH=$(dirname $DEVPATH)
done


Per cambiare il proprietario o il gruppo di un elemento abbiamo il comando chown:


----
<pre>~$ chown [nuovo nome proprietario]:[nome nuovo gruppo] ; per una cartella chown -R [nuovo nome proprietario]:[nome nuovo gruppo]</pre>
This is an indipendent translation of the book [http://www.kroah.com/lkn/ Linux Kernel in a Nutshell] by [http://www.kroah.com/log/ Greg Kroah-Hartman]. This translation (like the original work) is available under the terms of [http://creativecommons.org/licenses/by-sa/2.5/ Creative Commons Attribution-ShareAlike 2.5].
----


[http://www.kernel.org/pub/linux/kernel/people/gregkh/lkn/lkn_pdf/ch07.pdf ''Capitolo originale'']
==Sabato: repository... ?==
[[Categoria:Kernel]]
OK, lentamente ci siamo. Il mio sistema incomincia a prendere forma e sento che sono quasi pronto ad installare i miei primi programmi. Mi domando però da dove sia possibile "prelevarli"...
===Cosa sono i repository===
I repository sono una sorta di "lista" di installatori di programmi contenuti in un archivio. Quest'ultimo può trovarsi su supporto removibile (CD, DVD, ...) oppure in rete. Questi "installatori" ci permetteranno poi di installare un programma con tutti i pacchetti (dipendenze) relativi ad esso. Ma non anticipiamo troppo i tempi.
===Dove sono i repository e come si modificano===
I repository si trovano nel file /etc/apt/sources.list. Per modificarli, basta editare il file con qualsiasi editor di testo ed aggiungere quelli che si desiderano. In questa guida non vi annoierò cercando di capire quali sono quelli da installare; fatevi un giro in rete e troverete mille proposte, a voi scegliere ciò che preferite (del resto, sarebbe uguale voler dimostrare quale distro di GNU/Linux sia la migliore...). Inoltre, per incominciare, nei repository ufficiali della debian (configurati in modo automatico durante l'installazione) troverete già tantissime applicazioni; saranno nuove esigenze che vi porteranno ad aggiungerne magari altri, magari niente.
==Domenica: aggiorniamo il sistema e installiamo i programmi==
Yuppi! Ecco il giorno che aspettavo! Finalmente installerò tutti i programmi che mi servono e la mia nuova debian sarà così pronta per il mio uso quotidiano. Allora, incominciamo ad aggiornare il sistema...
===Aggiornare il sistema===
Essendo le liste dei repository in continuo aggiornamento, per ottenere sempre le liste aggiornate digitiamo:
<pre>~$ sudo apt-get update</pre>
A questo punto possiamo aggiornare il nostro sistema (e i programmi già installati) con i seguenti comandi:
<pre>~$ sudo apt-get upgrade
oppure ~$ sudo apt-get dist-upgrade</pre>
A dire il vero l'''oppure'' non è propriamente corretto. Con il primo comando andremo ad aggiornare tutti i pacchetti presenti nel sistema SENZA installare dei nuovi pacchetti e SENZA eliminarne. Con il secondo comando andremo ad eseguire la stessa operazione, ma questa volta, se sono presenti nuovi pacchetti verranno installati e pacchetti non più presenti saranno eliminati. In tutti e due i casi, il sistema ci avviserà sempre dei cambiamenti che verranno effettuati e dovremo confermare la nostra scelta con un bel ''yes''.
===Installare programmi con apt===
Ogni programma dipende da vari pacchetti che a loro volta possono interagire con altri pacchetti ancora. Pensate ora se dovessimo installare un programma e dovessimo poi cercare "a manina" tutto ciò che occorre per farlo funzionare, senza poi inoltre avere brutte interazioni con gli altri programmi... brrrr... Per fortuna apt fa tutto ciò per noi. Possiamo utilizzarlo sia in modalità grafica che in modalità da linea di comando.
====Apt e shell====
In questa guida lo abbiamo già utilizzato più di una volta per installare i programmi che ci servivano; la sintassi è semplice:
<pre>~$ sudo apt-get install <nomepacchetto>    (per installare un programma)
~$ sudo apt-get remove <nomepacchetto>    (per disinstallare un programma)</pre>
Un piccolo trucco per visualizzare in modo rapido i vari pacchetti sta ancora una volta nel tasto "tab": oltre a completare il nome di un pacchetto presente nei repository, si può anche premere due volte ottenendo la lista di tutti i pacchetti che iniziano con le lettere digitate. Ad esempio, digitando ~$ sudo apt-get install gnome (e premere due volte tab), otteniamo la lista di tutti i pacchetti che incominciano con "gnome".
====Apt e Synaptic====
Come detto, apt si può anche utilizzare in veste grafica con il programma Synaptic package Manager, presente nel menu sistema -> amministrazione. Il programma è molto intuitivo: per ad esempio installare un pacchetto basta cercarlo nella lista e "cliccarlo" con il tasto destro, scegliendo l'opzione "installa" fra quelle possibili. Tutte le funzionalità del programma le lascio scoprire da voi...
===Installare pacchetti .deb e da sorgenti===
Le opzioni presenti nel sottotitolo sono le altre possibilità per installare un programma sulla debian. Alle prime armi è però tutto sconsigliato, in quanto di difficile gestione, fra dipendenze ed interazioni. Inoltre con apt potete installare una moltitudine di programmi fino a saturare le vostre capacità d'immaginazione. Per programmi recenti imparerete poi ad utilizzare i backports o a mixare releases diverse. Apt non finirà mai di stupirvi!
==Conclusione==
Finisce così questa guida. Essendo io stesso alle prime armi ho cercato di riassumere gli affanni più grandi che ho avuto, dando per ognuno uno spunto dal quale incominciare. Sperando di avervi dato alcune basi per "resistere" i primi giorni a fianco della debian, non vi resta ora che lanciarvi appieno nel fantastico mondo del free software ed apprendere ogni giorno qualcosina in più. La rete è piena di risorse e ogni volta che un nuovo problema compare, pensate che qualcuno da qualche parte nel mondo avrà già vissuto la stessa identica cosa... e oggigiorno, il mondo è piccolo...

Versione attuale delle 18:39, 3 nov 2019

Emblem-important.png Attenzione. Questa guida è obsoleta. Viene mantenuta sul Wiki solo per motivi di natura storica e didattica.


Questa piccola guida nasce con l'idea di rendere meno traumatico l'approccio al mondo debian da parte dell'utente principiante e alle prime armi con sistemi basati su GNU/Linux. L'idea è di dare la possibilità all'utente di installare un sistema debian funzionante sul proprio computer e di apprenderne le basi. In sintesi, la trascrizione dei primi pensieri e delle prime operazioni nel nuovo sistema operativo.

Lunedì: partizioniamo il disco

Dopo anni passati con il Mac, ormai ho deciso: questa settimana installerò Debian! Il problema è che, almeno per il momento, non vorrei abbandonare del tutto il mio vecchio sistema operativo... chissà se è possibile? E chissà quali complicate operazioni dovrò affrontare?

Premessa: BIOS, MBR e File System

L'accensione di un computer è il risultato di alcuni processi in ordine definito:

  1. Subito dopo l'accensione parte il BIOS (Basic Input-Output System): un programma che gestisce l'accesso all'hardware del computer e trova il disco di avvio.
  2. Dando inizio all'avvio parte il MBR (Master Boot Record): questo programma si trova all'inizio dell'hard-disk e avvia il boot loader.
  3. Il boot loader è un programma che ci permetterà di avviare un sistema operativo su una determinata partizione del disco.

Non facciamoci spaventare da queste prime righe: volevo solo dare un'introduzione (del resto molto semplificata), citando boot loader e partizioni che ci serviranno per installare Debian. Tra l'altro ormai il BIOS nei nuovi PC è stato rimpiazzato dall'EFI, che usa un altro metodo di gestione delle partizioni (cioè il GPT, ma può sempre usare il MBR se opportunamente configurato). In ogni caso, andiamo avanti e concentriamoci sui file system.

File System

Un file system è un metodo d'immagazzinamento e organizzazione dei file su un dispositivo d'archiviazione, come ad esempio un hard disk: in questo caso si parlerà di file system del disco. Tra i file system del disco più conosciuti troviamo:

FAT, FAT32  ->  DOS e Microsoft Windows
NTFS        ->  Microsoft Windows NT 
HFS+        ->  Mac OS X
ext3, ext4  ->  GNU/Linux

Per un sistema misto dovremo ricordarci che sia da OSX che da Windows non è possibile visualizzare direttamente le partizioni ext4. Qualche "trucco" esiste comunque, anche se la soluzione più semplice è quella di creare una partizione in FAT32 (sarebbe anche meglio in exFAT, detta anche FAT64, ma purtroppo Linux non la supporta ancora al meglio) visibile da tutti e tre i sistemi (e quindi utilizzabile per accedere ai file da qualsiasi sistema operativo o per trasferirli da un sistema all'altro). Nel prossimo capitolo vedremo come fare.

Boot loader

Il boot loader, come detto sopra, è un programma che ci permette l'avvio di un sistema operativo su una determinata partizione; nel caso di più sistemi operativi (su partizioni diverse), il boot loader ci permetterà di scegliere il sistema operativo da avviare. Nei sistemi GNU/Linux il boot loader per eccellenza è GRUB (GRand Unified Bootloader). Se abbiamo già installato MacOSX o Windows potremo utilizzarlo per il multi-boot (vedi martedì). GRUB sarà scritto nel MBR ed andrà a sovrascrivere il boot loader già presente. Una volta installato, GRUB penserà a gestire i vari sistemi operativi: all'avvio del computer potremo scegliere da un menu quale sistema operativo avviare.

Partizioni necessarie

Per concludere questa prima giornata vediamo ora le partizioni che necessitiamo per installare il nostro nuovo sistema operativo:

NTFS   -> se teniamo il nostro Windows XP, 7 o 8.x, lo ritroveremo su una partizione con questo file system
HFS+   -> se teniamo il nostro MacOS X, lo ritroveremo su una partizione con questo file system
ext4   -> sarà il file system per la partizione sulla quale installeremo Debian
FAT32  -> potremmo creare questa partizione per leggere o scambiare dei file fra i vari sistemi operativi
swap   -> collocata su un file system swap, si tratta di una memoria virtuale che ci servirà per Debian

Tutte queste partizioni possono essere create con l'installer di Debian (anche volendo lasciare il vecchio sistema operativo); dunque, visto che siamo agli inizi, non andiamo a complicarci la vita e corriamo a prendere il CD d'installazione (o la chiavetta USB)!

Martedì: installiamo Debian

Cavoli! Non sto più nella pelle! Ieri mi sono ben documentato sulle partizioni; ho deciso così: voglio mantenere MacOSX e mi farò una bella partizione FAT32 per condividere i file fra i due sistemi operativi. Poi installerò GRUB e lo utilizzerò per scegliere il sistema operativo all'avvio. Per fortuna non dovrò fare niente di difficile: penserà a tutto l'installer di Debian! Ma dove lo trovo?

Reperire un CD d'installazione Debian

Tutte le informazioni riguardo Debian si trovano sul sito principale della distribuzione: http://www.debian.org/. Se abbiamo a disposizione un accesso ad internet, potremo scaricare una versione minimale del sistema (netinst) e installare il resto dalla rete. Altrimenti possiamo scaricare i CD (o DVD) con tutti i pacchetti a disposizione. In entrambi i casi dovremo scaricare una versione adatta all'architettura del nostro processore (ad es. "powerpc", "i386", ecc.). Oltre alla rete ci sono varie riviste che potrebbero offrire i CD d'installazione, così come negozi specializzati ai quali è possibile indirizzarsi.

Incomincia l'installazione!

Come tutte le nuove installazioni cominceremo con un bel back-up del nostro vecchio sistema con tutti i nostri dati... Ok, si parte! Inseriamo il CD nel computer e riavviamo. Quest'ultimo dovrà sopportare il boot da CD. Se non riusciamo nell'intento, un doppio-clic sul CD e ci verrà proposta l'installazione di un installer sul nostro computer: questo ci farà un "riavvia" e ci darà la possibilità di avviare l'installer all'inizio del boot.
Per quanto riguarda poi l'installazione vera e propria ci sono centinaia di guide in rete e non commenterò dunque punto per punto, dando solo delle indicazioni per i punti più importanti:

Prima schermata

"Press F1 for help, or ENTER to boot". Leggere gli aiuti sarebbe sempre una cosa importante... In ogni caso, se tralasciate questo punto e premete ENTER per incominciare vi ritroverete in modalità testuale. Per la comoda interfaccia grafica, dare il comando: installgui ENTER.

Partizionamento del disco

v. sotto.

Scelta dei Software

Assolutamente da installare è il sistema standart e l'ambiente Desktop. Se si ha un laptop si sceglie evidentemente anche questa opzione.

GRUB

Assolutamente rispondere di sì; GRUB verrà installato nel MBR permettendo il multi-boot (avvio del sistema operativo a scelta).

Warning.png ATTENZIONE
Se si re-installa Windows (o Mac) il MBR verrà sovrascritto e bisognerà re-installre GRUB.


Partizionamento del disco

Dopo le prime impostazioni del sistema, arriviamo infine al partizionamento del disco. L'installer ci propone di formattare tutto il disco per installare il nuovo sistema operativo (non che sia una brutta idea, ma per incominciare...). Per mantenere il nostro vecchio sistema dovremo dunque scegliere la modalità manuale. A questo punto dobbiamo ridimensionare la partizione contenente il sistema operativo per avere dello spazio libero sul quale creare le nuove partizioni. Ciò, semplicemente seguendo le proposte dell'installer. Una volta ottenuto dello spazio libero possiamo creare le nuove partizioni. Si potrebbe fare in modo automatico dicendo all'installer di utilizzare tutto lo spazio libero per installare debian (forse la scelta migliore, ma io volevo ancora avere una partizione FAT32...). Se vogliamo invece crearci le partizioni in modo manuale dovremo prestare attenzione solo ad alcune cosette:

  • la partizione su cui installeremo la debian deve avere un file system Ext3, essere "bootabile" (vedremo una "B" nell'indice, prima era nella partizione del vecchio sistema), essere "primaria" e avere come indice di partenza "/".
  • la swap deve avere un file system swap, essere "locale" ed essere grande almeno quanto la memoria RAM.
  • la partizione con file system FAT32 deve essere "primaria".

N.B.: un'opzione semplificata potrebbe essere quella di dire all'installer di utilizzare tutto lo spazio libero per il nuovo sistema operativo; avrete così la partizione ext3 e swap "gestita" dall'installer; poi, per creare la partizione con FAT32, potete ridimensionare la ext3 guadagnando spazio e utilizzando quest'ultimo per creare l'ultima partizione in modo manuale.

Mercoledì: tastiera, risoluzione schermo e shell

Oggi accendo finalmente il pc dopo aver installato la mia prima debian. Un po' di scritte... ecco, adesso posso loggarmi... e finalmente ecco il mio bel desktop! Peccato che la mia eccitazione già si arresta appena provo a scrivere due cosettine... i caratteri visualizzati non corrispondono ai tasti premuti... mhmm... lo sapevo che non potevo utilizzare la tastiera del mac...

La tastiera

Per "sintonizzare" la tastiera abbiamo due possibilità: utilizzare le preferenze di GNOME o modificare il file /etc/X11/xorg.conf

Preferenze GNOME

Dal menu nella barra superiore scegliere: sistema > preferenze > tastiera. Sotto "Layouts" scegliere il modello (ad es. per mac, macintosh) e la lingua predefinita. Sempre nel caso Apple, per configurare il tasto "Alt-Gr" si può andare sotto "Layout Options" > "Third level choosers" e scegliere Left win-key o Right win-key per avere il tasto "mela" di sinistra o destra come un "Alt-Gr".

/etc/X11/xorg.conf

In questo file troviamo la configurazione del sistema grafico. La tastiera la troviamo sotto Identifier "Generic Keyboard" o qualcosa del genere. A destra di Option "XkbModel" avremo il modello, ad esempio "macintosh", con Option "XkbLayout" avremo la lingua, ad esempio "it". Se si volesse ancora una volta abilitare un tasto "mela" con la funzione di "Alt-Gr", bisognerà aggiungere l'opzione Option "XkbOptions" "lv3:lwin_switch" per la "mela" di sinistra o "lv3:rwin_switch" per quella di destra.

A questo punto una domanda è però lecita: come si modifica il file /etc/X11/xorg.conf? Dalla shell... vediamo quasi subito...

La risoluzione dello schermo

In questo caso si può scegliere da sistema > preferenze > risoluzione monitor un valore. Se non dovrebbe esserci quello che cerchiamo bisognerà ancora una volta modificare il file /etc/X11/xorg.conf. Questa volta cercheremo la parte con Identifier "Default screen". Nelle susseguenti Subsection "Display" andremo sotto "Modes" ad inserire la risoluzione cercata.

Warning.png ATTENZIONE
non è detto che inserendo una risoluzione sotto "Modes" venga correttamente accettata; questo perchè la risoluzione è dipendente anche dai drivers utilizzati. In altre parole, se dovreste avere problemi a riguardo, consultate la rete per accertare il vostro driver ed eventuali istruzioni per aggiornarlo/cambiarlo.


La shell

Giusto per chiarire i termini, la shell è la linea di comando (= terminale). In debian si chiama bash. È uno strumento molto potente e alla base di tutte le impostazioni del sistema operativo. Come citato sopra, utilizzeremo la shell per avere i diritti di superuser per poter modificare il file /etc/X11/xorg.conf. Per prima cosa controlliamo se abbiamo installato sudo (superuser do; questo comando ci permette di fare delle azioni come superuser, senza però doverci "loggare" in quanto tale):

~$ su (invio), dare la password, ~# apt-get install sudo

Se è già installato il sistema ci avviserà, altrimenti si potrà installare il programma (maggiori dettagli sull'installazione dei programmi si trovano nell'ultima giornata). Per fare il logout da superuser semplicemente scrivere "exit" ed invio. Poi dobbiamo dare al nostro utente i diritti di superuser. Per fare ciò dovremo loggarci dapprima come superuser e poi modificare il file /etc/sudoers tramite un editor di testo su shell. Per questioni di semplicità utilizzeremo "nano":

~$ su (invio), dare la password, ~# nano /etc/sudoers

A questo punto otterremo una mini interfaccia grafica; fra le righe troveremo la seguente linea:

root      ALL=(ALL) ALL ; dove sotto aggiugeremo (spostando il cursore con le frecce)
<nostronomeutente>  ALL=(ALL) ALL

Per concludere, ctrl+O per salvare ed infine ctrl+X per uscire. Quando vorremo ora eseguire un'azione con diritti da superuser (amministratore) basterà digitare "sudo" e poi l'azione voluta.
Torniamo ora alla modifica del nostro xorg.conf. Il modo più semplice è di modificarlo con gedit (gnome). Daremo il comando:

~$ sudo gedit /etc/X11/xorg.conf

Avremo così aperto il file con un editor grafico, gedit appunto, e grazie a sudo avremo i diritti di scrittura per modificarlo. Nel capitolo relativo ai permessi vedremo altri comandi base della shell ed un chiarimento sui permessi di scrittura di un file.

Giovedì: allacciamoci alla rete

Con il cavo dell'ethernet conficcato nella scheda ho potuto per fortuna installare sudo... ora però vorrei capire meglio come funziona la rete e come potrei configurarla. E se volessi anche un Wireless? Già non ci capisco più niente...

Configurare la rete tramite il file /etc/network/interfaces

Rete ethernet cablata

Per configurare una rete esistono varie applicazioni grafiche (come network-manager), ma il consiglio è quello di configurarla con il file sopracitato (che verrà "caricato" durante l'accensione del pc); una volta capito il sistema non avrete così mai un problema. Come prima cosa, onde evitare spiacevoli interazioni con il sistema grafico, andremo a disinstallare il network-manager:

~$ sudo apt-get remove network-manager network-manager-gnome

Avendo fatto l'installazione tramite la net-install e la rete diamo per scontato che la scheda ethernet funziona. Per vedere le schede di rete del nostro sistema diamo il comando:

~$ sudo ifconfig -a

Otterremo una lista con a sinistra i nome delle interfacce e a destra la loro configurazione (con ifconfig senza "-a" vedremo solo le schede attive). La scheda ethernet dovrebbe avere un nome tipo "eth0" (o "eth1", ...). La scheda con il nome di "lo" al momento la lasceremo perdere, non ci servirà. Per configurare ora la scheda andiamo a editare il file /etc/network/interfaces (alias lo apriamo con gedit in modalità amministratore, così da poterlo modificare; volutamente non vi scrivo come fare, ma è la stessa cosa di come abbiamo fatto con /etc/X11/xorg.conf, vero?). Otterremo qualcosa del genere:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp

La scheda viene "caricata" all'accensione del sistema (auto eth0) e viene utilizzata tramite dhcp (inet dhcp). Per configurare una rete con ip fisso vi lascio a guide più dettagliate, presenti ovunque e dovunque in rete (a partire da debianizzati).

Rete Wireless

Come prima cosa dobbiamo installare un pacchetto per la gestione del wireless:

~$ sudo apt-get install wireless-tools

Fatto questo, un requisito fondamentale è avere una scheda wireless riconosciuta dal sistema. Per verificare daremo il comando:

~$ sudo iwconfig

Come abbiamo visto con ifconfig, avremo sulla sinistra le sigle delle interfacce di rete e sulla destra le loro caratteristiche. La scheda ethernet avrà la descrizione "no wireless extensions.", così come "lo". La nostra scheda wireless non avrà dunque questa scritta, ma un elenco di parametri (tipo ESSID, Mode, ...). Il nome può variare a seconda dei drivers utilizzati (wlan0, ra0, eth1, eth2, ...).

Warning.png ATTENZIONE
se la scheda wireless non viene visualizzata bisogna installare dei drivers (o magari anche solo un firmware). La procedura varia molto a seconda della scheda utilizzata. Il procedimento non verrà dunque descritto. Un buon inizio è dare il comando "lspci" per visualizzare il chipset della scheda e consultare la rete (alias google, forum, ...) per il procedimento d'installazione.


Per vedere le reti wireless accessibili alla nostra scheda diamo il comando:

~$ sudo iwlist scan

Sceglieremo poi la rete alla quale vogliamo collegarci e annoteremo il nome ESSID e il numero di canale (Channel). A questo punto, editiamo ancora una volta il nostro file /etc/network/interfaces e aggiungeremo le seguenti righe (ammettiamo di avere la scheda wireless "wlan0":

auto wlan0                          (vogliamo "caricare" la scheda all'avvio)
iface wlan0 inet dhcp               (chiediamo un ip tramite dhcp)
wirless-essid <nomerete>            (scegliamo a che rete collegarci)
wireless-channel <numerocanale>     (scegliamo il canale)
wireless-key s: <password rete>     (diamo la password se necessario)

Questo sistema funziona con una rete aperta o con chiave WEP. Per una rete con WPA si può configurare "wpasupplicant" (divertitevi con le ricerche: google, forum, ...); il metodo forse però più semplice è quello di editare il nostro file nel modo seguente;

auto wlan0                              (vogliamo "caricare" la scheda all'avvio)
iface wlan0 inet dhcp                   (chiediamo un ip tramite dhcp)
pre-up ifconfig wlan0 up                (carichiamo "al volo" l'interfaccia)
pre-up iwconfig wlan0 essid <nomerete>  (scegliamo a che rete collegarci)
pre-up iwconfig wlan0 mode Managed      (scegliamo il modo [visibile con lo scanning])
pre-up iwconfig wlan0 channel 1         (scegliamo il canale)
pre-up iwpriv wlan0 set AuthMode=WPAPSK (scegliamo il tipo di WPA)
pre-up iwpriv wlan0 set EncrypType=TKIP (scegliamo il tipo di criptazione)
pre-up iwpriv wlan0 set WPAPSK=xxxxxxxx (diamo la password)
Warning.png ATTENZIONE
la password deve venire scritta in modo criptato!


Per fare ciò possiamo installare in ogni caso il pacchetto "wpasupplicant" e poi criptare la nostra password con:

~$ sudo apt-get install wpasupplicant     ; dopo aver installato il pacchetto digitiamo:
~$ wpa_passphrase <nomerete> <password>

L'output sarà la password criptata. Non ci resta che ricopiarla nel nostro /etc/network/interfaces. Per utilizzare ora la nostra scheda dobbiamo riavviare la rete con:

~$ sudo /etc/init.d/networking restart

Onde evitare interazioni potete disabilitare la scheda ethernet, mettendo il segno "#" davanti alle righe che la concernono (auto eth0 e iface eth0 inet dhcp). Come già detto, per la configurazione di wpasupplicant e tutte le reti più complesse, spazio ad altre guide ;-) !

Venerdì: permessi e spostamento files/cartelle

Con il week end alle porte sono oggi invogliato a "fare un giretto" nella mia nuova debian. Provo a spostarmi fra le cartelle, ordinare dei file... ma... alcuni file non me li lascia spostare... Non ho i diritti... Ma se il computer è il mio?! Uffa... e adesso che faccio? Vorrei magari viaggiare anche un po' con la shell, ma con tutti questi comandi assurdi, non ci si capisce niente!

comandi base shell

A metà settimana abbiamo imparato i primi comandi della shell (sudo e editare un testo con diritti d'amministratore); oggi vedremo dei comandi semplici per muoverci all'interno del sistema.

~$ cd [percorso] => per spostarci fra le cartelle.

Ad es. cd /home/[nostro nome utente] ci porterà nella nostra cartella d'utente (quella che di default è "selezionata" quando apriamo una sessione di shell), cd / ci porterà nella cartella principale del sistema. Con il comando cd .. "retrocediamo" di una cartella. Non hai capito? Prova...

Per "percorrere" le cartelle esiste un metodo molto pratico che ci farà risparmiare tempo ed errori: il tasto "TAB" (quello per fare i rientri, sulla tastiera in alto a sinistra), che completerà automaticamente le parole. Ad es. per editare il file /etc/network/interfaces "tippiamo": sudo ged [tab] /e [tab] net [tab] / in [tab].

~$ ls => ci mostra il contenuto della cartella attuale.

Con il comando ls -a vedremo anche le cartelle o i file nascosti (preceduti da un punto), con ls -l vediamo dei dati supplementari per ogni elemento della cartella (dettagli in "permessi").

~$ mv [file/cartella] [nuova location o nuovo nome file] => sposta o rinomina un file o una cartella.

È anche possibile eseguire entrambe le operazioni dando un nuovo nome al file/cartella ed una nuova location. Attenzione ai permessi... (vedi sotto).

~$ rm [file] => rimuove un file. Per rimuovere cartelle, rm -r [cartella].

Attenzione ai permessi... (vedi sotto).

~$ cp [file] [location e nome file] => copia un file. Per copiare cartelle, cp -r [cartella] [location e nome cartella].

Come con mv, è possibile rinominare "al volo" (dando un nuovo nome) la copia del file. Attenzione ai permessi... (vedi sotto).

Per tutti gli altri comandi troverete istruzioni su debianizzati e nella rete. Per capire la sintassi di un comando o visualizzare le opzioni possibili esistono due comandi molto comodi:

~$ man [comando] => mostra il funzionamento del comando. Ad es. man cp (premere "q" per uscire).
~$ [comando] --help => più o meno la stessa cosa, forse qualche dettaglio in meno.

Permessi

Per avere un'idea, proviamo a dare il comando ls -l nella cartella principale (sapete come "andarci", vero?). Fra tutte le cartelle prendiamo in analisi la home:

drwxr-xr-x   3 root root  4096 2007-12-05 17:41 home

Da sinistra verso destra otteniamo le segunti informazioni:

  • d: sta per directory -> l'elemento è una cartella.

Le prossime lettere si leggono a tre a tre, rispettivamente per proprietario, gruppo, tutti gli altri. Le lettere significano:

  • r: sta per read -> è possibile leggere l'elemento.
  • w: sta per write -> è possibile scrivere/manipolare l'elemento.
  • x: sta per executable -> è possibile far eseguire l'elemento.

Nel nostro esempio, la home ha i seguenti attributi:

  • proprietario: può leggere, scrivere/manipolare e "eseguire" l'elemento.
  • gruppo: può leggere e "eseguire" l'elemento, ma non scriverlo/manipolarlo.
  • tutti: possono leggere e "eseguire" l'elemento, ma non scriverlo/manipolarlo.
  • 3: sta per il numero degli elementi inclusi. Se è una cartella è il numero dei file in essa, se è un file i valore sarà 1.
  • root: è il nome del proprietario del file o della cartella.
  • root: (il secondo nome) è il nome del gruppo al quale appartiene l'elemento.
  • 4096: è la dimensione dell'elemento in bytes. N.B. per una cartella, non si tratta della somma di tutti gli elementi in essa, ma solo dello spazio che occupa la cartella vuota.
  • 2007-12-05 17:41: data e orario di creazione/modifica.
  • home: nome dell'elemento.

A questo punto capiamo perchè non ci era possibile modificare il file /etc/network/interfaces; questo appartiene a root (-rw-r--r-- 1 root root 719 2007-12-11 10:21 interfaces) e solo root può scriverlo. Perciò dobbiamo avere i privilegi da root (ottenuti con sudo, grazie al file /etc/sudoers) per modificarlo. La stessa cosa vale per spostare dei files dei quali non siamo il proprietario. In generale, l'unica cartella del sistema che ci appartiene (come utente) è la cartella /home/[nostro nome utente] con tutto il suo contenuto.

Cambiare permessi/proprietario

Per cambiare i permessi di un elemento abbiamo il comando chmod. Questo comando ha due sintassi possibili: una con ugo+/-rwx e l'altra con 3 numeri (4,2,1). In questa guida vi indicherò come si utilizza il sistema "numerico", per l'altro metodo, vi ricordate come si "studia" un comando? man...
I numeri rappresentano i permessi:

  • 4: sta per read -> leggere.
  • 2: sta per write -> scrivere/manipolare.
  • 1: sta per executable -> eseguibile.

Per dare i permessi ad un elemento non faremo nient'altro che calcolare la somma dei permessi che si vogliono attribuire e darli nell'ordine: proprietario, gruppo, altri. Per dare un esempio, per dare i permessi ad un file uguali alla cartella home (vedi sopra), daremo:

~$ chmod 755 [file] ; per una cartella ~$ chmod -R 755 [cartella]

Mi sembra inutile aggiungere che per modificare i diritti di un elemento bisogna essere il proprietario o averne i diritti (v. sudo).

Per cambiare il proprietario o il gruppo di un elemento abbiamo il comando chown:

~$ chown [nuovo nome proprietario]:[nome nuovo gruppo] ; per una cartella chown -R [nuovo nome proprietario]:[nome nuovo gruppo]

Sabato: repository... ?

OK, lentamente ci siamo. Il mio sistema incomincia a prendere forma e sento che sono quasi pronto ad installare i miei primi programmi. Mi domando però da dove sia possibile "prelevarli"...

Cosa sono i repository

I repository sono una sorta di "lista" di installatori di programmi contenuti in un archivio. Quest'ultimo può trovarsi su supporto removibile (CD, DVD, ...) oppure in rete. Questi "installatori" ci permetteranno poi di installare un programma con tutti i pacchetti (dipendenze) relativi ad esso. Ma non anticipiamo troppo i tempi.

Dove sono i repository e come si modificano

I repository si trovano nel file /etc/apt/sources.list. Per modificarli, basta editare il file con qualsiasi editor di testo ed aggiungere quelli che si desiderano. In questa guida non vi annoierò cercando di capire quali sono quelli da installare; fatevi un giro in rete e troverete mille proposte, a voi scegliere ciò che preferite (del resto, sarebbe uguale voler dimostrare quale distro di GNU/Linux sia la migliore...). Inoltre, per incominciare, nei repository ufficiali della debian (configurati in modo automatico durante l'installazione) troverete già tantissime applicazioni; saranno nuove esigenze che vi porteranno ad aggiungerne magari altri, magari niente.

Domenica: aggiorniamo il sistema e installiamo i programmi

Yuppi! Ecco il giorno che aspettavo! Finalmente installerò tutti i programmi che mi servono e la mia nuova debian sarà così pronta per il mio uso quotidiano. Allora, incominciamo ad aggiornare il sistema...

Aggiornare il sistema

Essendo le liste dei repository in continuo aggiornamento, per ottenere sempre le liste aggiornate digitiamo:

~$ sudo apt-get update

A questo punto possiamo aggiornare il nostro sistema (e i programmi già installati) con i seguenti comandi:

~$ sudo apt-get upgrade
oppure ~$ sudo apt-get dist-upgrade

A dire il vero l'oppure non è propriamente corretto. Con il primo comando andremo ad aggiornare tutti i pacchetti presenti nel sistema SENZA installare dei nuovi pacchetti e SENZA eliminarne. Con il secondo comando andremo ad eseguire la stessa operazione, ma questa volta, se sono presenti nuovi pacchetti verranno installati e pacchetti non più presenti saranno eliminati. In tutti e due i casi, il sistema ci avviserà sempre dei cambiamenti che verranno effettuati e dovremo confermare la nostra scelta con un bel yes.

Installare programmi con apt

Ogni programma dipende da vari pacchetti che a loro volta possono interagire con altri pacchetti ancora. Pensate ora se dovessimo installare un programma e dovessimo poi cercare "a manina" tutto ciò che occorre per farlo funzionare, senza poi inoltre avere brutte interazioni con gli altri programmi... brrrr... Per fortuna apt fa tutto ciò per noi. Possiamo utilizzarlo sia in modalità grafica che in modalità da linea di comando.

Apt e shell

In questa guida lo abbiamo già utilizzato più di una volta per installare i programmi che ci servivano; la sintassi è semplice:

~$ sudo apt-get install <nomepacchetto>    (per installare un programma)
~$ sudo apt-get remove <nomepacchetto>     (per disinstallare un programma)

Un piccolo trucco per visualizzare in modo rapido i vari pacchetti sta ancora una volta nel tasto "tab": oltre a completare il nome di un pacchetto presente nei repository, si può anche premere due volte ottenendo la lista di tutti i pacchetti che iniziano con le lettere digitate. Ad esempio, digitando ~$ sudo apt-get install gnome (e premere due volte tab), otteniamo la lista di tutti i pacchetti che incominciano con "gnome".

Apt e Synaptic

Come detto, apt si può anche utilizzare in veste grafica con il programma Synaptic package Manager, presente nel menu sistema -> amministrazione. Il programma è molto intuitivo: per ad esempio installare un pacchetto basta cercarlo nella lista e "cliccarlo" con il tasto destro, scegliendo l'opzione "installa" fra quelle possibili. Tutte le funzionalità del programma le lascio scoprire da voi...

Installare pacchetti .deb e da sorgenti

Le opzioni presenti nel sottotitolo sono le altre possibilità per installare un programma sulla debian. Alle prime armi è però tutto sconsigliato, in quanto di difficile gestione, fra dipendenze ed interazioni. Inoltre con apt potete installare una moltitudine di programmi fino a saturare le vostre capacità d'immaginazione. Per programmi recenti imparerete poi ad utilizzare i backports o a mixare releases diverse. Apt non finirà mai di stupirvi!

Conclusione

Finisce così questa guida. Essendo io stesso alle prime armi ho cercato di riassumere gli affanni più grandi che ho avuto, dando per ognuno uno spunto dal quale incominciare. Sperando di avervi dato alcune basi per "resistere" i primi giorni a fianco della debian, non vi resta ora che lanciarvi appieno nel fantastico mondo del free software ed apprendere ogni giorno qualcosina in più. La rete è piena di risorse e ogni volta che un nuovo problema compare, pensate che qualcuno da qualche parte nel mondo avrà già vissuto la stessa identica cosa... e oggigiorno, il mondo è piccolo...