루트가 지정된 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=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) 다음 명령을 사용하여 16진수 형식의 이미지를 관찰할 수 있습니다.

cat jessie-arm64.img | xxd

2) 이는 dd 명령에 유효합니다.GNU 핵심 도구. BSD 스타일 dd명령(예: macOS)을 bs=1m사용 하는 경우 bs=1M.

관련 정보