dd на весь диск, но не хочу пустую часть

dd на весь диск, но не хочу пустую часть

У меня есть диск, скажем /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:

  1. mkdir /srcfs && mount /dev/sdXN /srcfs

  2. Используйте zerofill, zerofreeили просто:
    dd if=/dev/zero of=/srcfs/tmpzero.txt
    для заполнения неиспользуемых блоков нулями; дождитесь полного заполнения файловой системы, затем:
    rm /srcfs/tmpzero.txt

  3. Возьмите изображение с помощью 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.

Связанный контент