Pourquoi la commande "ls" indique-t-elle les autorisations des fichiers d'une partition FAT32?

40

Je pense que le système de fichiers FAT32 ne prend pas en charge les autorisations de fichiers. Toutefois, lorsque je le fais ls -lsur une partition FAT32, cela ls -lindique que les fichiers ont des autorisations:

-rw-r--r-- 1 john john 11 Mar 20 15:43 file1.txt
-rw-r--r-- 1 john john 5 Mar 20 15:49 file2.txt

Pourquoi l' ls -laffichage des autorisations des fichiers?

utilisateur342731
la source
Bonne question! Bienvenue
0xSheepdog

Réponses:

71

Le système de fichiers stocké sur le disque ne stocke pas les autorisations de fichiers, mais le pilote de système de fichiers doit les fournir au système d'exploitation, car elles font partie intégrante du concept de système de fichiers Unix et les interfaces d'appel système n'ont aucun moyen de présenter les autorisations. manquant.

Pensez également à ce qui se produirait si un fichier ne contenait aucune autorisation. Serait-ce la même chose 0777, c'est-à-dire l'accès à tous? ou le même que 0000, c'est-à-dire pas d'accès à personne? Mais les deux sont des autorisations de fichiers, alors pourquoi ne pas les afficher? Ou faites quelque chose de plus utile et disposez d'un moyen de définir des autorisations raisonnables.

Le pilote simule donc certaines autorisations, les mêmes pour tous les fichiers. Les autorisations avec le propriétaire et le groupe de fichiers sont configurables au moment du montage. Celles-ci sont décrites dans "Options de montage pour la graisse" dans la page de manuel mount (8) :

Options de montage pour fat
(Remarque: fat n'est pas un système de fichiers distinct, mais une partie commune des systèmes de fichiers msdos, umsdos et vfat.)

uid=valueet gid=value
Définissez le propriétaire et le groupe de tous les fichiers. (Par défaut: l'UID et le GID du processus en cours.)

umask=value
Définissez le umask (le masque de bits des autorisations qui ne sont pas présentes). La valeur par défaut est l'umask du processus en cours. La valeur est donnée en octal.

dmask=value
Définissez l'umask appliqué aux répertoires uniquement. La valeur par défaut est l'umask du processus en cours. La valeur est donnée en octal.

fmask=value
Définissez umask appliqué aux fichiers normaux uniquement. La valeur par défaut est l'umask du processus en cours. La valeur est donnée en octal.

Notez que les autorisations sont présentées sous forme de masques. Par conséquent, les autorisations finales correspondent à la négation du masque. fmask=0133tous les fichiers auraient des autorisations 0644, ou rw-r--r--.

De plus, les valeurs par défaut sont héritées de l'appel du processus mount(). Par conséquent, si vous appelez à mountpartir de la ligne de commande, le shell umasks'appliquera.

ilkkachu
la source
7
Et la raison pour laquelle il simule les autorisations, c’est que sinon, ls, et tout autre programme traitant des autorisations de fichiers (même votre code essayant de lire un fichier) aurait besoin de la logique pour gérer toutes les différentes organisations de système de fichiers intégrées.
jamesqf
4
@jamesqf, oui, et même les interfaces d’appel système n’ont pas la possibilité de "ne pas avoir d’autorisations", car les autorisations ont toujours été présentes. (C’est ce que je pensais lorsque j’ai écrit qu’ils constituaient une "partie intégrante".) Par conséquent, les autorisations doivent toujours être là aussi, et des éléments tels que les listes de contrôle d’accès sont créés de manière à leur donner un sens.
ilkkachu
2
J'ai généralement vu le mode 777 pour tous les fichiers dans les systèmes de fichiers FAT (au moins FAT16 avec un ancien pilote).
forêt
2
@forest qui dépend de l' umaskoption de montage, pour laquelle la valeur par défaut est umask of mountprocess (voir la page de manuel associée à cette réponse).
Ruslan
Mais FAT ne stocker certaines autorisations / attributs (lecture seule, caché, système, etc.), même si elles ne correspondent pas exactement à ceux Unix. chmod ugo-wsur un fichier activera l'attribut en lecture seule. Utiliser l' fmask=0133option comme dans votre exemple n'entraînera pas tous les fichiers avec l'autorisation 0644. Ce que FAT ne stocke absolument pas est un uid et un gid pour chaque fichier. Précisez s'il vous plaît; la réponse actuelle est très trompeuse.
Mosvy
22

Mais les fichiers ont des autorisations. L'utilisateur john a un accès rw, alors que certains utilisateurs aléatoires n'ont qu'un accès en lecture. Ces autorisations ne proviennent pas du système de fichiers lui-même, mais des options de montage (-o uid / gid / umask), ce qui ne les rend pas moins réelles.

Vous pouvez avoir plusieurs partitions vfat montées avec différentes options et vous pouvez utiliser ls pour déterminer quelles sont ces options. Vous pourriez même utiliser mount --bind pour avoir un seul répertoire contenant des fichiers de différentes partitions vfat, et ls afficherait correctement les autorisations spécifiées pour chaque fichier.

Roman Odaisky
la source
15

lsne connaît pas FAT32, il ne connait que l'interface VFS (Virtual Filesystem) exposée par le noyau avec les appels POSIX open/ readdir/ statsystem.

Linux ne supporte pas le concept de fichiers qui n'ont pas l' utilisateur / groupe / autres bits d'autorisation, struct statcontient simplement un mode_t st_mode;membre (et uid, membres GID) que le noyau doit remplir quand ls -lfait des stat(2)appels système.

Il n'y a pas de code spécial qui signifie "non disponible" ou "non applicable" pour ces champs. Le pilote vfat du noyau doit donc inventer quelque chose. FAT16 / FAT32 a un indicateur en lecture seule, mais sinon, le propriétaire / groupe provient d'options de montage, de même qu'un umask.

Peter Cordes
la source