我正在尝试在我的 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 参数会影响::
- img 的读/写速度
- 文件的空间分配及其文件大小
我将使用 chroot 环境来编译 arm64 的源代码并运行一些繁重的 gui 程序(在 openbox 或 xfce 中)。我希望 bs 的值对于读/写速度和空间利用率来说都是最佳的。
答案1
参数count=0
为非常此处很重要,该命令仅用于创建特定大小的文件,实际上并未复制任何内容。
因此有不 optimal value for bs
从硬件角度
创建的文件的大小为bs * seek
。 1 MB 的 bs 只是让您很容易看出您正在创建一个大小为 5120 MB 的文件。
在系统调用级别,这只是执行open
、lseek
和close
调用。 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=5120
5120 个大小的块obs
将被跳过。obs
是输出块大小,在我们的例子中它没有指定obs=bs=1M
。
如果您愿意,您甚至可以删除if=/dev/zero
并获得相同的结果。
dd of=jessie-arm64.img bs=1M count=0 seek=5120
现在的问题是 的最佳值bs
,我们在dd的源代码即使count=0
块被复制,我们也有seek=5120
(seek_records
在源代码中)并且使用bs
(obs
, 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
.