Я пытаюсь скопировать раздел из всего образа диска.
Эта команда работает: 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
То, чего Вы хотите достигнуть, кажется невозможным мне.
От 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
размер являются делящимися без остатка.
Это возможно путем объединения 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; }
Мы можем просто использовать размер количества в качестве делящегося без остатка вместо обоих, сместить и размер.
Или использование секторы конца.
можно ли установить отдельный модуль?
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
Да, можно указать разные единицы измерения для 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 .