GNU/Linux >> Linux Esercitazione >  >> Linux

Comprendere /dev e le sue sottocartelle e file

Quasi tutti i file in /dev sono file di dispositivo. Mentre la lettura e la scrittura su un file normale memorizza i dati su un disco o su un altro filesystem, l'accesso a un file di dispositivo comunica con un driver nel kernel, che generalmente a sua volta comunica con un componente hardware (un dispositivo hardware, da cui il nome).

Esistono due tipi di file dispositivo:dispositivi a blocchi (indicati da b come primo carattere nell'output di ls -l ) e caratteri (indicati da c ). La distinzione tra dispositivi a blocchi e caratteri non è del tutto universale. I dispositivi a blocchi sono cose come i dischi, che si comportano come file grandi e di dimensioni fisse:se scrivi un byte a un certo offset e successivamente leggi dal dispositivo a quell'offset, ottieni quel byte indietro. I dispositivi a caratteri sono praticamente qualsiasi altra cosa, in cui la scrittura di un byte ha un effetto immediato (ad es. viene emesso su una linea seriale) e anche la lettura di un byte ha un effetto immediato (ad es. viene letto dalla porta seriale).

Il significato di un file di dispositivo è determinato dal suo numero, non dal suo nome (il nome conta per le applicazioni, ma non per il kernel). Il numero in realtà è composto da due numeri:il numero maggiore indica quale driver è responsabile di questo dispositivo e il numero minore consente a un conducente di guidare diversi dispositivi¹. Questi numeri appaiono nel ls -l lista, dove normalmente troverai la dimensione del file. Per esempio. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda → questo dispositivo è maggiore 8, minore 0.

Alcuni file di dispositivo in /dev non corrispondono ai dispositivi hardware. Uno che esiste su ogni sistema unix è /dev/null; la scrittura su di esso non ha alcun effetto e la lettura da esso non restituisce mai alcun dato. Spesso è conveniente negli script di shell, quando vuoi ignorare l'output di un comando (>/dev/null ) o eseguire un comando senza input (</dev/null ). Altri esempi comuni sono /dev/zero (che restituisce byte nulli ad infinitum ) /dev/urandom (che restituisce byte casuali ad infinitum ).

Alcuni file di dispositivo hanno un significato che dipende dal processo che vi accede. Ad esempio, /dev/stdin designa lo standard input del processo corrente; l'apertura da ha approssimativamente lo stesso effetto dell'apertura del file originale aperto come input standard del processo. Un po' allo stesso modo, /dev/tty designa il terminale a cui è connesso il processo. Sotto Linux, al giorno d'oggi, /dev/stdin e gli amici non sono implementati come dispositivi di caratteri, ma invece come collegamenti simbolici a un meccanismo più generale che consente di fare riferimento a ogni descrittore di file (invece di solo 0, 1 e 2 nel metodo tradizionale); ad esempio /dev/stdin è un collegamento simbolico a /proc/self/fd/0 . Vedi In che modo /dev/fd è correlato a /proc/self/fd/?.

Troverai un numero di collegamenti simbolici sotto /dev . Ciò può verificarsi per motivi storici:un file di dispositivo è stato spostato da un nome a un altro, ma alcune applicazioni utilizzano ancora il vecchio nome. Ad esempio, /dev/scd0 è un collegamento simbolico a /dev/sr0 sotto Linux; entrambi designano il primo dispositivo CD. Un altro motivo per i collegamenti simbolici è l'organizzazione:sotto Linux, troverai i tuoi dischi rigidi e le partizioni in diversi posti:/dev/sda e /dev/sda1 e amici (ogni disco designato da una lettera arbitraria e partizioni secondo il layout della partizione), /dev/disk/by-id/* (dischi designati da un numero di serie univoco), /dev/disk/by-label/* (partizioni con un filesystem, designate da un'etichetta scelta dall'uomo); e altro ancora. I collegamenti simbolici vengono utilizzati anche quando un nome di dispositivo generico potrebbe essere uno tra diversi; ad esempio /dev/dvd potrebbe essere un collegamento simbolico a /dev/sr0 o potrebbe essere un collegamento a /dev/sr1 se hai due lettori CD e il secondo deve essere il lettore DVD predefinito.

Infine, ci sono alcuni altri file che potresti trovare sotto /dev , per ragioni tradizionali. Non troverai lo stesso su tutti i sistemi. Sulla maggior parte degli unice, /dev/log è un socket che i programmi usano per emettere messaggi di log. /dev/MAKEDEV è uno script che crea voci in /dev . Sui sistemi Linux moderni, le voci in /dev/ vengono creati automaticamente da udev, rendendo obsoleto MAKEDEV .

¹ Questo in realtà non è più vero sotto Linux, ma questo dettaglio conta solo per chi scrive driver di dispositivo.


  1. Sì - direttamente o come collegamenti simbolici - questo è ciò che /dev/ è per.
  2. Per vari scopi:a volte per compatibilità tra schemi di denominazione, a volte è necessario per l'ambiente di lavoro - come nell'esempio di /dev/stdin . Questo non punto staticamente a /dev/pts/2 o qualsiasi altro:passa a un altro terminale e vedrai. /dev/stdin è l'input standard del tuo current sessione terminale. Questo è anche un esempio del motivo per cui deve essere un collegamento simbolico.
  3. Vedi man mknod e info coreutils 'mknod invocation' . In generale, c sta per un tipo di dispositivo di carattere.

Per la tua prima domanda, non sono descrittori di file, sono file di dispositivo. (ovvero "nodi di sviluppo")

Questi file sono associati al driver che gestisce il dispositivo utilizzando numeri maggiori e minori. (Ad esempio, "136, 2" nel tuo ls output si riferisce al driver del dispositivo associato al numero principale 136 e specifica il dispositivo n. 2 gestito da quel driver.)

La prima lettera dell'output di ls -l è il tipo di dispositivo in caso di file di dispositivo. Se è 'c' è un dispositivo a caratteri, o se è 'b', è un dispositivo a blocchi.

Per la tua seconda domanda, fai riferimento alla risposta precedente di rozcietrzewiacz.


Linux
  1. In che modo Linux gestisce più separatori di percorsi consecutivi (/home////nomeutente///file)?

  2. Quando usare /dev/random vs /dev/urandom?

  3. Come ricreare i file del dispositivo LVM nella directory /dev usando vgmknodes

  4. Cosa sono i file /dev/zero e /dev/null in Linux

  5. Come codificare in base64 /dev/random o /dev/urandom?

Comprendere i file /proc/mounts, /etc/mtab e /proc/partitions

Linux:differenza tra /dev/console , /dev/tty e /dev/tty0

kernel:disabilitare /dev/kmem e /dev/mem

Crea un dispositivo a blocchi virtuale che scrive su /dev/null

I siti web dovrebbero vivere in /var/ o /usr/ in base all'utilizzo consigliato?

Differenze tra /dev/sda e /dev/sda1