Клонировать весь раздел или жесткий диск в разреженный файл


35

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

cp --sparse=always <(dd if=/dev/sda1 bs=8M) /mount/external/backup/sda1.raw

Однако, на мой вкус, это слишком сложно и не позволяет мне возобновить процесс, если его прервать. Забавно, что для этого есть инструмент NTFS ( ntfsclone), но для родных файловых систем Linux (EXT2-4) такого инструмента не существует.

Есть ли лучший инструмент для этого, например, ddвариант с разреженной поддержкой? Я не ищу какое-то проприетарное программное обеспечение для резервного копирования дисков, а просто хочу сделать разреженную копию клона, которую я могу при необходимости смонтировать как устройство зацикливания.


7
+1 для творческого использования cp, мне никогда не приходило в голову, что вы можете копировать образ диска. Я всегда просто сжимал их, если мне нужно было сэкономить место. Теперь, почему это в вопросе не ответ?
— Калеб

Ответы:


21

Вы хотите dd_rescue.

dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw

1
Большой! В руководстве говорится: «Если процесс копирования прерван пользователем, можно продолжить в любой позиции позже». и "-a запись файла spArse (по умолчанию = нет)". Именно то, что я хочу! Благодарность!
— Мартин Шаррер

3
Ища dd_rescueонлайн, я обнаружил, что есть также другой инструмент, названный ddrescue(без подчеркивания), который был разработан независимо от, dd_rescueно, кажется, делает в основном то же самое. Я просто упомянул это здесь как общее замечание.
— Мартин Шаррер

Да, dd_rescueи ddrescueэто не одно и то же. Теоретически они выполняют ту же работу, но в целом мне повезло больше со старым / оригинальным dd_rescue.
— Стивен Притчард

1
Если кому-то интересно, вы можете остановить копирование в любое время с помощью Ctrl-C. Он покажет вам вашу текущую позицию, и вы можете использовать это значение для перезапуска, добавив -sи позицию к исходной команде. (Так бы это выглядело dd_rescue -a -b 8M -s 42000k /dev/sda1 /mount/external/backup/sda1.raw.)
— Стивен Притчард

1
@ Стивен Притчард: Не нужно помнить позицию. Укажите третье имя файла, которое будет лог-файлом, и при перезапуске оно прочитает его и выберет, где оно остановилось.
— Танит Розенбаум

20

Просто для полноты призыва к спасению . --sparseИли -Sфлаг позволяет назначения быть написаны редко:

$ ddrescue -S -b8M /dev/sda1 /mount/external/backup/sda1.raw

Или с длинным вариантом:

$ ddrescue --sparse --block-size 8M /dev/sda1 /mount/external/backup/sda1.raw

Или, если вы предпочитаете MiBs :

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw

Чтобы аварийное восстановление было прервано и возобновлено, вы также можете использовать файл журнала:

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log

Обратите внимание, что GNU ddrescueи dd_rescueесть разные программы. Но GNU ddrescueкажется более распространенным. Например, он уже упакован с GRML .


Требуется ли особая обработка образа при восстановлении, можете ли вы предоставить команду, используемую для восстановления ddrescue?
— user12439

Теоретически носитель данных вы используете для спасения должен быть более надежным, так что вы можете , как правило , просто использовать дд для записи на сменный диск: dd if=sda1.raw of=/dev/sdb1. Однако, чтобы использовать ddrescue для восстановления, вы просто меняете источник / место назначения, которое вы использовали для восстановления, на новый источник / место назначения, предпочтительно с новым файлом журнала. Если возможно (часто нет), вы можете, конечно, использовать ddrescue для копирования данных непосредственно с диска с плохим исходным кодом на диск для замены.
— zaTricky

3

В 2007 году был предложен патч для обеспечения поддержки разреженных файлов в GNU dd, но, похоже, он не превратил его в coreutils (по крайней мере, не в 8.4). Я сомневаюсь, что dd сильно изменился с тех пор, патч может быть применен к текущей версии без особой работы.

Я также очень впечатлен творческим использованием cpв вашем вопросе, и это заставило меня принять решение использовать его для возобновления (здесь возобновление с ~ 80M в источник):

cp --sparse=always \
  <(dd if=/dev/sda1 bs=8M skip=10) /dev/stdout \
  | dd bs=8M seek=10 of=/mount/external/backup/sda1.raw

Изменить: поцарапать это. Второй dd, конечно, будет искать неправильную позицию в выходном файле, так как он не совпадает с длиной ввода.


1
Как и в случае с ответом bhinesley, было бы лучше записать прогресс dd для точного возобновления. Если бы вы использовали этот подход как для первого запуска, так и для возобновления, и регистрировали оба параллельных дд независимо, то вы могли бы знать, как далеко в выходной файл искать. Если у меня будет время, я постараюсь разобраться с этим.
— Эли Хеди

2
Спасибо за ссылку на патч. Я начинал думать о программировании чего-то подобного самому :-) Разреженные файлы не могут быть отправлены, поэтому ваш код не будет работать.
— Мартин Шаррер

Да, я только что обнаружил это сам. Ну что ж, было весело находить новые сумасшедшие применения cp- спасибо!
— Эли Хеди

1
dd commit в 2012: git.savannah.gnu.org/cgit/coreutils.git/commit/… "dd: добавить поддержку опции conv = sparse" ("(iwrite): преобразовать запись блока NUL в поиск если
— требуется

1

Просто добавляю мои 2 цента. Другой способ создать разреженный файл с необработанного диска - использовать qemu-img, используя что-то вроде:

qemu-img convert -f raw /dev/sda /tmp/sda.raw

Вы также можете использовать это на одном разделе. Кроме того, у вас есть возможность преобразовать необработанный диск / раздел в любой другой формат, поддерживаемый qemu-img (QCOW2, VHD [x], vmdk и т. Д.)


1

Другой вариант rsync . Например:

rsync -SP --copy-devices /dev/sda1 /mount/external/backup/sda1.raw

Объяснение:

  • -S/ --sparseпропустить разреженные блоки при записи
  • -P/ --partial --progressпоказать прогресс и сохранить частично переданные файлы
  • --copy-devices скопировать содержимое устройства

Вы можете добавить, --appendчтобы возобновить прерванную копию (или --append-verifyподтвердить контрольную сумму совпадений как новых, так и старых данных).

Редактировать : я только что понял, что copy-devices.diff находится на рассмотрении и может отсутствовать во многих системах (хотя он включен в Fedora , Ubuntu , Debian и другие)


0

Примечание: это не работает по причинам, описанным в комментариях, я оставляю это здесь для справки.

Следите за статистикой dd с помощью kill -USR1:

$ cp --sparse=always <(dd if=/dev/urandom bs=8M) \
    /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Возобновить с помощью skip / seek:

$ i_bytes= # get from the last dd statistic
$ o_bytes=`du -b /mount/external/backup/sda1.raw | cut -f 1`   
$ cp --sparse=always <(dd if=/dev/urandom bs=8M skip=$i_bytes \
    seek=$o_bytes) /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Без $ i_bytes было бы сложнее возобновить. Вероятно, проще всего записать статистику dd в файл в случае сбоя машины или чего-либо еще.


Второй cpпросто перезапишет существующий файл, не так ли? Я знаю свои skipи другие варианты dd. Вопрос это cpчасть.
— Мартин Шаррер

Хм, да, ты прав.
— Bhinesley


0

Почему бы просто:

cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.