Linux環境でAutoFSを使いこなす:NFS/SMB共有をオンデマンドで自動マウントし、システムのフリーズを防ぐ

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

リモートストレージを /etc/fstab に静的記述する方法は、多くのLinuxシステム管理者が最初に覚える手法です。しかし、この方法は突然トラブルを引き起こすことがあります。再起動時にストレージノードがオフラインになっていると、サーバーは90秒間のTCPタイムアウト待ちでハングアップしてしまいます。

日次cronジョブが停止し、応答しなくなったネットワークマウントを維持するためにカーネルが無駄にソケットを消費し続けます。こうした問題を根本から解決するのがAutoFSです。カーネルレベルのVFSインターセプターと軽量なユーザースペースデーモンを連携させることで、プロセスがアクセスした瞬間にだけネットワーク共有をマウントし、アイドル状態が一定時間続くと安全にアンマウントします。

クイックスタート(5分)

まずは実際に自動マウントを動かしてみましょう。この手順では、/etc/fstab を一切変更することなく、リモートのNFSエクスポートをマウントします。

1. AutoFSパッケージのインストール

使用しているディストリビューションに応じてパッケージをインストールします。

# Debian / Ubuntu
sudo apt update
sudo apt install -y autofs nfs-common

# RHEL / AlmaLinux / Rocky Linux
sudo dnf install -y autofs nfs-utils

2. マスターマップの設定

メインの設定ファイルは /etc/auto.master です。ここでは親マウントディレクトリとそれぞれのマップルールを紐付けます。エディタでこのファイルを開きます。

sudo nano /etc/auto.master

末尾に次の行を追加します。

/mnt/nfs  /etc/auto.nfs  --timeout=60

この1行のエントリによって、AutoFSが /mnt/nfs を完全に制御するようになります。デーモンは /etc/auto.nfs を解析してマウント対象を特定し、60秒間アクセスのない共有を自動的にアンマウントします。

3. マップファイルの作成

次に /etc/auto.nfs を作成し、マウントポイントと対象のストレージを指定します。

sudo nano /etc/auto.nfs

次の行を追加し、IPアドレスとリモートパスをお使いのネットワーク環境に合わせて変更します。

backups   -fstype=nfs4,rw,soft,timeo=50,retrans=3   192.168.1.50:/srv/nfs/backups

4. 起動と動作確認

systemdでサービスを起動し、自動起動を有効化します。

sudo systemctl enable --now autofs

df -h でマウント状況を確認します。この時点では /mnt/nfs/backups はまだ表示されず、休眠状態のままです。対象パス内のファイルを一覧表示することで、即座にマウントをトリガーできます。

ls -la /mnt/nfs/backups

再度 df -h を実行してください。リモート共有がマウントされ、I/O処理が可能な状態になっていることが確認できます。その後、そのパスに対してコマンドを実行せずに60秒放置すると、AutoFSがバックグラウンドで静かにファイルシステムを切り離します。

アーキテクチャの深層解説

各コンポーネントが内部でどのように連携しているかを把握しておくと、マウント失敗時のトラブルシューティングが格段に容易になります。

カーネルモジュールとユーザースペースデーモン

AutoFSは、autofs4 カーネルモジュールと automount ユーザースペースデーモンの2つのレイヤーで役割を分担しています。アプリケーションが設定されたパスへアクセスしようとすると、カーネルモジュールがVFS(仮想ファイルシステム)のパス検索をインターセプト(捕捉)します。

対象パスはディスク上のアクティブなinodeではなくAutoFSのトリガーであるため、カーネルは呼び出し元のプロセスを一時停止させ、専用のパイプ経由で automount デーモンに通知を送ります。デーモンはマップを解析し、標準の mount システムコールを発行してファイルディスクリプタを返却します。処理が完了し、無通信タイマーがゼロになると、デーモンはカーネルにシグナルを送りボリュームをアンマウントします。

間接マップ(Indirect Maps)と直接マップ(Direct Maps)

本番環境では、主に2つのマッピング設計が使い分けられます。

  • 間接マップ(Indirect Maps): /mnt/nfs のような共通の親ディレクトリ配下に複数の共有をまとめます。プロセスが正確なターゲット名を要求するまで、サブフォルダは通常の ls /mnt/nfs には一切表示されません。この設計により、多数のマウントハンドシェイクがリモートストレージに一斉に押し寄せるのを防ぎます。
  • 直接マップ(Direct Maps): /var/log/remote や /opt/app/data など、ファイルシステム階層内の任意の独立したパスを直接指定します。直接マップを定義するには、/etc/auto.master 内でベースパスとして /- を指定します。

直接マップを使用する場合、マスターファイルには次のように記述します。

/-   /etc/auto.direct   --timeout=120

そして /etc/auto.direct 内では、キーとして絶対パスを指定します。

/var/www/shared   -fstype=nfs4,ro,soft   192.168.1.50:/srv/www_assets

WindowsおよびSamba(SMB/CIFS)共有の安全なマウント

LinuxとWindowsが混在する環境ではCIFSマウントが必要です。マップファイル内に平文でパスワードを保存するとセキュリティ監査上の重大な指摘事項となるため、分離された認証情報ファイルを使用します。

認証情報を /etc/autofs.credentials に記述します。

username=svc_backup
password=SuperSecurePassword123
domain=CORP

直ちにパーミッションをrootのみに制限します。

sudo chmod 600 /etc/autofs.credentials
sudo chown root:root /etc/autofs.credentials

/etc/auto.master にSMBの親マップエントリを追加します。

/mnt/smb   /etc/auto.smb   --timeout=90

/etc/auto.smb に対象の共有とマウントオプションを設定します。

finance   -fstype=cifs,credentials=/etc/autofs.credentials,uid=1000,gid=1000,iocharset=utf8   ://192.168.1.100/FinanceShare

sudo systemctl reload autofs でデーモンの設定を再読み込みします。ユーザーが /mnt/smb/finance にアクセスした瞬間、CIFSドライバがドメインコントローラーに対して認証を行い、適切なPOSIXパーミッションと所有権でリモート共有をアタッチします。

応用的な活用テクニック

これらの設定パターンを活用することで、数百ノード規模のクラスタ環境でもAutoFSを効率的かつスマートにスケールさせることができます。

動的ワイルドカードマウント

プロジェクトディレクトリやホームフォルダが数十個ある場合、個別にマップエントリを書くのは運用の大きな負担になります。ワイルドカードマップを使用すれば、パターンマッチングによって動的なターゲットを自動処理できます。

# /etc/auto.projects 内の設定
*   -fstype=nfs4,rw,soft,timeo=50,retrans=3   192.168.1.50:/srv/exports/&

アスタリスク(*)はクライアントが要求したフォルダ名をキャプチャし、アンパサンド(&)はその文字列をエクスポートパスに代入します。例えば cd /mnt/projects/alpha を実行すると、AutoFSはその場で動的に 192.168.1.50:/srv/exports/alpha をマウントします。

実環境における負荷軽減とパフォーマンス改善効果

RAM 4GBを搭載したUbuntu 22.04のエッジゲートウェイにおいて、8台のバックアップおよび取り込みノードへ fstab で常時マウントを行っていた際、180MBのメモリを消費し48個のTCPソケットが常にオープン状態になっていました。これらのターゲットを60秒のタイムアウトを持つAutoFSへ切り替えたところ、アイドル時のソケット使用数はゼロまで激減しました。

rsync を使用したデータ取り込みジョブはオンデマンドでマウントをトリガーし、40GBのデータを処理したのち、ジョブ終了から60秒後に接続を解放しました。深夜のメンテナンスでセカンダリNASが再起動した際も、データ取り込みスクリプトはカーネルによる悪名高い15分間のフリーズを完全に回避することができました。

高可用性フェイルオーバーマウント

AutoFSには、読み取り専用ミラー向けにラウンドロビンおよびレイテンシ基準のネイティブなフェイルオーバー機能が備わっています。1つのマップエントリ内に、複数のサーバーをスペース区切りで記述するだけで設定できます。

assets   -fstype=nfs4,ro,soft   192.168.1.51:/srv/assets 192.168.1.52:/srv/assets

AutoFSはマウント前にRPC経由で各ホストにプローブを送信し、ネットワークレイテンシが最も低いノードを自動選択します。マウント試行前にサーバー .51 が無応答になった場合でも、自動的に .52 へフォールバックします。

現場で役立つ実践ノウハウ

本番ノードへAutoFSを導入する前に、以下の実践的なベストプラクティスを押さえておきましょう。

1. フォアグラウンドモードでのデバッグ

エラーログを残さず静かに失敗するマウントのトラブルシューティングは非常に厄介です。バックグラウンドサービスを停止し、フォアグラウンドのデバッグモードでデーモンを起動して正確なエラーコードを確認します。

sudo systemctl stop autofs
sudo automount -f -v -d

別のシェルからマウントをトリガーすると、コンソール出力にリアルタイムのRPC検出状況や権限エラー(NFSの EACCES など)、DNSタイムアウトなどの詳細情報が表示されます。

2. ‘soft’ オプションと明示的なタイムアウト設定でハングアップを回避

NFSのデフォルトマウントは hard モードです。ストレージがオフラインになると、クライアントプロセスは割り込み不可スリープ(D 状態)に陥り、df や rsync、さらには kill -9 さえも完全にフリーズして受け付けなくなります。これを防ぐには、soft オプションと明示的なタイムアウト値を組み合わせて使用します。

shared   -fstype=nfs4,rw,soft,timeo=50,retrans=3   192.168.1.50:/srv/shared

ここで timeo=50 はタイムアウトを5秒(1/10秒単位)に設定し、retrans=3 は3回のリトライ失敗後にリクエストを中断します。なお、従来の intr オプションは現代のLinuxカーネル(NFSv4およびLinux 2.6.25以降)では完全に無視される点に注意してください。

3. systemdのジャーナルログによるAutoFSの監視

自動マウントの有効化や正常なアンマウントの動作は、システムログから直接追跡できます。

sudo journalctl -u autofs -f --no-tail

4. シェルのTabキー補完に関する注意点

/mnt/nfs/ のような間接マウントディレクトリ内で Tab キーを押しても、フォルダ名は自動補完されません。アクセスされるまでサブディレクトリはVFSテーブル上に存在しないため、シェルからは空のフォルダに見えるからです。開発者や経験の浅い管理者はこれを設定の不具合と勘違いしがちです。明確なパスをドキュメント化するか、チームメンバーがアクセス対象を把握しやすい予測可能な命名規則を策定しておきましょう。

Share: