дд: разные единицы для бс, пропустить и посчитать?

Я пытаюсь скопировать раздел из всего образа диска.

Эта команда работает: dd if=image.iso of=test bs=512 skip=1161215 count=32768

Чтобы увеличить скорость, я бы хотел установить большую bs.

dd if=image.iso of=test bs=1M skip=1161215 count=32768

skip и единицей count является bs, возможно ли установить отдельную единицу?

Тогда я мог бы сделать эту команду:

dd if=image.iso of=test bs=4M skip=1161215*512 bytes count=32768*512 bytes

0
задан 15 July 2016 в 21:04

4 ответа

То, чего Вы хотите достигнуть, кажется невозможным мне.

От man dd:

   bs=BYTES
          read and write up to BYTES bytes at a time

   ibs=BYTES
          read up to BYTES bytes at a time (default: 512)

   obs=BYTES
          write BYTES bytes at a time (default: 512)


   count=N
          copy only N input blocks

   skip=N skip N ibs-sized blocks at start of input

, В то время как bs (или ibs и obs) имеет аргумент BYTES, который определяет размер блока т.е. сумма байтов, которая обрабатывается сразу, count и seek, параметры имеют аргумент N, который определяет количество блоков для обрабатывания/пропущения.

Поэтому как dd может всегда только копировать или пропускать целые блоки данных (размер блока, определенный [1 110] / ibs & obs), необходимо установить размер блока на значение, которым эти skip смещение и count размер являются делящимися без остатка.

0
ответ дан 15 July 2016 в 21:04
  • 1
    Лично я использовал бы clonezilla для того @kreuzerkrieg Выше метода, не отменяет нормальные процедуры резервного копирования. На работе, хотя нам не разрешают хранить частные файлы на связанных с работой компьютерах, и при этом не позволяется хранить уязвимую информацию на чем-либо еще, чем Карта памяти (который включает пароль, IP-адреса, ключи SSH, экспорт клиентских данных и т.д.). Наши системы работы вытираются каждую пятницу и сбрасываются к значению по умолчанию, которое мы имеем. Голландский закон довольно строг на этом: если в любой момент Вы не можете объяснить, что произошло с данными, которым необходимо сообщить - все-клиентские данные, возможно, поставились под угрозу. – Rinzwind 14 February 2018 в 22:12

Это возможно путем объединения dd команды.

dd if=image.iso bs=4M | { dd bs=1161215 count=1 of=/dev/null; dd bs=${16*512} count=${32768/16} of=partition.dump; }

Мы можем просто использовать размер количества в качестве делящегося без остатка вместо обоих, сместить и размер.

Или использование секторы конца.

0
ответ дан 15 July 2016 в 21:04
  • 1
    имеет смысл..., если Вы придерживаетесь LTS только... в любом случае, что, если, Вашей машины не стало и Вы хотите как можно быстрее принести новой машине к рабочему состоянию? что, если Вы хотите создать дополнительную машину, например, один для офиса и второго для дома, оба используемые для той же цели? – kreuzerkrieg 14 February 2018 в 22:09

можно ли установить отдельный модуль?

AFAIK, с Только dd , нет.

но вы можете использовать losetup для достижения своей цели, например:

dd if=$(losetup --sector-size 512 --offset $((1161215*512)) --sizelimit $((32768*512)) --find --show image.iso) of=test bs=4M

или, более кратко, вот так:

dd if=$(losetup -b 512 -o $((1161215*512)) --sizelimit $((32768*512)) -f --show image.iso) of=test bs=4M

Еще больше ...

Чтобы увеличить скорость , Я бы хотел установить больший bs

, если вы просто хотите ' забыть о ' «оптимизации размера блока», и он доступен для вас, просто используйте pv , например:

pv $(losetup -b 512 -o $((1161215*512)) --sizelimit $((32768*512)) -f --show image.iso) > test
1
ответ дан 20 May 2019 в 10:17

Укажите разные единицы измерения

Да, можно указать разные единицы измерения для bs и пропустить и счетчик . Однако есть только два варианта для единиц пропуска и счетчика . skip и count должны соответствовать значению bs или указываться в байтах. Чтобы установить единицы измерения в байтах, вы должны добавить дополнительный операнд iflag = skip_bytes для skip и iflag = count_bytes для count или iflag = skip_bytes, count_bytes для обоих.

В вашем случае эта команда должна достичь вашей цели:

dd if=image.iso of=test iflag=skip_bytes,count_bytes bs=4M \
  skip=$((1161215*512)) count=$((32768*512))

Похоже, вы хотите извлечь ровно 16M. Установите bs = 4M count = 4 и используйте только skip_bytes :

dd if=input.file of=output.file iflag=skip_bytes bs=4M \
  skip=$((1161215*512)) count=4

Пример для тестирования:

Входной файл с содержимым:

aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz

С count_bytes (извлечь точно count байт):

$ dd if=input.file of=output.file iflag=skip_bytes,count_bytes bs=8 skip=5 count=20

дает 20 символов:

cddeeffgghhiijjkkllm

Без count_bytes ( count умножается на bs ]):

dd if=input.file of=output.file iflag=skip_bytes bs=8 skip=5 count=3

дает 24 символа:

cddeeffgghhiijjkkllmmnno

Ваша версия dd может не включать iflag , skip_bytes или count_bytes . Эти примеры были протестированы на Debian 9 с использованием dd (coreutils) 8.26 .

3
ответ дан 4 October 2019 в 18:44

Другие вопросы по тегам:

Похожие вопросы: