SMB Azure ファイル共有を Linux でマウントする

注意

この記事では、間もなくサポート終了 (EOL) 状態になる Linux ディストリビューションである CentOS について説明します。 適宜、使用と計画を検討してください。 詳細については、「CentOS のサポート終了に関するガイダンス」を参照してください。 Azure Files は、Microsoft の使いやすいクラウド ファイル システムです。 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 を使用してください。

Distribution 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 ディストリビューションが上記の表に記載されていない場合は、uname コマンドを使用して Linux カーネル バージョンを確認してください。

uname -r

Note

SMB 2.1 のサポートが追加されたのは、Linux カーネル バージョン 3.7 となります。 お使いの Linux カーネルのバージョンが 3.7 より後の場合、SMB 2.1 がサポートされています。

適用対象

ファイル共有の種類 SMB NFS
Standard ファイル共有 (GPv2)、LRS/ZRS はい いいえ
Standard ファイル共有 (GPv2)、GRS/GZRS はい いいえ
Premium ファイル共有 (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 ファイル共有を 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

次に、mount コマンドを使用してファイル共有をマウントします。 次の例では、$SMB_PATH コマンドがストレージ アカウントのファイル エンドポイントの完全修飾ドメイン名を使用して設定されています。また、$STORAGE_ACCOUNT_KEY には、ストレージ アカウント キーが設定されています。

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

mount コマンドのマウント オプションには、uid/gid または dir_mode および file_mode を使用してアクセス許可を設定できます。 アクセス許可を設定する方法の詳細については、UNIX の数値表記に関する記事を参照してください。

必要に応じて、同じ 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 所有者に基づく) には読み取り、書き込み、および実行が、所有者グループのユーザーには読み取りおよび実行が、システム上の他のユーザーには読み取りおよび実行が許可されることを意味します。 別途、mount の uidgid または dir_modefile_mode で必要に応じてアクセス許可を設定することもできます。 アクセス許可を設定する方法の詳細については、Wikipedia の「UNIX numeric notation」 (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

Note

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 の形式) です。 snapshot オプションは、バージョン 4.19 以降の Linux カーネルでサポートされています。

ファイル共有スナップショットを作成したら、次の手順に従ってマウントします。

  1. Azure portal で、スナップショットをマウントするファイル共有が含まれているストレージ アカウントに移動します。

  2. [データ ストレージ] > [ファイル共有] を選んで、ファイル共有を選びます。

  3. [操作] > [スナップショット] を選び、マウントするスナップショットの名前を記録しておきます。 スナップショットの名前は、次のスクリーンショットのように GMT タイムスタンプになります。

    Azure portal でファイル共有スナップショットの名前とタイムスタンプを見つける方法を示すスクリーンショット。

  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 Files 接続とアクセスの問題 (SMB) のトラブルシューティング」を参照してください。

次のステップ

Azure Files の詳細については、次のリンクをご覧ください。