1. 概要

このチュートリアルでは、ツール sshfs を使用して、Linuxでリモートディレクトリをローカルにマウントする方法を見ていきます。

2. sshfs

sshfs は、リモートディレクトリをローカルにマウントできるLinuxコマンドラインツールです。 マウントされると、ユーザーは、フォルダーがローカルに存在するかのようにマウントポイントを操作できます。

舞台裏では、 sshfs はSSHのSFTPプロトコルを使用して、2つのノード間で必要なファイル送信を実行します。 したがって、リモートサーバーはsshdを実行しており、SSH接続を受け入れている必要があります。

2.1. インストール

UbuntuなどのDebianベースのLinuxにsshfsをインストールするには、apt-getを使用できます。

$ sudo apt-get install -y sshfs

同様に、 yum を使用して、CentOSなどのRHELベースのLinuxにsshfsをインストールできます。

$ sudo <span class="comment-copy">yum --enablerepo=powertools install fuse-sshfs</span>

RHELベースのLinuxでsshfsバイナリを取得するには、パッケージfuse-sshfsをインストールする必要があります。 さらに、フラグ –enablerepoを使用してpowertoolsrepoを有効にする必要があります。

2.2. 一般的な構文

一般に、sshfsコマンドは次のように表すことができます。

sshfs [user@]host:[dir] mountpoint [options] 

sshfs の最初の引数は、SSHの仕様に従った接続文字列です。

[user@]host:[dir]

user 引数は、リモートサーバーにログインするためのユーザー名を指定します。 次に、 host 引数は、リモートサーバーのIPアドレスまたはドメインの値を取ります。 次に、オプションの dir 引数は、リモートディレクトリのパスを指定します。 値がない場合、sshfsは認証ユーザーのホームパスにマウントされます。

マウントポイント引数は、マウントが作成されるローカルパスです。 さらに、 mountpoint 引数で指定されたパスは、マウントする前に存在している必要があります。 最後に、このコマンドは、さまざまな構成を提供するオプションのフラグのリストを受け入れます。

2.3. 基本的な使用法

sshfs を使用してリモートディレクトリをマウントするには、最初に、マウントポイントとして機能するディレクトリをローカルノードに作成します。

$ mkdir -p /mnt/DATA

次に、sshfsを使用してリモートディレクトリをマウントします。

$ sshfs bob@192.168.1.16:/tmp/DATA /mnt/DATA
bob@192.168.1.16's password:

基本的に、上記のコマンドは、マウントポイント / mnt /DATAをホスト192.168.1.16のリモートディレクトリ/tmp /DATAにポイントします。 さらに、ユーザーbobとしてホストに接続することを選択しました。 SSH仕様に従って、リモートはユーザーbobのパスワードの入力を求めます。

2.4. リモートディレクトリのアンマウント

マウントポイントをアンマウントするには、fusermountを使用できます。

$ fusermount -u /mnt/DATA

または、 umount を使用して、マウントポイントをアンマウントすることもできます。

$ umount /mnt/DATA

3. オプション

3.1. 別のポートを指定する

リモートサーバーが別のポートでSSH接続を受け入れている場合は、-pを使用してポートを指定できます。 たとえば、SSH接続のポートを2200として指定できます。

$ sshfs baeldung@192.168.1.16:/tmp/DATA /mnt/DATA -p 2200

3.2. 自動再接続

接続が中断された場合、接続を自動的に再確立するようにsshfsを構成できます。

これを行うには、オプション -oreconnectを指定できます。

$ sshfs baeldung@192.168.1.16:/tmp/DATA /mnt/DATA -o reconnect

3.3. 接続の遅延

sshfs を使用してマウントポイントを作成すると、接続がすぐに確立されます。 接続を遅らせるために、フラグ -odelay_connectを適用できます。

$ sshfs baeldung@192.168.1.16:/tmp/DATA /mnt/DATA -o delay_connect

コマンドは、パスワードプロンプトなしですぐに戻ります。 これは、フラグ -o delay_connect により、接続がすぐに確立されないためです。 代わりに、マウント / mnt /DATAに最初にアクセスしたときに接続が確立されます。

4. ファイルの所有権とアクセス許可

sshfs は、リモートファイルとディレクトリのユーザーID(UID)とグループID(GID)を同等のローカル値にマップするいくつかの方法を提供します。 マッピングは、すべてのUIDとGIDをローカルで単一の値にマッピングするのと同じくらい簡単に行うことができます。 さらに、マッピングを指定するファイルを使用すると、マッピングをより動的にすることができます。

4.1. 所有者を単一のユーザーとグループに設定する

フラグ-ouidを渡すことにより、リモートディレクトリとファイルの所有者を単一のユーザーとグループIDに設定できます。 たとえば、フラグ -o uid = 1002 は、マウントポイント内のファイルとディレクトリの所有者をユーザー1002に設定します。

$ sshfs bob@192.168.1.16:/tmp/DATA /mnt/DATA -o uid=1002
bob@192.168.1.16's password:
$ ls -l /mnt/DATA
total 4
-rw-r--r-- 1 1002 alicegroup 11 Apr 10 14:28 bob-file.txt
-rw-rw-r-- 1 1002 alicegroup 12 Apr 10 14:28 joey-file.txt

さらに、フラグ-o gid を使用して、グループIDを単一のローカル値に設定することもできます。 たとえば、ディレクトリ内のファイルのグループIDを5005に設定できます。

$ sshfs bob@192.168.1.16:/tmp/DATA /mnt/DATA -o gid=5005
bob@192.168.1.16's password:
$ ls -l /mnt/DATA
total 8
-rw-r--r-- 1 alice 5005 11 Apr 10 14:28 bob-file.txt
-rw-rw-r-- 1 alice 5005 12 Apr 10 14:28 joey-file.txt

最後に、両方のフラグを指定して、ファイルのUIDとGIDを設定できます。

$ sshfs bob@ubuntu-box-p:/tmp/DATA /mnt/DATA -o uid=1002 -o gid=5005
bob@192.168.1.16's password:
$ ls -l /mnt/DATA
total 8
-rw-r--r-- 1 1002 5005 11 Apr 10 14:28 bob-file.txt
-rw-rw-r-- 1 1002 5005 12 Apr 10 14:28 joey-file.txt

4.2. UIDとGIDを動的にマッピングする

マッピングファイルに従ってリモートUIDおよびGID値をローカルにマッピングするには、オプション-o idmap =fileを渡します。 次に、フラグ -ouidfileおよび-ogidfileを使用してマッピングファイルを指定します。

たとえば、ホスト192.168.1.16のディレクトリ / tmp / DATA には、bob-file.txtjoey-file.txtの2つのファイルが含まれています。

$ ls -l /tmp/DATA
total 8
-rw-rw-r-- 1 bob  bobgroup  11 Apr 10 14:28 bob-file.txt
-rw-rw-r-- 1 joey joeygroup 12 Apr 10 14:28 joey-file.txt

まず、ホスト192.168.1.16上のbobjoeyのUIDとGIDを決定する必要があります。 ユーザーのUIDを判別するには、コマンド id を使用して、フラグ-uを渡します。

$ id -u bob
1001
$ id -u joey
1002

同じコマンドidを使用して、フラグ -g を指定することにより、ユーザーのGIDを取得できます。

$ id -g bobgroup
201
$ id -g joeygroup
202

次に、リモートUIDとGIDをローカル値にマッピングするために、マッピングルールをローカルで作成できます。 ルールは特定の形式で指定されます。

local-username:remote-uid

この例では、リモートユーザーbobをローカルユーザーaliceにマップし、リモートユーザーjoeyをローカルユーザーamyにマップします。

$ cat > uid-mapping <<EOF
alice:1001
amy:1002
root:0
EOF

上記のコマンドは、コマンドcatおよびheredocを使用して、マッピングルールをファイルuid-mappingに書き込みます。

同様に、グループIDマッピングファイル gid-mapping を作成して、リモートグループをローカル値にマッピングできます。

$ cat > gid-mapping <<EOF
alicegroup:201
amygroup:202
root:0
EOF

次に、コマンド sshfs を使用してマウントポイントを作成し、uid-mappinggid-mappingをマッピングのルールとして渡します。

$ sshfs bob@192.168.1.16:/tmp/DATA /mnt/DATA -o idmap=file -o uidfile=uid-mapping -o gidfile=gid-mapping

フラグ-oidmap= file を使用して、コマンドsshfsにファイルを使用してマッピングを実行するように指示しています。 次に、フラグ -ouidfileおよび-ogidfileを使用してマッピングファイル名を渡します。

ローカルマウントポイントのアクセス許可情報を見てみましょう。

$ ls -l /mnt/DATA
total 8
-rw-rw-r-- 1 alice   alicegroup  11 Apr 10 14:28 bob-file.txt
-rw-rw-r-- 1 amy     amygroup    12 Apr 10 14:28 joey-file.txt

ご覧のとおり、権限はuid-mappingおよびgid-mappingファイルに従ってマッピングされています。

5. 結論

このチュートリアルでは、sshfsを使用してリモートディレクトリをマウントする方法について説明しました。 まず、DebianベースおよびRHELベースのLinuxのインストールガイドから始めました。 次に、リモートディレクトリをマウントおよびアンマウントする方法を確認しました。

次に、ツールが提供するいくつかのオプションについて検討しました。 最後に、コマンドの権限マッピング機能について説明しました。