Comprendre / dev et ses sous-répertoires et fichiers


53
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. Je me demandais si tous les fichiers sous /devet ses sous-répertoires sont tous des descripteurs de fichiers de périphériques?
  2. Pourquoi y a-t-il tant de liens les uns aux autres? Par exemple, /dev/fd/0, /dev/stdin, /proc/self/fd/0sont tous les liens vers /dev/pts/2.
  3. Si len lrwx------lien moyen, qu'est-ce cen crw--w---- moyenne?

3
Et pour répondre à la question 3, le c représente le caractère du périphérique, ou caractère spécial . b signifie bloc spécial .
felixphew

Réponses:


79

Presque tous les fichiers sous /devsont des fichiers de périphérique . Alors que la lecture et l’écriture dans un fichier standard stocke les données sur un disque ou un autre système de fichiers, l’accès à un fichier de périphérique communique avec un pilote du noyau, qui communique généralement à son tour avec un élément matériel (un périphérique matériel, d’où son nom).

Il existe deux types de fichiers de périphérique: les périphériques de bloc (indiqués par ble premier caractère de la sortie de ls -l) et les périphériques de caractères (indiqués par c). La distinction entre les blocs et les périphériques de caractères n’est pas totalement universelle. Les périphériques en mode bloc sont des éléments tels que les disques, qui se comportent comme des fichiers volumineux de taille fixe: si vous écrivez un octet avec un certain décalage et lisez plus tard à partir du périphérique avec ce décalage, vous récupérez cet octet. Les périphériques de type caractères sont à peu près tout ce qui se passe où l'écriture d'un octet a un effet immédiat (par exemple, il est émis sur une ligne série) et la lecture d'un octet a également un effet immédiat (par exemple, elle est lue depuis le port série).

La signification d'un fichier de périphérique est déterminée par son numéro et non par son nom (le nom est important pour les applications mais pas pour le noyau). Le numéro est en fait deux chiffres: le numéro majeur indique quel pilote est responsable de ce périphérique et le numéro mineur permet à un pilote de conduire plusieurs périphériques¹. Ces numéros apparaissent dans la ls -lliste, où vous trouverez normalement la taille du fichier. Par exemple brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ cet appareil est majeur 8, mineur 0.

Certains fichiers de périphérique sous /devne correspondent pas à des périphériques matériels. Celui qui existe sur tous les systèmes Unix est /dev/null; son écriture n'a aucun effet et sa lecture ne renvoie aucune donnée. C'est souvent pratique dans les scripts shell, quand vous voulez ignorer le résultat d'une commande ( >/dev/null) ou exécuter une commande sans input ( </dev/null). D'autres exemples courants sont /dev/zero(qui renvoie des octets nuls ad infinitum ) /dev/urandom(qui renvoie des octets aléatoires ad infinitum ).

Quelques fichiers de périphérique ont une signification qui dépend du processus qui y accède. Par exemple, /dev/stdindésigne l'entrée standard du processus en cours; L'ouverture de ouvre a à peu près le même effet que d'ouvrir le fichier d'origine ouvert en tant qu'entrée standard du processus. De manière similaire, /dev/ttydésigne le terminal auquel le processus est connecté. De nos jours, sous Linux, les /dev/stdinamis ne sont pas implémentés comme des périphériques de caractères, mais plutôt comme des liens symboliques vers un mécanisme plus général qui permet de référencer tous les descripteurs de fichiers (par opposition à seulement 0, 1 et 2 dans la méthode traditionnelle); par exemple /dev/stdinest un lien symbolique vers /proc/self/fd/0. Voir Quel est le lien entre / dev / fd et / proc / self / fd /? .

Vous trouverez un certain nombre de liens symboliques sous /dev. Cela peut se produire pour des raisons historiques: un fichier de périphérique a été déplacé d'un nom à un autre, mais certaines applications utilisent toujours l'ancien nom. Par exemple, /dev/scd0est un lien symbolique /dev/sr0sous Linux; les deux désignent le premier périphérique CD. Une autre raison de liens symboliques est l' organisation: sous Linux, vous trouverez vos disques et partitions de disque en plusieurs endroits: /dev/sdaet /dev/sda1et les amis (chaque disque désigné par une lettre arbitraire, et les partitions en fonction de la mise en page de la partition), /dev/disk/by-id/*(disques désignés par un numéro de série unique), /dev/disk/by-label/*(partitions avec un système de fichiers, désignées par une étiquette choisie par l'homme); et plus. Les liens symboliques sont également utilisés lorsqu'un nom de périphérique générique peut être l'un des plusieurs; par exemple/dev/dvdIl peut s'agir d'un lien symbolique vers /dev/sr0, ou d'un lien vers /dev/sr1si vous avez deux lecteurs de CD et que le second doit être le lecteur de DVD par défaut.

Enfin, il existe quelques autres fichiers que vous pourriez trouver sous /dev, pour des raisons traditionnelles. Vous ne trouverez pas la même chose sur tous les systèmes. Sur la plupart des ordinateurs, /dev/logest un socket utilisé par les programmes pour émettre des messages de journal. /dev/MAKEDEVest un script qui crée des entrées dans /dev. Sur les systèmes Linux modernes, les entrées /dev/sont créées automatiquement par udev , obsolète MAKEDEV.

¹ En réalité, cela n’est plus vrai sous Linux, mais ce détail n’a d’importance que pour les auteurs de pilotes de périphérique.


Merci! Par "La signification d'un fichier de périphérique est déterminée par son numéro", voulez-vous dire son descripteur de fichier?
Tim

@ Tim: Non, les numéros apparaissent dans la ls -lliste où vous retrouvez normalement la taille du fichier, avant la date, par exemple brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ cet appareil est majeur 8, mineur 0. Les numéros d'appareils ne sont pas fréquents dans la pratique, je viens juste de les mentionner pour dire Ce qui fait d’un appareil un appareil (le plus important, ce n’est pas le nom du fichier). Un numéro de descripteur de fichier n'a de signification que dans un processus particulier.
Gilles, arrête de faire le mal

Non, l'ouverture /dev/stdin(=> /proc/self/fd/0) sous Linux n'a pas le même effet que la duplication d'une entrée standard. Pour voir la différence, su - non_root_useralors exec 5</dev/stdinéchouera avec "Permission Denied", mais exec 5<&0réussira. Et il est non seulement que le nouveau fd sera ouvert avec des drapeaux différents, tout sur l'objet fichier ( « descrip fichier ouvert tion » dans le jargon Posix) sera différent (pointeur de fichier offset, mode non / blocage, etc.).
Mosvy

14
  1. Oui, soit directement, soit sous forme de liens symboliques, c’est /dev/pour cela.
  2. A des fins diverses: parfois pour la compatibilité entre les schémas de nommage, parfois nécessaire pour l'environnement de travail - comme dans l'exemple de /dev/stdin. Cela ne pointe pas statiquement/dev/pts/2 ni vers un autre - il suffit de basculer vers un autre terminal et vous verrez. /dev/stdinest l'entrée standard de votre session de terminal actuelle . C'est aussi un exemple pour lequel il doit s'agir d'un lien symbolique.
  3. Voir man mknodet info coreutils 'mknod invocation'. En général, ccorrespond à un type de périphérique.

3
"entrée standard de votre session de terminal actuelle" est un peu ambigu. /dev/stdinfait référence à l'entrée standard du processus qui l'ouvrira. Tout ce qu’il contient /proc/$pidest constitué de données dépendantes du processus et /proc/selfconstitue une sorte de lien symbolique magique pointant vers les données du processus.
Stéphane Gimenez

11

Pour votre première question, ce ne sont pas des descripteurs de fichier, ce sont des fichiers de périphérique. (aka "dev noeuds")

Ces fichiers sont liés au pilote qui gère le périphérique en utilisant des nombres majeurs et mineurs. (Par exemple, "136, 2" dans votre lssortie fait référence au pilote de périphérique lié au numéro majeur 136 et spécifie le périphérique n ° 2 géré par ce pilote.)

La première lettre de sortie de ls -lest le type de périphérique dans le cas de fichiers de périphérique. Si c'est «c», c'est un périphérique de caractères, ou si c'est «b», c'est un périphérique de bloc.

Pour votre deuxième question, reportez-vous à la réponse ci-dessus de rozcietrzewiacz.


1
Le lien "Introduction aux pilotes de périphérique" semble être rompu.
Slothworks
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.