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