ルートが指定されたLinuxの場合、'dd'のbsに最適な値は何ですか?

ルートが指定された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. ファイルのスペース割り当てとファイルサイズ

私はarm64用のソースコードをコンパイルし、いくつかの重いGUIプログラム(openboxまたはxfceで)を実行するためにchroot環境を使用します。私はbsの値が読み書き速度と空間利用の両方に最適であることを望みます。

答え1

パラメータcount=0は次のとおりです。非常にここで重要なのは、このコマンドは特定のサイズのファイルを作成するためにのみ使用され、実際には何もコピーしないことです。

だからいいえ optimal value for bsハードウェアの観点から

生成されたファイルのサイズはbs * seek。 1MB bsを使用すると、5120MBのサイズのファイルを作成していることが簡単にわかります。

システムコールレベルでは、これは単に実行と呼び出しopenですlseek。 ddは計算をclose実行し、それをシステムコールに渡します。だから生産するbs * seeklseekbs 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はstdinの代わりにFILEから読み取られます。

  • of = FILEはstdoutの代わりにFILEに書き込みます。

  • bs = BYTESは一度に最大BYTESバイトを読み書きします。

  • count = NはN個の入力ブロックのみをコピーします。

  • eek = Nは、出力開始時にN個のobsサイズチャンクをスキップします。

count=0コピーする入力チャンクは0個ですが、スキップするseek=5120サイズのチャンクは5120個です。出力ブロックサイズです。私たちの場合は指定されていません。obsobsobs=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)次のコマンドを使用して、16進形式の画像を観察できます。

cat jessie-arm64.img | xxd

2)これはddコマンドに有効です。GNUコアツール。 BSDスタイルのddコマンド(macOSなど)をbs=1m使用している場合bs=1M

関連情報