Monter un partage de fichiers SMB Azure sur Linux

Attention

Cet article fait référence à CentOS, une distribution Linux proche de l’état EOL (End Of Life). Faites le point sur votre utilisation et organisez-vous en conséquence. Pour plus d’informations, consultez les conseils d’aide relatifs à la fin de vie de CentOS. Azure Files est le système de fichiers cloud facile à utiliser de Microsoft. Les partages de fichiers Azure peuvent être montés dans des distributions Linux à l’aide du client SMB en mode noyau.

La méthode recommandée pour monter un partage de fichiers Azure sur Linux est d’utiliser SMB 3.1.1. Par défaut, Azure Files exige un chiffrement en transit, que SMB 3.0+ prend en charge. Azure Files prend aussi en charge SMB 2.1, qui ne prend pas en charge le chiffrement en transit, mais des impératifs de sécurité peuvent vous interdire de monter des partages de fichiers Azure avec SMB 2.1 à partir d’une autre région Azure ou de votre environnement local. À moins que votre application nécessite spécifiquement SMB 2.1, utilisez SMB 3.1.1.

Distribution SMB 3.1.1 (recommandé) SMB 3.0
Version de noyau Linux
  • Prise en charge 3.1.1 de base :4.17
  • Montage par défaut : 5.0
  • Chiffrement AES-128-GCM : 5.3
  • Chiffrement AES-256-GCM : 5.10
  • Prise en charge 3.0 de base : 3.12
  • Chiffrement AES-128-CCM : 4.11
Ubuntu Chiffrement AES-128-GCM : 18.04.5 LTS+ Chiffrement AES-128-CCM : 16.04.4 LTS+
Red Hat Enterprise Linux (RHEL)
  • De base : 8.0+
  • Montage par défaut : 8.2+
  • Chiffrement AES-128-GCM : 8.2+
7.5+
Debian De base : 10+ Chiffrement AES-128-CCM : 10+
SUSE Linux Enterprise Server Chiffrement AES-128-GCM : 15 SP2+ Chiffrement AES-128-CCM : 12 SP2+

Si votre distribution Linux n’est pas indiquée dans le tableau ci-dessus, vous pouvez vérifier la version du noyau Linux à l’aide de la commande uname :

uname -r

Notes

La prise en charge de SMB 2.1 a été ajoutée à la version 3.7 du noyau Linux. Si vous utilisez une version du noyau Linux après la 3.7, elle devrait prendre en charge SMB 2.1.

S’applique à

Type de partage de fichiers SMB NFS
Partages de fichiers Standard (GPv2), LRS/ZRS Oui Non
Partages de fichiers Standard (GPv2), GRS/GZRS Oui Non
Partages de fichiers Premium (FileStorage), LRS/ZRS Oui Non

Prérequis

  • Vérifiez que le package cifs-utils est installé. Le package cifs-utils peut être installé à l’aide du gestionnaire de package sur la distribution Linux de votre choix.

Sur Ubuntu et Debian, utilisez le gestionnaire de packages apt :

sudo apt update
sudo apt install cifs-utils

Sur les autres distributions, utilisez le gestionnaire de packages approprié ou effectuez une compilation à partir de la source.

  • La dernière version de l’interface de ligne de commande Azure (CLI). Pour plus d'informations sur l'installation d’Azure CLI, consultez Installer l’interface de ligne de commande Microsoft Azure et sélectionnez votre système d’exploitation. Si vous préférez utiliser le module Azure PowerShell dans PowerShell 6+, rien ne vous en empêche. Sachez cependant que les instructions de cet article s’appliquent à Azure CLI.

  • Vérifiez que le port 445 est ouvert : SMB communique sur le port TCP 445. Vérifiez que votre pare-feu ou fournisseur de services Internet ne bloque pas le port TCP 445 de la machine cliente. Remplacez <your-resource-group> et <your-storage-account>, puis exécutez le script suivant :

    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 connexion a été établie, vous devez obtenir une sortie semblable à la suivante :

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

    Si vous ne parvenez pas à ouvrir le port 445 sur votre réseau d’entreprise ou que vous n’y êtes pas autorisé par un fournisseur de services Internet, vous pouvez utiliser une connexion VPN ou ExpressRoute pour contourner le port 445. Pour plus d’informations, consultez Considérations relatives à la mise en réseau pour un accès direct à un partage de fichiers Azure.

Montage du partage de fichiers Azure à la demande avec mount

Lorsque vous montez un partage de fichiers sur un système d’exploitation Linux, votre partage de fichiers distant est représenté sous la forme d’un dossier dans votre système de fichiers local. Vous pouvez monter des partages de fichiers sur n’importe quel emplacement de votre système. L’exemple suivant monte sous le chemin d’accès /media. Vous pouvez remplacer cela par le chemin d’accès par défaut que vous souhaitez en modifiant la variable $MNT_ROOT.

Remplacez <resource-group-name>, <storage-account-name> et <file-share-name> par les informations correspondant à votre environnement :

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

Ensuite, montez le partage de fichiers à l’aide de la commande mount. Dans l’exemple suivant, la commande $SMB_PATH est remplie à l’aide du nom de domaine complet pour le point de terminaison de fichier du compte de stockage et $STORAGE_ACCOUNT_KEY est renseigné avec la clé de compte de stockage.

Notes

À partir de la version 5.0 du noyau Linux, SMB 3.1.1 est le protocole négocié par défaut. Si vous utilisez une version du noyau Linux antérieure à 5.0, spécifiez vers=3.1.1 dans la liste d’options de montage.

# 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

Vous pouvez utiliser uid/gid ou dir_mode et file_mode dans les options de montage de la commande mount pour définir des autorisations. Pour plus d’informations sur la façon de définir les autorisations, consultez la notation numérique UNIX.

Vous pouvez également monter le même partage de fichiers Azure sur plusieurs points de montage, si vous le souhaitez. Quand vous avez terminé d’utiliser le partage de fichiers Azure, utilisez sudo umount $mntPath pour démonter le partage.

Monter automatiquement les partages de fichiers

Lorsque vous montez un partage de fichiers sur un système d’exploitation Linux, votre partage de fichiers distant est représenté sous la forme d’un dossier dans votre système de fichiers local. Vous pouvez monter des partages de fichiers sur n’importe quel emplacement de votre système. L’exemple suivant monte sous le chemin d’accès /media. Vous pouvez remplacer cela par le chemin d’accès par défaut que vous souhaitez en modifiant la variable $MNT_ROOT.

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

Pour monter un partage de fichiers Azure sur Linux, utilisez le nom du compte de stockage comme nom d’utilisateur du partage de fichiers et la clé du compte de stockage comme mot de passe. Puisque les informations d’identification du compte de stockage peuvent changer au fil du temps, vous devez stocker les informations d’identification du compte de stockage séparément de la configuration de montage.

L’exemple suivant montre comment créer un fichier pour stocker les informations d’identification. N’oubliez pas de remplacer <resource-group-name> et <storage-account-name> par les informations correspondant à votre environnement.

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

Pour monter automatiquement un partage de fichiers, vous avez le choix entre l’utilisation d’un montage statique via l’utilitaire /etc/fstab ou l’utilisation d’un montage dynamique via l’utilitaire autofs.

Montage statique avec /etc/fstab

À l’aide de l’environnement précédent, créez un dossier pour votre compte de stockage/partage de fichiers dans votre dossier de montage. Remplacez <file-share-name> par le nom approprié de votre partage de fichiers Azure.

FILE_SHARE_NAME="<file-share-name>"

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

Enfin, créez un enregistrement dans le fichier /etc/fstab de votre partage de fichiers Azure. Dans la commande ci-dessous, le fichier Linux 0755 et les autorisations de dossier par défaut sont utilisés, ce qui signifie lecture, écriture et exécution pour le propriétaire (en fonction du propriétaire Linux des fichiers/répertoires), lecture et exécution pour les utilisateurs du groupe propriétaire, et lecture et exécution pour les autres utilisateurs du système. Vous souhaiterez peut-être des valeurs uid et gid alternatives ou les autorisations dir_mode et file_mode sur le montage. Pour plus d’informations sur la façon de définir les autorisations, consultez la notation numérique UNIX sur Wikipédia.

Conseil

Si vous souhaitez que les conteneurs Docker exécutant des applications .NET Core puissent écrire dans le partage de fichiers Azure, incluez nobrl dans les options de montage SMB pour éviter d’envoyer des demandes de verrouillage de plage d’octets au serveur.

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

Notes

À partir de la version 5.0 du noyau Linux, SMB 3.1.1 est le protocole négocié par défaut. Vous pouvez spécifier d’autres versions de protocole à l’aide de l’option de montage vers (les versions de protocole sont 3.1.1, 3.0 et 2.1).

Montage dynamique avec autofs

Pour monter un partage de fichiers de manière dynamique avec l’utilitaire autofs, installez-le à l’aide du gestionnaire de package sur la distribution Linux de votre choix.

Sur les distributions Ubuntu et Debian, utilisez le gestionnaire de packages apt :

sudo apt update
sudo apt install autofs

Ensuite, mettez à jour les fichiers de configuration 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

La dernière étape consiste à redémarrer le service autofs.

sudo systemctl restart autofs

Monter un instantané de partage de fichiers

Si vous souhaitez monter un instantané spécifique d’un partage de fichiers Azure SMB, vous devez fournir l’option snapshot dans le cadre de la commande mount, où snapshot est l’heure à laquelle l’instantané spécifique a été créé dans un format tel que @GMT-2023.01.05-00.08.20. L’option snapshot est prise en charge dans le noyau Linux depuis la version 4.19.

Une fois l’instantané du partage de fichiers créé, suivez ces instructions pour le monter.

  1. Dans le portail Azure, accédez au compte de stockage contenant le partage de fichiers dont vous souhaitez monter un instantané.

  2. Sélectionnez Stockage de données > Partages de fichiers et sélectionnez le partage de fichiers.

  3. Sélectionnez Opérations > Instantanés et notez le nom de l’instantané que vous souhaitez monter. Le nom de l’instantané sera un horodatage GMT, comme dans la capture d’écran ci-dessous.

    Capture d’écran montrant comment localiser le nom et l’horodatage d’un instantané de partage de fichiers dans le portail Azure.

  4. Convertissez l’horodatage au format attendu par la commande mount, qui est @GMT-année.mois.jour-heure.minutes.secondes. Dans cet exemple, vous convertirez 2023-01-05T00:08:20.0000000Z en @GMT-2023.01.05-00.08.20.

  5. Exécutez la commande mount à l’aide de l’heure GMT pour spécifier la valeur snapshot. Veillez à remplacer <storage-account-name>, <file-share-name> et l’horodatage GMT par vos valeurs. Le fichier .cred contient les informations d’identification à utiliser pour monter le partage (consultez Monter automatiquement les partages de fichiers).

    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 vous pouvez parcourir l’instantané sous le chemin /media/<file-share-name>/snapshot1, le montage a réussi.

Si le montage échoue, consultez Résoudre les problèmes de connectivité et d’accès Azure Files (SMB).

Étapes suivantes

Consultez ces liens pour en savoir plus sur Azure Files :