1.14. /proc

/proc è una directory molto speciale poiché è anche un filesystem virtuale. A volte viene indicato come un sistema di pseudo-file per l'informazione sui processi. Non contiene file "reali" ma informazioni sul sistema mentre è in esecuzione (per esempio memoria di sistema, dispositivi montati, configurazione dell'hardware, etc.). Per questa ragione può essere considerato come un centro di controllo e di informazioni per il kernel. Infatti, diverse utilità di sistema sono delle semplici chiamate a file contenuti in questa directory; per esempio, il comando "lsmod" è lo stesso di "cat /proc/modules" mentre "lspci" è equivalente a "cat /proc/pci". Modificando i file contenuti in questa directory si possono anche leggere o modificare i parametri del kernel (sysctl) mentre il sistema è in esecuzione.

La cosa che più caratterizza i file di questa directory è il fatto che tutti hanno dimensione 0, ad eccezione di kcore, mtrr e self. Una lista del contenuto della directory appare simile a questa:


total 525256
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 1
dr-xr-xr-x    3 daemon   root            0 Jan 19 15:00 109
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 170
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 173
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 178
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 2
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 3
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 4
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 421
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 425
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 433
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 439
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 444
dr-xr-xr-x    3 daemon   daemon          0 Jan 19 15:00 446
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 449
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 453
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 456
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 458
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 462
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 463
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 464
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 465
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 466
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 467
dr-xr-xr-x    3 gdm      gdm             0 Jan 19 15:00 472
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 483
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 5
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 6
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 7
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 8
-r--r--r--    1 root     root            0 Jan 19 15:00 apm
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 bus
-r--r--r--    1 root     root            0 Jan 19 15:00 cmdline
-r--r--r--    1 root     root            0 Jan 19 15:00 cpuinfo
-r--r--r--    1 root     root            0 Jan 19 15:00 devices
-r--r--r--    1 root     root            0 Jan 19 15:00 dma
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 driver
-r--r--r--    1 root     root            0 Jan 19 15:00 execdomains
-r--r--r--    1 root     root            0 Jan 19 15:00 fb
-r--r--r--    1 root     root            0 Jan 19 15:00 filesystems
dr-xr-xr-x    2 root     root            0 Jan 19 15:00 fs
dr-xr-xr-x    4 root     root            0 Jan 19 15:00 ide
-r--r--r--    1 root     root            0 Jan 19 15:00 interrupts
-r--r--r--    1 root     root            0 Jan 19 15:00 iomem
-r--r--r--    1 root     root            0 Jan 19 15:00 ioports
dr-xr-xr-x   18 root     root            0 Jan 19 15:00 irq
-r--------    1 root     root     536809472 Jan 19 15:00 kcore
-r--------    1 root     root            0 Jan 19 14:58 kmsg
-r--r--r--    1 root     root            0 Jan 19 15:00 ksyms
-r--r--r--    1 root     root            0 Jan 19 15:00 loadavg
-r--r--r--    1 root     root            0 Jan 19 15:00 locks
-r--r--r--    1 root     root            0 Jan 19 15:00 mdstat
-r--r--r--    1 root     root            0 Jan 19 15:00 meminfo
-r--r--r--    1 root     root            0 Jan 19 15:00 misc
-r--r--r--    1 root     root            0 Jan 19 15:00 modules
-r--r--r--    1 root     root            0 Jan 19 15:00 mounts
-rw-r--r--    1 root     root          137 Jan 19 14:59 mtrr
dr-xr-xr-x    3 root     root            0 Jan 19 15:00 net
dr-xr-xr-x    2 root     root            0 Jan 19 15:00 nv
-r--r--r--    1 root     root            0 Jan 19 15:00 partitions
-r--r--r--    1 root     root            0 Jan 19 15:00 pci
dr-xr-xr-x    4 root     root            0 Jan 19 15:00 scsi
lrwxrwxrwx    1 root     root           64 Jan 19 14:58 self -> 483
-rw-r--r--    1 root     root            0 Jan 19 15:00 slabinfo
-r--r--r--    1 root     root            0 Jan 19 15:00 stat
-r--r--r--    1 root     root            0 Jan 19 15:00 swaps
dr-xr-xr-x   10 root     root            0 Jan 19 15:00 sys
dr-xr-xr-x    2 root     root            0 Jan 19 15:00 sysvipc
dr-xr-xr-x    4 root     root            0 Jan 19 15:00 tty
-r--r--r--    1 root     root            0 Jan 19 15:00 uptime
-r--r--r--    1 root     root            0 Jan 19 15:00 version

Ognuna delle directory numerate corrisponde a un ID di processo effettivo. Guardando la tabella dei processi si possono trovare le corrispondenze con gli ID di processo associati. Per esempio, la tabella dei processi per la secure shell server (sshd) potrebbe indicare quanto segue:


# ps ax | grep sshd
439 ? S 0:00 /usr/sbin/sshd

Si possono ottenere maggiori dettagli su questo processo guardando i file associati nella directory del processo /proc/460. Può sembrare strano che si possano vedere i dettagli di un processo il cui file ha una dimensione pari a 0; ha più senso se lo si vede come una "finestra" sul kernel. Il file in realtà non contiene alcun dato; agisce solo come un puntatore a dove risiedono realmente le informazioni sul processo. Per esempio, una lista dei file nella directory /proc/460 appare simile alla seguente:

total 0
-r--r--r--    1 root     root            0 Jan 19 15:02 cmdline
lrwxrwxrwx    1 root     root            0 Jan 19 15:02 cwd -> /
-r--------    1 root     root            0 Jan 19 15:02 environ
lrwxrwxrwx    1 root     root            0 Jan 19 15:02 exe -> /usr/sbin/sshd
dr-x------    2 root     root            0 Jan 19 15:02 fd
-r--r--r--    1 root     root            0 Jan 19 15:02 maps
-rw-------    1 root     root            0 Jan 19 15:02 mem
lrwxrwxrwx    1 root     root            0 Jan 19 15:02 root -> /
-r--r--r--    1 root     root            0 Jan 19 15:02 stat
-r--r--r--    1 root     root            0 Jan 19 15:02 statm
-r--r--r--    1 root     root            0 Jan 19 15:02 status

Lo scopo e i contenuti di ognuno di questi file è spiegato qui di seguito:

/proc/PID/cmdline

Argomenti da riga di comando.

/proc/PID/cpu

L'attuale e l'ultima cpu nel quale è stato eseguito il processo.

/proc/PID/cwd

Collegamento alla directory di lavoro corrente.

/proc/PID/environ

Valori delle variabili d'ambiente.

/proc/PID/exe

Collegamento agli eseguibili del processo.

/proc/PID/fd

Directory contenente tutti i descrittori dei file.

/proc/PID/maps

Mappe di memoria per gli eseguibili e per i file di libreria.

/proc/PID/mem

Memoria occupata dal processo.

/proc/PID/root

Collegamento alla directory principale del processo.

/proc/PID/stat

Stato del processo.

/proc/PID/statm

Informazioni sullo stato della memoria del processo.

/proc/PID/status

Stato del processo in forma leggibile.

Per saperne di più, la pagina man di proc descrive ognuno dei file associati a un ID del processo in esecuzione con maggior dovizia di particolari.

Anche se i file sembrano avere dimensione 0, l'esame dei loro contenuti rivela il contrario:

# cat status


Name: sshd
State: S (sleeping)
Tgid: 439
Pid: 439
PPid: 1
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 32
Groups: 
VmSize:     2788 kB
VmLck:        0 kB
VmRSS:     1280 kB
VmData:      252 kB
VmStk:       16 kB
VmExe:      268 kB
VmLib:     2132 kB
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 8000000000001000
SigCgt: 0000000000014005
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff

I file nella directory /proc agiscono in modo molto simile ai file delle sottodirectory degli ID dei processi. Per esempio, esaminando il contenuto del file /proc/interrupts si vedrà qualcosa di simile:

# cat interrupts

           CPU0       
  0:      32657          XT-PIC  timer
  1:       1063          XT-PIC  keyboard
  2:          0          XT-PIC  cascade
  8:          3          XT-PIC  rtc
  9:          0          XT-PIC  cmpci
 11:        332          XT-PIC  nvidia
 14:       5289          XT-PIC  ide0
 15:         13          XT-PIC  ide1
NMI:          0 
ERR:          0

Ciascun numero della colonna a sinistra rappresenta l'interrupt in uso. Nel file sono contenuti i dati associati, che possono essere visualizzati sullo schermo. La maggior parte dei file system /proc è di sola lettura; tuttavia in alcuni file si possono cambiare le variabili del kernel. Questo fornisce un meccanismo per rimodulare effettivamente il kernel senza doverlo ricompilare e riavviare il sistema.

Il programma di utilità procinfo fa un riepilogo delle informazioni sul file system /proc e le mostra sullo schermo come nel seguente esempio:

# /usr/bin/procinfo

Linux 2.4.18 (root@DEB) (gcc 2.95.4 20011002 ) #2 1CPU [DEB.(none)]

Memory:      Total        Used        Free      Shared     Buffers      Cached
Mem:        513908      107404      406504           0        2832       82180
Swap:       265032           0      265032

Bootup: Sun Jan 19 14:58:27 2003    Load average: 0.29 0.13 0.05 1/30 566

user  :       0:00:10.26   2.3%  page in :    74545  disk 1:     6459r     796w
nice  :       0:00:00.00   0.0%  page out:     9416  disk 2:       19r       0w
system:       0:00:19.55   4.5%  swap in :        1
idle  :       0:06:48.30  93.2%  swap out:        0
uptime:       0:07:18.11         context :    22059

irq  0:     43811 timer                 irq  9:         0 cmpci                
irq  1:      1427 keyboard              irq 11:       332 nvidia               
irq  2:         0 cascade [4]           irq 12:         2                      
irq  6:         2                       irq 14:      7251 ide0                 
irq  8:         3 rtc                   irq 15:        83 ide1                 

/proc/apm

Informazioni sull'"Advanced power management".

/proc/bus

Directory contenente le informazioni relative ai bus.

/proc/cmdline

La riga di comando del kernel.

/proc/cpuinfo

Informazioni sul processore, come il tipo, la marca, il modello e le prestazioni.

/proc/devices

Lista dei driver di dispositivo configurati nel kernel attualmente in esecuzione (a blocchi e a caratteri).

/proc/dma

Mostra i canali DMA in uso in un determinato momento.

/proc/driver

In questa directory vengono raggruppate le informazioni relative a diversi driver, di solito rtc.

/proc/execdomains

I dominî degli eseguibili, relativi alla sicurezza.

/proc/fb

Dispositivi del Frame Buffer.

/proc/filesystems

Un elenco di filesystem configurati nel kernel o supportati da esso.

/proc/fs

I file conteneti i parametri del file system, di solito nfs/exports.

/proc/ide

Questa sottodirectory contiene informazioni su tutti i dispositivi IDE riconosciuti dal kernel. Contiene una sottodirectory per ogni controller IDE, il file "drivers" e un collegamento per ogni dispositivo IDE che punta alla directory del dispositivo nel sottoalbero del controller. Il file "drivers" contiene informazioni generali sui driver usati per i dispositivi IDE. Si possono trovare informazioni più dettagliate nelle sottodirectory relative al singolo controller, le quali sono denominate ide0, ide1, e così via. Ognuna di queste directory contiene i seguenti file:

/proc/ide/ide?/channel

Canale IDE (0 o 1)

/proc/ide/ide?/config

Configurazione (solo per bridge PCI/IDE)

/proc/ide/ide?/mate

Nome di mate (onchip partnered controller)

/proc/ide/ide?/model

Type/Chipset del controller IDE

Ogni dispositivo connesso a un controller ha una sottodirectory separata nella directory dei controller. In queste directory sono contenuti i seguenti file:

/proc/ide/ide?/model/cache

La cache.

/proc/ide/ide?/model/capacity

Capacità del supporto (in blocchi da 512 byte)

/proc/ide/ide?/model/driver

Driver e versione

/proc/ide/ide?/model/geometry

Geometria fisica e logica

/proc/ide/ide?/model/identify

Blocco di identificazione del dispositivo

/proc/ide/ide?/model/media

Tipo di supporto

/proc/ide/ide?/model/model

Identificatore del dispositivo

/proc/ide/ide?/model/settings

Configurazione del dispositivo

/proc/ide/ide?/model/smart_thresholds

Soglie per la gestione del disco IDE

/proc/ide/ide?/model/smart_values

Valori per la gestione del disco IDE

/proc/interrupts

Mostra quali interrupt sono in uso e quante volte ciascuno di essi è stato chiamato.

Guardando nel file /proc/interrupts è possibile per esempio controllare quali interrupt sono attualmente in uso e per cosa sono stati usati:

# cat /proc/interrupts

 
  CPU0 0: 8728810 
  XT-PIC timer 1: 895
  XT-PIC keyboard 2: 
  0 XT-PIC cascade 3: 531695 
  XT-PIC aha152x 4: 2014133
  XT-PIC serial 5: 44401 
  XT-PIC pcnet_cs 8: 2 
  XT-PIC rtc 11: 8 
  XT-PIC i82365 12: 182918 
  XT-PIC PS/2 Mouse 13: 1 
  XT-PIC fpu 14: 1232265 
  XT-PIC ide0 15: 7
  XT-PIC ide1 NMI: 0 
  

Nei kernel 2.4 e derivati erano state aggiunte un paio di righe a questo file LOC & ERR (questo è l'output di una macchina SMP):

# cat /proc/interrupts

 
  CPU0 CPU1 
  0: 1243498 1214548 IO-APIC-edge timer 
  1: 8949 8958 IO-APIC-edge keyboard 
  2: 0 0 XT-PIC cascade 
  5: 11286 10161 IO-APIC-edge soundblaster 
  8: 1 0 IO-APIC-edge rtc 
  9: 27422 27407 IO-APIC-edge 3c503 
  12: 113645 113873 IO-APIC-edge PS/2 Mouse 
  13: 0 0 XT-PIC fpu 14: 22491 24012 IO-APIC-edge ide0 
  15: 2183 2415 IO-APIC-edge ide1 
  17: 30564 30414 IO-APIC-level eth0 
  18: 177 164 IO-APIC-level bttv NMI: 2457961 2457959 
              LOC: 2457882 2457881 ERR: 2155 
  

NMI in questo caso è incrementato perché ogni interrupt del timer genera un NMI (Non Maskable Interrupt) che è usato dal NMI Watchdog per individuare i lookup.

LOC è il contatore dell'interrupt locale dell'APIC interno di ogni CPU.

ERR è incrementato nel caso di errori nel bus IO-APIC (il bus che connette le CPU in un sistema SMP). Questo vuol dire che è stato individuato un errore e il IO-APIC ritenta automaticamente la trasmissione, pertanto non dovrebbe essere un grosso problema; comunque è meglio leggere le SMP-FAQ.

In questo contesto sarebbe interessante osservare la nuova drectory irq nel kernel 2.4. Potrebbe essere usata per impostare l'affinità tra IRQ e CPU, cioè è possibile consentire al sistema di connettere un particolare IRQ a un'unica CPU, oppure escludere una CPU dalla gestione degli IRQ. Il contenuto della sottodirectory irq è una sottodirectory per ogni IRQ e un file, prof_cpu_mask. Per esempio,

 
  # ls /proc/irq/ 0 10 12 14 16 18 2 4 6 8 prof_cpu_mask
                  1 11 13 15 17 19 3 5 7 9
  

 
  # ls /proc/irq/0/ smp_affinity
  

Il contenuto del file prof_cpu_mask e di ciascun file smp_affinity relativo a ciascun IRQ è lo stesso in modo predefinito:


  # cat /proc/irq/0/smp_affinity
  ffffffff 
  

È un bitmask, nel quale si può specificare quali CPU possono gestire l'IRQ; possono essere impostate in questo modo:

# echo 1 > /proc/irq/prof_cpu_mask

Ciò vuol dire che solo la prima CPU gestisce l'IRQ, ma si può anche impostare con echo 5 che vuol dire che solo la prima e la quarta CPU possono gestire l'IRQ. Il modo in cui gli IRQ vengono instradati è gestito dal IO-APIC, e dal suo Round Robin fra tutte le CPU che possono gestirlo. Come al solito il kernel ha più informazioni dell'utente, e fa un lavoro migliore, per cui è sempre meglio quasi per tutti lasciare le impostazioni predefinite.

/proc/iomem

La mappa della memoria di sistema.

/proc/ioports

Le porte I/O attualmente in uso.

/proc/irq

Le mask per l'affinità dell'irq con la cpu.

/proc/isapnp

Informazioni sulle schede PnP (Plug&Play) di tipo ISA.

/proc/kcore

Un'immagine della memoria fisica del sistema; può essere in formato ELF o A.OUT (abbandonato nel kernel 2.4). Ha esattamente la stessa dimensione della memoria fisica, ma non occupa così tanto spazio; è generato in tempo reale al momento dell'accesso dei programmi alla memoria. Nota bene: a meno che non venga copiato da qualche altra parte, nessun file sotto /proc occupa spazio disco.

/proc/kmsg

Messaggi di output del kernel. Questi sono inviati anche a syslog.

/proc/ksyms

Tabella dei simboli per il kernel.

/proc/loadavg

Il carico medio del sistema; tre indicatori che misurano l'attività del sistema negli ultimi 1, 5 e 15 minuti.

/proc/locks

I file bloccati dal kernel.

/proc/meminfo

Informazioni sull'utilizzo della memoria, sia fisica che di swap. Concatenando questo file si hanno risultati simili a quelli di "free" o delle prime righe di "top".

/proc/misc

Informazioni di varia natura, che non trovano collocazione nel resto del filesystem proc.

/proc/modules

I moduli del kernel correntemente caricati. Tipicamente ha il medesimo output del comando "lsmod".

/proc/mounts

I filesystem montati

/proc/mtrr

Informazioni sugli mtrr. Sui processori Intel della famiglia P6 (Pentium Pro, Pentium II e successivi) gli MTRR (Memory Type Range Registers) possono essere usati per controllare gli accessi del processore a intervalli di memoria. L'utilità maggiore si ha sulle schede video (VGA) su bus PCI o AGP. L'abilitazione del write-combining permette di combinare i trasferimenti in scrittura sul bus in un trasferimento più grande prima che percorrano il bus PCI/AGP. Questo può incrementare le prestazioni sulle operazioni di scrittura di 2,5 volte o più. I processori Cyrix 6x86, 6x86MX e M II hanno gli ARR (Address Range Registers) che forniscono una funzionalità simile agli MTRR. Per questi, gli ARR sono usati per emulare gli MTRR. I processori AMD K6-2 (stepping 8 e superiore) e K6-3 hanno due MTRR. Questi sono supportati. L'AMD della famiglia Athlon fornisce 8 MTRR stile Intel. Il Centaur C6 (WinChip) ha 8 MCR che permettono il write-combining. Anche questi sono supportati. Le CPU VIA Cyrix III e VIA C3 forniscono 8 MTRR stile Intel. Per maggiori dettagli sulla tecnologia mtrr si veda il file /usr/src/linux/Documentation/mtrr.txt.

/proc/net

Informazioni sullo stato dei protocolli di rete.

Informazioni sull'IPv6

/proc/net/udp6

I socket UDP (IPv6).

/proc/net/tcp6

I socket TCP (IPv6).

/proc/net/raw6

Statistiche sul raw device (IPv6).

/proc/net/igmp6

Gli indirizzi IP multicast a cui è collegato l'host (IPv6).

/proc/net/if_inet6

Elenco di indirizzi IPv6 delle interfacce di rete.

/proc/net/ipv6_route

Tabella degli instradamenti del kernel per IPv6.

/proc/net/rt6_stats

Statistiche globali sulla tabella degli instradamenti per IPv6.

/proc/net/sockstat6

Statistiche sui socket (IPv6).

/proc/net/snmp6

Dati snmp (IPv6).

Informazione generali sulla rete

/proc/net/arp

Tabella ARP del kernel.

/proc/net/dev

Dispositivi di rete con statistiche.

/proc/net/dev_mcast

I vari gruppi multicast Layer2 su cui ogni dispositivo è in attesa (indice di interfaccia, etichetta, numero di riferimenti, numero di indirizzi collegati).

/proc/net/dev_stat

Stato del dispositivo di rete.

/proc/net/ip_fwchains

Collegamento alle catene del firewall.

/proc/net/ip_fwnames

Nomi delle catene del firewall.

/proc/net/ip_masq

Directory contenente le tabelle di informazioni sul masquerading.

/proc/net/ip_masquerade

Tabella principale di informazioni sul masquerading.

/proc/net/netstat

Statistiche sulla rete.

/proc/net/raw

Statistiche sui raw device.

/proc/net/route

La tabella di instradamento del kernel.

/proc/net/rpc

Directory contenente informazione sugli rpc.

/proc/net/rt_cache

La cache di instradamento.

/proc/net/snmp

Dati SNMP.

/proc/net/sockstat

Statistiche sul socket.

/proc/net/tcp

I socket TCP.

/proc/net/tr_rif

Tabella di instradamento RIF token ring.

/proc/net/udp

I socket UDP.

/proc/net/unix

I socket del dominio UNIX.

/proc/net/wireless

I dati delle interfacce wireless (Wavelan etc).

/proc/net/igmp

Indirizzi IP multicast collegati da questo host.

/proc/net/psched

Parametri globali del packet scheduler.

/proc/net/netlink

Elenco dei socket PF_NETLINK.

/proc/net/ip_mr_vifs

Elenco delle interfacce virtuali del protocollo multicast.

/proc/net/ip_mr_cache

Elenco della cache di instradamento multicast.

Quest'informazione può essere usata per vedere quali periferiche di rete sono disponibili nel sistema e la quantità di traffico instradato su queste periferiche; inoltre ogni interfaccia Channel Bond ha la propria directory. Per esempio, la periferica bond0 avrà una directory chiamata /proc/net/bond0/, che contiene informazioni specifiche su quel bond, come gli slave correnti del bond, lo stato dei collegamenti degli slave e il numero di volte in cui il collegamento slave non ha avuto successo.

/proc/parport

La directory /proc/parport contiene informazioni sulle porte parallele del sistema. Ha una sottodirectory per ogni porta, che prende il nome dal numero della porta (0,1,2,...).

/proc/parport/autoprobe

Informazioni sugli ID di qualsiasi periferica IEEE-1284 che è stata acquisita.

/proc/parport/devices

Elenco dei driver di periferica che usano quella porta. Un segno + apparirà accanto al nome della periferica che sta correntemente usando la porta (potrebbe non apparire per niente).

/proc/parport/hardware

Indirizzo base della porta parallela, linea di IRQ e canale DMA.

/proc/parport/irq

IRQ che parport sta usando per quella porta. Si trova in un file separato per consentirne la modifica scrivendovi un nuovo valore (numero di IRQ o nessuno).

/proc/partitions

Tabella delle partizioni riconosciute dal sistema

/proc/pci, /proc/bus/pci

Informazioni sul bus PCI, spesso sottovalutate.

/proc/rtc

Real time clock

/proc/scsi

Se nel sistema è presente un adattatore host SCSI ci sarà in /proc/scsi una sottodirectory con lo stesso nome del driver per questo adattatore. Inoltre /proc/scsi contiene un elenco di tutti i dispositivi SCSI riconosciuti. La directory corrispondente al nome del driver ha un file per ogni adattatore trovato nel sistema. Questi file contengono informazioni sul controller, inclusi l'IRQ usato e l'intervallo di indirizzi. La quantità di informazione mostrata dipende dall'adattatore utilizzato.

/proc/self

Un collegamento simbolico alla directory dei processi del programma che sta guardando in /proc. Quando due processi guardano in /proc, ottengono collegamenti diversi. Serve principalmente per facilitare ai programmi il raggiungimento della loro directory dei processi.

/proc/slabinfo

Il file slabinfo fornisce informazioni sull'uso della memoria a livello dello slab. I kernel di Linux di versione superiore a 2.2 utilizzano i pool di slab per gestire la memoria oltre il livello di pagina. Gli oggetti comunemente utilizzati dispongono di pool di slab propri (come buffer di rete, directory cache, e così via).

/proc/stat

Varie statistiche sul sistema, come il numero di errori di pagina da quando il sistema è stato avviato.

/proc/swaps

Utilizzo dello spazio di swap

/proc/sys

Questa non è solo una fonte di informazioni, permette anche di cambiare i parametri all'interno del kernel senza bisogno di ricompilarlo e neanche riavviare il sistema. Bisogna farlo con molta attenzione perché può sia ottimizzare il sistema che renderlo instabile. Si consiglia di leggere sia la documentazione che i sorgenti prima di fare modifiche. Le voci in /proc possono differire leggermente a seconda della versione del kernel, per cui in caso di dubbio rivedere la documentazione del kernel nella directory /usr/src/linux/Documentation. In alcuni casi l'unica alternativa in caso di errore è quella di riavviare la macchina. Per cambiare un valore immettere semplicemente il nuovo valore nel file utilizzando il comando echo. Più avanti è riportato un esempio nella sezione dedicata ai dati del filesystem. Naturalmente tutte queste operazioni vanno eseguite come utente "root"; ci si può creare un proprio script di avvio per eseguirle ad ogni avvio del sistema.

/proc/sys/fs

Contiene i dati sul file system. Questa sottodirectory contiene informazioni specifiche sul file system, file handle, inode, dentry e quote.

dentry-state

Stato della directory della cache. Dal momento che i dati della directory vengono allocati e deallocati dinamicamente, questo file indica lo stato corrente. Contiene sei valori, dei quali gli ultimi due non vengono usati e sono sempre uguali a zero. Gli altri sono elencati qui di seguito:

 
  File      Contenuto 
  nr_dentry Quasi sempre zero 
  nr_unused Numero di voci della cache inutilizzate 
  age_limit I secondi trascorsi i quali la voce può essere
            reclamata, quando la memoria è scarsa 
  want_pages Ad uso interno  

dquot-max

Il file dquot-max mostra il numero massimo di voci di quota disco memorizzate nella cache.

dquot-nr

Mostra il numero di voci allocate nella quota disco e il numero di voci libere nella quota disco. Se il numero di voci di quota disco disponibili nella cache è molto basso e ci sono molti utenti che accedono al sistema simultaneamente, il limite potrebbe essere elevato.

file-nr e file-max

Il kernel alloca i file handle dinamicamente, ma non li libera immediatamente. Il valore in file-max indica il numero massimo di handle che il kernel Linux può allocare. In caso si ripetuti messaggi di errore indicanti una carenza di file handle, questo limite può essere aumentato. Il valore predefinito è 4096. Per cambiarlo basta scrivere il nuovo numero nel file:


  # cat /proc/sys/fs/file-max
  4096
  # echo 8192 > /proc/sys/fs/file-max
  # cat /proc/sys/fs/file-max
  8192
  

Questo metodo di revisione è utile per tutti i parametri del kernel modificabili; basta inserire il nuovo valore nel file corrispondente col comando echo.

I tre valori in file-nr indicano il numero di file handle allocati, il numero di file handle usati e il numero massimo di file handle. Quando i file handle alloccati si avvicinano al massimo ma il numero degli handle attualmente usati ne è ancora lontano, si ha un picco nell'uso dei file handle e non c'è necessità di aumentare il massimo.

inode-state, inode-nr and inode-max

Come per i file handles, il kernel alloca le strutture degli inode dinamicamente, ma non può liberarli ancora.

Il valore in inode-max indica il numero massimo di inode handler. Questo valore dovrebbe essere da 3 a 4 volte più grande del valore in file-max, poiché stdin, stdout e i socket di rete richiedono anche una struttura inode per gestirli. Se capita spesso di avere scarsità di inode si dovrebbe incrementare questo valore.

Il file inode-nr contiene le prime due voci contenute in inode-state, così si può saltare la descrizione di questo file ...

inode-state contiene tre numeri reali e quattro valori fittizi. I numeri sono nr_inodes, nr_free_inodes, e preshrink (in ordine di apparizione).

nr_inodes

Indica il numero degli inode allocati dal sistema, che può essere leggermente più alto rispetto a inode-max perché Linux gli alloca una pagina alla volta.

nr_free_inodes

Rappresenta il numero degli inode liberi e preshrink è diverso da zero quando nr_inodes è maggiore di inode-max e il sistema deve ridurre la lista degli inode invece di allocarne di più.

super-nr and super-max

Ancora, le strutture di superblocchi sono allocate dal kernel, ma non liberate. Il file super-max contiene il numero massimo di gestori di superblocchi, mentre super-nr mostra il numero di quelli correntemente allocati. Ogni file system montato necessita di un superblocco, così se si devono montare molti file system si dovrebbero incrementare questi numeri.

binfmt_misc

Questa directory gestisce il supporto del kernel per diversi formati binari; binfmt_misc fornisce al kernel la capacità di registrare formati binari addizionali senza bisogno di compilare un modulo aggiuntivo del kernel. Perciò binfmt_misc deve conoscere i magic number all'inizio o l'estensione del nome del file binario. Funziona mantenendo un elenco collegato di strutture che contengono una descrizione del formato binario, compreso il magic number con dimensione (o l'estensione del nome del file), offset e maschera, e il nome dell'interprete. A richiesta chiama l'interprete indicato col programma originale come argomento, come fanno binfmt_java, binfmt_em86 e binfmt_mz do. Poichè binfmt_misc non definisce nessun formato binario predefinito, ogni fomato binario aggiuntivo va registrato. In binfmt_misc ci sono due file generici e un file per ogni formato registrato. I due file generici sono register e status. Per registrare un nuovo formato binario bisogna dare il comando echo :nome:tipo:offset:magic:mask:interprete: > /proc/sys/fs/binfmt_misc/register con il nome appropriato (il nome per la voce di directory in /proc), il valore di offset, (il valore predefinito è 0, se non indicato), il magic number, il mask (che può essere omesso, 0xff è il valore predefinito per tutti) e da ultimo ma non meno importante, l'interprete da invocare (per esempio e per prova /bin/echo). Il tipo può essere M per il magic number o E per l'estensione (se si indica l'estensione invece che il magic number). Se si legge il file /proc/sys/fs/binfmt_misc/status con cat, si ottiene lo stato attuale (abilitato/disabilitato) di binfmt_misc. Si può cambiare lo stato inserendo col comando echo i valori 0 (disabilita), 1 (abilita) o -1 (attenzione: questo annulla tutti i formati binari precedentemente registrati) nel file status. Per esempio echo 0 > status per disabilitare binfmt_misc (temporaneamente). Ogni gestore registrato ha una voce in /proc/sys/fs/binfmt_misc. Questi file svolgono la stessa funzione di status ma il loro scopo è limitato al reale formato binario. Leggendo questo file con "cat" si possono ottenere tutte le informazioni collegate sull'interprete/magic number del binfmt. Un esempio sull'uso di binfmt_misc (emulazione di binfmt_java) è il seguente:


  cd /proc/sys/fs/binfmt_misc 
  echo ":Java:M::\xca\xfe\xba\xbe::/usr/local/java/bin/javawrapper:" 
  > register 
  echo ":HTML:E::html::/usr/local/java/bin/appletviewer:"
  > register 
  echo ":Applet:M::<!--applet::/usr/local/java/bin/appletviewer:" >
  register 
  echo ":DEXE:M::\x0eDEX::/usr/bin/dosexec:" < register
  

Queste quattro righe aggiungono il supporto per gli eseguibili e le applet Java (come binfmt_java, in più riconoscendo l'estensione .html senza bisogno di mettere <!--applet> a ogni file di applet). Si deve installare JDK e anche lo script di shell /usr/local/java/bin/javawrapper. Esso funziona aggirando la mancata gestione dei nomi dei file Java. Per aggiungere un binario Java basta creare un collegamento al file-classe da qualche parte del percorso.

/proc/sys/kernel

Questa directory rispecchia il comportamento generale del kernel; i contenuti dipendono dalla configurazione specifica. Qui di seguito vengono elencati i file più importanti, con la spiegazione del loro significato e di come debbano essere usati.

/proc/sys/kernel/acct

Il file contiene tre valori; highwater, lowwater e frequency. Esiste solo se è abilitato l'accounting del processo in stile BSD. Questi valori controllano il suo comportamento. Se lo spazio libero sul file system dove risiede il registro scende al di sotto della percentuale di lowwater, l'accounting viene sospeso; se va al di sopra della percentuale di highwater, l'accounting riprende. Frequency determina la frequenza con cui viene controllata la quantità di spazio libero (il valore è in secondi). Impostazioni predefinite sono: 4, 2 e 30. Cioè, sospensione dell'accounting se c'è meno del 2 per cento libero, ripresa se tale valore è uguale o maggiore del 3 per cento, esame per 30 secondi delle informazioni sulla quantità di spazio libero valido.

/proc/sys/kernel/ctrl-alt-del

Quando il valore in questo file è 0, ctrl-alt-del è intercettato da trap e inviato al programma init per gestire un riavvio corretto; quando invece il valore è maggiore di zero, la reazione di Linux a questa combinazione di tasti è un riavvio immediato, senza sincronizzazione dei dirty buffer. È da notare che quando un programma (come dosemu) ha la tastiera in modalità raw, la combinazione ctrl-alt-del viene intercettata dal programma prima di raggiungere il livello tty del kernel, e spetta al programma decidere cosa fare.

/proc/sys/kernel/domainname, /proc/sys/kernel/hostname

Questi file possono essere utilizzati per impostare il nome di dominio NIS e di host del computer. Per il classico darkstar.frop.org un semplice:

# echo "darkstar" > /proc/sys/kernel/hostname 
# echo "frop.org" > /proc/sys/kernel/domain:mname
dovrebbe essere sufficiente per impostare il nome di host e di dominio NIS.

/proc/sys/kernel/osrelease, /proc/sys/kernel/ostype, /proc/sys/kernel/version

I nomi sono alquanto indicativi del contenuto di questi campi:

# cat /proc/sys/kernel/osrelease 
  2.2.12 
# cat /proc/sys/kernel/ostype 
  Linux 
# cat /proc/sys/kernel/version 
  #4 Fri Oct 1 12:41:14 PDT 1999.
I file osrelease e ostype dovrebbero essere abbastanza chiari. Version necessita di qualche chiarimento; #4 vuol dire che è la quarta compilazione del kernel dalla base sorgente e la data che segue è la data di compilazione. L'unico modo per regolare questi valori è quello di ricompilare il kernel.

/proc/sys/kernel/panic

Il valore in questo file rappresenta il numero di secondi che il kernel attende prima di riavviarsi al verificarsi di un errore irreversibile. Quando si usa il software watchdog, l'impostazione raccomandata è 60. Se è impostato a 0, che è l'impostazione predefinita, il riavvio automatico dopo un "kernel panic" è disabilitato.

/proc/sys/kernel/printk

I quattro valori printk indicano rispettivamente: console_loglevel, default_message_loglevel, minimum_console_level e default_console_loglevel. Questi valori influenzano il comportamento di printk() nella visualizzazione o nella registrazione dei messaggi di errore provenienti dal kernel. Si veda syslog(2) per maggiori informazioni sui diversi "livelli di log".

/proc/sys/kernel/console_loglevel

I messaggi con una priorità più alta di questa verranno mostrati sulla console.

/proc/sys/kernel/default_message_level

I messaggi senza una specifica priorità verranno visualizzati con questa priorità.

/proc/sys/kernel/minimum_console_loglevel

Il valore minimo (più alto) al quale può essere impostato il "livello di log della console".

/proc/sys/kernel/default_console_loglevel

Il valore predefinito del "livello di log della console".

/proc/sys/kernel/sg-big-buff

Questo file mostra le dimensioni del buffer SCSI generico (sg). Modifiche al contenuto del file sono possibili solo in fase di compilazione aprendo il file include/scsi/sg.h e cambiando il valore di SG_BIG_BUFF. Se si usa uno scanner con SANE (Scanner Access Now Easy) si potrebbe impostarlo a un valore più alto. Far riferimento alla documentazione di SANE su questo argomento.

/proc/sys/kernel/modprobe

La posizione del file eseguibile di modprobe. Il kernel usa questo programma per caricare i moduli su richiesta.

/proc/sys/vm

I file in questa directory possono essere usati per regolare il funzionamento del sottosistema di memoria virtuale (VM) del kernel Linux. In aggiunta, uno dei file (bdflush) ha qualche influenza sul'utilizzo dei dischi.

nfract

Questo parametro governa il numero massimo di dirty buffer nella cache dei buffer. Dirty ("sporco") significa che il contenuto del buffer non è ancora stato scritto su disco (al contrario di un buffer pulito, di cui non parliamo). Impostare questo ad un valore più alto significa che Linux può ritardare la scrittura su disco per un lungo periodo, ma anche che dovrà eseguire molte operazioni di I/O alla volta quando la memoria scarseggia. Un valore più basso estende l'I/O del disco in modo più uniforme.

ndirty

Ndirty assegna il numero massimo di dirty buffer per volta che bdflush può scrivere sul disco. Un valore alto significherà un I/O ritardato, dirompente, mentre uno piccolo potrebbe condurre ad una riduzione della memoria qualora bdflush non venga richiamato abbastanza spesso.

nrefill

È il numero di buffer che bdflush aggiunge alla lista dei buffer liberi quando viene chiamato refill_freelist(); è necessario allocare i buffer liberi prima, dal momento che spesso i buffer sono di dimensioni diverse rispetto alle pagine di memoria e alcuni conteggi devono essere eseguiti anticipatamente. Più alto è il numero, più memoria verrà sprecata e meno spesso dovrà essere avviato refill_freelist().

nref_dirt

Quando refill_freelist() incontra più di nref_dirt dirty buffer, risveglia bdflush.

age_buffer, age_super

Infine, i parametri age_buffer e age_super controllano il tempo massimo di attesa prima che Linux scriva un dirty buffer su disco. Il valore è espresso in jiffy (battiti di orologio), il numero di jiffy al secondo è uguale a 100. Age_buffer è la vita massima dei blocchi di dati (data blocks), mentre age_super è per i metadati del filesystem.

buffermem

I tre valori in questo file controllano la quantità di memoria da utilizzare per la memoria buffer. La percentuale è calcolata come percentuale sulla memoria totale del sistema.

I valori sono:

min_percent

La percentuale minima di memoria da utilizzzare come memoria buffer.

borrow_percent

Quando Linux ha poca memoria a disposizione e la cache dei buffer ne usa più di quella concessa, il sottosistema della gestione della memoria (MM - memory management) inizierà a svuotare la cache dei buffer in modo più rapido rispetto al resto della memoria per compensare [la carenza di memoria lbera].

max_percent

La quantità massima di memoria da utilizzare come memoria buffer.

freepages

Questo fie contiene tre valori: min, low e high:

min

Quando il numero di pagine libere nel sistema raggiunge questo numero solo il kernel può allocare una maggior quantità di memoria.

low

Se il numero di pagine libere va al di sotto di questo, il kernel inizia a usare la swap in modo aggressivo.

high

Il kernel prova a mantenere questa quantità di memoria libera: se la memoria scende al di sotto di questo punto, il kernel comincia a usare leggermente la swap nella speranza di non dover mai passare alla modalità aggressiva.

kswapd

Kswapd è il demone del kernel per le operazioni di swap out; cioè kswapd è quella parte del kernel che libera memoria quando questa è frammentata o piena. Poiché ogni sistema è differente, è utile avere qualche controllo su questa parte del sistema.

Il file contiene tre numeri:

tries_base

Il numero massimo di pagine [di memoria] che kswapd cerca di liberare in un singolo tentativo viene calcolato a partire da questo numero, il quale normalmente viene diviso per 4 o per 8 (si veda mm/vmscan.c), cosicché il numero delle pagine non è così grande come sembra. Quando serve una maggiore larghezza di banda da o per la swap è meglio aumentare questo numero.

tries_min

Il numero minimo di tentativi che kswapd effettua per liberare una pagine ogni volta che viene chiamato. Fondamentalmente serve per assicurare che kswapd liberi alcune pagine anche quando è chiamato con priorità minima.

swap_cluster

Questo valore è quello che probabilmente influisce maggiormante sulle prestazioni del sistema; swap_cluster è il numero di pagine alla volta che kswapd scrive. Questo valore dovrebbe essere abbastanza grande in modo che kswapd esegua le operazioni di I/O in blocchi piuttosto grandi, limitando il numero di ricerche sul disco, ma non troppo grande altrimenti sommergerà la coda delle richieste.

overcommit_memory

Questo file contiene un valore. Il seguente algoritmo viene usato per decidere se c'è abbastanza memoria: se il valore di overcommit_memory è positivo, viene sempre assegnata abbastanza memoria. Questa è una funzione utile, poiché spesso i programmi allocano grandi quantità di memoria anche quando ne usano solo una piccola parte. Lasciare questo valore a 0 porta a considerare come alloccata una grande quantità di memoria anche se di fatto il sistema ne ha a sufficienza per eseguire il programma. D'altra parte l'abilitazione di questa funzionalità può causare l'esaurimento della memoria e portare il sistema alla morte, perciò i server grandi o importanti dovrebbero impostare questo valore a 0.

pagecache

Questo file fa esattamente lo stesso lavoro di buffermem, solo che questo file controlla la quantità di memoria concessa per la mappatura della memoria e per la cache generica dei file. Il livello minimo non dovrebbe essere troppo basso, altrimenti il sistema potrebbe avere dei contraccolpi quando la memoria è piena o la frammentazione è alta.

pagetable_cache

Il kernel mantiene un certo numero di page table in una cache per processore (questo è di grande aiuto nei sistemi SMP). La dimensione della cache per ogni processore oscilla tra un valore minimo e uno massimo. Su un sistema con poca memoria e con una sola CPU questi valori possono essere tranquillamente impostati a 0 per non sprecare memoria. Questo controllo è usato su sistemi SMP in modo che il sistema possa effettuare rapide allocazioni delle pagetable senza dover acquisire il memory lock dal kernel. Per sistemi di grandi dimensioni probabilmente è utile impostare questo controllo, per sistemi normali è indifferente, mentre per piccoli sistemi (con meno di 16MB di ram) può essere conveniente impostare entrambi i valori a 0.

swapctl

Questo file contiene non meno di 8 variabili; tutti questi valori sono utilizzati da kswapd. Le prime quattro variabili, sc_max_page_age, sc_page_advance, sc_page_decline e sc_page_initial_age, sono usate per controllare l'invecchiamento delle pagine (page aging) di Linux. Il page aging è un metodo per tenere il conto delle pagine di memoria usate più spesso e per stabilire quali pagine possano essere spostate nella swap senza conseguenze.

Quando una pagina viene richiamata dalla swap assume il valore iniziale di sc_page_initial_age (quello predefinito è 3), quando la pagina viene controllata da kswapd il suo stato d'invecchiamento è regolato secondo lo schema seguente.

Se la pagina è stata usata dall'ultima volta che è stata controllata il suo valore è incrementato di un numero di unità pari a sc_page_advance (valore predefinito 3), fino a un valore massimo difinito da sc_max_page_age (predefinito 20); altrimenti (se non è stata usata) il suo valore d'invecchiamento viene diminuito di un numero di unità pari a sc_page_decline (predefinito 1).

Quando una pagina raggiunge il valore 0 è pronta per essere spostata nella swap.

Le variabili sc_age_cluster_fract, sc_age_cluster_min, sc_pageout_weight e sc_bufferout_weight possono essere usate per controllare l'aggressività di kswapd nel trasferire le pagine nella swap.

Sc_age_cluster_fract è usato per calcolare quante pagine di un processo devono essere controllate da kswapd. La formula utilizzata è

(sc_age_cluster_fract diviso per 1024) volte la "resident set size"

Se ad esempio si vuole che kswapd controlli l'intero processo sc_age_cluster_fract deve avere il valore di 1024. Il numero minimo di pagine che kswapd deve controllare è rappresenatato da sc_age_cluster_min, che è fatto in modo che kswapd controlli anche i piccoli processi. I valori di sc_pageout_weight e sc_bufferout_weight vengono usati per controllare il numero di tentativi che kswapd dovrà fare per spostare una pagina/buffer nella swap. Questi valori possono essere usati per calibrare il rapporto fra pagine utente e memoria buffer/cache. Se ci si accorge che il sistema Linux sta spostando troppe pagine di processo, per soddisfare le richieste di memoria buffer si può aumentare il valore di sc_bufferout_weight, o diminuire quello di sc_pageout_weight.

/proc/sys/dev

Parametri specifici per i dispositivi. Attualmente c'è solo il supporto per le unità CDROM, e per quelle c'è solo un file di sola lettura contenente informazioni sulle unità CD-ROM collegate al sistema:


>cat /proc/sys/dev/cdrom/info 
CD-ROM information, Id: cdrom.c 2.55 1999/04/25 

drive name:		sr0	hdb 
drive speed: 		32	40 
drive # of slots: 	1 	0 
Can close tray: 	1 	1 
Can open tray: 		1 	1 
Can lock tray: 		1 	1 
Can change speed: 	1 	1 
Can select disk: 	0 	1 
Can read multisession: 	1 	1 
Can read MCN: 		1 	1 
Reports media changed: 	1 	1 
Can play audio: 	1 	1
Si possono vedere due unità, sr0 e hdb, con un elenco delle loro caratteristiche.

SUNRPC

/proc/sys/sunrpc

Questa directory contiene quattro file, che abilitano o disabilitano il debugging per le funzioni RPC per NFS, per il demone NFS, per RPC e per NLM. I valori predefiniti sono pari a 0; possono essere impostati a uno per attivare il debugging (il valore predefinito è 0 per tutti).

/proc/sys/net

L'nterfaccia alle parti del kernel che riguardano la rete si trova nella directory proc/sys/net. La seguente tabella mostra tutte le possibili sottodirectory; a seconda della configurazione del kernel è possibile che nel sistema in uso se ne vedano solo alcune. Ci concentreremo principalmente sulle reti IP, dato che AX15, X.25 e DEC Net rivestono un ruolo marginale nel mondo di Linux; per una descrizione dettagliata dei parametri dei protocolli non trattati si rimanda alla documentazione online e ai sorgenti del kernel. In questa sezione verranno trattate le sottodirectory elencate in precedenza. Poiché i valori predefiniti sono adatti alla maggior parte delle necessità, non è necessario cambiarli.

PARAMETRI GENERALI

/proc/sys/net/core

Opzioni essenziali per la rete

rmem_default

L'impostazione predefinita per il buffer di ricezione del socket espressa in byte.

rmem_max

La dimensione massima del buffer di ricezione del socket in byte.

wmem_default

L'impostazione predefinita (espressa in byte) per il buffer di trasmissione del socket.

wmem_max

La dimensione massima del buffer di trasmissione del socket in byte.

message_burst e message_cost

Questi parametri vengono usati per limitare i messaggi di avvertimento scritti nel registro del kernel dal codice di rete. Essi applicano un limite di traffico (rate limit) in modo da rendere impossibile un attacco "denial of service"; più alto è il fattore di costo e meno messaggi verranno scritti. Message_burst controlla il ritmo con cui vengono emessi i messaggi. Le impostazioni predefinite limitano i messaggi di avvertimento a uno ogni cinque secondi.

netdev_max_backlog

Numero massimo di pacchetti che restano in coda nella parte di INPUT quando l'interfaccia riceve pacchetti ad una velocità maggiore di quella con cui il kernel può elaborarli.

optmem_max

La dimensione massima del buffer ausiliario consentita per socket. I dati ausiliari sono una sequenza di strutture struct cmsghdr con dati aggiunti.

I SOCKET DEL DOMINIO UNIX

/proc/sys/net/unix

Parametri per i socket del dominio Unix

In questa sottodirectory ci sono solo due file, che controllano il ritardo per la cancellazione e distruzione dei descrittori dei socket.

IPv4

/proc/sys/net/ipv4

Impostazioni per IPV4. IP versione 4 è tuttora il protocollo più usato nelle reti Unix; verrà sostituito da IP versione 6 fra un paio d'anni, ma per il momento è lo standard di fatto per internet ed è usato nella maggior parte degli ambienti di rete in tutto il mondo. Vista l'importanza di questo protocollo, verrà esaminato in modo approfondito il sottoalbero che controlla il il comportamento del sottosistema Ipv4 del kernel Linux.

Per prime verranno descritte le voci in /proc/sys/net/ipv4.

Impostazioni per ICMP

icmp_echo_ignore_all e icmp_echo_ignore_broadcasts

Abilitano (1) o disabilitano (0) il kernel ad ignorare tutte le richieste di ICMP ECHO, o solo quelle verso indirizzi broadcast e multicast.

È utile far notare che se si accettano richieste ICMP echo con un indirizzo di destinazione broadcast/multicast la rete può essere utilizzata come un detonatore per attacchi "denial of service" sommergendo di pacchetti di richieste altri host.

icmp_destunreach_rate, icmp_echoreply_rate, icmp_paramprob_rate e icmp_timeexeed_rate

Imposta limiti per l'invio di pacchetti ICMP a specifiche destinazioni. Un valore pari a zero disabilita tutte le limitazioni. Qualsiasi valore positivo imposta la velocità massima dei pacchetti in centesimi di secondo (su sistemi Intel).

Impostazioni per IP

ip_autoconfig

Questo file contiene un numero: uno se l'host ha ricevuto la sua configurazione IP da RARP, BOOTP, DHCP o da un meccanismo simile, zero altrimenti.

ip_default_ttl

TTL (Time To Live) per le interfacce IPv4. È semplicemente il massimo numero di nodi (hops) che un pacchetto può attraversare [prima di giungere a destinazione].

ip_dynaddr

Abilita la riscrittura dinamica degli indirizzi del socket al cambio di indirizzo dell'interfaccia. È utile per interfacce dialup con indirizzi IP variabili.

ip_forward

Abilita o disabilita l'inoltro di pacchetti IP da un'interfaccia a un'altra. La modifica di questo valore reimposta tutti gli altri parametri ai loro valori predefiniti, che sono diversi a seconda che il kernel sia configurato come host o come router.

ip_local_port_range

La gamma di porte utilizzata da TCP e UDP per scegliere la porta locale. Contiene due numeri, il primo rappresenta la porta locale più bassa, il secondo quella più alta. Il valore predefinito è 1024-4999; per sistemi con un alto utilizzo di porte dovrebbe essere cambiato in 32768-61000.

ip_no_pmtu_disc

Parametro globale per disabilitare la ricerca del percorso MTU, può essere impostato a livello di socket dalle applicazioni o a livello di route.

ip_masq_debug

Abilita o disabilita il debugging di IP masquerading.

Impostazioni per la gestione della frammentazione dell'IP

ipfrag_high_trash e ipfrag_low_trash

Quantità massima di memoria utilizzata per riassemblare i frammenti IP. Quando un numero di byte di memoria pari a ipfrag_high_thrash è allocata a questo scopo, la gestione dei frammenti abbandonerà dei pacchetti fino al raggiungimento di ipfrag_low_thrash.

ipfrag_time

Tempo in secondi per il mantenimento in memoria di un frammento IP.

Impostazioni per TCP

tcp_ecn

Questo file controlla l'uso del bit ECN negli header IPv4, questa è una nuova funzionalità riguardante l'Explicit Congestion Notification, ma alcuni router e firewall bloccano il traffico che ha questo bit impostato, per cui si potrebbe rendere necessario impostare /proc/sys/net/ipv4/tcp_ecn al valore 0 (col comando echo) per comunicare con questi siti. Per maggiori informazioni si può leggere RFC2481.

tcp_retrans_collapse

Compatibilità bug per bug con alcune stampanti difettose. In fase di ritrasmissione, tenta di inviare pacchetti di dimensioni maggiori per cercare di risolvere errori di trasmissione in alcuni stack TCP. Può essere disattivato impostandolo a zero.

tcp_keepalive_probes

Numero di volte che TCP ritrasmette un messaggio "keep alive" prima di considerare la connessione come interrotta.

tcp_keepalive_time

La frequenza con la quale TCP invia messaggi "keep alive" quando keep alive è abilitato. Il valore predefinito è 2 ore.

tcp_syn_retries

Numero di volte che i pacchetti SYN iniziali di un tentativo di connessione TCP devono essere ritrasmessi. Non dovrebbe superare 255. Questo è solo il tempo limite per le connesioni in uscita, per le connessioni in ingresso il numero delle ritrasmissioni è definito da tcp_retries1.

tcp_sack

Abilita la conferma selettiva dopo RFC2018.

tcp_timestamps

Abilita le marcature orarie (timestamp) come definite in RFC1323.

tcp_stdurg

Abilita l'interpretazione rigorosa RFC793 del campo dell'"urgent pointer" TCP. L'impostazione predefinita è l'uso dell'interpretazione compatibile BSD dell'urgent pointer che punta al primo byte dopo i dati urgent. L'interpretazione RFC793 punta all'ultimo byte dei dati urgent. L'abilitazione di quest'opzione può condurre a problemi di interoperabilità, ed è disabilitata in modo predefinito.

tcp_syncookies

Valido solo se il kernel è stato compilato con l'opzione CONFIG_SYNCOOKIES. Emette syncooky quando la coda del backlog syn di un socket è piena. Questo è per evitare il comune "attacco syn flood". È disabilitato in modo predefinito. Si noti che il concetto di socket backlog è stato abbandonato. Ciò significa che il peer può non ricevere messaggi di errore attendibili da un server sovraccarico con i syncooky abilitati.

tcp_window_scaling

Abilita il window scaling come definito in RFC1323.

tcp_fin_timeout

Il tempo di attesa in secondi per la ricezione di un FIN finale prima che il socket sia chiuso definitivamente. A stretto rigore questa è una violazione della specifica TCP, però è richiesta per prevenire attacchi "denial of service".

tcp_max_ka_probes

Indica quanti messaggi keep alive vengono inviati per slow timer run. Non dovrebbe essere impostato a un valore troppo alto per prevenire picchi.

tcp_max_syn_backlog

Lunghezza della coda di backlog del socket. Sin dal kernel Linux 2.2 il backlog specificato in listen(2) specifica solo la lunghezza della coda di backlog dei socket già stabiliti. Quando arrivano più richieste di connessione Linux inizia a rilasciare pacchetti. Quando i syncooky sono abilitati i pacchetti continuano a ricevere risposta e la coda massima è effettivamente ignorata.

tcp_retries1

Definisce per quante volte viene ritrasmessa una risposta a una richiesta di connessione TCP prima di rinunciare.

tcp_retries2

Definisce per quante volte viene ritrasmesso un pacchetto TCP prima di rinunciare.

/proc/sys/net/ipv4/conf

Qui si trova una sottodirectory per ogni interfaccia riconosciuta dal sistema e una directory denominata all. Le modifiche effettuate nella sottodirectory "all" hanno effetto su tutte le interfacce, mentre quelle apportate nelle altre sottodirectory hanno effetto su una sola interfaccia. Tutte le directory hanno le stesse voci:

accept_redirects

Questo parametro stabilisce se il kernel accetta messaggi ICMP ridiretti o no. L'impostazione predefinita è "yes" se il kernel è configurato per un normale host, "no" se è configurato per un router.

accept_source_route

I pacchetti instradati dalla sorgente (source routed) possono essere accettati o rifiutati. L'impostazione predefinita dipende dalla configurazione del kernel: "yes" per i router e "no" per gli host.

bootp_relay

Accetta pacchetti con indirizzo d'origine 0.b.c.d non destinati all'host corrente come se fossere locali. Si suppone che un demone BOOTP relay intercetti e inoltri tali pacchetti. L'impostazione predefinita è 0.

forwarding

Abilita o disabilita l'IP forwarding sull'interfaccia corrente.

log_martians

Registra nel registro del kernel i pacchetti con indirizzi d'origine aventi instradamenti sconosciuti.

mc_forwarding

Esegue instradamenti multicast. Il kernel dev'essere compilato con CONFIG_MROUTE ed è richiesto un demone d'instradamento multicast.

proxy_arp

Effettua (1) o non effettua (0) il proxy ARP.

rp_filter

Un valore intero che stabilisce se dev'essere eseguita la validazione dell'indirizzo di provenienza: 1 per si, 0 per no. È disabilitato in modo predefinito, ma lo spoofing sugli indirizzi local/broadcast è sempre attivo. Se viene impostato a 1 su un router che è l'unica connessione della rete a internet, impedisce attacchi di spoofing alle reti interne (gli indirzzi esterni sono ancora soggetti allo spoofing) senza bisogno di regole aggiuntive per il firewall.

secure_redirects

Accetta messaggi ICMP ridiretti solo per i gateway elencati nella lista dei gateway predefiniti. È abilitato in modo predefinito.

shared_media

Se non è impostato il kernel non considera che diverse sottoreti su questo dispositivo possano comunicare direttamente. L'impostazione predefinita è "yes".

send_redirects

Stabilisce se inviare messaggi di ridirezione ICMP agli altri host.

Impostazioni d'instradamento

La directory /proc/sys/net/ipv4/route contiene diversi file per controllare le specifiche di instradamento.

error_burst and error_cost

Questi parametri sono usati per limitare i messaggi di avvertimento scritti sul registro del kernel dal codice d'instradamento. Più grande è il fattore error_cost e meno messaggi verranno scritti. Error_burst controlla la frequenza con la quale vengono emessi i messaggi. L'impostazione predefinita limita i messaggi di avvertimento a uno ogni cinque secondi.

flush

La scrittura in questo file comporta lo svuotamento della cache d'instradamento.

gc_elastic, gc_interval, gc_min_interval, gc_tresh, gc_timeout

Valori per controllare la frequenza e il comportamento dell'algoritmo di "garbage collection" per la cache di instradamento.

max_size

La dimensione massima della cache d'instradamento. Le vecchie voci verranno eliminate una volta che la cache raggiunge questa dimensione.

max_delay, min_delay

Ritardi per lo svuotamento della cache d'instradamento.

redirect_load, redirect_number

Fattori che stabiliscono se più messaggi ICPM di ridirezione devono essere inviati ad un host specifico. Non verranno inviati messaggi di ridirezione una volta raggiunto il limite di carico o il numero massimo di messaggi.

redirect_silence

Tempo limite per i messaggi di ridirezione. Dopo questo periodo i messaggi verranno inviati di nuovo, anche se sono stati interrotti, perché è stato raggiunto il limite di carico o di numero.

/proc/sys/net/ipv4/neigh

Network Neighbor handling. Contiene le impostazioni su come gestire le connessioni con i direct neighbors (nodi attaccati allo stesso collegamento). Come già visto per la directory conf, c'è una sottodirectory predefinita che gestisce i valori predefiniti, e una directory per ogni interfaccia. Il contenuto delle directory è identico, con la sola eccezione che le impostazioni predefinite contengono opzioni aggiuntive per impostare i parametri di "garbage collection".

Nelle directory delle interfacce si trovano le seguenti voci:

base_reachable_time

Un valore di base usato per calcolare il valore casuale del tempo di raggiungibilità come specificato in RFC2461.

retrans_time

Il tempo, espresso in jiffy (1/100 sec), fra messaggi Neighbor Solicitation ritrasmessi. Viene usato per la risoluzione degli indirizzi e per determinare se un vicino (neighbor) è irraggiungibile.

unres_qlen

Lunghezza massima della coda di una richiesta arp pendente - il numero di pacchetti che sono accettati da altri strati mentre l'indirizzo ARP è ancora risolto.

anycast_delay

Massimo ritardo casuale delle risposte ai messaggi neighbor solicitation in jiffy (1/100 sec). Non ancora implementato (Linux non ha ancora il supporto per anycast).

ucast_solicit

Numero massimo di tentativi per i solleciti unicast.

mcast_solicit

Numero massimo di tentativi per i solleciti multicast.

delay_first_probe_time

Ritardo per il primo tentativo di verifica se il "neighbor" è raggiungibile. (si veda gc_stale_time)

locktime

Una voce ARP/neighbor è sostituita con una nuova solo se è più vecchia di almeno locktime. Questo previene lo svuotamento della cache ARP.

proxy_delay

Tempo massimo (il tempo reale è casuale [0..proxytime]) prima che venda data risposta a una richiesta ARP per la quale c'è una voce nel proxy ARP. In alcuni casi è usato per prevenire intasamenti sulla rete.

proxy_qlen

Lunghezza massima della coda del timer del ritardo del proxy arp (si veda proxy_delay).

app_solcit

Stabilisce il numero massimo di richieste da inviare al demone ARP a livello utente. Usare 0 per disabilitarlo.

gc_stale_time

Stabilisce la frequenza con la quale debbano essere verificate le voci ARP scadute. Dopo che una voce ARP è scaduta, viene risolta nuovamente (il che è utile quando un indirizzo IP migra verso un'altra macchina). Quando ucast_solicit è maggiore di 0, prima tenta di inviare un pacchetto ARP direttamente all'host conosciuto, se non ha successo e mcast_solicit è maggiore di 0, viene inviata una richiesta ARP a tutta la rete.

APPLETALK

/proc/sys/net/appletalk

Contiene i dati di configurazione di Appletalk quando questo è caricato. I parametri configurabili sono:

aarp-expiry-time

Il periodo di tempo durante il quale una voce ARP viene mantenuta prima che scada. Usato per dichiarare scaduti i vecchi host.

aarp-resolve-time

La quantità di tempo a disposizione per tentare di risolvere un indirizzo Appletalk.

aarp-retransmit-limit

Numero di volte che una richiesta viene ritrasmessa prima di rinunciare.

aarp-tick-time

Controlla la frequenza con la quale vengono controllate le voci in scadenza.

/proc/net/appletalk

Tiene la lista dei socket Appletalk attivi sulla macchina. I campi indicano il tipo DDP, l'indirizzo locale (nel formato network:node), l'indirizzo remoto, la dimensione della coda in attesa di trasmissione, la dimensione della coda in ricezione (byte in attesa di essere letti dalle applicazioni), lo stato e il uid proprietrio del socket.

/proc/net/atalk_iface

Elenca tutte le interfacce configurate per appletalk. Mostra il nome dell'interfaccia, il suo indirizzo Appletalk, l'intervallo di rete per quell'indirizzo (o numero di rete per le reti di fase 1) e lo stato dell'interfaccia.

/proc/net/atalk_route

Elenca tutti gli instradamenti di rete noti. Elenca il punto d'arrivo (rete) dell'instradamento, il router (può essere connesso direttamente), i flag dell'instradamento e il dispositivo in uso per l'instradamento.

IPX

Il protocollo IPX non ha valori regolabili in proc/sys/net, per far questo fornisce la directory proc/net/ipx, la quale elenca i socket IPX che danno gli indirizzi locali e remoti in formato Novell (cioè network:node:port). In accordo con l'insolita tradizione Novell, ogni cosa tranne la porta è in formato esadecimale. Per i socket che non sono legati ad uno specifico indirizzo remoto viene visualizzato Not_Connected. La dimensione delle code Tx e Rx indicano il numero di byte in attesa di trasmissione e ricezione; state indica lo stato in cui si trova il socket e uid è l'uid proprietario del socket.

ipx_interface

Elenca tutte le interfacce IPX. Per ogni interfaccia fornisce il numero di rete, numero di nodo e indica se è la rete primaria. Indica anche a quale dispositivo è connesso (o Internal per reti interne) e il tipo di frame se appropriato. Linux supporta 802.3, 802.2, 802.2 SNAP e il framing ethernet DIX (Blue Book) per IPX.

ipx_route

È una tabella contenente una lista degli instradamenti IPX. Per ogni instradamento fornisce la rete di destinazione, il nodo del router (o Directly) e l'indirizzo di rete del router (o Connected per le reti interne).

/proc/sysvipc

Informazioni sulle risorse di SysVIPC (msg, sem, shm) (2.4)

/proc/tty

Nella directory /proc/tty si possono trovare le informazioni sui dispositivi tty disponibili ed effettivamente in uso. In questa directory si trovano voci per i driver e per le discipline di linea.

/proc/tty/drivers

Un elenco di driver e il loro utilizzo.

/proc/tty/ldiscs

Discipline di linea registrate.

/proc/tty/driver/serial

Statistiche sull'utilizzo e lo stato di singole linee tty.

Per vedere quali dispositivi tty sono correntemente in uso è sufficiente dare uno sguardo al file /proc/tty/drivers:


  # cat /proc/tty/drivers
  serial               /dev/cua        5  64-127 serial:callout
  serial               /dev/ttyS       4  64-127 serial
  pty_slave            /dev/pts      143   0-255 pty:slave
  pty_master           /dev/ptm      135   0-255 pty:master
  pty_slave            /dev/pts      142   0-255 pty:slave
  pty_master           /dev/ptm      134   0-255 pty:master
  pty_slave            /dev/pts      141   0-255 pty:slave
  pty_master           /dev/ptm      133   0-255 pty:master
  pty_slave            /dev/pts      140   0-255 pty:slave
  pty_master           /dev/ptm      132   0-255 pty:master
  pty_slave            /dev/pts      139   0-255 pty:slave
  pty_master           /dev/ptm      131   0-255 pty:master
  pty_slave            /dev/pts      138   0-255 pty:slave
  pty_master           /dev/ptm      130   0-255 pty:master
  pty_slave            /dev/pts      137   0-255 pty:slave
  pty_master           /dev/ptm      129   0-255 pty:master
  pty_slave            /dev/pts      136   0-255 pty:slave
  pty_master           /dev/ptm      128   0-255 pty:master
  pty_slave            /dev/ttyp       3   0-255 pty:slave
  pty_master           /dev/pty        2   0-255 pty:master
  /dev/vc/0            /dev/vc/0       4       0 system:vtmaster
  /dev/ptmx            /dev/ptmx       5       2 system
  /dev/console         /dev/console    5       1 system:console
  /dev/tty             /dev/tty        5       0 system:/dev/tty
  unknown              /dev/vc/%d      4    1-63 console
  

Da notare che mentre i file di cui si è parlato tendono a essere file di testo facilmente leggibili, in alcuni casi possono essere formattati in modo non facilmente comprensibile. Ci sono molti comandi che fanno poco più che leggere i file di cui sopra e formattarli per essere comprensibili. Per esempio il programma free legge /proc/meminfo e converte le quantità espresse in byte in kilobyte (e aggiunge anche qualche informazione in più).

/proc/uptime

Indica per quanto tempo il sistema è rimasto in funzione.

/proc/version

La versione del kernel.

/proc/video

Informazioni BTTV sulle risorse video.