Utilitário para TRIM espaço não alocado na unidade

9

Eu tenho uma unidade (cartão SD) com algumas partições ext4, mas também algum espaço não alocado. O utilitário fstrim só pode funcionar em um sistema de arquivos. Antes de reinventar a roda e escrever uma, existe outro utilitário que pode TRIM o espaço não alocado (ou que pode TRIM um intervalo especificado explicitamente)?

Eu posso verificar que a maioria do espaço não alocado no dispositivo é não atualmente conhecido como livre pelo controlador, já que observei que, neste cartão em particular, leio para o espaço aparado retorna 0, mas uma varredura do dispositivo mostra muitos dados de lixo que sobraram.

Editar: estou com um problema usando hdparm . O exemplo abaixo descarta o primeiro setor, mas estou vendo os mesmos resultados, independentemente do intervalo especificado. fstrim não tem problemas no dispositivo:

root@ubuntu:~# hdparm --please-destroy-my-drive --trim-sector-ranges 0:1 --verbose /dev/mmcblk0 

/dev/mmcblk0:
trimming 1 sectors from 1 ranges
outgoing cdb:  85 0d 06 00 01 00 01 00 00 00 00 00 00 40 06 00
outgoing_data:  
00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

ioctl(fd,SG_IO): Invalid argument
FAILED: Invalid argument

Estou investigando mais, mas alguém tem alguma ideia?

    
por Jason C 22.10.2013 / 20:55

2 respostas

13

Se você tem uma versão recente de util-linux , ela contém a ferramenta blkdiscard , que é capaz de TRIM dispositivos inteiros ou intervalos dentro de um dispositivo usando as opções --offset e --length .

Por favor note: blkdiscard é perigoso, se você deixar TRIM nas regiões erradas, seus dados sumiram!

Então você pode descobrir as regiões não particionadas (livres) da sua tabela de partições e depois TRIM elas usando esta ferramenta. Para msdos e gpt partitions, parted fornece as regiões livres da seguinte forma:

# parted -m /dev/sda unit b print free | grep ':free;'
1:17408B:1048575B:1031168B:free;
1:64022904832B:64023240191B:335360B:free;

Adicione um loop a ele ...

while IFS=: read -ra FREE
do
    echo blkdiscard --offset ${FREE[1]%%B} --length ${FREE[3]%%B} /dev/sda
done < <(parted -m /dev/sda unit b print free | grep ':free;')

que imprime

blkdiscard --offset 17408 --length 1031168 /dev/sda
blkdiscard --offset 64022904832 --length 335360 /dev/sda

Verifique se esta saída está correta para você, adicione opções adicionais se desejar (verbose?) e, finalmente, remova o echo para que ele seja realmente executado e você deve estar definido.

O segundo comando desse exemplo realmente falha porque o comprimento é muito pequeno - pode valer a pena verificar dentro do loop, ignorar regiões menores que 1MB, pois é improvável que sejam aparadas com sucesso.

Se você estiver usando o LVM em vez de partições, você pode criar um LV para o espaço não ocupado e apará-lo:

lvcreate -l100%FREE -n blkdiscard SSD-VG
blkdiscard -v /dev/SSD-VG/blkdiscard
lvremove SSD-VG/blkdiscard

Se você definir issue_discards = 1 no seu lvm.conf , poderá ignorar a chamada blkdiscard , pois o LVM emitirá o TRIM em lvremove por si mesmo.

    
por 31.10.2013 / 12:39
7

hdparm --trim-sector-ranges pode aparar um intervalo. A página man avisa para usá-lo, então é melhor você ter certeza de ter o alcance e a sintaxe corretos.

Acho que enviar um recorte para todos os dados fora de uma partição seria perigoso, pois há alguns dados ocultos, às vezes, como o código do carregador de inicialização ou as segundas tabelas de partição. Você precisa saber exatamente quais áreas fora das partições estão realmente sem uso.

    
por 22.10.2013 / 21:26