リモートストレージをローカルドライブとしてマウントする:LinuxにおけるFUSEとSSHFS活用ガイド

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

SCPやSFTPの繰り返し作業からの脱却

複数サーバー間でのファイル管理は、通常、scprsyncの繰り返し、あるいはFileZillaのようなSFTPクライアントを開く作業を伴います。これらのツールは便利ですが、開発プロセスに摩擦(手間)を生じさせます。以前の私は、ログファイルをダウンロードしてgrepをかけたり、コードの修正パッチを一つずつアップロードしたりするだけで、15分から20分も費やしていました。しかし、日常のルーチンにFUSE(Filesystem in Userspace)とSSHFSを取り入れたことで、すべてが変わりました。

FUSEは、権限のない一般ユーザーがカーネルコードを触ることなく独自のファイルシステムを作成できるようにするカーネルインターフェースです。これにより、DevOpsエンジニアにとっての大きな障壁が取り除かれます。本番サーバーのリモートディレクトリやAmazon S3バケット、さらにはGoogle Driveのアカウントまで、ローカルのノートPCに直接マウントできます。一度マウントすれば、これらのリモートファイルはローカルデータと全く同じように動作します。ファイルがあたかも手元のNVMeドライブにあるかのように、lscatvim、あるいは任意のGUIファイルマネージャーを使用できます。

4GBのRAMを搭載した本番環境のUbuntu 22.04サーバーにおいて、このアプローチはデータ処理時間を大幅に短縮しました。かつて、別のストレージノードに保存された50GBの生ログを分析する必要がありました。ネットワーク転送に12分待つ代わりに、SSHFS経由でノードをマウントし、即座にスクリプトを実行しました。カーネルがバックグラウンドでデータストリーミングを処理したため、ディスク容量を節約できただけでなく、精神的なストレスも解消されました。

ツールの準備

まず、sshfsパッケージをインストールする必要があります。主要なLinuxディストリビューションのほとんどは、デフォルトのリポジトリにこれを含んでいます。SSHFSはFUSEに依存しているため、通常はインストール時に必要な依存関係がすべて自動的に解決されます。

DebianやUbuntuベースのシステムでは、以下を実行します:

sudo apt update
sudo apt install sshfs

RHEL、CentOS、またはAlmaLinuxユーザーの場合:

sudo dnf install fuse-sshfs

インストール後、ユーザーをfuseグループに追加する必要があるか確認してください。Ubuntu 22.04などの最新のディストリビューションでは、これは自動的に処理されます。権限エラーが発生した場合は、手動で自分自身を追加してみてください:

sudo usermod -a -G fuse $(whoami)

このグループ変更を反映させるには、一度ログアウトして再度ログインし直す必要があることを忘れないでください。

SSHFSによるリモートサーバーのマウント

SSHFSは驚くほどシンプルです。サーバーへのSSHアクセス権があれば、そのファイルシステムをマウントできます。アクティブなSSHデーモン以外、サーバー側で特別な設定は必要ありません。

基本的なマウントコマンド

まず、マウントポイントとなるローカルディレクトリを作成します。私は整理しやすいように、通常~/mntに作成しています。

mkdir -p ~/mnt/remote_server
sshfs user@remote-ip:/var/www/html ~/mnt/remote_server

これで、~/mnt/remote_serverに移動すると、リモートの/var/www/htmlディレクトリ内のファイルが表示されます。SSHキーを使用している場合(強く推奨します)、パスワードの入力なしで即座にマウントされます。

非rootユーザーでも利用可能という利点

このセットアップの際立った特徴の一つは、これらのドライブをマウントするためにローカルマシンでのroot権限が必要ないことです。これは、共有環境や制限のあるワークステーションに最適です。システム管理者が新しいデータソース接続を承認するのを待つことなく、自分自身でマウントを管理できます。

クラウドストレージの取り扱い(S3とRclone)

SSHFSはサーバーには最適ですが、AWS S3やBackblaze B2のようなオブジェクトストレージを扱いたい場合もあるでしょう。その場合は、rcloneをお勧めします。これは同じFUSEバックエンドを使用してクラウドバケットをマウントします。

# rcloneの設定後にS3バケットをマウントする例
rclone mount mys3bucket:bucket-name ~/mnt/s3_data --vfs-cache-mode writes

これにより、クラウドバケットをローカルフォルダとして扱うことができます。バックアップスクリプトや、標準的なファイルシステムが必要だがクラウドの無限の拡張性も利用したいアプリケーションにとって、非常に有用です。

最適化とパフォーマンスチューニング

ネットワーク経由での作業には遅延が伴います。ピン(ping)が100msを超えるような接続環境では、単純なlsコマンドでも動作が重く感じられることがあります。いくつかの特定のフラグを使用することで、操作感を大幅に向上させることができます。

ディレクトリの一覧表示やファイルアクセスを高速化するには、以下のキャッシュと圧縮の設定を試してみてください:

sshfs user@remote-ip:/path ~/mnt/remote_server -C -o cache=yes -o kernel_cache -o compression=yes
  • -C: 低速な回線において非常に有効な圧縮機能を有効にします。
  • -o kernel_cache: カーネルがファイルをキャッシュするようにし、不要なネットワークリクエストを削減します。
  • -o auto_cache: ファイルの更新時間に基づいてキャッシュを有効にします。

Wi-Fiが途切れたり、サーバーが接続を切断したりする場合に備えて、reconnectオプションを追加しましょう。これにより、マウントが無期限にハングアップするのを防げます:

sshfs user@remote-ip:/path ~/mnt/remote_server -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3

確認とモニタリング

マウントが成功したかどう確認すればよいでしょうか?df -hコマンドが最も確実な方法です。マウントされたファイルシステムがリスト表示され、リモートサーバーのディスク使用状況が表示されます。

df -h | grep sshfs

作業が終わったら、接続を解除するためにrmdirを使用しないでください。FUSEファイルシステムを安全にデタッチするには、fusermountユーティリティを使用します:

fusermount -u ~/mnt/remote_server

fstabによる自動化

/etc/fstabにマウント設定を追加することで、再起動後もマウントを継続させることができます。ただし、ノートPCでこれを行うことはお勧めしません。適切なネットワークに接続されていない場合、起動プロセスが停止する可能性があるからです。安定したサーバーで使用する場合は、_netdevallow_otherオプションを含めてください:

user@remote-ip:/path /home/localuser/mnt/remote_server fuse.sshfs _netdev,allow_other,IdentityFile=/home/localuser/.ssh/id_rsa 0 0

よくある問題のトラブルシューティング

接続が突然切断されると、マウントが「古い(stale)」状態になることがあります。「Transport endpoint is not connected」といったエラーが表示される場合があります。このような場合、通常のumountは失敗することが多いです。解決策は、強制的な遅延アンマウント(lazy unmount)です:

# 強制アンマウント
fusermount -uz ~/mnt/remote_server

-zフラグは、ファイルシステムがビジー状態でなくなった直後にマウントポイントをクリーンアップし、ハングアップを即座に解消します。

FUSE and SSHFSを使用することで、分散インフラストラクチャの管理方法が根本的に改善されました。ローカルの利便性とリモートのパワーを組み合わせることで、お気に入りのエディタやツールをどこにあるデータに対しても使用できるようになります。次にscpコマンドの繰り返し作業に陥っている自分に気づいたら、ぜひ試してみてください。

Share: