A maneira mais rápida de contar zero bytes em uma partição

1

Minhas partições raiz e domésticas são criptografadas pelo LUKS. Desejo ter o descarte / TRIM ativado neles (estou ciente das implicações de segurança). Se meu entendimento estiver correto, isso deve resultar em áreas descartadas sendo zeros em um dispositivo de disco bruto e ininteligível no dispositivo mapeado por cryptsetup.

Fiz algumas alterações de configuração, executei fstrim e agora quero verificar se o descarte está funcionando. Para fazer isso, quero contar quantos bytes na minha partição são zeros. Em um disco aparado eu esperaria que:

count of 0 bytes ÷ total partition size ≈ percentage of free space

Em uma partição criptografada não aparada: (supondo que todos os bytes tenham sido escritos pelo menos uma vez)

count of 0 bytes ≈ total partition size ÷ 256

Inspirado por Como reunir estatísticas de ocorrências de bytes no arquivo binário? , tentei essa abordagem:

sudo pv /dev/disk/by-label/ESP | od -vtu1 -An -w1 | grep -Fx '   0' | wc -l

mas os resultados foram decepcionantes: o processamento de uma partição de 500 MB levou quase 3 minutos. São 3 MB / s, enquanto meu SSD pode alcançar leituras sequenciais de 360 MB / s. Também notei que um dos meus núcleos de CPU estava funcionando a 100%, enquanto outros estavam inativos, então acho que isso poderia se beneficiar da paralelização. (O impacto de pv é insignificante, quase nenhuma diferença em relação a cat )

Qual é a maneira mais rápida de contar 0 bytes em uma partição?

    
por gronostaj 25.07.2018 / 10:21

1 resposta

1

Se você conseguir acessar o disco bruto (sem criptografia), poderá fazer:

dd if=/dev/sda bs=1M count=100 2>/dev/null | tr -d '
$ time { { { sudo dd if=/dev/sdX bs=100M 2> >(grep -oP '[0-9]+(?=\s*bytes)' 1>&2 ) | tr -d '
766568020/999292928
' | wc -c; } 2>&1; } | { read -d '' a b; echo "$b/$a"; }; }
' | wc -c

Isso vai ler 100Mega byte do disco, remover todos os zeros e contar o número de bytes restantes.

Eu não sei se esse é o método mais rápido, mas deve ser bastante rápido, supondo que haja mais zeros que os dados.

O comando acima lerá 100 vezes 1Mega byte ou 100*2^20 (104857600) bytes (se estiverem disponíveis). Tente com um número pequeno (10 ou 100) para testar a velocidade e como o comando funciona. Para ler todo o disco apenas remova a opção count, deixe o lado do disco limitar o comando.

Extraindo os dois valores que importam (contagem total de bytes em disco e número de bytes diferentes de zero), o comando se torna mais complexo:

$ bc <<<'(1-766568020/999292928)*100'
23.28895776994831289400

Que imprimirá os dois valores como: non-zero/disk , como:

dd if=/dev/sda bs=1M count=100 2>/dev/null | tr -d '
$ time { { { sudo dd if=/dev/sdX bs=100M 2> >(grep -oP '[0-9]+(?=\s*bytes)' 1>&2 ) | tr -d '
766568020/999292928
' | wc -c; } 2>&1; } | { read -d '' a b; echo "$b/$a"; }; }
' | wc -c

Calcule 1-766568020/999292928 para encontrar a porcentagem de zero bytes:

$ bc <<<'(1-766568020/999292928)*100'
23.28895776994831289400
    
por 25.07.2018 / 18:43