共用方式為


在 Linux 用戶端上掛接 SMB Azure 檔案共用

可以使用 SMB 核心用戶端將 Azure 檔案共用裝載在 Linux 發行版本中。

建議您使用 SMB 3.1.1,以便在 Linux 上掛接 Azure 檔案共用。 根據預設,Azure 檔案儲存體需要在傳輸中加密 (由 SMB 3.0 + 支援)。 Azure 檔案儲存體也支援 SMB 2.1,這在傳輸中不支援加密,但基於安全考慮,您無法從另一個 Azure 區域或內部部署的 SMB 2.1 掛接 Azure 檔案共用。 除非您的應用程式特別需要 SMB 2.1,否則請使用 SMB 3.1.1。 SMB 2.1 支援已新增至 Linux 核心 3.7 版,因此如果您使用 3.7 之後的 Linux 核心版本,它應該支援 SMB 2.1。

Distribution SMB 3.1.1 (建議) SMB 3.0
Linux 核心版本
  • 基本 3.1.1 支援:4.17
  • 預設掛接:5.0
  • AES-128-GCM 加密:5.3
  • AES-256-GCM 加密:5.10
  • 基本 3.0 支援:3.12
  • AES-128-CCM 加密:4.11
Ubuntu \(英文\) AES-128-GCM 加密:18.04.5 LTS+ AES-128-CCM 加密:16.04.4 LTS+
Red Hat Enterprise Linux (RHEL)
  • 基本:8.0+
  • 預設掛接:8.2+
  • AES-128-GCM 加密:8.2+
7.5+
Debian 基本:10+ AES-128-CCM 加密:10+
SUSE Linux Enterprise Server AES-128-GCM 加密: 15 SP2+ AES-128-CCM 加密: 12 SP2+

如果 Linux 散發套件未列于上表中,您可以檢查 Linux 核心版本,以下為適用的uname命令:

uname -r

注意

本文中的所有掛接指令碼都會使用預設的 0755 Linux 檔案和資料夾權限來掛接 SMB 檔案共用。 這表示檔案/目錄擁有者的讀取、寫入和執行、擁有者群組中使用者的讀取和執行,以及其他使用者的讀取和執行。 根據組織的安全原則,您可能會想要在掛接選項中設定替代的 uid/giddir_modefile_mode 權限。 如需有關如何設定權限的詳細資訊,請參閱 UNIX 數值標記法

適用於

檔案共用類型 SMB NFS
標準檔案共用 (GPv2)、LRS/ZRS 是 否
標準檔案共用 (GPv2)、GRS/GZRS 是 否
進階檔案共用 (FileStorage)、LRS/ZRS 是 否

必要條件

  • 請確定已安裝 cifs-utils 套件。可使用套件管理員將 cifs-utils 套件安裝所選擇的 Linux 發行版本上。

在 Ubuntu 和 Debian 上,請使用 apt 套件管理員:

sudo apt update
sudo apt install cifs-utils

在其他發行版本上,請使用適當的封裝管理員或從來源編譯

  • 最新版本的 Azure 命令列介面 (CLI)。 如需如何安裝 Azure CLI 的詳細資訊,請參閱安裝 Azure CLI,並選取您的作業系統。 如果您偏好,也可以在 PowerShell 6+ 中使用 Azure PowerShell 模組,不過本文中的指示適用於 Azure CLI。

  • 請確定已開啟連接埠 445:SMB 透過 TCP 通訊埠 445 進行通訊 - 請確定您的防火牆或 ISP 並未封鎖用戶端電腦存取 TCP 通訊埠 445。 取代 <your-resource-group><your-storage-account>,然後執行下列指令碼:

    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
    

    如果連線成功,您應會看見類似下列的輸出:

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

    如果您無法在公司網路上開啟連接埠 445,或是 ISP 不讓您開啟此連接埠,則可以使用 VPN 連線或 ExpressRoute 來處理連接埠 445。 如需詳細資訊,請參閱直接 Azure 檔案共用存取 的網路考慮

使用隨需掛接 Azure 檔案共用

當您在 Linux OS 上掛接檔案共用時,您的遠端檔案共用會表示為本機檔案系統中的資料夾。 您可以將檔案共用掛接到系統上的任何位置。 下列範例會在此 /media 路徑下裝載。 您可以藉由修改 $MNT_ROOT 變數,將其變更為您想要的慣用路徑。

使用您環境的適當資訊取代 <resource-group-name><storage-account-name><file-share-name>

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

接著,執行下列指令碼初始化認證檔案。

# 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

現在您可以使用認證檔案的 mount 命令掛接檔案共用。 在下列範例中,會使用儲存體帳戶檔案端點的完整功能變數名稱來填入 $SMB_PATH 命令。

注意

從 Linux 核心版本 5.0 開始,SMB 3.1.1 是預設的協商通訊協定。 如果您使用早於 5.0 的 Linux 核心版本,請在掛接選項清單中指定 vers=3.1.1

# 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

您也可以視需要將相同的 Azure 檔案共用掛接至多個掛接點。 使用完 Azure 檔案共用後,請使用 sudo umount $mntPath 取消掛接共用。

自動掛接檔案共用

當您在 Linux OS 上掛接檔案共用時,您的遠端檔案共用會表示為本機檔案系統中的資料夾。 您可以將檔案共用掛接到系統上的任何位置。 下列範例會在此 /media 路徑下裝載。 您可以藉由修改 $MNT_ROOT 變數,將其變更為您想要的慣用路徑。

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

若要在 Linux 上掛接 Azure 檔案共用,請使用儲存體帳戶名稱做為檔案共用的使用者名稱,並使用儲存體帳戶金鑰作為密碼。 因為儲存體帳戶憑證可能會隨時間而變更,所以您應該將儲存體帳戶的認證與掛接設定分開儲存。

下列範例顯示如何建立檔案來儲存認證。 請記得將 <resource-group-name><storage-account-name> 取代為您環境的適當資訊。

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

若要自動掛接檔案共用,您可以選擇透過公用程式使用靜態掛接 /etc/fstab ,或透過公用程式使用動態掛接 autofs

使用 /etc/fstab 的靜態掛接

使用較早的環境,在您的掛接資料夾下建立儲存體帳戶/檔案共用的資料夾。 以 Azure 檔案共用的適當名稱取代 <file-share-name>

FILE_SHARE_NAME="<file-share-name>"

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

最後,在 /etc/fstab 檔案中為您的 Azure 檔案共用建立記錄。 在下列命令中,會使用預設的 0755 Linux 檔案和資料夾權限,這表示擁有者的讀取/寫入/執行 (根據檔案/目錄 Linux 擁有者)、擁有者群組中使用者的讀取和執行,以及系統上其他使用者的讀取和執行。 您可能會想要視需要設定掛接的替代 uidgiddir_modefile_mode 權限。 如需有關如何設定權限的詳細資訊,請參閱 UNIX 數值標記法

提示

如果您希望執行 .NET Core 應用程式的 Docker 容器能夠寫入 Azure 檔案共用,請在 SMB 掛接選項中包含 nobrl,以避免將位元組範圍鎖定要求傳送至伺服器。

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

注意

從 Linux 核心版本 5.0 開始,SMB 3.1.1 是預設的協商通訊協定。 您可以使用 vers 掛接選項來指定替代的通訊協定版本 (通訊協定版本為 3.1.13.02.1)。

使用 autofs 動態掛接

若要以動態方式使用 autofs 公用程式掛接檔案共用,請在您選擇的 Linux 發行版本上使用套件管理員進行安裝。

在 Ubuntu 和 Debian 發行版本上,請使用 apt 套件管理員:

sudo apt update
sudo apt install autofs

接下來,更新 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,serverino,nosharesock,actimeo=30,mfsymlinks :$SMB_PATH" > /etc/auto.fileshares

echo "/fileshares /etc/auto.fileshares --timeout=60" > /etc/auto.master

最後一個步驟是重新開機 autofs 服務。

sudo systemctl restart autofs

下一步

請參閱這些連結,以取得 Azure 檔案服務的詳細資訊: