我正在尝试从整个磁盘映像复制一个分区。
该命令有效: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
答案1
指定不同的单位
是的,可以为bs
和skip
和指定不同的单位。但是,和 的单位count
只有两种选择。和必须与值匹配或以字节为单位指定。要将单位设置为字节,您必须为 和 或 两者添加额外的操作数。skip
count
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 (核心实用程序) 8.26。
更新: skip_bytes
并count_bytes
得到 coreutils 的支持v8.16(2012 年 3 月),因此几乎所有发行版都默认支持它
答案2
通过组合命令来实现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; }
我们可以直接使用计数大小作为无余数的整除,而不是同时使用偏移量和大小。
或者使用末端扇区。
答案3
你想要实现的目标在我看来似乎是不可能的。
从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
始终只能复制或跳过整个数据块(块大小由bs
/ ibs
&决定obs
),因此必须将块大小设置为一个值,使得skip
偏移量和count
大小可以被其整除而无余数。
答案4
是否可以设置单独的单位?
据我所知,dd
只有,没有。
但你可以使用失败来实现你的目标,就像这样:
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 $(losetup -b 512 -o $((1161215*512)) --sizelimit $((32768*512)) -f --show image.iso) > test