rsh で zfs send

以下、安全なネットワークでのお話。くれぐれもインターネットにつながった世界とかではやらないでください。

zfs send/recv

ZFS には zfs send/recv という仕組みがあって、ファイルシステムを標準出力に吐き出して、それを標準入力から受け取るこが出来ます。とうぜん、ネットワーク経由で他のマシンに送り込んでバックアップを取る、ということもできるわけです。

そこで気になるのが、ネットワークでの送信手段。よくあるのは ssh で、Solaris のマニュアルにも

% pfexec zfs send -v tank/hoge@snapshot | ssh remote_host pfexec zfs recv tank/hoge@snapshot

みたくやりましょう、と書いてあります。

けれど、実際にやってみるとネットワークのwire speedにくらべてかなり遅い。remote_hostでprstatしてみると、sysじゃなくて (zfsカーネル側)、 sshユーザランドで CPU 食ってることが分かります。

そこで「やっぱり Sun がスキ!」のブログでは mbuffer を使った例 が紹介されています。けれど、送信するたびにリモートでmbuffer起動して、とかやるのは自動化するときにはちょい面倒。安全なLAN内に限って、もうちょい楽をしたいんですよね。

rsh

ということで、安全なことを前提に rsh やってみました。

Solaris だと inetd まわりは inetadm を使うんだけど、 svc のほうにもエントリがあるので svcadm でまとめて管理してくれます。

% pfexec svcadm enable svc:/network/shell:default
% pfexec svcs -l svc:/network/shell:default
fmri         svc:/network/shell:default
name         rsh
enabled      true
state        online
next_state   none
state_time   Tue Dec 08 10:31:02 2009
restarter    svc:/network/inetd:default
contract_id  
dependency   require_any/error svc:/network/loopback (online)
dependency   optional_all/error svc:/milestone/network (online)
% pfexec inetadm | grep network/shell:default
enabled   online         svc:/network/shell:default

そして、とてつもなく久しぶりの .rhosts *1 を書きます。むかし某所で「.xhost ってファイル書くといいよ!」みたいないたずら流行ってたのが懐かしい。

count.local% echo "elmo.local ichii386" > ~/.rhosts
count.local% chmod 600 ~/.rhosts

あとは rsh でコマンド実行出来るか確認。

elmo.local% rsh count.local id
uid=101(ichii386) gid=10(staff) groups=10(staff)

send してみるテスト

elmo.local と count.local は1Gのネットワークで繋がってます。

elmo.local% pfexec zfs send -v rpool/test@snapshot | ssh count.local pfexec zfs recv rpool/test@snapshot
receiving full stream of rpool/test@snapshot into rpool/test@snapshot
received 7.65GB stream in 250 seconds (31.3MB/sec)
  • via rsh
elmo.local% pfexec zfs send -v rpool/test@snapshot | rsh count.local pfexec zfs recv rpool/test@snapshot
receiving full stream of rpool/test@snapshot into rpool/test@snapshot
received 7.65GB stream in 90 seconds (90.2MB/sec)

うーん、いいですね。これであとは zfs send -i してゆけばカンペキです。

*1:追記: ファイル名が間違ってたのを直しました