0

出力 (生データ、ログなし) を rsync のファイルにパイプして、これを bsdiff に保存することは可能ですか? rsnapshot は構成がなく、構文がばかげているため (インデント、wtf?)、rdiff は少し不安定なため、非常にイライラします。

すべてのデータを rsync し、その tar.gz アーカイブを作成し、bsdiff を実行して 2 つの tar.gz アーカイブ間のパッチを生成する実用的なソリューションがあります。しかし、毎回アーカイブ全体を作成する必要があるため、これは大量の負荷がかかるとかなり CPU 集約的であり、非常にディスク集約的です。

要約すると: - 最初の rsync を作成する - 以前のファイルに対して bsdiff を実行する - 回復しやすいように diff をアーカイブする

これを書いたとき、lvm-snapshot のアイデアを思いつきました。

4

1 に答える 1

0

rsync(1)リモートシステムに接続するときに、別のシェルを簡単に使用できます。がデフォルトですが、 に転送するすべてのコンテンツのコピーを-e ssh起動して保存するラッパー プログラムを作成することもできます。sshssh

私が考えているもののいくつかの擬似コード:

in[2] = pipe
out[2] = pipe
err[2] = pipe
fork
if child, fork
grandparent /* ssh */
    close 0, 1, 2
    dup2 in[0], 0
    dup2 out[1], 1
    dup2 err[1], 2
    close in, out, err
    exec(ssh, hostname, rsync) -- copy from rsync itself
parent /* stdin -> pipe */
    close in[0], out, err, 1, 2
    open (log, "/path/to/log", "w")
    loop forever:
        read(0, buf)
        write(in[1], buf)
        write(log, buf)
child /* pipe -> stdout, stderr */
    close in, out[1], err[1], 0
    loop forever:
        read(out[0], bufout)
        write(1, bufout)
        read(err[0], buferr)
        write(2, buferr)

pipe(2)これを実装する前に、、、dup2(2)およびclose(2)呼び出しを再確認してください。記述子を適切に接続し、各プロセスで使用されていない記述子を閉じたと思いますが、これは少し微妙です。

結果のファイルをリモート エンドポイントの tarball に適用するのがどれほど簡単かはわかりませんが、それがあなたの行き詰まっている部分でないことを願っています。

于 2011-10-22T06:31:58.093 に答える