Назад | Перейти на главную страницу

Дельта-копия Rsync не работает для виртуального диска

Я пробовал rsync для копирования виртуальных машин на удаленный хост, но deltacopy, похоже, не работает. Я использую Virtualbox на CentOS 6.2. Моя виртуальная машина имеет 1 снимок, поэтому я просто копирую файл снимка вместо всего базового образа. Это работает, когда я копирую на удаленный хост, отображаемый как локальный диск (в этом случае rsync deltacopy не используется).

Проблема в том, что когда я использую rsync поверх ssh для копирования простого текстового файла, изменения копируются, но когда я использую тот же метод для копирования файла моментального снимка, изменения (например, текстовый файл, созданный на рабочем столе) не копируются. Кто-нибудь успешно использовал rsync для копирования изменений на жесткий диск виртуальной машины без копирования всего файла?

Я думаю, что rsync, вероятно, действительно делает свое дельта-копию для виртуального диска, но диск настолько велик, что ему нужно прочитать все, чтобы найти различия. С несколькими файлами (например, с обычной файловой системой, а не с виртуальным диском) rsync может использовать отдельные временные метки и размеры всех ваших файлов, но с виртуальным диском у него есть только 1 файл.

Итак, если вы копируете файл локально, он дважды читает диск на одном компьютере (2 файла, источник и место назначения), что делает его очень медленным, а если он удален, передача по сети низкая, но полный диск Считывается с обеих сторон двумя отдельными процессами rsync во время процесса прокатки diff. Я не проверил это полностью, но, наблюдая за iostat (при всей активности диска, а не только в моем тесте rsync), я обнаружил, что скорость записи очень низкая по сравнению со скоростью чтения.

Кроме того, когда вы копируете с помощью rsync, он создает временный файл перед перезаписью файла назначения. Чтобы избежать этого, вы можете использовать --inplace. Таким образом, у вас никогда не будет написана вторая копия, но вы все равно прочитаете весь диск, так что это не идеальное решение.

Первоначально я сказал: я не думаю, что есть способ прочитать весь файл ... для этого вам понадобится что-то другое, кроме rsync, например файловая система с копированием при записи, такая как btrfs или zfs с возможностью инкрементной отправки, то есть способность уже знать различия только по метаданным файловой системы, а не читать все данные заново.

Изменить: сегодня я понял, что вы, вероятно, могли бы избежать чтения всего файла, если бы файл был разделен на множество частей, поэтому каждая часть имеет другую метку времени и т.д. с вариантом Split2G формата vmdk, который разбивает файл на множество файлов по 2 ГБ ( но я не проверял, что детали имеют разные временные метки).