对于 chrooted linux,'dd' 中 bs 的最佳值是什么?

对于 chrooted linux,'dd' 中 bs 的最佳值是什么?

我正在尝试在我的 Android 手机(snapdragon650 和 3GB RAM)上安装 chrooted debian (arm64)。我找到了很多关于它的教程。几乎所有指南都提到了这个用于为 chrooted debian 创建 img 的命令。

 dd if=/dev/zero of=jessie-arm64.img bs=1M count=0 seek=5120

这里 bs=1M 。我对dd了解不多。但我认为 bs 参数会影响::

  1. img 的读/写速度
  2. 文件的空间分配及其文件大小

我将使用 chroot 环境来编译 arm64 的源代码并运行一些繁重的 gui 程序(在 openbox 或 xfce 中)。我希望 bs 的值对于读/写速度和空间利用率来说都是最佳的。

答案1

参数count=0非常此处很重要,该命令仅用于创建特定大小的文件,实际上并未复制任何内容。

因此有 optimal value for bs从硬件角度

创建的文件的大小为bs * seek。 1 MB 的 bs 只是让您很容易看出您正在创建一个大小为 5120 MB 的文件。

在系统调用级别,这只是执行openlseekclose调用。 dd 将进行bs * seek计算并将其交给lseek系统调用。所以bs if=/dev/zero seek=5368709120 bs=1 of=jesse-arm64.img会产生确切地相同的系统调用。

答案2

首先,关于命令的一些细节

dd if=/dev/zero of=jessie-arm64.img bs=1M count=0 seek=5120

来自dd 的手册页

  • if=FILE 从 FILE 而不是 stdin 读取

  • of=FILE 写入 FILE 而不是 stdout

  • bs=BYTES 一次最多读写 BYTES 字节

  • count=N 仅复制 N 个输入块

  • eek=N 在输出开始时跳过 N 个 obs 大小的块

我们有count=0,因此将复制 0 个输入块,但我们有seek=51205120 个大小的块obs将被跳过。obs是输出块大小,在我们的例子中它没有指定obs=bs=1M

如果您愿意,您甚至可以删除if=/dev/zero并获得相同的结果。

dd of=jessie-arm64.img bs=1M count=0 seek=5120

现在的问题是 的最佳值bs,我们在dd的源代码即使count=0块被复制,我们也有seek=5120seek_records在源代码中)并且使用bsobs, int源代码)值。output_blocksize

  if (seek_records != 0 || seek_bytes != 0)
    {
      size_t bytes = seek_bytes;
      uintmax_t write_records = skip (STDOUT_FILENO, output_file,
                                      seek_records, output_blocksize, &bytes);
      if (write_records != 0 || bytes != 0)
        {
          memset (obuf, 0, write_records ? output_blocksize : bytes);
          do
            {
              size_t size = write_records ? output_blocksize : bytes;
              if (iwrite (STDOUT_FILENO, obuf, size) != size)
                {
                  error (0, errno, _("writing to %s"), quoteaf (output_file));
                  quit (EXIT_FAILURE);
                }
              if (write_records != 0)
                write_records--;
              else
                bytes = 0;
            }
          while (write_records || bytes);
        }
}

的最佳值bs取决于您的硬件,这里是文章解释如何测量它。我不会在这里进行详细解释,因为这个答案太长了。

评论:

1)您可以使用以下命令以十六进制格式观察图像:

cat jessie-arm64.img | xxd

2) 这对 dd 命令有效GNU 核心工具。如果您使用 BSD 风格的dd命令(例如在 macOS 中),则必须bs=1m使用bs=1M.

相关内容