Дд на весь диск, но не хочу пустой порции
У меня есть диск, скажем /dev/sda.
Вот fdisk -l:
Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5
Device Boot Start End Blocks Id System
/dev/sda1 * 1 27 209920 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 27 525 4000768 5 Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5 27 353 2621440 83 Linux
/dev/sda6 353 405 416768 83 Linux
/dev/sda7 405 490 675840 83 Linux
/dev/sda8 490 525 282624 83 Linux
Мне нужно создать образ для хранения на нашем файловом сервере, чтобы использовать его для перепрограммирования других устройств, которые мы производим, поэтому мне нужно только используемое пространство (всего около 4 ГБ). Я хочу сохранить mbr и т. Д., Поскольку это устройство должно быть готово к загрузке, как только копия будет завершена.
Есть идеи? Я ранее использовал dd if=/dev/sda of=[//fileserver/file]
, но в то время моя основная копия была на 4 ГБ флэш-памяти.
8 ответов
В тот день я столкнулся с похожей проблемой со встроенными дистрибутивами Linux - избавился от всего мусора перед сжатием изображения.
dd if=/dev/zero of=asdf.txt
, Подождите, пока он не умрет. Удалить asdf.txt.
Вы только что записали нули во все свободное место на устройстве.
Теперь возьмите образ диска и запустите его через gzip. Вуаля, редкий образ.
Вероятно, не очень хорошо масштабируется и может вызвать проблемы, если вам действительно нужно записать на диск, но эй.
Вы можете сделать снимок диска rsync на другом томе, обнулить его и затем получить этот образ диска.
Примечание: это может быть опасно для SSD, пользователь должен рассмотреть эту операцию перед фиксацией.
Предполагая, что вы хотите сохранить /dev/sdXN
в /tgtfs/image.raw
а ты root
mkdir /srcfs && mount /dev/sdXN /srcfs
Используйте zerofill или просто:
dd if=/dev/zero of=/srcfs/tmpzero.txt
заполнить неиспользуемые блоки нулями (затем дождитесь полного заполнения файловой системыrm /srcfs/tmpzero.txt
)Сделайте снимок с помощью dd и используйте conv=sparse, чтобы пробивать нули на лету:
dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw
Если вы хотите использовать сжатие, вам не нужно пробивать нули с помощью dd, поскольку нулевые блоки очень сжимаемы:
dd if=/dev/sdxn | gz -c | dd of=/tgtfs/image.raw
PS: Вы должны заметить, что это не очень хорошая идея для носителей на основе флеш-памяти (т.е. ваша исходная файловая система будет SSD)
Используйте dd с опцией count.
В вашем случае вы использовали fdisk, поэтому я воспользуюсь этим подходом. Ваш "sudo fdisk -l " произвел:
Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5
Device Boot Start End Blocks Id System
/dev/sda1 * 1 27 209920 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 27 525 4000768 5 Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5 27 353 2621440 83 Linux
/dev/sda6 353 405 416768 83 Linux
/dev/sda7 405 490 675840 83 Linux
/dev/sda8 490 525 282624 83 Linux
Следует обратить внимание на две вещи: 1) размер блока и 2) столбец "Конец". В вашем случае у вас есть цилиндры, которые равны 8225280 байт. В столбце "Конец" sda8 заканчивается на 525 (что составляет 525[единиц]*16065*512 = ~4,3 ГБ)
dd может делать много вещей, таких как запуск после смещения или остановка после определенного количества блоков. Мы сделаем последнее, используя опцию count в dd. Команда будет выглядеть следующим образом:
sudo dd if=/dev/sda of=/your_directory/image_name.iso bs=8225280 count=526
Где -bs - это размер блока (проще всего использовать единицу, которую использует fdisk, но любая единица будет делать это, пока в этих единицах объявлена опция count), а count - это количество единиц, которые мы хотим скопировать (примечание что мы увеличиваем счет на 1, чтобы захватить последний блок).
В то время как /dev/zero
Занятие свободного дискового пространства и использование dd conv=sparse
/gz -c
возможно, на огромных дисках с пустым пространством в сотнях гигабайт, /dev/zero
Он мучительно медленный - не говоря уже о том, что, как отмечали другие ответы, /dev/zero
SDD до EOF.
Вот что я сделал, когда столкнулся с этой ситуацией:
На Lubuntu Live CD, используется
gparted
"сжать" диск до минимально возможного размера, оставив оставшееся пространство незанятымИспользуемый
dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz
для создания быстро сжатого образа (само собой разумеется, вы можете пропустить сжатие, если у вас достаточно места для хранения необработанных данных (или иным образом склонны уменьшать нагрузку на процессор)- Используемый
dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY
скопировать данные обратно на другой диск - Используемый
gparted
снова "расширить" раздел
Я не пробовал его для нескольких разделов, но я полагаю, что описанный выше процесс можно адаптировать для копирования "разделов", если сначала создается таблица разделов на целевом диске и только данные, содержащиеся в разделе, копируются через dd
- смещение чтения / записи (skip
/seek
вариант dd
соответственно) будет необходимо по мере необходимости.
Ты не можешь dd
это инструмент очень низкого уровня, и он не имеет возможности различать файлы и пустое пространство.
С другой стороны, пустое пространство будет очень и очень хорошо сжиматься, поэтому, если вас интересует только место для хранения, а не, например, время записи, просто передайте его через gzip.
Предполагая, что остальная часть диска пуста (все нули), вы можете передать свой DD через gzip, который должен довольно хорошо сжать пустое пространство. Вы можете использовать такой инструмент, как zerofree, чтобы убедиться, что ваше пустое пространство фактически пустое, поэтому оно хорошо сжимается.
Если вы используете такие инструменты, как partimage, clonezilla или некоторые другие инструменты клонирования linux, большинство из них будет обрабатывать для вас автоматически.
Принятый ответ не верен. Я согласен с комментарием выше. Я использую dd с параметром count для резервного копирования моего диска на регулярной основе. Просто замените BACKUP_FOLDER и букву вашего устройства на "X":
Определите последний использованный блок диска:
ct=$(fdisk -l | awk '$1 == "/dev/sdX" { print $3 }')
Затем клонируем диск (исключая его пустое пространство):
dd if=/dev/sdX bs=512 count=$ct | gzip > BACKUP_FOLDER/sdX_$(date +"%Y-%m-%d").img.gz >>"$LOG"
Нет ничего плохого в