Condividi tramite


Montare condivisioni file di Azure SMB nei client Linux

Le condivisioni file di Azure possono essere montate nelle distribuzioni Linux usando il client del kernel SMB.

Il modo consigliato per montare una condivisione file di Azure in Linux è usare SMB 3.1.1. Per impostazione predefinita, File di Azure richiede la crittografia in transito, supportata da SMB 3.0+. File di Azure supporta anche SMB 2.1, che non supporta la crittografia in transito. Tuttavia, per motivi di sicurezza, non è possibile montare le condivisioni file di Azure con SMB 2.1 da un'altra area di Azure o in locale. A meno che l'applicazione non richieda in modo specifico SMB 2.1, usare SMB 3.1.1. Il supporto per SMB 2.1 è stato aggiunto alla versione 3.7 del kernel Linux. Se si usa una versione del kernel Linux successiva alla 3.7, dovrebbe quindi supportare SMB 2.1.

Distribuzione SMB 3.1.1 (scelta consigliata) SMB 3.0
Versione del kernel Linux
  • Supporto di base 3.1.1: 4.17
  • Montaggio predefinito: 5.0
  • Crittografia AES-128-GCM: 5.3
  • Crittografia AES-256-GCM: 5.10
  • Supporto di base 3.0: 3.12
  • Crittografia AES-128-CCM: 4.11
Ubuntu Crittografia AES-128-GCM: 18.04.5 LTS+ Crittografia AES-128-CCM: 16.04.4 LTS+
Red Hat Enterprise Linux (RHEL)
  • Basic: 8.0+
  • Montaggio predefinito: 8.2+
  • Crittografia AES-128-GCM: 8.2+
7.5+
Debian Basic: 10+ Crittografia AES-128-GCM: 10+
SUSE Linux Enterprise Server Crittografia AES-128-GCM: 15 SP2+ Crittografia AES-128-GCM: 12 SP2+

Se la distribuzione di Linux non è elencata nella tabella precedente, è possibile controllare la versione del kernel Linux con il comando uname:

uname -r

Nota

Tutti gli script di montaggio in questo articolo monteranno le condivisioni file SMB usando le autorizzazioni predefinite per file e cartelle Linux 0755, ovvero lettura, scrittura ed esecuzione per il proprietario di file/directory, lettura ed esecuzione per gli utenti del gruppo proprietario e lettura ed esecuzione per gli altri utenti. In base ai criteri di sicurezza dell'organizzazione, è possibile impostare autorizzazioni uid/gid alternative o dir_mode e file_mode nelle opzioni di montaggio. Per altre informazioni su come impostare le autorizzazioni, vedere Notazione numerica UNIX. Per un elenco delle opzioni di montaggio, vedere Opzioni di montaggio.

Si applica a

Tipo di condivisione file SMB NFS
Condivisioni file Standard (GPv2), archiviazione con ridondanza locale/archiviazione con ridondanza della zona Sì No
Condivisioni file Standard (GPv2), archiviazione con ridondanza geografica/archiviazione con ridondanza geografica della zona Sì No
Condivisioni file Premium (FileStorage), archiviazione con ridondanza locale/archiviazione con ridondanza della zona Sì No

Prerequisiti

  • Verificare che il pacchetto cifs-utils sia installato. Installare la versione più recente del pacchetto cifs-utils usando la gestione pacchetti nella distribuzione Linux di propria scelta.

In Ubuntu e Debian usare il sistema di gestione pacchetti apt:

sudo apt update
sudo apt install cifs-utils

In altre distribuzioni usare l'utilità di gestione dei pacchetti appropriata o compilare il codice sorgente.

  • La versione più recente dell'interfaccia della riga di comando di Azure. Per altre informazioni su come installare l'interfaccia della riga di comando di Azure, vedere Installare l'interfaccia della riga di comando di Azure e selezionare il sistema operativo in uso. Se si preferisce, è anche possibile usare il modulo Azure PowerShell in PowerShell 6+, ma le istruzioni riportate in questo articolo fanno riferimento all'interfaccia della riga di comando di Azure.

  • Assicurarsi che la porta 445 sia aperta: SMB comunica tramite la porta TCP 445. Verificare che il firewall o il provider di servizi internet non blocchi la porta TCP 445 del computer client. Sostituire <your-resource-group> e <your-storage-account>, quindi eseguire lo script seguente:

    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
    

    Se la connessione ha avuto esito positivo, verrà visualizzato un risultato simile all'output seguente:

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

    Se non è possibile aprire la porta 445 nella rete aziendale o il provider di servizi Internet ne impedisce questo tipo di operazione, è possibile usare una connessione VPN o ExpressRoute per aggirare la porta 445. Per maggiori informazioni, consultare la sezione Considerazioni sulla rete per l'accesso diretto alla condivisione file di Azure.

Montare la condivisione file di Azure su richiesta con il comando mount

Quando si monta una condivisione file in un sistema operativo Linux, la condivisione file remota viene rappresentata come una cartella nel file system locale. È possibile montare condivisioni file in qualsiasi punto del sistema. Nell'esempio seguente il montaggio viene eseguito nel percorso /media. È possibile passare al percorso preferito modificando la variabile $MNT_ROOT.

Sostituire <resource-group-name>, <storage-account-name> e <file-share-name> con le informazioni appropriate per l'ambiente:

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

Inizializzare quindi il file delle credenziali eseguendo lo script seguente.

# 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

È ora possibile montare la condivisione file con il mount comando usando il file delle credenziali. Nell'esempio seguente il comando $SMB_PATH viene popolato usando il nome di dominio completo per l'endpoint file dell'account di archiviazione. Per un elenco delle opzioni di montaggio SMB, vedere Opzioni di montaggio.

Nota

A partire dal kernel Linux versione 5.0, SMB 3.1.1 è il protocollo negoziato predefinito. Se si usa una versione del kernel Linux precedente alla 5.0, specificare vers=3.1.1 nell'elenco delle opzioni di montaggio.

# 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

È anche possibile montare la stessa condivisione file di Azure in più punti di montaggio, se necessario.

Dopo aver usato la condivisione file di Azure, è possibile usare sudo umount $mntPath per smontarla.

Montare le condivisioni file automaticamente

Quando si monta una condivisione file in un sistema operativo Linux, la condivisione file remota viene rappresentata come una cartella nel file system locale. È possibile montare condivisioni file in qualsiasi punto del sistema. Nell'esempio seguente il montaggio viene eseguito nel percorso /media. È possibile passare al percorso preferito modificando la variabile $MNT_ROOT.

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

Per montare una condivisione file di Azure in Linux, usare il nome dell'account di archiviazione come nome utente della condivisione file e la chiave dell'account di archiviazione come password. Poiché le credenziali dell'account di archiviazione potrebbero cambiare nel tempo, è necessario archiviare le credenziali per l'account di archiviazione separatamente dalla configurazione di montaggio.

Nell'esempio seguente viene illustrato come creare un file per archiviare le credenziali. Ricordare di sostituire <resource-group-name> e <storage-account-name> con le informazioni appropriate per l'ambiente.

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

Per montare automaticamente una condivisione file, è possibile scegliere tra l'uso di un montaggio statico tramite l'utilità /etc/fstab o l'uso di un montaggio dinamico tramite l'utilità autofs.

Montaggio statico con /etc/fstab

Usando l'ambiente precedente, creare una cartella per l'account di archiviazione o la condivisione file nella cartella di montaggio. Sostituire <file-share-name> con il nome appropriato della condivisione file di Azure.

FILE_SHARE_NAME="<file-share-name>"

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

Infine, creare un record nel file /etc/fstab per la condivisione file di Azure. Nel comando seguente vengono usate le autorizzazioni predefinite per file e cartelle Linux 0755, ovvero lettura, scrittura ed esecuzione per il proprietario (in base al proprietario di file/directory Linux), lettura ed esecuzione per gli utenti nel gruppo proprietario e lettura ed esecuzione per altri utenti del sistema. È possibile impostare autorizzazioni uid e gid o dir_mode e file_mode alternative per il montaggio in base alle esigenze. Per altre informazioni su come impostare le autorizzazioni, vedere Notazione numerica UNIX. Per un elenco delle opzioni di montaggio SMB, vedere Opzioni di montaggio.

Suggerimento

Se si vuole che i contenitori Docker che eseguono applicazioni .NET Core possano scrivere nella condivisione file di Azure, includere nobrl nelle opzioni di montaggio SMB per evitare l'invio di richieste di blocco dell'intervallo di byte al server.

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 partire dal kernel Linux versione 5.0, SMB 3.1.1 è il protocollo negoziato predefinito. È possibile specificare versioni di protocollo alternative usando l'opzione di montaggio vers (le versioni del protocollo sono 3.1.1, 3.0 e 2.1).

Eseguire il montaggio dinamico con autofs

Per montare dinamicamente una condivisione file con l'utilità autofs, installarla usando la gestione pacchetti nella distribuzione Linux di propria scelta.

Nelle distribuzioni basate su Ubuntu e Debian usare il sistema di gestione pacchetti apt:

sudo apt update
sudo apt install autofs

Aggiornare quindi i file di configurazione autofs. Per un elenco delle opzioni di montaggio SMB, vedere Opzioni di montaggio.

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

Il passaggio finale consiste nel riavvio del servizio autofs.

sudo systemctl restart autofs

Opzioni di montaggio

È possibile usare le opzioni di montaggio seguenti durante il montaggio di condivisioni file di Azure SMB in Linux.

Opzione di montaggio Valore consigliato Descrizione
username= Nome account di archiviazione Obbligatorio per l'autenticazione NTLMv2.
password= Chiave primaria dell'account di archiviazione Obbligatorio per l'autenticazione NTLMv2.
password2= Chiave secondaria dell'account di archiviazione Consigliato nel caso in cui non sia consigliabile eseguire la rotazione delle chiavi senza tempi di inattività.
mfsymlinks n/d Consigliato. Forza il montaggio a supportare i collegamenti simbolici, consentendo alle applicazioni come Git di clonare i repository con collegamenti simbolici.
actimeo= 30-60 Consigliato. Specificando actimeo imposta tutti gli acregminoggetti , acregmax, acdirmine acdirmax sullo stesso valore. L'uso di un valore inferiore a 30 secondi può causare una riduzione delle prestazioni perché le cache degli attributi per i file e le directory scadono troppo rapidamente. È consigliabile impostare actimeo tra 30 e 60 secondi.
nosharesock n/d Facoltativo. Forza il client a stabilire sempre una nuova connessione al server anche se dispone di una connessione esistente al montaggio SMB. Ciò può migliorare le prestazioni, perché ogni punto di montaggio userà un socket TCP diverso. In alcuni casi, nosharesock può ridurre le prestazioni a causa della mancata memorizzazione nella cache dello stesso file quando viene aperto da due montaggi dallo stesso client.
max_channels= 4 Consigliato quando si usa SMB multicanale. Specifica il numero massimo di canali (connessioni di rete) alla condivisione file. Se si usa SMB multicanale e il numero di canali supera quattro, ciò comporterà prestazioni scarse.
remount n/d Rimonta la condivisione file e modifica le opzioni di montaggio, se specificato. Usare con l'opzione password2 nei casi in cui si vuole specificare una password alternativa per correggere una password scaduta dopo il montaggio originale.
nobrl n/d Consigliato in scenari a client singolo quando sono necessari blocchi di avviso. File di Azure non supporta i blocchi consultivi e questa impostazione impedisce l'invio di richieste di blocco dell'intervallo di byte al server.
snapshot= Ora Montare uno snapshot specifico della condivisione file. L'ora deve essere un numero intero positivo che identifica lo snapshot richiesto (in unità di 100 nanosecondi trascorsi dal 1° gennaio 1601 oppure in alternativa può essere specificato in formato GMT, ad esempio @GMT-2024.03.27-20.52.19).
closetimeo= 5 Configura il timeout di chiusura posticipato (handle cache) in secondi o lo disabilita impostando su 0. Il valore predefinito è 5 secondi.
nostrictsync n/d Non chiedere al server di scaricare su fsync(). Alcuni server eseguono scritture non memorizzate nel buffer per impostazione predefinita, nel qual caso lo scaricamento è ridondante. Questa opzione può migliorare le prestazioni per i carichi di lavoro in cui un client esegue numerose combinazioni di scrittura e fsync di piccole dimensioni e la latenza di rete è molto superiore alla latenza del server.
multiuser n/d Eseguire il mapping degli accessi utente alle singole credenziali durante l'accesso al server. Per impostazione predefinita, i montaggi CIFS usano solo un singolo set di credenziali utente (le credenziali di montaggio) quando accedono a una condivisione. Con questa opzione, il client crea invece una nuova sessione con il server usando le credenziali dell'utente ogni volta che un nuovo utente accede al montaggio. Altri accessi da parte dell'utente useranno anche tali credenziali. Poiché il kernel non può richiedere password, i montaggi multiutente sono limitati ai montaggi usando sec= opzioni che non richiedono password.
cifsacl n/d Questa opzione viene usata per eseguire il mapping di ACL CIFS/NTFS a/da bit di autorizzazione Linux, per eseguire il mapping di SID e GID e ottenere e impostare descrittori di sicurezza. Supportato solo per l'autenticazione NTLMv2.
idsfromsid,modefromsid n/d Consigliato quando il client deve eseguire l'autorizzazione applicata dal client. Abilita le autorizzazioni di tipo Unix. Funziona solo quando gli UID/GID sono uniformi in tutti i client. Supportato solo per l'autenticazione NTLMv2.
sec= krb5 Obbligatorio per l'autenticazione Kerberos. Per abilitare la modalità di sicurezza Kerberos, impostare sec=krb5. Quando si usa questa opzione, è necessario omettere nome utente e password. Il client Linux deve essere aggiunto a un dominio. Vedere Abilitare l'autenticazione di Active Directory tramite SMB per i client Linux.
uid= 0 Facoltativo. Imposta l'uid che possiede tutti i file o le directory nel file system montato quando il server non fornisce informazioni sulla proprietà. Può essere specificato come nome utente o come uid numerico. Se non specificato, il valore predefinito è 0.
gid= 0 Facoltativo. Imposta il gid che possiede tutti i file o le directory nel file system montato quando il server non fornisce informazioni sulla proprietà. Può essere specificato come nomegruppo o gid numerico. Se non specificato, il valore predefinito è 0.
file_mode= n/d Facoltativo. Se il server non supporta le estensioni CIFS Unix, viene ignorata la modalità file predefinita.
dir_mode= n/d Facoltativo. Se il server non supporta le estensioni CIFS Unix, viene ignorata la modalità predefinita per le directory.
handletimeout= n/d Facoltativo. Tempo in millisecondi per il quale il server deve riservare l'handle di file dopo un failover in attesa della riconnessione del client.

Passaggi successivi

Per altre informazioni sull'uso di condivisioni file di Azure SMB con Linux, vedere: