Вывод rsync по каналу в файл

#diff #rsync #lvm

#diff #rsync #lvm

Вопрос:

Возможно ли передать выходные данные (необработанные данные, без регистрации) в файл rsync и, возможно, сохранить это в bsdiff? Я нахожу rsnapshot очень раздражающим из-за отсутствия конфигурации и глупого синтаксиса (отступы, wtf?), А rdiff немного нестабилен.

У меня есть рабочее решение, в котором я повторно синхронизирую все данные, создаю из них tar.gz-архив и bsdiff для создания исправления между двумя tar.gz-архивами. Но это довольно интенсивно для процессора при огромных нагрузках и очень интенсивно для диска, так как вам приходится каждый раз создавать весь архив целиком.

Подводя итог: — Создайте начальный rsync — bsdiff для сравнения с предыдущими файлами — Заархивируйте diff таким образом, чтобы его было легко восстановить

Когда я писал это, у меня только что появилась идея с lvm-snapshot, есть желающие узнать, как мне поступить с этим?

Ответ №1:

rsync(1) можно легко использовать другую оболочку при обращении к удаленным системам; -e ssh используется по умолчанию, но вы могли бы написать программу-оболочку, которая запускает ssh и сохраняет копию всего содержимого, на которое вы пересылаете ssh .

Некоторый псевдокод для того, о чем я думаю:

 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) перед реализацией этого; Я полагаю, что я правильно подключил дескрипторы и закрыл неиспользуемые дескрипторы в каждом процессе, но это немного сложно.

Я не знаю, насколько легко вам будет применить полученный файл к архиву вашей удаленной конечной точки, но я надеюсь, что это не та часть, на которой вы застряли.