оптимальное значение для bs в 'dd' для chrooted linux?

Я пытаюсь установить chrooted debian (arm64) на мой Android-телефон (snapdragon650 и 3GB RAM). Я нашел много учебников для этого. Почти все гиды упомянули этот cmd для создания img для chrooted debian.

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

Здесь bs = 1M. Я не знаю много о дд. Но я думаю, что параметр bs повлияет на ::

  1. скорость чтения / записи на img
  2. Распределение пространства для файлов и их размер файла

Я собираюсь использовать chrooted среду для компиляции исходного кода для arm64 и запускать немного тяжелые программы gui (в openbox или xfce). Я хочу это значение для bs, которое было бы оптимальным для скорости чтения / записи и использования пространства.

Здесь очень важен параметр count=0 , эта команда используется только для создания файла определенного размера, при этом ничего не копируется.

Поэтому нет optimal value for bs с точки зрения аппаратного обеспечения

Созданный файл будет иметь размер bs * seek . Бс 1 мегабайт просто позволяет легко увидеть, что вы создаете файл размером 5120 мегабайт.

На уровне системного вызова это будет просто open , lseek и close вызов. dd выполнит bs * seek и передаст его системному вызову lseek . Таким образом, bs if=/dev/zero seek=5368709120 bs=1 of=jesse-arm64.img будет производить точно такие же системные вызовы.

Во-первых, некоторые сведения о команде

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

На странице man dd :

  • if = FILE читать из ФАЙЛА вместо stdin

  • of = FILE писать в FILE вместо stdout

  • bs = BYTES чтение и запись в байты BYTES за раз

  • count = N копирует только N блоков ввода

  • seek = N пропускает N незанятых блоков при начале вывода

У нас есть 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 , output_blocksize int в исходном коде ).

  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 coreutils . Если вы используете команду dd стиле BSD, например, в macOS, вам нужно использовать bs=1m вместо bs=1M .