Como preencher um dispositivo com zeros, sem sobrescrever os bytes que já são zeros?

1

Eu tenho um usb flash drive usb 3, a velocidade de leitura é muito mais do que a velocidade de gravação. Digamos que 99% da memória flash já esteja cheia com zeros, e eu gostaria de preenchê-la com zeros até 100%, sobrescrevendo todo o flash da memória com zeros dd if=/dev/zero of=/dev/FLASH .

Esse processo será longo e minimizará a expectativa de vida do flash drive.

Eu pensei, talvez seria muito mais rápido verificar quais áreas são diferentes de zero, e sobrescrever apenas as áreas não zertas com zeros?

Existe alguma maneira de fazer isso? Se é interessante, eu precisaria de tudo isso por razões de segurança.

    
por Slok 16.09.2018 / 17:30

1 resposta

1

Razões de segurança à parte, vamos fazê-lo. Nós podemos (ab) usar o GNU ddrescue .

Para detectar setores de zeros --generate-mode é útil.

When ddrescue is invoked with the --generate-mode option it operates in "generate mode", which is different from the default "rescue mode". That is, if you use the --generate-mode option, ddrescue does not rescue anything. It only tries to generate a mapfile for later use.

[…]

ddrescue can in some cases generate an approximate mapfile, from infile and the (partial) copy in outfile, that is almost as good as an exact mapfile. It makes this by simply assuming that sectors containing all zeros were not rescued.

[…]

ddrescue --generate-mode infile outfile mapfile

( fonte )

Vamos fingir que seu dispositivo é outfile da execução anterior de ddrescue . Não podemos usá-lo como infile (porque ddrescue se recusa a trabalhar quando infile e outfile são o mesmo arquivo), precisamos de um fictício, /dev/zero serve. Devemos saber o tamanho do setor físico do seu dispositivo e usá-lo com a opção -b . Este comando pode ajudar:

lsblk -o NAME,PHY-SeC /dev/FLASH

Aqui, assumo que é 512 .

ddrescue -b 512 --generate-mode /dev/zero /dev/FLASH flash.map

Agora, flash.map descreve todos os setores como não experimentados ( ? ) ou como concluídos ( + ), dependendo de estar cheio de zeros ou não. O próximo passo é preencher setores diferentes de zero com zeros; --fill-mode é perfeito para este trabalho:

When ddrescue is invoked with the --fill-mode option it operates in "fill mode", which is different from the default "rescue mode". That is, if you use the --fill-mode option, ddrescue does not rescue anything. It only fills with data read from infile the blocks of outfile whose status character from mapfile coincides with one of the type characters specified as argument to the --fill-mode option.

( fonte )

Devemos usar o mesmo valor de -b que com --generate-mode , adicionalmente --force para substituir o dispositivo de saída. Este é o comando:

ddrescue -b 512 --force --fill-mode=+ /dev/zero /dev/FLASH flash.map

Desta vez /dev/zero não é apenas um argumento fictício, é a fonte real de dados (zeros) gravados no dispositivo.

Após ddrescue finises, invoque sync . Agora /dev/FLASH está preenchido com zeros.

    
por 30.10.2018 / 00:29

Tags