在 Linux 上掛接 SMB Azure 檔案共用

警告

本文參考 CentOS,這是接近結束生命週期 (EOL) 狀態的 Linux 發行版本。 請據以考慮您的使用和規劃。 如需詳細資訊,請參閱 CentOS 生命週期結束指引Azure 檔案服務是 Microsoft 易於使用的雲端檔案系統。 可以使用 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 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

注意

已將 SMB 2.1 支援新增至 Linux 核心版本 3.7。 如果您使用 3.7 之後的 Linux 核心版本,則應支援 SMB 2.1。

適用於

檔案共用類型 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

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

注意

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

您可以在 mount 命令的掛接選項中使用 uid/giddir_modefile_mode 以設定權限。 如需有關如何設定權限的詳細資訊,請參閱 UNIX 數值標記法

您也可以視需要將相同的 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" | 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

注意

從 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 :$SMB_PATH" > /etc/auto.fileshares

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

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

sudo systemctl restart autofs

掛接檔案共用快照集

如果您想要掛接 SMB Azure 檔案共用的特定快照集,您必須在 mount 命令中提供 snapshot 選項,其中 snapshot 是特定快照集以 @GMT-2023.01.05-00.08.20 格式建立的時間。 自 4.19 版起,Linux 核心支援 snapshot 選項。

建立檔案共用快照集之後,請遵循下列指示加以掛接。

  1. 在 Azure 入口網站中,瀏覽至包含您要掛接快照集之檔案共用的儲存體帳戶。

  2. 選取 [資料儲存體] > [檔案共用],然後選取檔案共用。

  3. 選取 [作業] > [快照集],記下您要掛接的快照集名稱。 快照集名稱會是一個 GMT 時間戳記,例如下列螢幕擷取畫面所示。

    顯示如何在 Azure 入口網站 中尋找檔案共用快照集名稱和時間戳的螢幕快照。

  4. 將時間戳記轉換成 mount 命令所預期的格式 @GMT-year.month.day-hour.minutes.seconds。 在此範例中,將 2023-01-05T00:08:20.0000000Z 轉換為 @GMT-2023.01.05-00.08.20

  5. 使用 GMT 時間執行 mount 命令,以指定 snapshot 值。 請務必以您的值取代 <storage-account-name><file-share-name> 和 GMT 時間戳記。 .cred 檔案包含用來掛接共用的認證 (請參閱自動掛接檔案共用)。

    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. 如果您能夠瀏覽路徑 /media/<file-share-name>/snapshot1 下的快照集,則表示掛接成功。

如果掛接失敗,請參閱針對 Azure 檔案儲存體連線和存取問題進行疑難排解 (SMB)

下一步

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