Compartir a través de


Montaje de recursos compartidos de archivos de Azure SMB en clientes Linux

Los recursos compartidos de archivos de Azure se pueden montar en distribuciones de Linux mediante el cliente kernel de SMB.

Para montar un recurso compartido de archivos de Azure en Linux se recomienda usar SMB 3.1.1. De forma predeterminada, Azure Files requiere cifrado en tránsito, que solo se admite SMB 3.0, y en las versiones posteriores. Azure Files también admite SMB 2.1, que no admite el cifrado en tránsito, pero no puede montar recursos compartidos de archivos de Azure con SMB 2.1 desde otra región de Azure o de forma local por motivos de seguridad. Salvo que la aplicación requiera específicamente SMB 2.1, use SMB 3.1.1. La compatibilidad con SMB 2.1 se ha agregado a la versión 3.7 del kernel de Linux, por lo que si usa una versión del kernel de Linux después de la versión 3.7, debe admitir SMB 2.1.

Distribución SMB 3.1.1 (recomendado) SMB 3.0
Versión del kernel de Linux
  • Compatibilidad básica con 3.1.1: 4.17
  • Montaje predeterminado: 5.0
  • Cifrado AES-128-GCM: 5.3
  • Cifrado AES-256-GCM: 5.10
  • Compatibilidad básica con 3.0: 3.12
  • Cifrado AES-128-CCM: 4.11
Ubuntu Cifrado AES-128-GCM: 18.04.5 LTS+ Cifrado AES-128-CCM: 16.04.4 LTS+
Red Hat Enterprise Linux (RHEL)
  • Básico: 8.0 (o posterior)
  • Montaje predeterminado: 8.2 (o posterior)
  • Cifrado AES-128-GCM: 8.2 (o posterior)
7.5 (o posterior)
Debian Básico: 10 (o posterior) Cifrado AES-128-CCM: 10 (o posterior)
SUSE Linux Enterprise Server Cifrado AES-128-GCM: 15 SP2 (o posterior) Cifrado AES-128-GCM: 12 SP2 (o posterior)

Si la distribución de Linux no aparece en la tabla anterior, puede comprobar la versión del kernel de Linux con el comando uname:

uname -r

Nota:

Todos los scripts de montaje de este artículo montarán recursos compartidos de archivos SMB con los permisos predeterminados de archivos y carpetas de Linux 0755. Esto significa leer, escribir y ejecutar para el propietario del archivo o directorio, leer y ejecutar para los usuarios del grupo propietario, y leer y ejecutar para otros usuarios. En función de las directivas de seguridad de la organización, es posible que desee establecer permisos alternativos uid/gid o dir_mode y file_mode en las opciones de montaje. Para obtener más información sobre cómo establecer permisos, consulte Notación numérica de UNIX. Consulte opciones de montaje para obtener una lista de opciones de montaje.

Se aplica a

Tipo de recurso compartido de archivos SMB NFS
Recursos compartidos de archivos Estándar (GPv2), LRS/ZRS Sí No
Recursos compartidos de archivos Estándar (GPv2), GRS/GZRS Sí No
Recursos compartidos de archivos Premium (FileStorage), LRS/ZRS Sí No

Requisitos previos

  • Asegúrese de que el paquete cifs-utils está instalado. Instale la última versión del paquete cifs-utils mediante el administrador de paquetes en la distribución de Linux de su elección.

En Ubuntu y Debian, use el administrador de paquetes apt:

sudo apt update
sudo apt install cifs-utils

En otras distribuciones, use el administrador de paquetes apropiado o compile desde el origen.

  • La versión más reciente de la interfaz de la línea de comandos (CLI). Para más información sobre cómo instalar la CLI de Azure, consulte Instalación de la CLI de Azure y seleccione el sistema operativo. Si prefiere usar el módulo de Azure PowerShell en PowerShell 6+, puede hacerlo. Sin embargo, las instrucciones de este artículo son para la CLI de Azure.

  • Asegúrese de que el puerto 445 está abierto: SMB se comunica a través del puerto TCP 445, así que asegúrese de que el firewall o ISP no bloquea el puerto TCP 445 en el equipo cliente. Reemplace <your-resource-group> y <your-storage-account> y luego ejecute el siguiente script:

    RESOURCE_GROUP_NAME="<your-resource-group>"
    STORAGE_ACCOUNT_NAME="<your-storage-account>"
    
    # This command assumes you have logged in with az login
    HTTP_ENDPOINT=$(az storage account show \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $STORAGE_ACCOUNT_NAME \
        --query "primaryEndpoints.file" --output tsv | tr -d '"')
    SMBPATH=$(echo $HTTP_ENDPOINT | cut -c7-${#HTTP_ENDPOINT})
    FILE_HOST=$(echo $SMBPATH | tr -d "/")
    
    nc -zvw3 $FILE_HOST 445
    

    Si la conexión se realizó correctamente, verá algo parecido a la siguiente salida:

    Connection to <your-storage-account> 445 port [tcp/microsoft-ds] succeeded!
    

    Si no puede abrir el puerto 445 en su red corporativa o si un ISP le impide hacerlo, puede utilizar una conexión VPN o ExpressRoute como solución alternativa al puerto 445. Para más información, consulte Consideraciones de redes para el acceso directo a los recursos compartidos de archivos de Azure.

Montaje del recurso compartido de archivos de Azure a petición con mount

Al montar un recurso compartido de archivos en un sistema operativo Linux, el recurso compartido de archivos remoto se representa como una carpeta en el sistema de archivos local. Los recursos compartidos de archivos se pueden montar en cualquier lugar del sistema. En el ejemplo siguiente el montaje se realiza en la ruta de acceso /media. Para cambiarla por otra que desee, modifique la variable $MNT_ROOT.

Reemplace <resource-group-name>, <storage-account-name> y <file-share-name> por la información correcta para su entorno:

RESOURCE_GROUP_NAME="<resource-group-name>"
STORAGE_ACCOUNT_NAME="<storage-account-name>"
FILE_SHARE_NAME="<file-share-name>"

MNT_ROOT="/media"
MNT_PATH="$MNT_ROOT/$STORAGE_ACCOUNT_NAME/$FILE_SHARE_NAME"

sudo mkdir -p $MNT_PATH

A continuación, inicialice el archivo de credenciales ejecutando el siguiente script.

# Create a folder to store the credentials for this storage account and
# any other that you might set up.
CREDENTIAL_ROOT="/etc/smbcredentials"
sudo mkdir -p "/etc/smbcredentials"

# Get the storage account key for the indicated storage account.
# You must be logged in with az login and your user identity must have
# permissions to list the storage account keys for this command to work.
STORAGE_ACCOUNT_KEY=$(az storage account keys list \
    --resource-group $RESOURCE_GROUP_NAME \
    --account-name $STORAGE_ACCOUNT_NAME \
    --query "[0].value" --output tsv | tr -d '"')

# Create the credential file for this individual storage account
SMB_CREDENTIAL_FILE="$CREDENTIAL_ROOT/$STORAGE_ACCOUNT_NAME.cred"
if [ ! -f $SMB_CREDENTIAL_FILE ]; then
    echo "username=$STORAGE_ACCOUNT_NAME" | sudo tee $SMB_CREDENTIAL_FILE > /dev/null
    echo "password=$STORAGE_ACCOUNT_KEY" | sudo tee -a $SMB_CREDENTIAL_FILE > /dev/null
else
    echo "The credential file $SMB_CREDENTIAL_FILE already exists, and was not modified."
fi

# Change permissions on the credential file so only root can read or modify the password file.
sudo chmod 600 $SMB_CREDENTIAL_FILE

Ahora puede montar el recurso compartido de archivos con el comando mount mediante el archivo de credenciales. En el siguiente ejemplo, el comando $SMB_PATH se rellena con el nombre de dominio completo para el punto de conexión del archivo de la cuenta de almacenamiento. Consulte opciones de montaje para obtener una lista de opciones de montaje de SMB.

Nota:

A partir de la versión 5.0 del kernel de Linux, SMB 3.1.1 es el protocolo negociado predeterminado. Si usa una versión del kernel de Linux anterior a la 5.0, especifique vers=3.1.1 en la lista de opciones de montaje.

# This command assumes you have logged in with az login
HTTP_ENDPOINT=$(az storage account show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $STORAGE_ACCOUNT_NAME \
    --query "primaryEndpoints.file" --output tsv | tr -d '"')
SMB_PATH=$(echo $HTTP_ENDPOINT | cut -c7-${#HTTP_ENDPOINT})$FILE_SHARE_NAME

STORAGE_ACCOUNT_KEY=$(az storage account keys list \
    --resource-group $RESOURCE_GROUP_NAME \
    --account-name $STORAGE_ACCOUNT_NAME \
    --query "[0].value" --output tsv | tr -d '"')

sudo mount -t cifs $SMB_PATH $MNT_PATH -o credentials=$SMB_CREDENTIAL_FILE,serverino,nosharesock,actimeo=30,mfsymlinks

Si lo desea, también puede montar el mismo recurso compartido de archivos de Azure en varios puntos de montaje.

Cuando haya terminado de usar el recurso compartido de archivos de Azure, use sudo umount $mntPath para desmontarlo.

Montaje automático de recursos compartidos de archivos

Al montar un recurso compartido de archivos en un sistema operativo Linux, el recurso compartido de archivos remoto se representa como una carpeta en el sistema de archivos local. Los recursos compartidos de archivos se pueden montar en cualquier lugar del sistema. En el ejemplo siguiente el montaje se realiza en la ruta de acceso /media. Para cambiarla por otra que desee, modifique la variable $MNT_ROOT.

MNT_ROOT="/media"
sudo mkdir -p $MNT_ROOT

Para montar un recurso compartido de archivos de Azure en Linux, use el nombre de la cuenta de almacenamiento como nombre de usuario del recurso compartido de archivos y la clave de la cuenta de almacenamiento como contraseña. Dado que las credenciales de la cuenta de almacenamiento pueden cambiar con el tiempo, deben almacenarse por separado de la configuración de montaje.

En el ejemplo siguiente se muestra cómo crear un archivo para almacenar las credenciales. No olvide reemplazar <resource-group-name> y <storage-account-name> por la información correcta para su entorno.

RESOURCE_GROUP_NAME="<resource-group-name>"
STORAGE_ACCOUNT_NAME="<storage-account-name>"

# Create a folder to store the credentials for this storage account and
# any other that you might set up.
CREDENTIAL_ROOT="/etc/smbcredentials"
sudo mkdir -p "/etc/smbcredentials"

# Get the storage account key for the indicated storage account.
# You must be logged in with az login and your user identity must have
# permissions to list the storage account keys for this command to work.
STORAGE_ACCOUNT_KEY=$(az storage account keys list \
    --resource-group $RESOURCE_GROUP_NAME \
    --account-name $STORAGE_ACCOUNT_NAME \
    --query "[0].value" --output tsv | tr -d '"')

# Create the credential file for this individual storage account
SMB_CREDENTIAL_FILE="$CREDENTIAL_ROOT/$STORAGE_ACCOUNT_NAME.cred"
if [ ! -f $SMB_CREDENTIAL_FILE ]; then
    echo "username=$STORAGE_ACCOUNT_NAME" | sudo tee $SMB_CREDENTIAL_FILE > /dev/null
    echo "password=$STORAGE_ACCOUNT_KEY" | sudo tee -a $SMB_CREDENTIAL_FILE > /dev/null
else
    echo "The credential file $SMB_CREDENTIAL_FILE already exists, and was not modified."
fi

# Change permissions on the credential file so only root can read or modify the password file.
sudo chmod 600 $SMB_CREDENTIAL_FILE

Para montar automáticamente un recurso compartido de archivos, puede elegir entre usar un montaje estático a través de la utilidad /etc/fstab o un montaje dinámico a través de la utilidad autofs.

Montaje estático con /etc/fstab

Utilice el entorno anterior para crear una carpeta para su cuenta de almacenamiento o recurso compartido de archivos en la carpeta de montaje. Reemplace <file-share-name> por el nombre adecuado del recurso compartido de archivos de Azure.

FILE_SHARE_NAME="<file-share-name>"

MNT_PATH="$MNT_ROOT/$STORAGE_ACCOUNT_NAME/$FILE_SHARE_NAME"
sudo mkdir -p $MNT_PATH

Por último, cree un registro en el archivo /etc/fstab para el recurso compartido de archivos de Azure. En el comando siguiente, se usa el valor predeterminado de los permisos de archivo y carpeta de Linux, 0755, lo que significa lectura, escritura y ejecución para el propietario (según el propietario de Linux de archivo o directorio), lectura y ejecución para los usuarios en el grupo de propietarios y lectura y ejecución para otros en el sistema. Es posible que desee establecer los permisos uid y gid, o dir_mode y file_mode alternativos en el montaje según sea necesario. Para obtener más información sobre cómo establecer permisos, consulte Notación numérica de UNIX. Consulte opciones de montaje para obtener una lista de opciones de montaje de SMB.

Sugerencia

Si quiere que los contenedores Docker que ejecutan aplicaciones de .NET Core puedan escribir en el recurso compartido de archivos de Azure, incluya nobrl en las opciones de montaje de SMB para evitar el envío de solicitudes de bloqueo de intervalo de bytes al servidor.

HTTP_ENDPOINT=$(az storage account show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $STORAGE_ACCOUNT_NAME \
    --query "primaryEndpoints.file" --output tsv | tr -d '"')
SMB_PATH=$(echo $HTTP_ENDPOINT | cut -c7-${#HTTP_ENDPOINT})$FILE_SHARE_NAME

if [ -z "$(grep $SMB_PATH\ $MNT_PATH /etc/fstab)" ]; then
    echo "$SMB_PATH $MNT_PATH cifs _netdev,nofail,credentials=$SMB_CREDENTIAL_FILE,serverino,nosharesock,actimeo=30,mfsymlinks" | sudo tee -a /etc/fstab > /dev/null
else
    echo "/etc/fstab was not modified to avoid conflicting entries as this Azure file share was already present. You might want to double check /etc/fstab to ensure the configuration is as desired."
fi

sudo mount -a

Nota:

A partir de la versión 5.0 del kernel de Linux, SMB 3.1.1 es el protocolo negociado predeterminado. Puede especificar versiones alternativas del protocolo mediante la opción de montaje vers (las versiones de protocolo son 3.1.1, 3.0 y 2.1).

Montaje dinámico con autofs

Para montar dinámicamente un recurso compartido de archivos con la utilidad autofs, instálelo mediante el administrador de paquetes en la distribución de Linux que prefiera.

En las distribuciones de Ubuntu y Debian, use el administrador de paquetes apt:

sudo apt update
sudo apt install autofs

A continuación, actualice los archivos de configuración autofs. Consulte opciones de montaje para obtener una lista de opciones de montaje de SMB.

FILE_SHARE_NAME="<file-share-name>"

HTTP_ENDPOINT=$(az storage account show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $STORAGE_ACCOUNT_NAME \
    --query "primaryEndpoints.file" --output tsv | tr -d '"')
SMB_PATH=$(echo $HTTP_ENDPOINT | cut -c7-$(expr length $HTTP_ENDPOINT))$FILE_SHARE_NAME

echo "$FILE_SHARE_NAME -fstype=cifs,credentials=$SMB_CREDENTIAL_FILE,serverino,nosharesock,actimeo=30,mfsymlinks :$SMB_PATH" > /etc/auto.fileshares

echo "/fileshares /etc/auto.fileshares --timeout=60" > /etc/auto.master

El último paso es reiniciar el servicio autofs.

sudo systemctl restart autofs

Opciones de montaje

Puede usar las siguientes opciones de montaje al montar recursos compartidos de archivos de SMB de Azure en Linux.

Opción de montaje Valor recomendado Descripción
username= Nombre de la cuenta de almacenamiento Obligatorio para la autenticación NTLMv2.
password= Clave principal de la cuenta de almacenamiento Obligatorio para la autenticación NTLMv2.
password2= Clave secundaria de la cuenta de almacenamiento Se recomienda en caso de que no sea deseable la rotación de claves sin tiempo de inactividad.
mfsymlinks N/D Opción recomendada. Obliga al montaje a admitir vínculos simbólicos, lo que permite a las aplicaciones como Git clonar repositorios con vínculos simbólicos.
actimeo= 30-60 Opción recomendada. Al especificar actimeo, se establecen acregmin, acregmax, acdirmin y acdirmax en el mismo valor. El uso de un valor inferior a 30 segundos puede provocar una degradación del rendimiento porque las memorias caché de atributos de los archivos y directorios expiran demasiado rápidamente. Se recomienda establecer actimeo entre 30 y 60 segundos.
nosharesock N/D Opcional. Obliga al cliente a realizar siempre una nueva conexión al servidor aunque tenga una conexión existente al montaje de SMB. Esto puede mejorar el rendimiento, ya que cada punto de montaje usará un socket de TCP diferente. En algunos casos, nosharesock puede degradar el rendimiento debido a que no almacena en caché el mismo archivo cuando se abre desde dos montajes desde el mismo cliente.
max_channels= 4 Se recomienda cuando se usa SMB multicanal. Especifica el número máximo de canales (conexiones de red) al recurso compartido de archivos. Si usa SMB multicanal y el número de canales supera los cuatro, esto dará como resultado un rendimiento deficiente.
remount N/D Vuelve a montar el recurso compartido de archivos y cambia las opciones de montaje si se especifica. Use con la opción password2 en los casos en los que desee especificar una contraseña alternativa para corregir una contraseña expirada después del montaje original.
nobrl N/D Se recomienda en escenarios de cliente único cuando se requieren bloqueos de advertencia. Azure Files no admite bloqueos de advertencia y esta configuración impide el envío de solicitudes de bloqueo de rango de bytes al servidor.
snapshot= time Monte una instantánea específica del recurso compartido de archivos. El tiempo debe ser un entero positivo que identifique la instantánea solicitada (en unidades de 100 nanosegundos transcurridos desde el 1 de enero de 1601 o, como alternativa, se puede especificar en formato GMT, por ejemplo, @GMT-2024.03.27-20.52.19).
closetimeo= 5 Configura el tiempo de espera de cierre diferido (controlar la memoria caché) en segundos o lo deshabilita estableciendo en 0. El valor predeterminado es de 5 segundos.
nostrictsync N/D No pida al servidor que vacíe en fsync(). Algunos servidores realizan escrituras no almacenadas en búfer de forma predeterminada, en cuyo caso el vaciado es redundante. Esta opción puede mejorar el rendimiento de las cargas de trabajo en las que un cliente realiza una gran cantidad de combinaciones de escritura y fsync pequeñas y donde la latencia de red es mucho mayor que la latencia del servidor.
multiuser N/D Asigne acceso de usuario a credenciales individuales al acceder al servidor. De forma predeterminada, los montajes CIFS solo usan un único conjunto de credenciales de usuario (las credenciales de montaje) al acceder a un recurso compartido. Con esta opción, el cliente crea en su lugar una nueva sesión con el servidor mediante las credenciales del usuario cada vez que un nuevo usuario accede al montaje. Los accesos adicionales de ese usuario también usarán esas credenciales. Dado que el kernel no puede solicitar contraseñas, los montajes multiusuario se limitan a los montajes mediante opciones de sec= que no requieren contraseñas.
cifsacl N/D Esta opción se usa para asignar ACL CIFS/NTFS a / desde bits de permiso de Linux, asignar SID a / o desde UID y GID, y obtener y establecer descriptores de seguridad. Solo se admite para la autenticación NTLMv2.
idsfromsid,modefromsid N/D Se recomienda cuando el cliente necesita realizar la autorización aplicada por el cliente. Habilita los permisos de estilo Unix. Solo funciona cuando los UIDs/GID son uniformes en todos los clientes. Solo se admite para la autenticación NTLMv2.
sec= krb5 Se requiere para la autenticación Kerberos. Para habilitar el modo de seguridad Kerberos, establezca sec=krb5. Debe omitir el nombre de usuario y la contraseña al usar esta opción. El cliente Linux debe estar unido a un dominio. Consulte Habilitación de la autenticación de Active Directory a través de SMB para clientes Linux.
uid= 0 Opcional. Establece el Id. de usuario que poseerá todos los archivos o directorios del sistema de archivos montado cuando el servidor no proporciona información de propiedad. Se puede especificar como un nombre de usuario o un Id. de usuario numérico. Cuando no se especifica, el valor predeterminado es 0.
gid= 0 Opcional. Establece el identificador de grupo que poseerá todos los archivos o directorios del sistema de archivos montado cuando el servidor no proporciona información de propiedad. Se puede especificar como un nombre de grupo o un identificador de grupo numérico. Cuando no se especifica, el valor predeterminado es 0.
file_mode= N/D Opcional. Si el servidor no admite las extensiones CIFS de UNIX, esto invalida el modo de archivo predeterminado.
dir_mode= N/D Opcional. Si el servidor no admite las extensiones CIFS de UNIX, esto invalida el modo predeterminado para los directorios.
handletimeout= N/D Opcional. La hora (en milisegundos) para la que el servidor debe reservar el identificador de archivo después de una conmutación por error esperando a que el cliente se vuelva a conectar.

Pasos siguientes

Para más información sobre el uso de recursos compartidos de archivos de SMB de Azure con Linux, consulte: