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

11

Eu tenho uma unidade (cartão SD) com algumas partições ext4, mas também algum espaço não alocado. O fstrimutilitário pode funcionar apenas 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)?

Posso verificar que a maioria do espaço não alocado no dispositivo não é atualmente conhecido como livre pelo controlador, como observei que, nesta placa em particular, lê os 0s de retorno de espaço aparado, mas uma varredura do dispositivo mostra muitos dados de lixo que sobraram.

Edit: Estou tendo um problema ao usar hdparm. O exemplo abaixo descarta o primeiro setor, mas estou vendo os mesmos resultados, independentemente do intervalo especificado. fstrimnã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?

Jason C
fonte
1
Se você mapear o espaço não particionado com uma ou mais partições (temporariamente), poderá usá blkdiscard-las para aparar todo o dispositivo.
Frostschutz 22/10
Obrigado! Parece a ferramenta certa, mas blkdiscardnão parece estar disponível nos meus repositórios de pacotes padrão (Ubuntu 12.04, não parece estar presente util-linux).
Jason C
Eu nunca consegui hdparmtrabalhar para mim por algum motivo, mas peguei a fonte util-linux em github.com/karelzak/util-linux/tree/stable/v2.23 , a construí ( ./autogen.sh ; ./configure ; make blkdiscard) e está funcionando muito bem. Ainda confuso, hdparmmas blkdiscardfaz exatamente o que eu quero. Bônus: não há necessidade de criar um sistema de arquivos temporário primeiro, você pode usar sfdisk -lpara descobrir o espaço entre as partições e blkdiscardcortá-lo.
Jason C
Ah, eu nem sabia que blkdiscardera capaz de trabalhar com opções de deslocamento / comprimento. Portanto, as partições temporárias que sugeri nem são necessárias. Agradável!
Frostschutz 31/10

Respostas:

16

Se você possui uma versão recente o suficiente util-linux, ela contém a ferramenta blkdiscardcapaz de TRIM dispositivos inteiros ou intervalos dentro de um dispositivo usando --offsete --lengthopções.

Observe: blkdiscard é perigoso, se você deixar TRIM nas regiões erradas, seus dados desaparecerão!

Assim, você pode descobrir as regiões não particionadas (livres) da sua tabela de partição e depois TRIM-las usando esta ferramenta. Para msdose gptpartições, partedfornece 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 (detalhado?) E, finalmente, remova a opção echopara que ela seja realmente executada e você deve estar definido.

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


Se você estiver usando LVM em vez de partições, poderá criar um LV para o espaço desocupado e aparar:

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

Se você definir o issue_discards = 1seu lvm.conf, poderá pular a blkdiscardchamada, pois o LVM emitirá o TRIM lvremovepor si só.

frostschutz
fonte
1
Obrigado! Eu observei isso como a resposta, porque está funcionando para mim, mesmo que a resposta de Michael também seja válida. Além disso, adicionarei o que disse nos comentários da pergunta: Se você não tiver blkdiscarddisponível; você pode pegar a fonte util-linux em github.com/karelzak/util-linux/tree/stable/v2.23 e depois compilar blkdiscard(executar ./autogen.sh ; ./configure ; make blkdiscard) - ela foi criada de forma limpa (embora você possa ter que instalar algumas dependências e ajustar as configureopções) e como contanto que você não o instale, ele não entra em conflito com o util-linux existente.
Jason C
1
Eu estava observando falhas com certos valores passados blkdiscardtambém, mas notei que os valores eram baseados no deslocamento, não no comprimento. É possível que exista um problema blkdiscard, estou em processo de investigação. Veja unix.stackexchange.com/questions/98473/…
Jason C
Eu criei um script que faz o espaço livre de descarte em todos os sistemas de arquivos montados, bem como VGs LVM gratuitos: github.com/stefanct/discard-everything
stefanct
7

hdparm --trim-sector-rangespode cortar um intervalo. A página de manual adverte para usá-lo, portanto, é melhor você ter certeza de que possui o intervalo e a sintaxe certos.

Eu acho que enviar um recorte para todos os dados fora de uma partição seria perigoso, pois existem alguns dados ocultos por vezes, como código do carregador de inicialização ou segunda tabela de partição. Você precisaria saber exatamente, quais áreas fora das partições são realmente não utilizadas.

Michael Suelmann
fonte
Perfeito, obrigado! Posso pegar o tamanho do dispositivo com hdparmintervalos não utilizados sfdiske apará-los de acordo. Eu sei o que há na unidade. Se houver um esquema de particionamento que oculte dados em áreas acessíveis, mas não alocadas, isso quebraria a funcionalidade básica de qualquer editor de partição. Presumo (espero) que esquemas como esse tenham sido abandonados há muito tempo (embora eu não conheça nenhum deles). Todos os esquemas que conheço armazenam o MBR em um espaço não alocado conhecido no início do dispositivo e VBRs / EBRs dentro de partições alocadas. Pode haver esquemas obscuros antigos que são diferentes. :)
Jason C
Estou com alguma dificuldade hdparm, editei minha pergunta com detalhes; querendo saber se você tem alguma idéia.
Jason C
1
Parece que pelo menos parte do hdparm não funciona em / dev / mmcblk0. Desculpe, não tenho mais ideia.
Michael Suelmann 22/10