Quando o dd é adequado para copiar dados? (ou, quando são lidos () e gravados () parciais) aponta uma advertência importante ao usar count
: dd
pode copiar blocos parciais; portanto, quando fornecido, count
ele será interrompido após o número especificado de blocos, mesmo que alguns deles estejam incompletos. Portanto, você pode acabar com menos de bs * count
bytes 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 dd
usar 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-rescue
fazem automaticamente: eles leem blocos grandes inicialmente, mas se um bloco falhar, eles o relerão com tamanhos menores. dd
não fará isso, apenas falhará em todo o bloco.
dd bs=4m iflag=fullblock
vsdd bs=1111
e 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 defullblock
nã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.Há um pouco de um culto de carga por aí
dd
. Originalmente, havia dois erroscp
que 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 blocodd
é 512. O único efeito de deixá-lo em paz provavelmente terá nas circunstâncias mais modernas é tornar o processo de cópia mais lento.fonte
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
dd
de escrevê-la.bs=
define ambosibs=
(quantos dados são lidos por vez) eobs=
(quantos dados são gravados por vez). Quanto maior,obs=
mais iteraçõesibs=
serão necessárias antes que você tenha dados suficientes paradd
começ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 poribs=
) serão necessários paradd
considerar seu trabalho como concluído.fonte
dd
copiar blocos parciais - nem sempre ébs * count
.dd
sembs=2048
ou algum múltiplo resultaria em erro ao ler a partir de uma unidade de cdrom do dispositivo de bloco.O uso da opção blocksize
dd
especifica 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 dasdd
implementaçõ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=
eof=
está definido e de qual hardware está passando, se você tiver pouca memória e assim por diante.fonte
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,
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 change
comandos, o que geralmente resulta em operações de E / S mais rápidas.fonte