web-dev-qa-db-ja.com

ファイルツリーを配置してからNFS経由でエクスポートするにはどうすればよいですか?

次のようなツリーに増分バックアップを保存するバックアップサーバーがあります。

/backups       
   hourly.0
      server 1
      server 2
   hourly.1
      server 1
      server 2
   hourly.2
      server 1
      server 2
   daily.0
      server 1
      server 2
   etc...

実際のバックアップでソースツリーを変更せずに、次のような再編成されたツリーを作成したいと思います。

/share
   server1/1 Hour Ago -> /backups/hourly.0/server1
   server1/2 Hours Ago -> /backups/hourly.1/server1
   server2/1 Hour Ago -> /backups/hourly.0/server2
   server2/2 Hours Ago -> /backups/hourly.1/server2
   ...

...次に、このツリーをsingleNFSマウントとしてエクスポートします。

NFSクライアントは次を確認する必要があります。

/backups       
   server 1
      1 Hour Ago
      2 Hours Ago
   server 2
      1 Hour Ago
      2 Hours Ago

失敗した試み#1-シンボリックリンクを使用

シンボリックリンクはサーバーではなくNFSクライアントマシンに関連しているため、これは機能しません。クライアントで「1時間前」を開こうとすると、存在しないクライアントの/backups/hourly.0/server1にアクセスしようとします。

失敗した試み#2-/etc/fstabでBINDを使用

すなわち:

/backup/hourly.0/server1/ "/share/server1/1 Hour Ago" none ro,bind,defaults 0 0

これにより、NFSクライアントに表示される必要なツリーを作成できましたが、フォルダー内には何も表示されませんでした。これはおそらく、NFSがファイルシステムにまたがらず、NFSがバインドマウントポイントを新しいファイルシステムと見なしているためです。

これを達成する方法はありますか?

3
Nick

いいえ、これはカーネルベースのnfsサーバーでの単一のNFSエクスポートでは不可能です。

exports(5)マニュアルにあるように:

ファイル/ etc/exportsには、NFSクライアントがアクセスできるNFSサーバー上のローカル物理ファイルシステムのテーブルが含まれています。

ただし、ツリーの一部をエクスポートして、バインドを使用してクライアント上で再アセンブルすることができます。

シンボリックリンク

別の緩和策は、シンボリックリンクを使用することです。

/server_1
  hourly.0 -> /backups/hourly.0/server\ 1
  hourly.1 -> /backups/hourly.1/server\ 1
  ...
/server_2
  hourly.0 -> /backups/hourly.0/server\ 2
  hourly.1 -> /backups/hourly.1/server\ 2
  ...

これを機能させるには、バックアップツリー全体とサーバーディレクトリをエクスポートする必要があります。これは、シンボリックリンクを使用すると、各サーバーが他のサーバーのバックアップを参照できることを意味します。

nohideオプション

nohideファイルにはcrossmountおよびexportsオプションがあります。単一サーバーのエクスポートでのみ機能します。 inode number clashの可能性など、ドキュメントでこのオプションに付随する多くの警告があるため、これを使用したことはありません。

同じ物理ファイルシステムからディレクトリツリーをエクスポートしているため、NFSにマウントされたサブツリーをエクスポートするときに発生する可能性のあるこのiノード番号の衝突やデッド中間サーバーによるデッドロックは発生しません。

LinuxカーネルのNFSサーバーが、バインドオプションでマウントされたファイルシステムをnohideで表示できるとは思いません。

逆に行う

私はその質問について考えていて、おそらくこれにアプローチする正しい方法が逆にそれを行うことに気づきました。つまり、エクスポートしたいサーバーごとにディレクトリツリーを作成します。データを適切な場所に移動してから、mount -o bindを使用して/ backupsツリーを再構築します。

つまり、ファイルシステムは次のようになります。

/share/server1/1_Hour_Ago
               2_Hour_Ago
               ...
/share/server2/1_Hour_Ago
               2_Hour_Ago
               ...

あなたのfstabは

/share/server1/1_Hour_Ago /backups/hourly.0/server_1 none rw,bind 0 0 
/share/server1/2_Hour_Ago /backups/hourly.1/server_1 none rw,bind 0 0
...
/share/server2/1_Hour_Ago /backups/hourly.0/server_2 none rw,bind 0 0 
/share/server2/2_Hour_Ago /backups/hourly.1/server_2 none rw,bind 0 0
...

あなたのexportsはただ

/share/server1 server1(rw,no_subtree_check) 
/share/server2 server2(rw,no_subtree_check)
3
Dmitri Chubarov