valor ótimo para bs em 'dd' para linux chrooted?

1

Estou tentando instalar o debian cromado (arm64) no meu telefone Android (snapdragon650 & 3GB RAM). Eu encontrei muitos tutoriais para isso. Quase todos os guias mencionaram este cmd para criar img para o debian chrooted.

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

Aqui bs = 1M. Eu não sei muito sobre dd. Mas acho que o parâmetro bs vai afetar ::

  1. velocidade de leitura / gravação na img
  2. Alocação de espaço para arquivos & o tamanho do arquivo

Vou usar o ambiente chrooted para compilar o código-fonte para arm64 e executar programas GUI pouco pesados (em openbox ou xfce). Eu quero esse valor para bs que seria ótimo para velocidade de leitura / gravação e utilização de espaço.

    
por jonny789 14.01.2017 / 09:00

2 respostas

3

O parâmetro count=0 é muito significante aqui, este comando está sendo usado apenas para criar um arquivo de um tamanho específico, nada está realmente sendo copiado.

Portanto, não há não optimal value for bs do ponto de vista do hardware

O arquivo criado terá tamanho bs * seek . Os bs de 1 megabyte apenas facilitam a visualização de que você está criando um arquivo com tamanho de 5120 megabytes.

Em um nível de chamada do sistema, isso fará apenas uma chamada open , lseek e close . dd fará o cálculo de bs * seek e o fornecerá à chamada de sistema lseek . Portanto, bs if=/dev/zero seek=5368709120 bs=1 of=jesse-arm64.img produzirá exatamente as mesmas chamadas de sistema.

    
por 14.01.2017 / 20:38
2

Primeiro, alguns detalhes sobre o comando

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

Na página man do dd :

  • if=FILE read from FILE instead of stdin

  • of=FILE write to FILE instead of stdout

  • bs=BYTES read and write up to BYTES bytes at a time

  • count=N copy only N input blocks

  • seek=N skip N obs-sized blocks at start of output

Temos count=0 , então 0 bloco de entrada será copiado, mas temos seek=5120 , então 5120 blocos de tamanho obs serão ignorados. obs é o tamanho do bloco de saída, no nosso caso não é especificado obs=bs=1M .

Se você quiser, pode até remover o if=/dev/zero e obter o mesmo resultado.

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

Agora, a questão do valor ideal para bs , observamos no código-fonte de dd que mesmo se count=0 blocos forem copiados, teremos seek=5120 ( seek_records no código-fonte) e o valor bs ( obs , output_blocksize int o código-fonte) será usado.

  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);
        }
}

O valor ideal de bs depende do seu hardware, aqui está um artigo explicando como medir isso. Eu não irei em explicações detalhadas aqui, porque esta resposta está se tornando muito longa.

Observações:

1) Você pode observar sua imagem em formato hexadecimal com:

cat jessie-arm64.img | xxd

2) Isto é válido para o comando dd do GNU coreutils . Se você estiver usando um comando dd no estilo BSD, como no macOS, será necessário usar bs=1m em vez de bs=1M .

    
por 14.01.2017 / 11:22