dd:bs、skip 和 count 的单位不同吗?

dd:bs、skip 和 count 的单位不同吗?

我正在尝试从整个磁盘映像复制一个分区。

该命令有效: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

skipcount的单位是bs,是否可以设置一个单独的单位?

然后我可以发出这个命令:

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

答案1

指定不同的单位

是的,可以为bsskip和指定不同的单位。但是,和 的单位count只有两种选择。和必须与值匹配或以字节为单位指定。要将单位设置为字节,您必须为 和 或 两者添加额外的操作数。skipcountskipcountbsiflag=skip_bytesskipiflag=count_bytescountiflag=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_bytescount乘以bs):

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

产生 24 个字符:

cddeeffgghhiijjkkllmmnno

您的版本dd可能不包含iflagskip_bytescount_bytes。这些示例已在Debian 9使用dd (核心实用程序) 8.26

更新: skip_bytescount_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(或ibsobs)有一个参数BYTES,它决定了块大小即一次处理的字节数,countseek参数有一个参数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

相关内容