SMB Azure-bestands delen in Linux

Let op

In dit artikel wordt verwezen naar CentOS, een Linux-distributie die de status End Of Life (EOL) nadert. Houd rekening met uw gebruik en plan dienovereenkomstig. Zie de Richtlijnen voor het einde van de levensduur van CentOS voor meer informatie. Azure Files is het eenvoudig te gebruiken cloudbestandssysteem van Microsoft. Azure-bestands shares kunnen worden bevestigd in Linux-distributies met behulp van de SMB-kernelclient.

De aanbevolen manier om een Azure-bestandsshare te maken in Linux is met behulp van SMB 3.1.1. Standaard is Azure Files versleuteling in transit vereist, wat wordt ondersteund door SMB 3.0+. Azure Files ondersteunt ook SMB 2.1, dat geen ondersteuning biedt voor versleuteling tijdens overdracht, maar u kunt Azure-bestandsshares niet koppelen met SMB 2.1 vanuit een andere Azure-regio of on-premises om veiligheidsredenen. Gebruik SMB 3.1.1, tenzij uw toepassing specifiek SMB 2.1 vereist.

Distributie SMB 3.1.1 (aanbevolen) SMB 3.0
Linux-kernelversie
  • Basic 3.1.1-ondersteuning: 4.17
  • Standaardkoppeling: 5.0
  • AES-128-GCM-versleuteling: 5.3
  • AES-256-GCM-versleuteling: 5.10
  • Basic 3.0-ondersteuning: 3.12
  • AES-128-CCM-versleuteling: 4.11
Ubuntu AES-128-GCM-versleuteling: 18.04.5 LTS+ AES-128-CCM-versleuteling: 16.04.4 LTS+
Red Hat Enterprise Linux (RHEL)
  • Basis: 8.0+
  • Standaard mount: 8.2+
  • AES-128-GCM-versleuteling: 8.2+
7.5+
Debian Basis: 10+ AES-128-CCM-versleuteling: 10+
SUSE Linux Enterprise Server AES-128-GCM-versleuteling: 15 SP2+ AES-128-CCM-versleuteling: 12 SP2+

Als uw Linux-distributie niet wordt vermeld in de bovenstaande tabel, kunt u de Linux-kernelversie controleren met de opdracht uname:

uname -r

Notitie

SMB 2.1-ondersteuning is toegevoegd aan Linux-kernelversie 3.7. Als u een versie van de Linux-kernel gebruikt na 3.7, moet deze ondersteuning bieden voor SMB 2.1.

Van toepassing op

Bestands sharetype SMB NFS
Standaardbestandsshares (GPv2), LRS/ZRS Ja Nee
Standaardbestandsshares (GPv2), GRS/GZRS Ja Nee
Premium bestandsshares (FileStorage), LRS/ZRS Ja Nee

Vereisten

  • Zorg ervoor dat het cifs-utils-pakket is geïnstalleerd. Het cifs-utils-pakket kan worden geïnstalleerd met behulp van pakketbeheer op de Linux-distributie van uw keuze.

Gebruik op Ubuntu en Debian de apt pakketbeheerder:

sudo apt update
sudo apt install cifs-utils

Gebruik in andere distributies het juiste pakketbeheer of compileer vanuit de bron.

  • De meest recente versie van de Azure-opdrachtregelinterface (CLI). Zie De Azure CLI installeren en uw besturingssysteem selecteren voor meer informatie over het installeren van de Azure CLI. Als u liever de Azure PowerShell-module in PowerShell 6+ gebruikt, kunt u; De instructies in dit artikel zijn echter voor de Azure CLI.

  • Zorg ervoor dat poort 445 open is: SMB communiceert via TCP-poort 445. Zorg ervoor dat uw firewall of internetprovider TCP-poort 445 niet blokkeert vanaf de clientcomputer. Vervang <your-resource-group> en <your-storage-account> voer het volgende script uit:

    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
    

    Als de verbinding is geslaagd, ziet u iets vergelijkbaars met de volgende uitvoer:

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

    Als u poort 445 niet kunt openen op uw bedrijfsnetwerk of als u dit niet kunt doen door een internetprovider, kunt u een VPN-verbinding of ExpressRoute gebruiken om poort 445 te omzeilen. Zie Netwerkoverwegingen voor directe toegang tot Azure-bestandsshares voor meer informatie.

De Azure-bestandsshare op aanvraag koppelen met koppelen

Wanneer u een bestandsshare koppelt aan een Linux-besturingssysteem, wordt uw externe bestandsshare weergegeven als een map in uw lokale bestandssysteem. U kunt bestandsshares overal op uw systeem koppelen. In het volgende voorbeeld wordt onder het /media pad een koppeling weergegeven. U kunt dit wijzigen in het gewenste pad door de $MNT_ROOT variabele te wijzigen.

Vervang <resource-group-name>, <storage-account-name>en <file-share-name> door de juiste informatie voor uw omgeving:

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

Koppel vervolgens de bestandsshare met behulp van de mount opdracht. In het volgende voorbeeld wordt de $SMB_PATH opdracht gevuld met behulp van de volledig gekwalificeerde domeinnaam voor het bestandseindpunt van het opslagaccount en $STORAGE_ACCOUNT_KEY wordt deze gevuld met de sleutel van het opslagaccount.

Notitie

Vanaf Linux-kernelversie 5.0 is SMB 3.1.1 het standaard onderhandelde protocol. Als u een versie van de Linux-kernel gebruikt die ouder is dan 5.0, geeft u vers=3.1.1 op in de lijst met koppelopties.

# 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

U kunt de koppelingsopties voor de opdracht gebruiken uid/gid of dir_modefile_mode inschakelen mount om machtigingen in te stellen. Zie unix-numerieke notatie voor meer informatie over het instellen van machtigingen.

U kunt desgewenst ook dezelfde Azure-bestandsshare koppelen aan meerdere koppelpunten. Wanneer u klaar bent met het gebruik van de Azure-bestandsshare, kunt sudo umount $mntPath u de share ontkoppelen.

Bestandsshares automatisch koppelen

Wanneer u een bestandsshare koppelt aan een Linux-besturingssysteem, wordt uw externe bestandsshare weergegeven als een map in uw lokale bestandssysteem. U kunt bestandsshares overal op uw systeem koppelen. In het volgende voorbeeld wordt onder het /media pad een koppeling weergegeven. U kunt dit wijzigen in het gewenste pad door de $MNT_ROOT variabele te wijzigen.

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

Als u een Azure-bestandsshare wilt koppelen in Linux, gebruikt u de naam van het opslagaccount als de gebruikersnaam van de bestandsshare en de sleutel van het opslagaccount als wachtwoord. Omdat de referenties van het opslagaccount na verloop van tijd kunnen veranderen, moet u de referenties voor het opslagaccount afzonderlijk van de koppelingsconfiguratie opslaan.

In het volgende voorbeeld ziet u hoe u een bestand maakt om de referenties op te slaan. Vergeet niet om de juiste informatie voor uw omgeving te vervangen <resource-group-name> en <storage-account-name> door te geven.

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

Als u automatisch een bestandsshare wilt koppelen, kunt u kiezen tussen het gebruik van een statische koppeling via het /etc/fstab hulpprogramma of het gebruik van een dynamische koppeling via het autofs hulpprogramma.

Statische koppeling met /etc/fstab

Maak met behulp van de eerdere omgeving een map voor uw opslagaccount/bestandsshare onder de koppelingsmap. Vervang door <file-share-name> de juiste naam van uw Azure-bestandsshare.

FILE_SHARE_NAME="<file-share-name>"

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

Maak ten slotte een record in het /etc/fstab bestand voor uw Azure-bestandsshare. In de onderstaande opdracht worden de standaardmachtigingen voor 0755 Linux-bestanden en -mappen gebruikt. Dit betekent lezen, schrijven en uitvoeren voor de eigenaar (op basis van de Linux-eigenaar van het bestand/de map), lezen en uitvoeren voor gebruikers in de eigenaarsgroep en lezen en uitvoeren voor anderen op het systeem. U kunt desgewenst alternatieve uid en gid of of dir_mode machtigingen file_mode voor koppelen instellen. Zie UNIX-numerieke notatie op Wikipedia voor meer informatie over het instellen van machtigingen.

Tip

Als u wilt dat Docker-containers met .NET Core-toepassingen kunnen schrijven naar de Azure-bestandsshare, neemt u nobrl op in de SMB-koppelingsopties om te voorkomen dat aanvragen voor bytebereikvergrendeling naar de server worden verzonden.

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

Notitie

Vanaf Linux-kernelversie 5.0 is SMB 3.1.1 het standaard onderhandelde protocol. U kunt alternatieve protocolversies opgeven met behulp van de vers koppelingsoptie (protocolversies zijn 3.1.1, 3.0en 2.1).

Dynamisch koppelen met autofs

Als u een bestandsshare dynamisch wilt koppelen met het autofs hulpprogramma, installeert u deze met behulp van pakketbeheer op de Linux-distributie van uw keuze.

Gebruik op Ubuntu- en Debian-distributies de apt pakketbeheerder:

sudo apt update
sudo apt install autofs

Werk vervolgens de autofs configuratiebestanden bij.

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

De laatste stap is het opnieuw starten van de autofs service.

sudo systemctl restart autofs

Momentopname van een bestandsshare koppelen

Als u een specifieke momentopname van een SMB Azure-bestandsshare wilt koppelen, moet u de snapshot optie opgeven als onderdeel van de mount opdracht, waar snapshot het tijdstip is waarop de specifieke momentopname is gemaakt in een indeling zoals @GMT-2023.01.05-00.08.20. De snapshot optie wordt ondersteund in de Linux-kernel sinds versie 4.19.

Nadat u de momentopname van de bestandsshare hebt gemaakt, volgt u deze instructies om deze te koppelen.

  1. Navigeer in Azure Portal naar het opslagaccount met de bestandsshare waarvan u een momentopname wilt koppelen.

  2. Selecteer Bestandsshares voor gegevensopslag > en selecteer de bestandsshare.

  3. Selecteer Momentopnamen van bewerkingen > en noteer de naam van de momentopname die u wilt koppelen. De naam van de momentopname is een GMT-tijdstempel, zoals in de onderstaande schermopname.

    Schermopname die laat zien hoe u de naam en tijdstempel van een momentopname van een bestandsshare kunt vinden in Azure Portal.

  4. Converteer de tijdstempel naar de indeling die wordt verwacht door de mount opdracht. Dit is @GMT-year.month.day-hour.minutes.seconds. In dit voorbeeld converteert u 2023-01-05T00:08:20.0000000Z naar @GMT-2023.01.05-00.08.20.

  5. Voer de mount opdracht uit met de GMT-tijd om de snapshot waarde op te geven. Vervang , <file-share-name>en de GMT-tijdstempel door <storage-account-name>uw waarden. Het .cred-bestand bevat de referenties die moeten worden gebruikt om de share te koppelen (zie Automatisch bestandsshares koppelen).

    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. Als u door de momentopname onder het pad /media/<file-share-name>/snapshot1kunt bladeren, is de koppeling voltooid.

Als de koppeling mislukt, raadpleegt u Connectiviteits- en toegangsproblemen met Azure Files (SMB) oplossen.

Volgende stappen

Raadpleeg de volgende koppelingen voor meer informatie over Azure Files: