Permisos de archivo para WSL

En esta página se detalla cómo se interpretan los permisos de archivo de Linux en el Subsistema de Windows para Linux, en especial al acceder a recursos dentro de Windows en el sistema de archivos NT. En esta documentación se supone que tienes un conocimiento básico de la estructura de permisos del sistema de archivos de Linux y del comando umask.

Al acceder a los archivos de Windows desde WSL, los permisos de archivo se calculan a partir de los permisos de Windows o se leen de los metadatos que WSL ha agregado al archivo. Estos metadatos no están habilitados de forma predeterminada.

Metadatos de WSL en archivos de Windows

Cuando los metadatos están habilitados como opción de montaje en WSL, se pueden agregar e interpretar atributos extendidos en archivos de Windows NT para proporcionar los permisos del sistema de archivos de Linux.

WSL puede agregar cuatro atributos extendidos de NTFS:

Nombre del atributo Descripción
$LXUID Id. del propietario del usuario
$LXGID Id. del propietario del grupo
$LXMOD Modo de archivo (octales y tipo de permisos de sistemas de archivos; por ejemplo: 0777)
$LXDEV Dispositivo, si es un archivo de dispositivo

Además, cualquier archivo que no sea un archivo o directorio normal (por ejemplo, vínculos simbólicos, FIFO [PEPS], dispositivos de bloques, sockets de UNIX y dispositivos de caracteres) también tiene un punto de repetición de análisis de NTFS. De este modo, es mucho más rápido determinar el tipo de archivo en un directorio específico sin tener que consultar sus atributos extendidos.

Escenarios de acceso a archivos

A continuación, se muestra una descripción de cómo se determinan los permisos al acceder a los archivos de diferentes maneras con el Subsistema de Windows para Linux.

Acceso a archivos en el sistema de archivos de la unidad de Windows (DrvFS) desde Linux

Estos escenarios se producen cuando accedes a los archivos de Windows desde WSL, más probablemente a través de /mnt/c.

Lectura de los permisos de un archivo de Windows existente

El resultado depende de si el archivo ya tiene metadatos.

El archivo DrvFS no tiene metadatos (valor predeterminado)

Si el archivo no tiene metadatos asociados, convertimos los permisos vigentes del usuario de Windows en bits de lectura, escritura o ejecución, y los establecemos en el mismo valor para el usuario, el grupo y otros. Por ejemplo, si tu cuenta de usuario de Windows tiene acceso de lectura y ejecución, pero no tiene acceso de escritura al archivo, se mostrará como r-x para el usuario, el grupo y otros. Si el archivo tiene el atributo "Solo lectura" establecido en Windows, no concederemos el acceso de escritura en Linux.

El archivo tiene metadatos

Si el archivo tiene metadatos, simplemente usamos esos valores de metadatos en lugar de convertir los permisos vigentes del usuario de Windows.

Cambio de los permisos de archivo de un archivo de Windows existente mediante chmod

El resultado depende de si el archivo ya tiene metadatos existentes.

El archivo chmod no tiene metadatos (valor predeterminado)

Chmod solo tendrá un efecto. Si quita todos los atributos de escritura de un archivo, se establecerá el atributo "Solo lectura" en el archivo de Windows, ya que se trata del mismo comportamiento de CIFS (Sistema de archivos de Internet común), que es el cliente SMB (Bloque de mensajes del servidor) en Linux.

El archivo chmod tiene metadatos

Chmod cambiará o agregará metadatos en función de los metadatos ya existentes del archivo.

Ten en cuenta que no puedes concederte un mayor acceso del que tienes en Windows, aunque los metadatos indiquen lo contrario. Por ejemplo, podrías establecer los metadatos para mostrar que tienes permisos de escritura en un archivo mediante chmod 777, pero si intentas acceder a ese archivo, tampoco podrás escribir en él. Esto se debe a la interoperabilidad, ya que los comandos de lectura o escritura en los archivos de Windows se enrutan a través de los permisos de usuario de Windows.

Creación de un archivo en DriveFS

El resultado depende de si los metadatos están habilitados.

Los metadatos no están habilitados (valor predeterminado)

Los permisos de Windows del archivo recién creado serán los mismos que si creas el archivo en Windows sin un descriptor de seguridad específico. Este heredará los permisos del elemento primario.

Los metadatos están habilitados

Los bits de permiso del archivo se establecen para seguir el comando umask de Linux, y el archivo se guardará con metadatos.

¿Qué usuario y grupo de Linux son propietarios del archivo?

El resultado depende de si el archivo ya tiene metadatos existentes.

El archivo de usuario no tiene metadatos (valor predeterminado)

En el escenario predeterminado, al montar las unidades de Windows de forma automática, especificamos que el identificador de usuario (UID) de cualquier archivo se establece en el identificador del usuario de WSL, y el identificador de grupo (GID) se establece en el identificador de grupo principal del usuario de WSL.

El archivo de usuario tiene metadatos

El UID y el GID especificados en los metadatos se aplican como propietario del usuario y del grupo del archivo.

Acceso a archivos de Linux desde Windows mediante \\wsl$

El acceso a los archivos de Linux a través de \\wsl$ usará el usuario predeterminado de la distribución de WSL. Por lo tanto, cualquier aplicación de Windows que acceda a archivos de Linux tendrá los mismos permisos que el usuario predeterminado.

Creación de un archivo nuevo

El valor de umask predeterminado se aplica al crear un nuevo archivo dentro de una distribución de WSL desde Windows. Dicho valor es 022 o, en otras palabras, permite todos los permisos excepto los de escritura para grupos y otros.

Acceso a archivos en el sistema de archivos raíz de Linux desde Linux

Los archivos creados, modificados o a los que se accede en el sistema de archivos raíz de Linux siguen las convenciones estándar de Linux, como la aplicación de umask a un archivo recién creado.

Configuración de permisos de archivo

Puedes configurar los permisos de archivo dentro de las unidades de Windows mediante las opciones de montaje de wsl.conf. Las opciones de montaje te permiten establecer las máscaras de permisos umask, dmask y fmask. umask se aplica a todos los archivos, dmask se aplica solo a los directorios y fmask se aplica solo a los archivos. Luego, estas máscaras de permisos se someten a una operación OR lógica cuando se aplican a archivos, por ejemplo: Si tienes un valor de umask de 023 y uno de fmask de 022, la máscara de permisos resultante para los archivos será 023.

Más información: Opciones de configuración por distribución con wsl.conf.