共用方式為


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

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

本文說明如何使用 NTLMv2 驗證來掛接 SMB Azure 檔案共用(記憶體帳戶密鑰)。 基於安全性考慮,最好使用以身分識別為基礎的驗證。 請參閱 針對存取 Azure 檔案的 Linux 用戶端,透過 SMB 啟用 Active Directory 驗證

適用於

管理模型 計費模型 媒體層級 冗餘 中小企業 (SMB) 網路檔案系統 (NFS)
Microsoft 儲存服務 已佈建的 v2 HDD (標準) 本地 (LRS) 是 否
Microsoft 儲存服務 已佈建的 v2 HDD (標準) 區域 (ZRS) 是 否
Microsoft 儲存服務 已佈建的 v2 HDD (標準) 異地 (GRS) 是 否
Microsoft 儲存服務 已佈建的 v2 HDD (標準) GeoZone (GZRS) 是 否
Microsoft 儲存服務 已佈建的 v1 SSD (進階版) 本地 (LRS) 是 否
Microsoft 儲存服務 已佈建的 v1 SSD (進階版) 區域 (ZRS) 是 否
Microsoft 儲存服務 隨用隨付 HDD (標準) 本地 (LRS) 是 否
Microsoft 儲存服務 隨用隨付 HDD (標準) 區域 (ZRS) 是 否
Microsoft 儲存服務 隨用隨付 HDD (標準) 異地 (GRS) 是 否
Microsoft 儲存服務 隨用隨付 HDD (標準) GeoZone (GZRS) 是 否

通訊協定

根據預設,Azure 檔案服務會強制執行傳輸中的加密。 從 SMB 3.0 開始,即可使用 SMB 加密。 Azure 檔案服務也支援 SMB 2.1,不支援 SMB 加密。 因此,Azure Files 為了安全性考慮,不允許從另一個 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

必要條件

  • 確定已安裝 cifs-utils 套件。 使用您選擇的Linux發行版上的套件管理員,安裝最新版的 cifs-utils 套件。

在 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,您可以使用 VPN 連線或 ExpressRoute。 如需詳細資訊,請參閱直接 Azure 檔案共用存取 的網路考慮

權限

本文中的所有掛載腳本都會使用預設的 0755 Linux 文件和資料夾權限來掛載文件共享。 這表示檔案/目錄擁有者的讀取、寫入和執行、擁有者群組中使用者的讀取和執行,以及其他使用者的讀取和執行。 根據組織的安全原則,您可能會想要在掛接選項中設定替代的 uid/giddir_modefile_mode 權限。 如需如何設定許可權的詳細資訊,請參閱 Unix 符號表示法。 如需掛接選項的清單,請參閱 掛接選項

Unix 樣式權限支援

您也可以藉由使用用戶端強制執行的存取控制並為您掛接命令新增 modefromsid,idsfromsid 掛接選項來取得 SMB Azure 檔案共用的 Unix 樣式權限支援。 為了讓此作業能夠運作:

  • 所有存取共用的用戶端都需要使用 modefromsid,idsfromsid
  • UID/GID 必須跨所有客戶端統一
  • 客戶端必須執行下列其中一個支援的Linux散發版本:Ubuntu 20.04+、SLES 15 SP3+

使用隨選掛接 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 命令。 如需SMB掛接選項的清單,請參閱 掛接選項

附註

從 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

使用記憶體帳戶名稱作為檔案共享的用戶名稱,並將記憶體帳戶密鑰作為密碼。 因為儲存體帳戶憑證可能會隨時間而變更,所以您應該將儲存體帳戶的認證與掛接設定分開儲存。

下列範例顯示如何建立檔案來儲存認證。 請記得把 <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 數值標記法。 如需SMB掛接選項的清單,請參閱 掛接選項

秘訣

如果您希望執行 .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 設定檔。 如需SMB掛接選項的清單,請參閱 掛接選項

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

掛接選項

您可以在 Linux 上掛接 SMB Azure 檔案共享時,使用下列掛接選項。

掛接選項 建議值 說明
username= 儲存體帳戶名稱 對於 NTLMv2 驗證是必要項目。
password= 儲存體帳戶主要金鑰 對於 NTLMv2 驗證是必要項目。
password2= 儲存體帳戶次要金鑰 建議在希望不造成停機的情況下進行金鑰輪替時使用。
mfsymlinks n/a 建議使用。 強制掛接支援符號連結,讓 Git 之類的應用程式使用符號連結複製存放庫。
actimeo= 30-60 建議使用。 CIFS 用戶端在向伺服器要求屬性資訊之前,快取檔案或目錄的屬性的時間(以秒為單位)。 使用低於 30 秒的值,可能會導致效能降低,因為檔案和目錄的屬性快取太快過期。 建議您將 actimeo 設為 30 到 60 秒之間。
nosharesock n/a 選擇性。 強制用戶端始終與伺服器建立新連線,即使其已與 SMB 掛接具有現有的連線。 這可以增強效能,因為每個裝入點使用不同的 TCP 套接字。 在某些情況下,當從相同用戶端的兩個掛接點開啟時,由於沒有快取相同的檔案,nosharesock 可能會降低效能。
max_channels= 4 建議在使用 SMB 多重通道時使用。 指定檔案共用的通道數目上限(網路連線)。 使用SMB多重通道時,使用超過四條通道會導致效能不佳。
remount n/a 重新掛接檔案共享,並在指定的情況下變更掛接選項。 在您想要指定替代密碼以修正原始掛接後過期的密碼時,請使用password2選項。
nobrl n/a 當需要諮詢鎖定時,建議在單一用戶端案例中使用。 Azure 檔案儲存體 不支援諮詢鎖定,此設定可防止將位元組範圍鎖定要求傳送至伺服器。
snapshot= 時間 掛接檔案共用的特定快照。 時間必須是正整數,以識別要求的快照集 (以 1601 年 1 月 1 日之後經過的 100 奈秒為單位計算),或者可以指定為 GMT 格式,例如 @GMT-2024.03.27-20.52.19)。
closetimeo= 5 設定延遲的關閉逾時 (處理快取)(以秒為單位),或是藉由設定為 0 來加以停用。 預設值為5秒。
nostrictsync n/a 請勿要求伺服器在 fsync() 上排清。 某些伺服器預設會執行非緩衝寫入,在此情況下排清是多餘的。 此選項可改善用戶端執行大量小型寫入 + fsync 組合的工作負載效能,以及網路等待時間遠高於伺服器延遲的情況。
multiuser n/a 存取伺服器時將使用者存取對應到個別的憑證。 根據預設,CIFS 掛接只會在存取共用時使用一組用戶認證(掛接認證)。 當選擇此選項時,用戶端會在每當新的使用者存取掛載時,使用使用者的認證來與伺服器建立新的會話。 該用戶進一步存取也會使用這些認證。 因為核心無法提示輸入密碼,因此多使用者掛接僅限於使用 sec= 不需要密碼的選項進行掛接。
cifsacl n/a 此選項可用來將 CIFS/NTFS ACL 對應至 Linux 許可權位或從 Linux 許可權位,將 SID 對應至 UID 和 GID,並取得和設定安全性描述元。 僅支援NTLMv2驗證。
idsfromsid,modefromsid n/a 建議在需要執行由客戶端強制的授權時使用。 啟用 Unix 模式的權限設定。 只有在所有用戶端上都統一 UID/GID 時,才能運作。 僅支援NTLMv2驗證。
cruid= uid 或使用者名 選擇性。 設置憑證緩存所有者的 uid。 這主要對 sec=krb5. 預設值是執行掛載的進程的實際 uid。 我們建議將此參數設置為在其預設憑證緩存檔中具有必要 Kerberos 票證的使用者的 uid 或 username。 這會指示 upcall 查找該用戶擁有的憑證緩存。
sec= krb5 Kerberos 驗證的必要項目。 若要開啟 Kerberos 安全性模式, 請設定 sec=krb5。 範例: sudo mount -t cifs $SMB_PATH $MNT_PATH -o sec=krb5,cruid=$UID,serverino,nosharesock,actimeo=30,mfsymlinks. 使用此選項時,您必須省略使用者名稱和密碼。 Linux 用戶端必須加入網域。 請參閱 針對Linux用戶端透過SMB啟用Active Directory 驗證。
uid= 0 選擇性。 當伺服器不提供所有權資訊時,設定會擁有已掛接檔案系統上的所有檔案或目錄的使用者識別碼。 它可以指定為使用者名稱或數值 UID。 未指定時,預設值為 0。
gid= 0 選擇性。 當伺服器不提供所有權資訊時,設定會擁有已掛接檔案系統上的所有檔案或目錄的群組識別碼。 它可以指定為群組名稱或數字 GID。 未指定時,預設值為 0。
file_mode= n/a 選擇性。 如果伺服器不支援 CIFS Unix 延伸模組,這會覆寫預設檔案模式。
dir_mode= n/a 選擇性。 如果伺服器不支援 CIFS Unix 擴展,這會覆蓋目錄的預設模式。
handletimeout= n/a 選擇性。 在容錯移轉之後,伺服器應該保留檔案控制代碼以等待用戶端重新連線的時間 (以毫秒為單位)。

後續步驟

如需搭配Linux使用SMB Azure檔案共用的詳細資訊,請參閱: