SSHFSを使ってSSH経由でリモートをマウント

出典: Wikimura

目次

はじめに

自宅サーバ(CentOS 5.3)でMediaWiki、Subversion、Tracを稼動させ、SSH経由でのみ利用できるようにしている。 結構便利なのだが、ストレージが非冗長なので怖い。 そこで、研究室のメンバに割り当てられたファイルサーバ(RAID1)をバックアップ先にしようと考えた。


ここで問題となったのが、どうやって自宅サーバのデータを研究室サーバへ保存するかということ。 専用のコマンド(svnsyncやtrac-adminのhotcopy)を使ってバックアップできれば好ましい。 しかし、研究室サーバにはこれらのコマンドがない(SVNはインストールしてもらったが、バージョンが1.4.2)上に、 勝手にいじることができないという制約がある。


研究室サーバのホームディレクトリを自宅サーバでマウントすることができれば、 研究室サーバの都合を気にせずバックアップを実行できる。 始めは研究室サーバのSambaが使えないかと考えたが、SSHはUDPをトンネリングできないらしい。 Windowsクライアントに限れば、ループバックアダプタやら仮想ネットワークやらを用いることで、SSH経由でのSamba利用が可能となるらしい。 しかし、Linuxの自宅サーバをクライアントとする場合この方法は適用できない。


そんな中、SSH経由でのSamba利用を調べていたページ「Gfarm over SMB over SSH」の下の方に、Linuxでのやり方のヒントが載っていた。 SSHFSと呼ばれるソフトウェアを利用することで、SSH経由で接続先のホームディレクトリ以下(?)をマウントできるらしい。

ここでは、これを使って研究室サーバをマウントし、SubversionやTracのバックアップをとる方法の流れをメモする。 具体的な内容は参考ページを参考にすること。


インストール(CentOS用)

ソフトウェアのインストールにはyumが便利で、SSHFSもyumから持ってくることができる。 yumがソフトウェアを検索する先(リポジトリ)に、RPMForgeを追加する必要がある。

鍵の作成

  • クライアント(ここでは自宅サーバ)で鍵のペアを作る。
    • 秘密鍵のパーミッションは厳しく設定すること(600?)
    • 公開鍵のパーミッションは所有者以外も読めること(644?)
  • 公開鍵をサーバ(ここでは研究室サーバ)に送る。
    • 通常は、サーバのホームディレクトリ以下に「.ssh」という隠しディレクトリがある
    • .ssh以下に authorized_keys というファイルがある。ここに公開鍵を追加することで、パスワード不要でアクセスできるようになる。
    • くれぐれも上書きしないこと。追加モードにすること。
cat 公開鍵 >> authorized_keys

SSHクライアント設定

ここまでくればSSHFSを利用できるが、設定オプションを毎回書くのは面倒なので、設定ファイルを用意しておく。 この設定ファイルはOpenSSHの形式で記述する。

複数の接続先をHostオプション設定できる。Hostごとにログインユーザや秘密鍵、トンネリング設定などが行える。 SSHFSを使うにあたっては、ユーザ名と秘密鍵があれば充分。

参考ページに書いてあるが、このファイルの保存先は一般的に「~/.ssh/config」らしい。 またパーミッションは「所有者のみ読み書き可(600)」ですべきなので、これを守ること。

Host Kimura-lab.net
User ユーザ名
IdentityFile 秘密鍵へのパス


マウント・アンマウント

設定ができれば後はマウントするだけ。

sshfs  -F 設定ファイル  ユーザ名@ホスト:ディレクトリ  マウント先
  • 設定ファイルへのパス: 予め作成したSSHクライアント設定ファイルへのパス。
  • ユーザ名: 接続先でのユーザ名
  • ホスト: 接続先(ここではKimura-lab.net)
  • ディレクトリ: ユーザのホームディレクトリからの相対で、マウント元を指定する。省略した場合はホームディレクトリになる。
  • マウント先: マウントもとの内容をローカルのディレクトリに対応付ける。空ディレクトリを指定する方が安全。

アンマウントするには以下を実行する。

fusermount -u マウント先


注意: まだ確認ができていないが、Subversionリポジトリのバックアップにおいて、マウント先に生成した一時ファイルのリネームが行われるらしい。 上記の方法でsshfsを起動すると既存ファイルのリネームができないため、「許可されない操作」とか「ファイルシステムエラー」というエラーが起こる。


これを解決するためには、以下のようにworkaroundオプションでrenameを有効化する。 これにより操作のアトミック性が保障されなくなるらしく、問題が起きる可能性があるかもしれないとのこと(多分大丈夫とは書いてある)。 しかし、自分のディスクスペースを一人で使う分には衝突は起きないので問題ないと思われる。

sshfs  -F 設定ファイル  ユーザ名@ホスト:ディレクトリ  マウント先 -o workaround=rename                                    

SVNリポジトリバックアップ

バックアップはsvnsyncでbackups以下のリポジトリをrepos以下のリポジトリに同期させることで行う。

Before: 
/var/svn/repos/    複数のリポジトリ

After:
/var/svn/repos/    複数のリポジトリ
         backups/  リポジトリ対応するバックアップ先 <--+
                                                       |
研究室:                                                |  マウント
/home/ユーザ名/svn/repos/   元々あるリポジトリ         |
                   backups/ バックアップ --------------+

注意: 「http ://」でアクセスしようとすると以下のようなエラーが起こる。Apacheがアクセス権の都合で見られないのかもしれない。 「file://」ならアクセス可能だが、パスワード(conf/passwd)が暗号化されない。 そのため、バックアップ用リポジトリはSVNサーバから開けないようにした方が好ましい。

svn: Could not open the requested SVN filesystem

Tracバックアップ

SVNリポジトリもセットでバックアップしないと意味が無いが、Trac自体は以下で簡単にバックアップを取れる。

/var/trac/projects/  プロジェクト
          backups/   バックアップ先

trac-admin /var/trac/projects/プロジェクト hotcopy /var/trac/backups/バックアップ先

MediaWikiバックアップ