Por que especificar o tamanho do bloco ao copiar dispositivos de tamanho finito?

14

Nos tutoriais online, geralmente é sugerido o uso do seguinte comando para copiar um CDROM para uma imagem iso:

$ dd if=/dev/dvd of=foobar.iso bs=2048

Por que o tamanho do byte deve ser especificado? Percebo que, na verdade, 2048 é o tamanho padrão de bytes para imagens de CDROM, mas parece que ddsem especificar bs=ou count=funciona também.

Em que circunstâncias seria problemático não especificar bs=ou count=ao copiar de um dispositivo de tamanho finito?

dotancohen
fonte

Respostas:

12

Quando o dd é adequado para copiar dados? (ou, quando são lidos () e gravados () parciais) aponta uma advertência importante ao usar count: ddpode copiar blocos parciais; portanto, quando fornecido, countele será interrompido após o número especificado de blocos, mesmo que alguns deles estejam incompletos. Portanto, você pode acabar com menos de bs * countbytes copiados, a menos que você especifique iflag=fullblock.

O tamanho do bloco padrão para dd é 512 bytes. counté um limite; conforme sua pergunta sugere, não é necessário ao copiar um dispositivo de tamanho finito e realmente pretende copiar apenas parte de um dispositivo.

Eu acho que há dois aspectos a serem considerados aqui: desempenho e recuperação de dados.

No que diz respeito ao desempenho, o ideal é que o tamanho do bloco seja pelo menos igual e múltiplo ao tamanho do bloco físico subjacente (daí 2048 bytes ao ler um CD-ROM). De fato, hoje em dia, você também pode especificar tamanhos de bloco maiores para dar aos sistemas de cache subjacentes a chance de armazenar coisas em buffer para você. Porém, aumentar o tamanho do bloco significa ddusar muito mais memória e pode ser contraproducente se você estiver copiando em uma rede devido à fragmentação de pacotes.

No que diz respeito à recuperação de dados, você pode recuperar mais dados de um disco rígido com falha se usar tamanhos de bloco menores; é isso que programas como dd-rescuefazem automaticamente: eles leem blocos grandes inicialmente, mas se um bloco falhar, eles o relerão com tamanhos menores. ddnão fará isso, apenas falhará em todo o bloco.

Stephen Kitt
fonte
2
Desempenho especialmente; escreva uma imagem de partição em um cartão SD, por exemplo, usando dd bs=4m iflag=fullblockvs dd bs=1111e observe as taxas de dados substancialmente mais altas que o primeiro fornecerá. Isso ocorre porque o primeiro se alinha com o tamanho natural do bloco no cartão SD, enquanto o último requer que o controlador SD faça muita leitura, cópia e atualização para gravar blocos físicos parciais. A importância de fullblocknão deve ser subestimada, a propósito, como sem ela, bsé apenas uma leitura máxima e parcial e pode levar a desalinhamentos subsequentes persistentes.
Jason C
6

Há um pouco de um culto de carga por aí dd. Originalmente, havia dois erros cpque causavam problemas: ele detectava incorretamente os arquivos como esparsos quando relatados com um tamanho de bloco diferente de 512 (o Linux usava um tamanho de bloco de 1024) e não limpava blocos vazios do destino ao copiar de um arquivo esparso para um dispositivo de bloco.

Você pode encontrar algumas referências a isso nos primeiros arquivos da lista de discussão do Linux .

Então, as pessoas se acostumaram a dd ser a maneira correta de lidar com imagens de disco, e o cp caiu no esquecimento. E como o dd usa um tamanho de bloco padrão de 512, é lento (mais lento que o cp em sistemas modernos). Mas não é óbvio qual tamanho de bloco você deve usar. Provavelmente, no seu caso, alguém leu que 2048 é o tamanho de bloco "natural" de um CD-ROM (ou seja, os CD-ROMs são divididos em setores de 2.352 bytes contendo 2.048 bytes de dados juntamente com informações de correção de erros) e decidiu que isso é o tamanho "certo" para usar com o dd, quando na verdade você provavelmente obteria resultados mais rápidos se usasse um tamanho de bloco (moderadamente) maior. De fato, o GNU cp usa um tamanho de bloco padrão de 64k por esse motivo.

tl; dr: cp /dev/dvd foobar.iso deve funcionar bem. O tamanho padrão do bloco ddé 512. O único efeito de deixá-lo em paz provavelmente terá nas circunstâncias mais modernas é tornar o processo de cópia mais lento.

Random832
fonte
pode ter mudado, de qualquer maneira o GNU cp usa o tamanho de bloco de 128k por padrão (não 64k), consulte eklitzke.org/efficient-file-copying-on-linux
apurkrt
5

Alterar o tamanho do bloco é uma boa maneira de alterar quanto é armazenado em buffer ou é lido / gravado por vez.

Realmente não se relaciona se é um dispositivo de bloco real ou um infinito / virtual. É sobre o quanto você deseja armazenar na memória antes ddde escrevê-la. bs=define ambos ibs=(quantos dados são lidos por vez) e obs=(quantos dados são gravados por vez). Quanto maior, obs=mais iterações ibs=serão necessárias antes que você tenha dados suficientes para ddcomeçar a gravar no destino.

count=também não depende de nada além do que você deseja fazer. Ele controla quantos "blocos" (medidos por ibs=) serão necessários para ddconsiderar seu trabalho como concluído.

Bratchley
fonte
Nota O ponto de Stephens de ddcopiar blocos parciais - nem sempre é bs * count.
Drav Sloan
Observe que em alguns sistemas unix você deve ler um múltiplo do tamanho do bloco nativo; ddsem bs=2048ou algum múltiplo resultaria em erro ao ler a partir de uma unidade de cdrom do dispositivo de bloco.
wurtel
2

O uso da opção blocksize ddespecifica efetivamente quantos dados serão copiados para a memória do subsistema de E / S de entrada antes de tentar gravar novamente no subsistema de E / S de saída. A saída é a mesma (como todo o disco está sendo copiado), os pedaços estão sendo lidos no tamanho diferente que você especificar (a maioria das ddimplementações é feita com um tamanho de bloco padrão de 512 bytes).

Se você tiver grandes quantidades de memória sobressalente e aumentar o tamanho do bloco, mais trechos de dados maiores poderão ser lidos em sucessão, armazenados em buffer e liberados no destino de saída. Um tamanho de bloco menor requer mais sobrecarga em termos de cada lseek, memset etc.

Sua milhagem pode variar dependendo de onde você está if=e of=está definido e de qual hardware está passando, se você tiver pouca memória e assim por diante.

Drav Sloan
fonte
1

O bs = representa o tamanho do bloco para ler ou escrever. Deixar o campo intacto ou não especificá-lo pode parecer fazer o mesmo trabalho de cópia, mas há um fato oculto ao usá-lo. Por exemplo,

  • Ter 1000000000000000 arquivos com apenas 1 ~ 10 kb.
  • Ter um arquivo único para 10 GB

No primeiro caso, o uso de um tamanho de bloco menor foi encontrado para aumentar a velocidade de cópia. Enquanto isso, o tamanho maior do bloco tem sido uma opção melhor, pois aumenta o tamanho do setor, deixando menos número de sector changecomandos, o que geralmente resulta em operações de E / S mais rápidas.

Snazzy Sanoj
fonte