Linux クライアントに SMB Azure ファイル共有をマウントする
Azure ファイル共有は、SMB カーネル クライアントを使用して Linux ディストリビューションにマウントできます。
Linux で Azure ファイル共有をマウントするには、SMB 3.1.1 を使用することをお勧めします。 既定では、転送中の暗号化が Azure Files で必要になりますが、これがサポートされるのは SMB 3.0 以降となります。 Azure Files では 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 をサポートしているはずです。
配布 | 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 ディストリビューションが上記の表に記載されていない場合は、uname
コマンドを使用して Linux カーネル バージョンを確認してください。
uname -r
Note
この記事のすべてのマウント スクリプトは、既定の 0755 Linux ファイルおよびフォルダーのアクセス許可を使用して SMB ファイル共有をマウントします。 これは、ファイルとディレクトリの所有者の場合は読み取り、書き込み、実行、所有者グループ内のユーザーの場合は読み取りと実行、他のユーザーの場合は読み取りと実行を意味します。 組織のセキュリティ ポリシーによっては、マウント オプションで代替の uid
/gid
または dir_mode
および file_mode
アクセス許可を設定することもできます。 アクセス許可を設定する方法の詳細については、UNIX の数値表記に関する記事を参照してください。 マウント オプションの一覧については、「マウント オプション」を参照してください。
適用対象
ファイル共有の種類 | SMB | NFS |
---|---|---|
Standard ファイル共有 (GPv2)、LRS/ZRS | ||
Standard ファイル共有 (GPv2)、GRS/GZRS | ||
Premium ファイル共有 (FileStorage)、LRS/ZRS |
前提条件
- 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 を開くことができない場合、または ISP によってブロックされている場合は、VPN 接続または ExpressRoute を使用してポート 445 を回避することができます。 詳細については、直接の Azure ファイル共有アクセスのネットワークに関する考慮事項に関するページを参照してください。
Azure ファイル共有を mount を使用してオンデマンドでマウントする
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 マウント オプションの一覧については、「マウント オプション」を参照してください。
Note
Linux カーネル バージョン 5.0 以降でネゴシエートされる既定のプロトコルは SMB 3.1.1 です。 5\.0 より前のバージョンの Linux カーネルを使用する場合は、mount のオプション リストに 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
Azure ファイル共有を Linux にマウントするには、ファイル共有のユーザー名としてストレージ アカウント名を、また、パスワードとしてストレージ アカウント キーを使用します。 ストレージ アカウントの資格情報は時間が経つと変わる可能性があるため、ストレージ アカウントの資格情報は、マウントの構成とは別に保管しておく必要があります。
次の例は、資格情報を格納するファイルの作成方法を示しています。
<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 を使用した静的マウント
以前の環境を使用して、ストレージ アカウントやファイル共有のフォルダーを指定のマウント フォルダー下に作成します。
<file-share-name>
は、Azure ファイル共有の適切な名前に置き換えてください。
FILE_SHARE_NAME="<file-share-name>"
MNT_PATH="$MNT_ROOT/$STORAGE_ACCOUNT_NAME/$FILE_SHARE_NAME"
sudo mkdir -p $MNT_PATH
最後に、Azure ファイル共有のレコードを /etc/fstab
ファイルに作成します。 次のコマンドでは、Linux のファイルとフォルダーに既定のアクセス許可である 0755 が使用されています。これは、所有者 (ファイルまたはディレクトリの 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
Note
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 |
該当なし | 推奨要件。 シンボリック リンクをサポートするようにマウントを強制し、git などのアプリケーションでシンボリック リンクを使用してリポジトリを複製できるようにします。 |
actimeo= |
30-60 | 推奨要件。
actimeo を指定すると、acregmin 、acregmax 、acdirmin 、acdirmax のせべてに同じ値が設定されます。 30 秒未満の値を使用すると、ファイルおよびディレクトリ用の属性キャッシュの有効期限切れが早すぎるため、パフォーマンスが低下する場合があります。
actimeo は 30 から 60 秒の間で設定することをお勧めします。 |
nosharesock |
該当なし | 省略可能。 SMB マウントへの既存の接続がある場合でも、クライアントは常にサーバーに新しい接続を確立するように強制します。 これにより、各マウント ポイントで異なる TCP ソケットが使用されるため、パフォーマンスを向上させることができます。 場合によっては、nosharesock は、同じクライアントから 2 つのマウントから開いたときに同じファイルをキャッシュされないため、パフォーマンスが低下する可能性があります。 |
max_channels= |
4 | SMB マルチチャネルを使用する場合に推奨されます。 ファイル共有へのチャネル (ネットワーク接続) の最大数を指定します。 SMB MultiChannel の使用時、チャンネル数が 4 を超える場合、パフォーマンスが低下します。 |
remount |
該当なし | ファイル共有を再マウントし、指定した場合はマウント オプションを変更します。 元のマウント後に期限切れのパスワードを修正する代替パスワードを指定する場合は、password2 オプションと共に使用します。 |
nobrl |
該当なし | アドバイザリ ロックが必要な場合は、単一クライアントのシナリオで推奨されます。 Azure Files はアドバイザリ ロックをサポートしていないため、この設定により、バイト範囲ロック要求がサーバーに送信されません。 |
snapshot= |
time | ファイル共有の特定のスナップショットをマウントします。 時間は、要求されたスナップショットを識別する正の整数である必要があります (1601 年 1 月 1 日以降に経過した 100 ナノ秒単位、または GMT 形式 (例: @GMT-2024.03.27-20.52.19)) で指定することもできます)。 |
closetimeo= |
5 | 遅延終了タイムアウト (ハンドル キャッシュ) を秒単位で構成するか、0 に設定して無効にします。 既定値は 5 秒です。 |
nostrictsync |
該当なし | fsync() でフラッシュするようにサーバーに要求しないでください。 一部のサーバーでは、既定でバッファリングされない書き込みが実行され、その場合、フラッシュは不要になります。 このオプションを使用すると、クライアントが多数の小さな書き込み + fsync の組み合わせを実行し、ネットワーク待ち時間がサーバーの待ち機時間よりもはるかに長いワークロードのパフォーマンスを向上させることができます。 |
multiuser |
該当なし | サーバーにアクセスするときに、ユーザー アクセスを個々の資格情報にマップします。 既定では、CIFS マウントでは、共有にアクセスするときに使用するユーザー資格情報 (マウント資格情報) のセットは 1 つだけです。 このオプションを使用すると、新しいユーザーがマウントにアクセスするたびに、クライアントはユーザーの資格情報を使用してサーバーとの新しいセッションを作成します。 そのユーザーによる今後のアクセスでも、それらの資格情報が使用されます。 カーネルはパスワードの入力を求めることができないため、マルチユーザー マウントは、パスワードを必要としない sec= オプションを使用するマウントに限定されます。 |
cifsacl |
該当なし | このオプションは、LINUX アクセス許可ビットとの間で CIFS/NTFS ACL をマップしたり、UID と GID との間で SID をマップしたり、セキュリティ記述子を取得および設定したりするために使用されます。 NTLMv2 認証でのみサポートされます。 |
idsfromsid,modefromsid |
該当なし | クライアントがクライアント強制認可を行う必要がある場合に推奨されます。 Unix スタイルのアクセス許可を有効にします。 UID/GID がすべてのクライアント間で均一である場合にのみ機能します。 NTLMv2 認証でのみサポートされます。 |
sec= |
krb5 | Kerberos 認証に必要です。 Kerberos セキュリティ モードを有効にするには、sec=krb5 を設定します。 このオプションを使用する場合は、ユーザー名とパスワードを省略する必要があります。 Linux クライアントはドメインに参加している必要があります。 「Linux クライアントの SMB 経由の Active Directory 認証を有効にする」を参照してください。 |
uid= |
0 | 省略可能。 サーバーが所有権情報を提供しない場合に、マウントされたファイル システム上のすべてのファイルまたはディレクトリを所有する UID を設定します。 ユーザー名または数値の UID のいずれかとして指定できます。 指定しない場合は、0 が既定値です。 |
gid= |
0 | 省略可能。 サーバーが所有権情報を提供しない場合に、マウントされたファイル システム上のすべてのファイルまたはディレクトリを所有する GID を設定します。 グループ名または数値の GID のいずれかとして指定できます。 指定しない場合は、0 が既定値です。 |
file_mode= |
該当なし | 省略可能。 サーバーが CIFS Unix 拡張機能をサポートしていない場合は、既定のファイル モードがオーバーライドされます。 |
dir_mode= |
該当なし | 省略可能。 サーバーが CIFS Unix 拡張機能をサポートしていない場合は、ディレクトリの既定のモードがオーバーライドされます。 |
handletimeout= |
該当なし | 省略可能。 フェールオーバー後にクライアントの再接続を待機するためにサーバーがファイル ハンドルを予約する時間 (ミリ秒単位)。 |
次のステップ
Linux での SMB Azure ファイル共有の使用の詳細については、次を参照してください。