Table of Contents

Filesystem virtuali di Linux

tmpfs

Montato solitamente in /dev/shm, simile ad un ramdisk, ma oltre ad usare la RAM come spazio di memorizzazione, può usare anche lo swap; in pratica è un filesystem in memoria virtuale. Sarà il sottositema VM di Linux a preoccuparsi di utilizzare la RAM oppure il disco, eventualmente effettuando lo swap da l'uno all'altro.

Il tmpfs non ha un block device sottostante che deve essere formattato prima di usarlo, lo si monta ed è subito un filesystem disponibile. E' sufficiente compilare nel kernel il supporto al virtual memory file system (CONFIG_TMPFS), chiamato in precedenza shm fs.

La dimensione di un tmpfs è dinamica, però si può specificare una dimensione massima per evitare che un processo impazzito occupi tutta la VM. L'opzione viene specificata al momento del montaggio (o in /etc/default/tmpfs per Debian). Per default il kernel alloca la metà della memoria disponibile, ma in pratica si dovrebbe allocare un po' meno di quanta memoria virtuale (RAM + swap) rimane libera durante l'utilizzo più intenso della macchina.

Le applicazioni che fanno uso della shared memory secondo lo standard POSIX, per girare richiedono che il kernel supporti tmpfs, ma non è necessario che un filesystem di questo tipo sia montato. Le applicazioni POSIX shm attualmente non sono molte. Ci sono circostanze in cui può essere vantaggioso montare il classico /tmp su un tmpfs, ma la cosa va valutata con attenzione. In generale si può dire che per il momento si può vivere benissimo senza un tmpfs montato.

Volendo attivare il tmpfs automaticamente all'avvio si può aggiungere a /etc/fstab una riga del genere:

tmpfs /dev/shm  tmpfs size=32m  0 0

proc

Montato solitamente in /proc

usbfs

Montato solitamente in /proc/bus/usb

devpts

Montato solitamente in /dev/pts

devfs

Attenzione devfs è considerato ormai obsoleto, vedere la sezione udev e sysfs.

Montato solitamente in /dev

Dalla Linux Devfs (Device File System) FAQ:

Devfs is an alternative to “real” character and block special devices on your root filesystem. Kernel device drivers can register devices by name rather than major and minor numbers. These devices will appear in devfs automatically, with whatever default ownership and protection the driver specified. A daemon (devfsd) can be used to override these defaults. Devfs has been in the kernel since 2.3.46.

NOTE that devfs is entirely optional. If you prefer the old disc-based device nodes, then simply leave CONFIG_DEVFS_FS=n (the default). In this case, nothing will change. ALSO NOTE that if you do enable devfs, the defaults are such that full compatibility is maintained with the old devices names.

Quindi devfs sarebbe una cosa buona. Per attivarlo bisogna:

Una caratteristica di devfs è quella di caricare automaticamente il modulo kernel giusto quando un programma in user space tenta di aprire il device relativo. L'approccio più moderno di udev è quello di caricare il modulo kernel opportuno quando viene rilevata la periferica in hardware.

Ci sono comunque delle controindicazioni ad utilizzare devfs. Ad esempio essendo un filesystem virtuale le modifiche sulle permission dei device non sopravviverebbero ad un reboot. Inoltre ci possono essere delle differenze di denominazione tra i classici device su disco e i corrispondenti in devfs (/dev/hda1 diventa /dev/discs/disc0/part0); esistono tecniche per abilitare il compatibility entry management. Per tutti i dettagli vedere la FAQ.

udev e sysfs

Vedere anche l'articolo udev e Debian.

Il filesystem virtuale sysfs adotta una nuova e unificata interfaccia verso i driver e risulta migliore di tutte le implementazioni passate, è accessibile a partire dalla directory /sys.

In user space il programma udev è in grado ricevere le notifiche del sistema hotplug dei kernel 2.6 (NOTA BENE: il sistema hotplug del kernel 2.6, non il programma hotplug). A partire dalla versione 0.070 udev è in grado di fare tutto quello che faceva il programma hotplug per i kernel 2.4, ma è molto più veloce e leggero (è scritto in C). In più udev è in grado di creare dinamicamente i device file (quelli in /dev) per ogni periferica che viene rilevata nel sistema.

Quindi il kernel gestisce gli eventi hotplug grazie all'omonimo sottosistema ed esporta le informazioni necessarie grazie al filesystem /sys. Sempre in kernel space viene gestito il filesystem virtuale /dev. In userspace il programma udev riceve notifica degli eventi hotplug, determina le politiche dei permessi e dei nomi dei device.

udev provvede a caricare il modulo kernel giusto appena viene identificata una periferica hardware. Questo differisce dall'approccio di devfs, che tenta di caricare il modulo kernel opportuno quando un programma in user space apre il device relativo ad una periferica.

A partire da Debian Etch, udev ha sostituito il programma hotplug.

Opzioni kernel obbligatorie: CONFIG_HOTPLUG e CONFIG_TMPFS; opzioni altamente consigliate CONFIG_PNP, CONFIG_ISAPNP, CONFIG_PNPBIOS e CONFIG_PNPACPI.

Configurazione

Il demone udev riceve gli eventi hotplug dal kernel relativi ai device, legge gli attributi del device stesso in sysfs e quindi cerca le regole corrispondenti a questi attributi nei file contenuti in /etc/udev/. In base a queste regole si possono determinare ulteriori informazioni sul device (ad esempio il nome da assegnare ad una scheda Ethernet in base al MAC address), si può determinare la creazione di device nella directory /dev/ oppure link simbolici, l'assegnamento di opportuni permessi e ownership oppure l'esecuzione di script.

Manual override

If you want manually tweak the /dev directory at boot time, you can use the /etc/udev/links.conf configuration file. This is a Debian hack: you can create symbolic links, directories or special files (with mknod(1)). In this example a link for the GPS device is created, pointing to the third serial port:

L gps /dev/ttyS2

Blacklist dei moduli

To avoid aoutmatic loading of kernel modules, you can add blacklist lines to the file /etc/modprobe.d/blacklist, for example:

blacklist parport_pc
blacklist parport
blacklist joydev

Note that some modules (e.g. joydev) are explicitally loaded by the Debian script /etc/init.d/udev. If those modules are unwanted, you can prevent the modprobe command to work by adding to the blacklist file someting like this:

install joydev /bin/true

This tell modprobe to run an alternate program (/bin/true) to load the module, in this case doing nothing. If you need the module later, you can issue from the command line:

modprbe --ignore-install joydev

this will ignore any install directive into the configuration files.

Mappatura dei dischi SCSI

Il nome di un disco SCSI viene assegnato dal kernel al bootstrap in modo dinamico, quindi non è semplice determinare a quale controller è collegato ad esempio il disco /dev/sdd. Il sysfs viene in aiuto come mostrato:

cd /sys/block
ls -l sd?/device | cut -b 44-
sda/device -> ../../devices/pci0000:00/0000:00:09.0/0000:05:0a.0/host0/target0:0:0/0:0:0:0
sdb/device -> ../../devices/pci0000:00/0000:00:09.0/0000:05:0a.0/host1/target1:0:0/1:0:0:0
sdc/device -> ../../devices/pci0000:00/0000:00:09.0/0000:05:0a.0/host2/target2:0:0/2:0:0:0
sdd/device -> ../../devices/pci0000:00/0000:00:09.0/0000:05:0a.0/host3/target3:0:0/3:0:0:0
sde/device -> ../../devices/pci0000:00/0000:00:07.0/host4/target4:0:0/4:0:0:0
sdf/device -> ../../devices/pci0000:00/0000:00:07.0/host5/target5:0:0/5:0:0:0
sdg/device -> ../../devices/pci0000:00/0000:00:08.0/host6/target6:0:0/6:0:0:0
sdh/device -> ../../devices/pci0000:00/0000:00:08.0/host7/target7:0:0/7:0:0:0