Клонировать только используемое пространство с жесткого диска
Могу ли я использовать dd, rsync, clonezilla или любой другой инструмент для клонирования только используемого пространства на моем жестком диске в Linux? Мне нужно сделать резервную копию с 1 ТБ HD (с использованием только 2 ГБ места) в 500 ГБ HD.
5 ответов
Вы можете, но вы должны подготовить свой диск в первую очередь. Хитрость заключается в том, чтобы использовать разреженный файл или сжатие. Этот метод занимает много времени, он генерирует высокий I/O. В вашем случае (2 ГБ используется на жестком диске емкостью 1 ТБ) копия файла (как это предлагается в комментарии к опилкам), вероятно, будет лучшим решением. Если, с другой стороны, у вас есть, например, 850 ГБ из 1 ТБ, много маленьких файлов в нем, вы хотите создать резервную копию MBR, таблицы разделов, метаданных, всего этого сразу - тогда мой метод был бы разумным способом сохранить не менее 150 ГБ в файле образа (который по-прежнему не может поместиться в 500 ГБ жесткого диска, если данные недостаточно хорошо сжаты).
Я пишу это для пользователей с более высоким использованием диска. Также обратите внимание, что исходный диск должен быть исправен и позволять перезаписывать пустое пространство. Я даю решение в основном для резервного копирования, а не для восстановления или экспертизы. Время и стоимость ввода / вывода будут оплачены не только при создании образа, но и когда (если) образ будет записан обратно на диск. Подумайте дважды, подходит ли вам этот метод.
Допустим, вам нужно клонировать /dev/sdb
и есть несколько разделов: /dev/sdb1
, /dev/sdb2
...
подготовка
Чтобы использовать преимущества разреженных файлов или сжатия, вы должны перезаписать пустое пространство нулями:
## Most commands need sudo.
mount -o rw /dev/sdb1 /mnt
dd if=/dev/zero of=/mnt/zero_file bs=32M
## Long wait here. Expect "no space left on device".
sync
rm /mnt/zero_file
umount /dev/sdb1
## Repeat this with /dev/sdb2, /dev/sdb3 etc.
В случае раздела Windows могут возникнуть некоторые проблемы из-за гибернации Windows. Прочитайте это.
Если в макете раздела есть большие пробелы, вам также следует заполнить их нулями. Сменные разделы (если они есть) нуждаются в специальной обработке, чтобы сделать полученное изображение как можно меньшим. Файлы Windows, такие как hiberfil.sys
, pagefile.sys
а также swapfile.sys
могут быть удалены до zero_file
создание. Я не буду подробно освещать эти случаи здесь.
Метод разреженных файлов
Этот метод может использоваться, если целевая файловая система (где будет сохранен файл изображения) поддерживает разреженные файлы. Чтобы создать файл разреженного изображения, вызовите:
## dd probably needs sudo here.
dd if=/dev/sdb of=/foo/bar/my_image.dd bs=512 conv=sparse
(РЕДАКТИРОВАТЬ: первоначально был bs=32M
но это не лучший выбор с conv=sparse
, Сравните этот вопрос.)
Чтобы написать изображение обратно:
## dd probably needs sudo here.
dd if=/foo/bar/my_image.dd of=/dev/sdb bs=32M
Преимущества:
- Изображение может быть смонтировано (
mount -o offset=…
или использоватьkpartx
) для доступа к файлам внутри.
Недостатки:
- Целевая файловая система должна поддерживать разреженные файлы.
- Вы должны помнить, чтобы сохранить его разреженным при копировании (
cp --sparse=always
).
Метод сжатых файлов
Чтобы сгенерировать изображение:
## dd probably needs sudo here.
dd if=/dev/sdb bs=32M | gzip -c > /foo/bar/my_image.dd.gz
Чтобы написать изображение обратно:
## dd probably needs sudo here.
gzip -cd < /foo/bar/my_image.dd.gz | dd of=/dev/sdb bs=32M
Эти команды могут быть построены без dd
, с gzip
только. я использовал dd
обеспечить 32 МБ буфера.
Преимущества:
- Полученный файл не разреженный, не требует специальной обработки.
- Размер изображения будет уменьшен еще больше, если файлы на исходном диске подвержены сжатию.
Недостатки:
- Трудно получить доступ к файлам в сжатом образе без полной распаковки (некоторые FUSE могут быть полезны, хотя я не уверен, никогда не пробовал; рассмотрим подход squashfs).
Советы
Для мониторинга хода выполнения dd
с status=progress
операнд. Если dd
уже работает без него (например, ваш dd
не поддерживает status=progress
или вы забыли его использовать), отправьте USR1
сигнал к инструменту:
kill -s USR1 $(pidof dd)
и повторите при необходимости.
В качестве альтернативы вы можете использовать pv
читать. Примеры:
pv -B 32m /dev/sdb | dd of=/foo/bar/my_image.dd bs=512 conv=sparse
pv -B 32m /dev/sdb | gzip -c > /foo/bar/my_image.dd.gz
Сжать быстро использовать gzip --fast
, чтобы сжать лучшее использование gzip --best
, Ссылаться на man gzip
для большего количества вариантов.
использование pigz
вместо gzip
если ты можешь. Это должно ускорить процесс, потому что pigz
может использовать более одного ядра процессора. Вы можете использовать другой компрессор, если хотите.
Если целевой диск уже отформатирован, второй диск подключен к той же машине, что и первый, подключен, и если вы работаете в Linux или Mac:
rsync -avP --ignore=/media/disk2 / /media/disk2
Если целевой диск уже отформатирован, второй диск отформатирован и смонтирован на другом ПК, а если вы используете Linux или Mac:
rsync -avP / user@ip_of_disk2_host:/media/disk2
Это предполагает, что вы просто хотите сделать резервную копию файлов без учета основного диска. Это делает резервное копирование на файл и довольно быстро запускается только на 2 ГБ данных.
Используйте правильный инструмент для работы, в данном случае Clonezilla. Да, английский дилетантский, но, по крайней мере, он пытается изменить размеры разделов при клонировании дисков, чтобы расширить меньшие диски на большие. Clonezilla поставляется в виде живого ISO-образа, который объединяет и использует Partclone для клонирования разделов.
Проблема с dd в том, что он будет слепо копировать все с одного диска на другой, включая таблицу разделов. Это означает, что если вы скопируете диск емкостью 1 ТБ на диск емкостью 2 ТБ, будет использоваться только 1 ТБ большего диска. Clonezilla специально пытается расширить раздел «пропорционально» на диске большего размера.
Однако при копировании зашифрованных разделов возникает проблема: поскольку LUKS-шифрование происходит на уровне диска, Clonezilla не может знать, какое пространство свободно, а какое нет, поэтому ему приходится копировать клонированный раздел. (Конечно, тоже нельзяdd
.)
Я думаю, что уже есть довольно хороший ответ с использованием gzip или разреженных вещей, но он довольно надуманный. Обсуждение плюсов и минусов в ответе действительно того стоит!
Я могу добавить этот ответ о работе с резервными копиями SD-карты на Raspberry Pi, которая имеет ту же проблему, связанную с возможными огромными затратами дискового пространства при использовании обычногоdd
. Предлагается использоватьimage-backup
, что полностью соответствует задаче, необходимой ОП.
- Сделай gparted live USB
- Загрузитесь в gparted и измените размер раздела на исходном диске до 2+ ГБ
- Скопируйте диск
- Изменить размер только что скопированного раздела до его полного размера