Perché i file di dispositivi speciali hanno inode?


11

I file di dispositivo non sono file di per sé. Sono un'interfaccia I / O per utilizzare i dispositivi in ​​sistemi operativi simili a Unix. Non usano spazio sul disco, tuttavia usano ancora un inode come riportato dal statcomando:

$ stat /dev/sda
      File: /dev/sda
      Size: 0               Blocks: 0          IO Block: 4096   block special file
Device: 6h/6d   Inode: 14628       Links: 1     Device type: 8,0

I file del dispositivo utilizzano inode fisici nel filesystem e perché ne hanno bisogno?


2
L'inode e i dati sono il file. Senza un inode, non hai file. (I file del dispositivo non hanno dati però)
user253751

Risposte:


16

La risposta breve è che lo fa solo se si dispone di un supporto fisico per filesystem /dev(e se si utilizza una distribuzione Linux moderna, probabilmente non lo si fa).

La risposta lunga segue:

Tutto ciò risale alla filosofia UNIX originale secondo cui tutto è un file. Questa filosofia fa parte di ciò che ha reso UNIX così versatile, poiché è possibile interagire direttamente con i dispositivi dallo spazio utente senza la necessità di disporre di un codice speciale nell'applicazione per comunicare direttamente con l'hardware fisico.

In origine, /devera solo un'altra directory con un nome noto in cui inserire i file del dispositivo. Alcuni sistemi UNIX adottano ancora questo approccio (credo che OpenBSD lo sia ancora) e di solito puoi dire se un sistema è così perché avrà molti file di dispositivo per dispositivi che il sistema non ha effettivamente (ad esempio, file per ogni possibile partizione su ogni possibile disco). Ciò consente di risparmiare spazio in memoria e tempo all'avvio al costo di utilizzare un po 'più di spazio su disco, il che è stato un buon compromesso per i sistemi precedenti perché erano generalmente molto limitati dalla memoria e non molto veloci. Questo è generalmente definito come statico /dev.

Sui moderni sistemi Linux (e credo anche su FreeBSD e forse le versioni recenti di Solaris), /devè un filesystem temporaneo in memoria popolato dal kernel (o udev se usi Systemd, perché non si fidano del kernel per fare quasi nulla) . Ciò consente di risparmiare spazio su disco al prezzo di un po 'di memoria (in genere meno di qualche MB) e un sovraccarico di elaborazione molto ridotto. Ha anche una serie di altri vantaggi, tra cui uno dei più grandi è che è più facile rilevare hardware collegato a caldo. Questo è generalmente definito come dinamico /dev.

In entrambi i casi, tuttavia, è possibile accedere ai nodi del dispositivo tramite il normale livello VFS, il che per definizione significa che devono avere un inode (anche se si tratta di un inode virtuale che esiste solo in modo che roba del stat()genere funzioni come dovrebbe. Da un punto di vista pratico, questo non ha alcun impatto sui sistemi che usano una dinamica /devperché memorizzano semplicemente gli inode in memoria o li generano quando necessario, e quasi zero impatto dove /devè statico perché gli inode occupano quasi zero spazio su disco e la maggior parte dei filesystem non ha limiti massimi su o provvedere molto più di quanto chiunque possa mai aver bisogno.


3
Alza cautamente la mano. Sono stato su un progetto in cui un server ha esaurito gli inode. Fu finalmente la crisi di cui il nostro team aveva bisogno per convincere il management a investire nella sostituzione di quel sistema di back-end, che era stato progettato (male, come puoi immaginare!) Prima che qualcuno di noi ci fosse arrivato.
KRyan,

@KRyan Può succedere, ma oggigiorno è raro a meno che l'amministratore non abbia esplicitamente ridotto il numero durante la creazione del filesystem. Molti file system moderni (almeno NTFS, BTRFS e ZFS, penso che anche XFS potrebbero) allocare effettivamente gli inode in modo dinamico, quindi su molti sistemi più recenti, è effettivamente impossibile esaurirsi.
Austin Hemmelgarn,

@KRyan Anch'io ho avuto quel problema. Ed era in realtà un sistema ben progettato, anche se un po 'datato e portato a comparse (ogni transazione richiedeva un registro indipendente, che era tenuto su disco, alla fine si riempiva solo di piccoli inode)
coteyr

1
Od e docker sono famosi per aver causato esattamente questo problema di inode.
Coteyr,

@AustinHemmelgarn La famiglia ext è piuttosto famosa per avere un numero statico di inode (e successivamente esaurirsi). È anche, per inciso, il filesystem Linux più utilizzato, probabilmente con un enorme margine (scenari che memorizzano enormi quantità di dati su XFS a parte, con ZFS e BTRFS relativamente nuovi), e l'impostazione predefinita per la maggior parte delle distro. Ovviamente, in un sistema moderno, gli inode massimi predefiniti sono molti ordini di grandezza maggiori del numero di file del dispositivo che avrai mai.
Bob

15

Anche i file di dispositivo dispongono di autorizzazioni e questi sono archiviati in un inode.


Ottimo punto che ho dimenticato di menzionare.
Austin Hemmelgarn,

5
Non solo autorizzazioni, ma anche il tipo di file e altri metadati. Classicamente, la directory stessa contiene solo il nome e il numero dell'inode - non c'è nulla che indichi che il file è un dispositivo fino a quando non si legge l'inode.
Gilles 'SO- smetti di essere malvagio' il

12

Le directory sono semplicemente una mappatura dai nomi dei file agli inode, quindi tutto ciò che riguarda la cosa a cui fa riferimento il nome (un file, un collegamento simbolico, un dispositivo, un FIFO, un socket) deve essere nell'inode, non c'è altro posto dove metterlo.

Le informazioni sul dispositivo sono memorizzate nell'inode. Ci sono i numeri dei dispositivi principali e secondari, così come permessi, timestamp, ecc. Il campo del tipo che dice che è un dispositivo a blocchi o caratteri anziché un normale file è memorizzato lì.

L'inode per i dispositivi semplicemente non utilizza i campi che contengono la mappa a blocchi del file.


0

Senza un inode avresti solo il nome del file per contenere tutte le informazioni sul dispositivo in questione. Ciò significa che nomi di dispositivi "carini" come /dev/sdasarebbero fuori discussione: avresti bisogno di un nome che potrebbe essere legato a un determinato driver, come /dev/ohci/sda.

Ancora più importante, tutti gli strumenti che si basano su inode (come stat, lse così via) dovrebbero essere modificati per trattare i percorsi sotto /devin un modo speciale. Sarebbe una quantità proibitiva di lavoro senza alcun beneficio apparente rispetto allo stato attuale delle cose.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.