web-dev-qa-db-ja.com

/ dev / nullへのRsyncはそれを上書きします

Rsyncを使用して、あるサーバーから別のサーバーにコピー先のサーバーの/ dev/nullにコピーすると、ランダムな動作が発生します。これは私のネットワークパフォーマンステストの一部であり、テストではディスクI/Oを避けたいです。私はすべてのサーバーで同じスクリプトを使用していますが、一部のサーバーでは宛先/ dev/nullが上書きされて通常のファイルになり、それが他のものを壊します。

同じサーバーの場合、scpは宛先/ dev/nullを上書きしません。

前:

[root@localhost ~]# ls -l /dev/null
crw-rw-rw-. 1 root root 1, 3 Sep 11 09:24 /dev/null

これが私のrsyncコマンドです:

rsync -v -e ssh --progress 500MB root@destination-server:/dev/null

後:

[root@localhost ~]# ls -l /dev/null
-rw-r--r--. 1 root root 104857600 Sep 11 10:09 /dev/null

同じサーバーに対してscpを実行しても、/ dev/nullは壊れません

scp 500MB root@destination-server:/dev/null

ランダムな動作を引き起こす理由は何ですか?私のサーバーはCentOS6と7の混合です

ありがとう、Eilbron

3
Eilbron

rsyncは、ファイルのコンテンツをコピーするだけでなく、ファイル属性も同期します。これは、rsyncに渡す(または渡さない)オプションによって多少制限されますが、多少制限されます。 rsyncには--devicesデバイスファイルをデバイスファイルとして同期させるオプションですが、明らかにnotこのオプションを渡しても、プレーンファイルをプレーンファイルとして同期することはできます。

より一般的には、/ dev/nullはデータを書き込むための安全な場所ですinto;ファイルの属性や構造を乱すもののターゲットとして使用するのは安全ではありません。

3
Gordon Davisson

デフォルトでは、rsyncは

  • 新しいファイルを作成し、元のファイルを新しいファイルで上書きします
  • ファイルを特別なものとして扱わない(デバイス、リンク、FIFOなど)。

次に、passwdというファイルをディレクトリaからディレクトリbに同期する方法を示します。

ソースファイルを読み取ります

a/ OPEN passwd
a/ ACCESS passwd
a/ CLOSE_NOWRITE,CLOSE passwd

一時ファイルを作成し、データを移動します。

b/ CREATE .passwd.cBzlfu
b/ OPEN .passwd.cBzlfu
b/ ATTRIB .passwd.cBzlfu
b/ MODIFY .passwd.cBzlfu
b/ CLOSE_WRITE,CLOSE .passwd.cBzlfu
b/ ATTRIB .passwd.cBzlfu

ファイル名を確定します

b/ MOVED_FROM .passwd.cBzlfu
b/ MOVED_TO passwd

最後の操作は/ dev/nullを上書きするものです。これは、デバイスファイルを上書きするだけだからです。あなたはそれがそれに書き込む(追加する)と期待していますが、そうではありません。

スイッチ--inplaceおよび--partialが同期動作に影響を与えています。

スイッチ--devicesも参考になりました

このオプションを指定すると、rsyncは文字およびブロックデバイスファイルをリモートシステムに転送して、これらのデバイスを再作成します。受信rsyncがスーパーユーザーとして実行されていない場合、このオプションは効果がありません(--superおよび--fake-superオプションも参照)。

おそらく、ファイルをデバイスに同期しないことも検討する必要があります:) rsyncはファイルとファイル、デバイスとデバイスを同期できますが、ファイルをデバイスに同期しているように見えます。それはおそらく行かないでしょう。

1
asdmin

/ dev/nullはキャラクタースペシャルファイルであり、ご存知のとおり、rsyncをrootとして使用してファイルにコピーすると上書きされます。私の知る限り、rsyncはあなたがやりたいことをしません。 sshを介してcatにパイプ接続できる可能性があります。

time tar cf - file | ssh server "cat > /dev/null"
0
scarville