verifique independentemente se o TRIM realmente funciona no SSD

13

Eu tenho uma LUKSpartição /dev/sda1que eu luksOpen com --allow-discards:

cryptsetup --allow-discards luksOpen /dev/sda1 root

Em seguida, montei o ext4sistema de arquivos com a discardopção:

grep /dev/mapper/root /proc/mounts
/dev/mapper/root / ext4 ro,relatime,block_validity,discard,delalloc,barrier,user_xattr,acl 0 0

Depois aparei o espaço livre na partição montada:

fstrim -v /

com df, vejo que /tem 80% de espaço livre. Isso significa que /dev/sda180% do disco são zeros binários.

Se eu clonar a imagem com cat

cat /dev/sda1 > sda1.img

e comprima a imagem xz, eu esperaria que todos os zeros no disco fossem compactados. Como os 20% dos dados no disco são criptografados, eles devem parecer aleatórios e não compactáveis. Portanto, a imagem compactada em xz deve ser aprox. 20% do tamanho bruto.

No entanto, a imagem compactada xz resultante é aproximadamente do mesmo tamanho que o original bruto.

Meu raciocínio está correto?

Por que minha teoria não se traduz em prática?

Martin Vegter
fonte
2
unix.stackexchange.com/a/85880/30851 e tambémdmsetup table | grep allow_discards
frostschutz

Respostas:

8

Sua lógica não está incorreta. Mas isso só é válido se algumas condições forem atendidas.

O comando TRIM , conforme especificado no conjunto de comandos ATA , pode ou não zerar os setores nos quais é emitido.
Na verdade, o padrão se concentra em quais dados devem ser retornados após a emissão do TRIM 1 :

Os seguintes comportamentos são especificados por este padrão para setores que o dispositivo apara (consulte 7.5.3.3):

a) não determinístico - os dados em resposta a uma leitura de um setor aparado podem mudar para cada leitura até que o setor seja gravado pelo host;
b) Leitura determinística após recorte (DRAT) - os dados retornados em resposta a uma leitura de um setor recortado não mudam, mas podem ser diferentes dos dados retornados anteriormente; e
c) Ler zeros após aparar (RZAT) - os dados retornados em resposta a uma leitura do setor aparado são zero.

[...] Para dispositivos de armazenamento DRAT e não determinísticos, os dados retornados em resposta a um comando de leitura para um LBA que foi aparado com êxito:

a) podem ser os dados retornados anteriormente para o LBA especificado;
b) pode ser um padrão gerado pelo dispositivo de armazenamento; e
c) não é dados previamente gravados em um LBA diferente pelo hospedeiro.

Assim, o que o seu dispositivo retorna depois fstrimdepende dos recursos implementados. A menos que ele suporte RZAT, a suposição de que os dados lidos de um dispositivo aparado serão apenas zeros não é válida.

Você pode usar hdparmpara verificar isso:

sudo hdparm -I /dev/sdX | grep -i trim

Eu realizei alguns testes usando dois SSDs sdae sdb. Mesmo fabricante, modelos diferentes, com conformidade ATA diferente:

$ sudo hdparm -i /dev/sdb
 ...
 Drive conforms to: Unspecified:  ATA/ATAPI-3,4,5,6,7
 ...

$ sudo hdparm -i /dev/sda
 ...
 Drive conforms to: unknown:  ATA/ATAPI-2,3,4,5,6,7
 ...

Os dois SSDs têm suporte diferente para TRIM:

$ sudo hdparm -I /dev/sda | grep -i trim
           *    Data Set Management TRIM supported (limit 1 block)

$ sudo hdparm -I /dev/sdb | grep -i trim
           *    Data Set Management TRIM supported (limit 8 blocks)
           *    Deterministic read ZEROs after TRIM

Posso confirmar que, após a emissão fstrim, a unidade que suporta "ZEROs de leitura determinística após TRIM" (RZAT) parece realmente zerar a partição em questão quase inteiramente. Por outro lado, a outra unidade parece ter zerado (ou substituído por algum padrão altamente compressível) apenas uma parte menor do espaço liberado.

1 Fonte online: INCITS 529: Tecnologia da informação - Conjunto de comandos ATA / ATAPI - 4 (ACS-4)


Nota sobre o teste:

Conforme indicado por frostschutz nos comentários, uma leitura posterior fstrimpode retornar dados do cache do sistema operacional e não do dispositivo aparado. É, por exemplo, o que aconteceu nesta pergunta .
(Eu também apontaria essa resposta para a mesma pergunta, para um método alternativo para testar o TRIM).

Entre fstrime uma leitura subsequente, pode ser necessário descartar o cache, por exemplo, com:

echo 3 | sudo tee /proc/sys/vm/drop_caches

Dependendo do tamanho da partição com a qual você está reproduzindo, não soltar o cache pode ser suficiente para que seus testes falhem.


Nota sobre sua configuração:

A discardopção de montagem ativa o TRIM contínuo, ou seja, quando os arquivos são excluídos. Não é exigido por fstrim. De fato, o TRIM sob demanda e o TRIM contínuo são duas maneiras distintas de gerenciar as operações do TRIM. Para mais informações, aponto para a unidade de estado sólido no Arch Linux Wiki, que possui uma cobertura detalhada desse assunto.

fra-san
fonte
O Linux também pode estar retornando dados diferentes de zero do cache após o TRIM, mesmo que o SSD os releia como zeros. Este foi um problema com meu teste sim-aparar lá unix.stackexchange.com/a/85880/30851, mas também pode estar relacionado à leitura dos dados brutos antes e depois do TRIM. Portanto, se você não obtiver zero quando espera, descarte os caches por precaução.
Frostschutz 6/02/19
@frostschutz Good point! De alguma forma, eu estava assumindo que, como o OP mencionava um volume "raiz", teria sido grande demais para uma parte significativa dele caber na memória. Mas definitivamente o cache estava no meu caminho durante os testes - que falharam miseravelmente até que eu comecei a descartá-lo. Vou atualizar minha resposta.
fra-san
2

O SSD possui uma camada de criptografia de hardware integrada? Se houver um, os blocos TRIMmed podem ser todos os zeros (ou possivelmente todos) no nível de hardware bruto, mas, como o computador os vê através da camada de criptografia, eles aparecerão como uma tagarelice pseudo-aleatória depois de passar o -zeroes bloco bruto através do processo de descriptografia.

Essa camada de criptografia de hardware teria algumas vantagens:

  • Isso permitiria uma funcionalidade de apagamento de segurança muito rápida: basta que a unidade destrua a chave original usada na camada de criptografia de hardware e substitua-a por uma nova e todos os dados ficarão instantaneamente irrecuperáveis ​​para fins mais práticos.
  • Como todos os dados que atingem o nível de hardware bruto seriam criptografados, seria garantido que parecesse pseudo-aleatório e, portanto, seria amplamente homogêneo. Isso pode ajudar a evitar pontos quentes / frios e simplificar muito a estimativa de desgaste.
telcoM
fonte
0

df relatar espaço livre não implica espaço zero.

triminforma ao dispositivo de armazenamento que os blocos não são usados. Eu não acho que isso os zere.

ctrl-alt-delor
fonte