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

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 .

maxschlepzig
источник
Требуется ли особая обработка образа при восстановлении, можете ли вы предоставить команду, используемую для восстановления 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 и другие)

Kevinoid
источник
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 в файл в случае сбоя машины или чего-либо еще.

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

Существуют xfsdump и xfsrestore для XFS, которые долгое время были родной файловой системой Linux.

Кристиан Чиупиту
источник
0

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

cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw
Zaz
источник