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
rsync
は、ファイルのコンテンツをコピーするだけでなく、ファイル属性も同期します。これは、rsync
に渡す(または渡さない)オプションによって多少制限されますが、多少制限されます。 rsync
には--devices
デバイスファイルをデバイスファイルとして同期させるオプションですが、明らかにnotこのオプションを渡しても、プレーンファイルをプレーンファイルとして同期することはできます。
より一般的には、/ dev/nullはデータを書き込むための安全な場所ですinto;ファイルの属性や構造を乱すもののターゲットとして使用するのは安全ではありません。
デフォルトでは、rsyncは
次に、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はファイルとファイル、デバイスとデバイスを同期できますが、ファイルをデバイスに同期しているように見えます。それはおそらく行かないでしょう。
/ dev/nullはキャラクタースペシャルファイルであり、ご存知のとおり、rsyncをrootとして使用してファイルにコピーすると上書きされます。私の知る限り、rsyncはあなたがやりたいことをしません。 sshを介してcatにパイプ接続できる可能性があります。
time tar cf - file | ssh server "cat > /dev/null"