Montare una condivisione file di Azure SMB in Linux

Attenzione

Questo articolo fa riferimento a CentOS, una distribuzione Linux prossima allo stato EOL (End of Life, fine del ciclo di vita). Prendere in considerazione l'uso e il piano di conseguenza. Per altre informazioni, vedere le linee guida per la fine della vita di CentOS. File di Azure è il file system cloud facile da usare di Microsoft. 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, ma non è possibile montare condivisioni file di Azure con SMB 2.1 da un'altra area di Azure o in locale per motivi di sicurezza. A meno che l'applicazione non richieda in modo specifico SMB 2.1, usare SMB 3.1.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 basic 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

Il supporto per SMB 2.1 è stato aggiunto al kernel Linux, versione 3.7. Se si usa una versione del kernel Linux dopo la 3.7, deve supportare SMB 2.1.

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. Il pacchetto cifs-utils può essere installato usando la gestione pacchetti nella distribuzione Linux di propria scelta.

In Ubuntu e Debian usare la apt gestione pacchetti:

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. Se si preferisce usare il modulo Azure PowerShell in PowerShell 6+, è possibile; Tuttavia, le istruzioni contenute in questo articolo sono relative all'interfaccia della riga di comando di Azure.

  • Verificare che la porta 445 sia aperta: SMB comunica sulla porta TCP 445. Assicurarsi che il firewall o l'ISP non blocchi la porta TCP 445 dal 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 non è possibile farlo da un ISP, è 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 montaggio

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 viene montato il /media percorso. È possibile passare al percorso preferito modificando la $MNT_ROOT variabile.

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

Montare quindi la condivisione file usando il mount comando . Nell'esempio seguente il $SMB_PATH comando viene popolato usando il nome di dominio completo per l'endpoint file dell'account di archiviazione e $STORAGE_ACCOUNT_KEY viene popolato con la chiave dell'account di archiviazione.

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

È possibile usare uid/gid o dir_mode e file_mode nelle opzioni di montaggio per il mount comando per impostare le autorizzazioni. Per altre informazioni su come impostare le autorizzazioni, vedere Notazione numerica UNIX.

È anche possibile montare la stessa condivisione file di Azure in più punti di montaggio, se necessario. Al termine dell'uso della condivisione file di Azure, usare sudo umount $mntPath per smontare la condivisione.

Montare automaticamente condivisioni file

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 viene montato il /media percorso. È possibile passare al percorso preferito modificando la $MNT_ROOT variabile.

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 possono 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à o l'uso /etc/fstab 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 per la /etc/fstab condivisione file di Azure. Nel comando seguente vengono usate le autorizzazioni predefinite per file e cartelle linux 0755, ovvero leggere, scrivere ed eseguire per il proprietario (in base al proprietario di file/directory Linux), leggere ed eseguire per gli utenti nel gruppo proprietario ed eseguire per altri utenti nel sistema. È possibile impostare uid autorizzazioni e e giddir_mode alternative file_mode per il montaggio in base alle esigenze. Per altre informazioni su come impostare le autorizzazioni, vedere Notazione numerica UNIX su Wikipedia.

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

Montare dinamicamente 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 Ubuntu e Debian usare gestione apt pacchetti:

sudo apt update
sudo apt install autofs

Aggiornare quindi i file di autofs configurazione.

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

Il passaggio finale consiste nel riavviare il autofs servizio.

sudo systemctl restart autofs

Montare uno snapshot di condivisione file

Se si vuole montare uno snapshot specifico di una condivisione file di Azure SMB, è necessario fornire l'opzione snapshot come parte del mount comando, dove è il momento in cui snapshot è stato creato lo snapshot specifico in un formato come @GMT-2023.01.05-00.08.20. L'opzione snapshot è stata supportata nel kernel Linux dalla versione 4.19.

Dopo aver creato lo snapshot della condivisione file, seguire queste istruzioni per montarlo.

  1. Nella portale di Azure passare all'account di archiviazione contenente la condivisione file di cui si vuole montare uno snapshot.

  2. Selezionare Condivisioni file di archiviazione dati > e selezionare la condivisione file.

  3. Selezionare Snapshot operazioni > e prendere nota del nome dello snapshot da montare. Il nome dello snapshot sarà un timestamp GMT, ad esempio nello screenshot seguente.

    Screenshot che mostra come individuare il nome e il timestamp di una condivisione file nel portale di Azure.

  4. Convertire il timestamp nel formato previsto dal mount comando, che è @GMT-year.month.day-hour.minutes.seconds. In questo esempio si converte 2023-01-05T00:08:20.0000000Z in @GMT-2023.01.05-00.08.20.

  5. Eseguire il mount comando usando l'ora GMT per specificare il snapshot valore. Assicurarsi di sostituire <storage-account-name>, <file-share-name>e il timestamp GMT con i valori. Il file con estensione cred contiene le credenziali da usare per montare la condivisione (vedere Montare automaticamente le condivisioni file).

    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. Se è possibile esplorare lo snapshot nel percorso /media/<file-share-name>/snapshot1, il montaggio è riuscito.

Se il montaggio non riesce, vedere Risolvere i problemi di connettività e accesso File di Azure (SMB).

Passaggi successivi

Per altre informazioni su File di Azure, vedere i collegamenti seguenti: