在 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 核心版本 |
|
|
Ubuntu \(英文\) | AES-128-GCM 加密:18.04.5 LTS+ | AES-128-CCM 加密:16.04.4 LTS+ |
Red Hat Enterprise Linux (RHEL) |
|
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
/gid
或 dir_mode
和 file_mode
權限。 如需有關如何設定權限的詳細資訊,請參閱 UNIX 數值標記法。 如需掛接選項的清單,請參閱 掛接選項 。
適用於
檔案共用類型 | SMB | NFS |
---|---|---|
標準檔案共用 (GPv2)、LRS/ZRS | ||
標準檔案共用 (GPv2)、GRS/GZRS | ||
進階檔案共用 (FileStorage)、LRS/ZRS |
必要條件
在 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
命令。 如需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
若要在 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 擁有者)、擁有者群組中使用者的讀取和執行,以及系統上其他使用者的讀取和執行。 您可能會想要視需要設定掛接的替代 uid
和 gid
或 dir_mode
和 file_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.1
、3.0
和 2.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 | 建議使用。 指定 actimeo 會將所有 acregmin 、acregmax 、acdirmin 和 acdirmax 設定為相同的值。 使用低於 30 秒的值,可能會導致效能降低,因為檔案和目錄的屬性快取太快過期。 建議您將 actimeo 設為 30 到 60 秒之間。 |
nosharesock |
n/a | 選擇性。 強制用戶端一律對伺服器建立新的連線,即使它具有SMB掛接的現有連線也一樣。 這可以增強效能,因為每個裝入點都會使用不同的 TCP 套接字。 在某些情況下,從相同用戶端的兩個掛接開啟時, nosharesock 由於未快取相同檔案,所以效能可能會降低。 |
max_channels= |
4 | 建議使用SMB多重通道時。 指定檔案共用的通道數目上限(網路連線)。 如果您使用SMB多重通道,且通道數目超過四個,這會導致效能不佳。 |
remount |
n/a | 如果指定,請重新掛接檔案共享並變更掛接選項。 password2 如果您想要指定替代密碼,以在原始掛接之後修正過期的密碼,請使用 選項。 |
nobrl |
n/a | 在需要諮詢鎖定時,建議在單一用戶端案例中使用。 Azure 檔案儲存體 不支援諮詢鎖定,而且此設定可防止將位元組範圍鎖定要求傳送至伺服器。 |
snapshot= |
time | 掛接檔案共用的特定快照集。 時間必須是正整數,可識別要求的快照集(在 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驗證。 |
sec= |
krb5 | Kerberos 驗證的必要專案。 若要開啟 Kerberos 安全性模式, 請設定 sec=krb5 。 使用此選項時,您必須省略使用者名稱和密碼。 Linux 用戶端必須加入網域。 請參閱 針對Linux用戶端透過SMB啟用Active Directory 驗證。 |
uid= |
0 | 選擇性。 設定 uid,當伺服器未提供擁有權資訊時,將擁有掛接文件系統上的所有檔案或目錄。 它可以指定為使用者名稱或數值 UID。 未指定時,預設值為 0。 |
gid= |
0 | 選擇性。 設定當伺服器未提供擁有權資訊時,將擁有掛接文件系統上所有檔案或目錄的 gid。 它可以指定為 groupname 或 numeric gid。 未指定時,預設值為 0。 |
file_mode= |
n/a | 選擇性。 如果伺服器不支援 CIFS Unix 延伸模組,這會覆寫預設檔案模式。 |
dir_mode= |
n/a | 選擇性。 如果伺服器不支援 CIFS Unix 延伸模組,這會覆寫目錄的預設模式。 |
handletimeout= |
n/a | 選擇性。 在故障轉移等候用戶端重新連線之後,伺服器應該保留檔句柄的時間(以毫秒為單位)。 |
下一步
如需搭配Linux使用SMB Azure檔案共用的詳細資訊,請參閱: