server-memo.net

sshfsで別サーバのディレクトリをマウントする

   

sshfsを使用して別サーバのディレクトリをマウントする手順について説明しています。

sshfsについて

sshfsはsshを経由して他のサーバのディレクトリをマウントすることができます。

一度sshfsでマウントしてしまえば、データをコピーする際に毎回scpやrsyncなどのコマンドを使わずとも、cpコマンドで簡単にデータをコピーできるのでとても便利ですね。

sshfsのインストール

CentOSの場合は標準のリポジトリには含まれていないので、「epel」リポジトリを使用してインストールを行う必要があります。

# yum install --enablerepo=epel sshfs

「epel」リポジトリの追加手順はこちらのページを参考にしてください。

sshfsの使用方法

「sshfs」の使用方法について説明していきます。

マウント方法

「sshfs」を使用して別サーバのディレクトリをマウントする方法は下記の通りとなります。

sshfs [ユーザ名@]ホスト:[ディレクトリ] マウントディレクトリ [オプション]

マウント例

今回は「/home/tamohiko/test5」というディレクトリに「test5.server-memo.net」サーバの「tamohiko」ユーザのホームディレクトリをマウントしていきます。

実際にマウント作業を行うにあたり、まずはマウントさせるためのディレクトリを作成します。

$ mkdir /home/tamohiko/test5

次に「sshfs」コマンドを使ってマウントを行います。

$ sshfs tamohiko@test5.server-memo.net:/home/tamohiko /home/tamohiko/test5

マウント作業が完了しましたら、「df」コマンドでマウントされているか確認してみます。

$ df -h | grep test5
tamohiko@test5.server-memo.net:/home/tamohiko    48G   33M   48G    1% /home/tamohiko/test5

無事マウントされていることが確認できました。

アンマウント方法(マウント解除)

sshfsでマウントしたディレクトリをアンマウントする場合は「fusermount -u」コマンドを使用します。

fusermount -u マウントディレクトリ

アンマウント例

実際に先ほどマウントした「/home/tamohiko/test5/」ディレクトをアンマウントしてみます。

$ fusermount -u /home/tamohiko/test5/

実際にアンマウントされたかを「df」コマンドで確認してみます。

$ df -h | grep test5

何も表示されなかったので、無事アンマウントされていることが確認できました。

Device or resource busy で解除できない場合

マウントしているディレクトリを使用していない場合でも「fusermount -u 」コマンドでアンマウントが出来ない場合があります。

$ fusermount -u /home/tamohiko/test5
fusermount: failed to unmount /home/tamohiko/test5: Device or resource busy

この場合は「root」ユーザで「umount -l」を使用すると強制的にアンマウントすることが出来ます。

umount -l マウントポイント

実際にマウントされているディレクトリをアンマウントしてみます。

# umount -l /home/tamohiko/test5

コマンド実行後「df」コマンドでアンマウントされているか確認してください。

オプションについて

「sshfs」で使用できるオプションはとても多いので、普段使用しそうなものについて説明していきます。

ポートの変更 (-p ポート番号 | -o port=ポート番号)

SSHの待ち受けポートがデフォルトの「22」番ポートから変更されている場合は、「-p」か「-o port=ポート番号」を使用することで接続先ポート番号を指定することが出来ます。

-p ポート番号
-o port=ポート番号

使用例

「20222」番ポートを指定してマウントをする場合は、下記のように指定することになります。

「-p ポート番号」を使用
$ sshfs tamohiko@192.168.1.105:/home/tamohiko /home/tamohiko/test5 -p 20222
「-o port=ポート番号」を使用
$ sshfs tamohiko@192.168.1.105:/home/tamohiko /home/tamohiko/test5 -o port=20222

秘密鍵を指定 (-o IdentityFile)

SSHの接続が鍵認証方式となっている場合は、「-o IdentityFile」オプションを使用して秘密鍵を指定します。

-o IdentityFile=秘密鍵

使用例

秘密鍵を指定する場合は下記のように指定をします。

$ sshfs tamohiko@192.168.1.105:/home/tamohiko /home/tamohiko/test5 -p 20222 -o IdentityFile=/home/tamohiko/.ssh/id_ecdsa

他のユーザもアクセス許可(-o allow_other)

「sshfs」を使用してマウントしたディレクトリは、通常マウントしたユーザのみ使用できます。

他のユーザにも使用許可させるには「-o allow_other」オプションを使用します。

「tamohiko」ユーザが「sshfs」でマウントした状態で「df」コマンドを実行すると、マウントされたディレクトリの情報が表示されています。

$ id
uid=1000(tamohiko) gid=1000(tamohiko) groups=1000(tamohiko)
$ df
ファイルシス                  1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/cl-root              17811456 1239636 16571820    7% /
devtmpfs                           489248       0   489248    0% /dev
tmpfs                              499960       0   499960    0% /dev/shm
tmpfs                              499960    6860   493100    2% /run
tmpfs                              499960       0   499960    0% /sys/fs/cgroup
/dev/sda1                         1038336  151388   886948   15% /boot
tmpfs                               99992       0    99992    0% /run/user/1000
tamohiko@test5:/home/tamohiko    49725724   33136 49692588    1% /mnt/test5

別ユーザで「df」コマンドを実行してみると、マウントされているディレクトリが見えない状態となっています。

$ id
uid=1002(test) gid=1002(test) groups=1002(test)
$ df
ファイルシス        1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/cl-root    17811456 1239616 16571840    7% /
devtmpfs                 489248       0   489248    0% /dev
tmpfs                    499960       0   499960    0% /dev/shm
tmpfs                    499960    6860   493100    2% /run
tmpfs                    499960       0   499960    0% /sys/fs/cgroup
/dev/sda1               1038336  151388   886948   15% /boot
tmpfs                     99992       0    99992    0% /run/user/1000

ちなみに、直接マウントポイントに移動することも出来ません。

$ cd /mnt/test5
-bash: cd: /mnt/test5: 許可がありません

/etc/fuse.conf 編集

一般ユーザが「-o allow_other」を使用するには、最初に「/etc/fuse.conf」に「user_allow_other」の設定を追加する必要があります。

# cp -p /etc/fuse.conf /etc/fuse.conf_yyyymmdd
# vi /etc/fuse.conf

※「fuse.conf」ファイルが無い場合は新規に作成する必要があります。

編集前

CentOS7の場合は下記のように「user_allow_other」がコメント化されていますので、「#」を削除して有効化してあげてください。

# mount_max = 1000
# user_allow_other
編集後
# mount_max = 1000
user_allow_other

この設定を行わずに一般ユーザが「-o allow_other」オプションを使用すると、下記メッセージが表示されてマウントすることが出来ません。

fusermount: option allow_other only allowed if 'user_allow_other' is set in /etc/fuse.conf

「-o allow_other」を使用してマウント

「tamohiko」ユーザで「test5」サーバのディレクトリを「-o allow_other」オプションを指定して「/mnt/test5」にマウントします。

$ sshfs tamohiko@test5:/home/tamohiko /mnt/test5 -o allow_other

次に、「test」ユーザでマウントしたディレクトリを使用できるか確認してみます。

$ id
uid=1002(test) gid=1002(test) groups=1002(test)
$ df -h
ファイルシス                  サイズ  使用  残り 使用% マウント位置
/dev/mapper/cl-root              17G  1.2G   16G    7% /
devtmpfs                        478M     0  478M    0% /dev
tmpfs                           489M     0  489M    0% /dev/shm
tmpfs                           489M  6.7M  482M    2% /run
tmpfs                           489M     0  489M    0% /sys/fs/cgroup
/dev/sda1                      1014M  148M  867M   15% /boot
tmpfs                            98M     0   98M    0% /run/user/1000
tamohiko@test5:/home/tamohiko    48G   33M   48G    1% /mnt/test5

「df」コマンドでマウントされているディレクトリが確認できたので、次に移動出来るか確認してみます。

$ cd /mnt/test5/
$ pwd
/mnt/test5

無事対象ディレクトリに移動できることも確認できました。

複数オプションの指定方法

複数のオプションをまとめて指定する場合は「,」で区切ることで、一度に複数のオプションを指定することが出来ます。

-o allow_other,compression=yes,transform_symlinks,idmap=user

オプション一覧

sshfsのオプション一覧です。必要に応じて使用してください。

general options:
    -o opt,[opt...]        mount options
    -h   --help            print help
    -V   --version         print version

SSHFS options:
    -p PORT                equivalent to '-o port=PORT'
    -C                     equivalent to '-o compression=yes'
    -F ssh_configfile      specifies alternative ssh configuration file
    -1                     equivalent to '-o ssh_protocol=1'
    -o reconnect           reconnect to server
    -o delay_connect       delay connection to server
    -o sshfs_sync          synchronous writes
    -o no_readahead        synchronous reads (no speculative readahead)
    -o sync_readdir        synchronous readdir
    -o sshfs_debug         print some debugging information
    -o cache=BOOL          enable caching {yes,no} (default: yes)
    -o cache_timeout=N     sets timeout for caches in seconds (default: 20)
    -o cache_X_timeout=N   sets timeout for {stat,dir,link} cache
    -o workaround=LIST     colon separated list of workarounds
             none             no workarounds enabled
             all              all workarounds enabled
             [no]rename       fix renaming to existing file (default: off)
             [no]nodelaysrv   set nodelay tcp flag in sshd (default: off)
             [no]truncate     fix truncate for old servers (default: off)
             [no]buflimit     fix buffer fillup bug in server (default: on)
    -o idmap=TYPE          user/group ID mapping, possible types are:
             none             no translation of the ID space (default)
             user             only translate UID of connecting user
             file             translate UIDs/GIDs contained in uidfile/gidfile
    -o uidfile=FILE        file containing username:remote_uid mappings
    -o gidfile=FILE        file containing groupname:remote_gid mappings
    -o nomap=TYPE          with idmap=file, how to handle missing mappings
             ignore           don't do any re-mapping
             error            return an error (default)
    -o ssh_command=CMD     execute CMD instead of 'ssh'
    -o ssh_protocol=N      ssh protocol to use (default: 2)
    -o sftp_server=SERV    path to sftp server or subsystem (default: sftp)
    -o directport=PORT     directly connect to PORT bypassing ssh
    -o slave               communicate over stdin and stdout bypassing network
    -o disable_hardlink    link(2) will return with errno set to ENOSYS
    -o transform_symlinks  transform absolute symlinks to relative
    -o follow_symlinks     follow symlinks on the server
    -o no_check_root       don't check for existence of 'dir' on server
    -o password_stdin      read password from stdin (only for pam_mount!)
    -o SSHOPT=VAL          ssh options (see man ssh_config)

FUSE options:
    -d   -o debug          enable debug output (implies -f)
    -f                     foreground operation
    -s                     disable multi-threaded operation

    -o allow_other         allow access to other users
    -o allow_root          allow access to root
    -o auto_unmount        auto unmount on process termination
    -o nonempty            allow mounts over non-empty file/dir
    -o default_permissions enable permission checking by kernel
    -o fsname=NAME         set filesystem name
    -o subtype=NAME        set filesystem type
    -o large_read          issue large read requests (2.4 only)
    -o max_read=N          set maximum size of read requests

    -o hard_remove         immediate removal (don't hide files)
    -o use_ino             let filesystem set inode numbers
    -o readdir_ino         try to fill in d_ino in readdir
    -o direct_io           use direct I/O
    -o kernel_cache        cache files in kernel
    -o [no]auto_cache      enable caching based on modification times (off)
    -o umask=M             set file permissions (octal)
    -o uid=N               set file owner
    -o gid=N               set file group
    -o entry_timeout=T     cache timeout for names (1.0s)
    -o negative_timeout=T  cache timeout for deleted names (0.0s)
    -o attr_timeout=T      cache timeout for attributes (1.0s)
    -o ac_attr_timeout=T   auto cache timeout for attributes (attr_timeout)
    -o noforget            never forget cached inodes
    -o remember=T          remember cached inodes for T seconds (0s)
    -o intr                allow requests to be interrupted
    -o intr_signal=NUM     signal to send on interrupt (10)
    -o modules=M1[:M2...]  names of modules to push onto filesystem stack

    -o max_write=N         set maximum size of write requests
    -o max_readahead=N     set maximum readahead
    -o max_background=N    set number of maximum background requests
    -o congestion_threshold=N  set kernel's congestion threshold
    -o async_read          perform reads asynchronously (default)
    -o sync_read           perform reads synchronously
    -o atomic_o_trunc      enable atomic open+truncate support
    -o big_writes          enable larger than 4kB writes
    -o no_remote_lock      disable remote file locking
    -o no_remote_flock     disable remote file locking (BSD)
    -o no_remote_posix_lock disable remove file locking (POSIX)
    -o [no_]splice_write   use splice to write to the fuse device
    -o [no_]splice_move    move data while splicing to the fuse device
    -o [no_]splice_read    use splice to read from the fuse device

Module options:

[iconv]
    -o from_code=CHARSET   original encoding of file names (default: UTF-8)
    -o to_code=CHARSET      new encoding of the file names (default: UTF-8)

[subdir]
    -o subdir=DIR           prepend this directory to all paths (mandatory)
    -o [no]rellinks         transform absolute symlinks to relative

サーバ起動時にマウント

サーバを起動した際に自動的にマウントさせたい場合は、下記の書式で「/etc/fstab」に記述することで自動マウントさせることが出来ますが、この場合SSHは鍵認証方式に対応していて、鍵にパスワードが設定されていないことが前提となります。

/bin/sshfs#[ユーザ名@]ホスト:[ディレクトリ] マウントディレクトリ fuse [オプション] 0 0 

ちょっと長くなってしまいましたが、下記が実際の記述例となります。

/bin/sshfs#tamohiko@192.168.1.105:/home/tamohiko /mnt/test5 fuse IdentityFile=/home/tamohiko/.ssh/id_ecdsa,allow_other,compression=yes,transform_symlinks,idmap=user,reconnect,_netdev,ServerAliveInterval=60 0 0

今回指定しているオプションは以下のものになっています。

  • IdentityFile= SSHの秘密鍵を指定
  • allow_other 他ユーザのアクセス許可
  • compression=yes 通信の圧縮を行う
  • transform_symlinks マウント内で完結するsymlinkを相対パスに変更
  • idmap=user 接続ユーザのみuidを変換する
  • reconnect サーバに再接続
  • _netdev ネットワーク開始までマウントを待機する
  • ServerAliveInterval= ホストと応答確認を行う間隔

「IdentityFile=」「_netdev」は必須ですが、それ以外は必要に合わせて指定してください。

 - Tips