Montaje de un recurso compartido de archivos de Azure de SMB en Linux

Precaución

En este artículo se hace referencia a CentOS, una distribución de Linux que está cerca de su estado Final de ciclo vida (EOL). Tenga en cuenta su uso y planifique en consecuencia. Para más información, consulte la Guía de fin de ciclo de vida de CentOS. Azure Files es el sencillo sistema de archivos en la nube de Microsoft. 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.

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:

Se agregó compatibilidad con SMB 2.1 a la versión 3.7 del kernel de Linux. Si usa una versión del kernel de Linux posterior a la 3.7, debe ser compatible con SMB 2.1.

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. El paquete cifs-utils se puede instalar con 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, monte el recurso compartido de archivos mediante el comando mount. 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 y $STORAGE_ACCOUNT_KEY se rellena con la clave de la cuenta de almacenamiento.

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 username=$STORAGE_ACCOUNT_NAME,password=$STORAGE_ACCOUNT_KEY,serverino,nosharesock,actimeo=30,mfsymlinks

Puede usar uid/gid o dir_mode y file_mode en las opciones de montaje del comando mount para establecer permisos. Para obtener más información sobre cómo establecer permisos, consulte Notación numérica de UNIX.

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 en Wikipedia.

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" | 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 may 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.

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 :$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

Montaje de una instantánea de recurso compartido de archivos

Si quiere montar una instantánea específica de un recurso compartido de archivos SMB de Azure, debe proporcionar la opción snapshot como parte del comando mount, donde snapshot es el momento en que se creó la instantánea concreta en un formato como @GMT-2023.01.05-00.08.20. La opción snapshot se admite en el kernel de Linux desde la versión 4.19.

Después de crear la instantánea del recurso compartido de archivos, siga estas instrucciones para montarla.

  1. En Azure Portal, vaya a la cuenta de almacenamiento que contiene el recurso compartido de archivos del que quiere montar una instantánea.

  2. Seleccione Almacenamiento de datos > Recursos compartidos de archivos y seleccione el recurso compartido de archivos.

  3. Seleccione Operaciones > Instantáneas y anote el nombre de la instantánea que quiere montar. El nombre de la instantánea será una marca de tiempo GMT, como se muestra en la captura de pantalla siguiente.

    Captura de pantalla en la que se muestra cómo buscar el nombre y la marca de tiempo de una instantánea de recurso compartido de archivos en Azure Portal.

  4. Convierta la marca de tiempo al formato que espera el comando mount, es decir, @GMT-año.mes.día-hora.minutos.segundos. En este ejemplo, convertiría 2023-01-05T00:08:20.0000000Z en @GMT-2023.01.05-00.08.20.

  5. Ejecute el comando mount con la hora GMT para especificar el valor snapshot. Asegúrese de reemplazar <storage-account-name>, <file-share-name> y la marca de tiempo GMT por sus valores. El archivo .cred contiene las credenciales que se usarán para montar el recurso compartido (consulte Montaje automático de recursos compartidos de archivos).

    sudo mount -t cifs //<storage-account-name>.file.core.windows.net/<file-share-name> /media/<file-share-name>/snapshot1 -o credentials=/etc/smbcredentials/snapshottestlinux.cred,snapshot=@GMT-2023.01.05-00.08.20
    
  6. Si puede examinar la instantánea en la ruta de acceso /media/<file-share-name>/snapshot1, el montaje se realizó correctamente.

Si se produce un error en el montaje, vea Solución de problemas de conectividad y acceso de Azure Files (SMB).

Pasos siguientes

Consulte los vínculos siguientes para más información sobre Azure Files: