GNU/Linux >> Linux Esercitazione >  >> Linux

Linux – Sysfs e Devtmpfs?

Ulrich Dangel spiega molto bene la differenza tra devtmpfs e udev.

Che dire di sysfs?

Comprendo che il kernel utilizza sysfs per esportare i nodi del dispositivo nello spazio utente che deve essere utilizzato da udev. Quindi devtmpfs e sysfs sono gli stessi? Se sì, perché usano nomi diversi? Se no, qual è la vera differenza tra sysfs e devtmpfs?

Risposta accettata:

il kernel usa sysfs per esportare i nodi del dispositivo nello spazio utente per essere utilizzato da udev

No. Sysfs non contiene nodi dispositivo. Sysfs contiene principalmente file che forniscono informazioni sui dispositivi, nonché alcuni file che consentono ai processi di controllare il funzionamento dei dispositivi. Ma per la maggior parte i dispositivi non possono essere utilizzati attraverso ciò che fornisce sysfs.

Prendiamo un hard disk, per esempio. C'è una directory per questo da qualche parte sotto /sys/devices , con un percorso che dipende da come è collegato al computer (ad es. /sys/devices/pci0000:00/… per un disco collegato a un controller collegato al bus PCI primario del computer). In quella directory, puoi trovare varie informazioni come la sua dimensione, se è rimovibile, il suo stato di alimentazione, ecc. Ci sono anche sottodirectory per le partizioni. Ma non c'è nulla che fornisca l'accesso al contenuto del disco. Altrove in /sys , ci sono collegamenti simbolici alla directory corrispondente a quel disco:in /sys/block , in /sys/class/block , ecc. Ma ancora niente per accedere al contenuto del disco.

In /dev , la voce per il disco è un file speciale, un dispositivo a blocchi. Questo file consente ai processi di leggere e scrivere il contenuto del disco. (Sebbene per un disco ciò di solito non si verifica; invece il contenuto del disco — o di una partizione — è montato, quindi il kernel sta accedendo al dispositivo, i processi no.)

I file del dispositivo consentono di eseguire alcune operazioni diverse dalla lettura e dalla scrittura del contenuto tramite ioctl. Sarebbe possibile fornire tutte le informazioni e le interfacce di controllo fornite da sysfs tramite ioctl sul file del dispositivo. Tuttavia questo sarebbe meno conveniente per diversi motivi:

  • Con file separati in /sys , le autorizzazioni possono essere impostate a grana fine. Con un unico file per dispositivo in /dev , è tutto o niente.
  • File separati possono essere letti e scritti facilmente dalle applicazioni. Puoi semplicemente usare cat o echo . Con ioctl, è molto più difficile:non esiste un'interfaccia shell, spesso nessuna interfaccia in altri linguaggi di alto livello.
  • Con ioctl, il comando deve essere codificato in un numero anziché in un nome e il formato degli argomenti deve essere definito a livello binario. L'uso di nomi e semplici formati di testo semplifica la scrittura di software.

Andando nella direzione opposta, sarebbe possibile fornire l'accesso al contenuto del dispositivo tramite un file in sysfs. Ma ciò richiederebbe un lavoro extra nel kernel:sysfs è progettato principalmente per servire piccoli file e collegamenti simbolici e senza ioctl supporto previsto dalle applicazioni esistenti. Non credo che ci sarebbe un vantaggio significativo nell'espansione di sysfs per supportare i tipi di dispositivi esistenti, da qui l'esistenza continua di file di dispositivo.

Correlati:Linux – Come scoprire quali dischi rigidi ci sono nel sistema?

Sysfs viene popolato automaticamente dal kernel, riflettendo i dispositivi effettivamente disponibili in tempo reale. Il significato di un file in sysfs deriva dal suo percorso, scelto dal driver che fornisce quel file. /dev funziona in modo diverso:il significato di un file deriva dal tipo di file del dispositivo (blocco o carattere) e dai suoi numeri maggiori e minori (questo è ciò che ls -l elenchi invece della dimensione del file per un dispositivo). Tradizionalmente, /dev era statico, con file di dispositivo creati durante l'installazione del sistema; ma non funziona così bene quando i dispositivi possono essere collegati a caldo, da qui il desiderio di un /dev dinamico che riflette i dispositivi collegati in tempo reale.

Linux ha subito diverse iterazioni di un /dev dinamico . Linux 2.4 ha devfs, in cui il kernel ha creato automaticamente voci per riflettere i dispositivi connessi. Ma non è stato così bello, perché ha codificato la denominazione dei dispositivi e le politiche di autorizzazione nel kernel, quindi è stato sostituito dal programma userland udev per gestire la politica e /dev su un semplice filesystem tmpfs (un filesystem in memoria senza alcun significato speciale per il kernel). E poi devfs ha fatto un ritorno parziale, con devtmpfs, che è un'istanza di tmpfs in cui le voci per i dispositivi disponibili vengono create automaticamente dal kernel, ma udev fa tutta la gestione che vuole per di più.


Linux
  1. Comandi Linux:job, bg e fg

  2. Disconnettere e riconnettere ttyUSB0 a livello di codice in Linux

  3. utilizzo dei caratteri jolly di Linux in cp e mv

  4. Come montare un dispositivo in Linux?

  5. Enumerazione coerente dei dispositivi Linux

Tutto è file in Linux – Parte 1

Kernel Linux e le sue funzioni

Installa e configura Ansible in Linux

Installazione e configurazione di Jenkins in Linux

Come rilevare e gestire i dispositivi su Linux

Panoramica di RAMFS e TMPFS su Linux