在 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
命令。
注意
從 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 數值標記法。
提示
如果您希望執行 .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
設定檔。
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 檔案服務的詳細資訊: