Назад | Перейти на главную страницу

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 ГБ.

В свое время я столкнулся с аналогичной проблемой со встроенными дистрибутивами Linux - избавьтесь от всего мусора перед сжатием образа.

dd if=/dev/zero of=asdf.txt. Подождите, пока он не умрет. Удалите asdf.txt.

Вы только что написали нулями все свободное место на устройстве.

Теперь возьмите образ диска и прогоните его через gzip. Вуаля, скудный образ.

Вероятно, не очень хорошо масштабируется и может вызвать проблемы, если вам действительно нужно записать на диск, но эй.

Вы можете сделать снимок диска с помощью rsync на другой том, обнулить его, а затем взять этот образ диска.

Примечание: это может быть опасно для SSD, пользователь должен учитывать эту операцию перед фиксацией.

Предполагая, что вы хотите сэкономить /dev/sdXN к /tgtfs/image.rawи вы root:

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

  2. Использовать zerofill или просто:
    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 и сократить срок его службы. (но это нормально для случайной передачи данных)

Используйте 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 возможно, на огромных дисках с пустым пространством в 100 ГБ, /dev/zeroпроцесс очень медленный - не говоря уже о том, что, как отмечали другие ответы, /dev/zeroвставка SDD до EOF.

Вот что я сделал, когда столкнулся с такой ситуацией:

  • На live CD lubuntu используется 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, который должен довольно хорошо сжать пустое пространство. Вы можете использовать такой инструмент, как нулевой чтобы убедиться, что ваше пустое пространство действительно пустое, чтобы оно хорошо сжималось.

Если вы используете такой инструмент, как partimage, клонезилла или некоторые другие инструменты клонирования Linux, они сделают большую часть этого за вас автоматически.

Принятый ответ неверен. Я согласен с комментарием выше. я использую дд с участием считать параметр для регулярного резервного копирования моего диска. Просто замените 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"