
У меня есть диск, скажем /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-гигабайтной флэш-карте.
решение1
Когда-то я столкнулся с похожей проблемой со встраиваемыми дистрибутивами Linux — избавлялся от всего лишнего перед сжатием образа.
dd if=/dev/zero of=asdf.txt
. Подождите, пока он умрет. Удалите asdf.txt.
Вы только что записали нули во все свободное пространство на устройстве.
Теперь берем образ диска и пропускаем его через gzip. Вуаля, разреженный образ.
Возможно, он не очень хорошо масштабируется и может вызвать проблемы, если вам действительно понадобится записать данные на диск, но эй.
Вы можете сделать снимок диска rsync на другом томе, обнулить его, а затем создать образ диска.
Примечание: может быть опасно для SSD, пользователю следует рассмотреть эту операцию перед ее выполнением.
решение2
Предположим, что вы хотите сохранить /dev/sdXN
и /tgtfs/image.raw
являетесь пользователем root:
mkdir /srcfs && mount /dev/sdXN /srcfs
Используйте
zerofill
,zerofree
или просто:
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) на регулярной основе, поскольку это приведет к интенсивной записи на ваш SSD и сократит срок его службы (но это допустимо для периодической передачи данных).
решение3
Используйте dd с опцией подсчета.
В вашем случае вы использовали 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 — количество единиц, которые мы хотим скопировать (обратите внимание, что мы увеличиваем count на 1, чтобы захватить последний блок).
решение4
Этого нельзя сделать. dd
Это инструмент очень низкого уровня, и он не позволяет различать файлы и пустое пространство.
С другой стороны, пустое пространство будет сжиматься очень и очень хорошо, поэтому, если вас волнует только место для хранения, а не, например, время записи, то просто пропустите его через gzip.