¿Por qué el comando "ls" muestra permisos de archivos en una partición FAT32?

40

Creo que el sistema de archivos FAT32 no admite permisos de archivos, sin embargo, cuando lo hago ls -len una partición FAT32, ls -lmuestra que los archivos tienen permisos:

-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

¿Por qué se ls -lmuestran los permisos de los archivos?

usuario342731
fuente
¡Buena pregunta! Bienvenido
0xSheepdog

Respuestas:

71

El sistema de archivos tal como está almacenado en el disco no almacena permisos de archivos, pero el controlador del sistema de archivos tiene que proporcionarlos al sistema operativo, ya que son una parte integral del concepto de sistema de archivos Unix y las interfaces de llamada del sistema no tienen forma de presentar que los permisos son desaparecido.

También considere lo que sucedería si un archivo no tuviera ningún bit de permiso. ¿Sería lo mismo que 0777, es decir, acceso a todos; o lo mismo que 0000, es decir, ¿no hay acceso a nadie? Pero ambos son permisos de archivo, entonces, ¿por qué no mostrarlos? O haga algo más útil y tenga una manera de establecer algunos permisos razonables.

Entonces, el controlador falsifica algunos permisos, los mismos para todos los archivos. Los permisos junto con el propietario y el grupo de los archivos son configurables en el momento del montaje. Estos se describen en "Opciones de montaje para grasa" en la página del comando man mount (8) :

Opciones de montaje para fat
(Nota: fat no es un sistema de archivos separado, sino una parte común de los sistemas de archivos msdos, umsdos y vfat).

uid=valuey gid=value
Establecer el propietario y el grupo de todos los archivos. (Valor predeterminado: el UID y el GID del proceso actual).

umask=value
Establezca la umask (la máscara de bits de los permisos que no están presentes). El valor predeterminado es la umask del proceso actual. El valor se da en octal.

dmask=value
Establezca la umask aplicada solo a directorios. El valor predeterminado es la umask del proceso actual. El valor se da en octal.

fmask=value
Establezca la umask aplicada solo a archivos normales. El valor predeterminado es la umask del proceso actual. El valor se da en octal.

Tenga en cuenta que los permisos se presentan como máscaras, por lo que los permisos finales son la negación de la máscara. fmask=0133daría como resultado que todos los archivos tengan permisos 0644, o rw-r--r--.

Además, los valores predeterminados se heredan de la llamada al proceso mount(), por lo que si llama mountdesde la línea de comandos, umaskse aplicará el shell .

ilkkachu
fuente
77
Y la razón por la que falsifica los permisos es que, de lo contrario, ls, y cualquier otro programa que analice los permisos de archivos (incluso solo su código que intenta leer un archivo) tendría que tener la lógica para manejar todas las diferentes organizaciones de sistemas de archivos integradas.
jamesqf
44
@jamesqf, sí, e incluso las interfaces de llamada del sistema no tienen la opción de "no tener permisos", ya que los permisos siempre han estado ahí. (Eso era lo que estaba pensando cuando escribí que son una "parte integral"). Por lo tanto, los permisos siempre estarán allí también, y se hacen cosas como las ACL para que tengan sentido.
ilkkachu
2
Por lo general, he visto el modo 777 para todos los archivos en los sistemas de archivos FAT (FAT16 con un controlador antiguo, al menos).
bosque
2
@forest que depende de la umaskopción de montaje, para el cual el valor predeterminado es una máscara de mountproceso (consulte la página de manual vinculada a esta respuesta).
Ruslan
Pero la grasa hace almacenar algunos permisos / atributos (de sólo lectura, oculto, sistema, etc.), incluso si no se asignan exactamente a los Unix. chmod ugo-wen un archivo activará el atributo de solo lectura. Usar la fmask=0133opción como en su ejemplo no dará como resultado que todos los archivos tengan el permiso 0644. Lo que FAT no almacena en absoluto es un uid y un gid para cada archivo. Por favor aclarar; La respuesta tal como está es altamente engañosa.
Mosvy
22

Pero los archivos tienen permisos. El usuario John tiene acceso RW, mientras que un usuario aleatorio solo tiene acceso de lectura. Estos permisos no provienen del sistema de archivos en sí, sino de las opciones de montaje (-o uid / gid / umask), lo que no los hace menos reales.

Podría tener múltiples particiones vfat montadas con diferentes opciones y podría usar ls para determinar cuáles eran esas opciones. Incluso podría usar mount --bind para que un solo directorio contenga archivos de diferentes particiones vfat, y ls mostraría correctamente qué permisos se han especificado para cada archivo.

Roman Odaisky
fuente
15

lsno sabe sobre FAT32, solo sabe sobre la interfaz del Sistema de archivos virtual (VFS) expuesta por el núcleo con POSIX open/ readdir/ statllamadas al sistema.

Linux no admite el concepto de archivos que no tienen bits de permiso de usuario / grupo / otros, struct statsimplemente contiene un mode_t st_mode;miembro (y uid, miembros gid) que el núcleo debe completar cuando ls -lrealiza stat(2)llamadas al sistema.

No hay un código especial que signifique "no disponible" o "no aplicable" para ninguno de esos campos, por lo que el controlador vfat del núcleo debe inventar algo. FAT16 / FAT32 tiene un indicador de solo lectura, pero de lo contrario, el propietario / grupo proviene de las opciones de montaje, y también lo hace una umask.

Peter Cordes
fuente