Como TRIM / DISCARD uma partição SSD inteira no Linux?

28

Minha partição /dev/sda3em uma unidade SSD não contém nenhum sistema de arquivos, mas contém lixo. Como faço uma operação TRIM / DISCARD em toda a partição?

pts
fonte
7
Acho que o ponto é que ele não deseja gravar nenhum dado, ele quer que o SSD apague o bloco flash, mas deixe em branco para que esteja disponível para gravação, conhecido como atualizar uma unidade SSD.
22411 Chris
1
Wiki do ATA Secure Erase ata.wiki.kernel.org/index.php/ATA_Secure_Erase
joe
@joe: Seu link ATA Secure Erase nem menciona paritições. Não quero apagar a unidade inteira, apenas uma partição. E não quero me arriscar a apagar acidentalmente toda a unidade.
pts
11
@ Doc: Preencher a partição com dados de lixo é exatamente o oposto da intenção dos pts: informará ao SSD que a partição está completamente preenchida e em uso. Isso diminuirá o desempenho e a vida útil do SSD.
Preto

Respostas:

40

Se sua versão do util-linux é nova o suficiente (setembro de 2012), na verdade existe uma ferramenta criada especificamente para esse fim blkdiscard, que é a melhor maneira de fazer isso:

sudo blkdiscard /dev/sda3

Mas se você precisar de compatibilidade com versões mais antigas do distro Linux, continue a ler ... Há casos em que hdparm/ wiper.shlixo para tocar um volume porque não é uma partição, por isso precisamos de algo além disso.

A maneira mais suportada que encontrei é aproveitar o fato de que os volumes de troca do Linux suportam o DISCARD quando estão ativados. Os wipefs no final estão lá para que o volume não seja reconhecido como swap posteriormente.

D=/dev/sda3 ; mkswap $D && swapon -d $D && swapoff $D && wipefs -o 0xff6 $D

Isso emite o DESCARTE na maioria do dispositivo.

robbat2
fonte
1
Obrigado, não sabia blkdiscard. Comando perigoso ... :)
frostschutz 28/09
Por quê? Eu apenas procurei no manual:WARNING: All data in the discarded region on the device will be lost!
MrCalvin
9

Eu sei que essa pergunta é bem antiga, mas ...

A maneira mais simples de fazer isso é simplesmente criar um sistema de arquivos ext4 na partição com uma versão razoavelmente recente do mkfs.ext4. A primeira coisa que esta ferramenta faz é TRIM a partição inteira. Depois de fazer isso, você pode sobrescrever os dados criados com o sistema de arquivos que desejar.

(Acabei de fazer isso para criar uma nova partição vfat em um cartão SD, por exemplo.)

David Given
fonte
Obrigado pela dica! FYI Após o TRIMming, grava alguns blocos com metadados para um sistema de arquivos ext4 vazio, para que alguns por cento da partição permaneçam semTRIM.
pts
4
@pts Você pode minimizar o tamanho dos metadados, reduzindo o tamanho do diário eo número de inodes:mkfs.ext4 -J size=4 -N1 /dev/my/device
Aryeh Leib Taurog
2
A utilização de @AryehLeibTaurog -E lazy_journal_initparece resultar em menos gravações do que -J size=4ocorre. (Com base em experimentos usando um arquivo esparso em vez de um SSD física e dupara verificar o quanto tinha sido escrito.)
kasperd
@kasperd Um experimento inteligente com resultados interessantes! Obrigado.
Aryeh Leib Taurog
8

O hdparm --trim-sector-range é de baixo nível, deve conversar diretamente com o SSD, portanto, não há dependência no sistema de arquivos. O que o wiper.sh faz é usar programas específicos do sistema de arquivos para mapear regiões livres (sistema de arquivos) para setores SSD (hardware), eles usam o hdparm para apará-las.

Respondendo à pergunta, você pode usar o hdparm para aparar essa partição, mas deve ter muito cuidado . A maneira de fazer isso é obter o intervalo do setor usado pela partição e usar o hdparm nesse intervalo do setor. Provavelmente, você precisará passar por vários intervalos de setor, pois cada intervalo para --trim-setor-intervalos pode ter no máximo 65535 setores.

O fdisk -l pode informar o início e o tamanho das partições. Preste atenção nas unidades em uso pelo fdisk e no tamanho do setor do seu SSD.

Exemplo (meu SSD):

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    39070079    19534016   83  Linux

Para descartar o espaço antes desta partição, eu poderia cortar 2047 (512 bytes de tamanho, em meus SSD) setores a partir de setor 1: hdparm --trim-sector-ranges 1:2047. Não consigo cortar a partir do setor 0, porque esse é o MBR (não sei como é o GPT).

Para descartar o espaço usado pela partição, eu faria hdparm --trim-sector-ranges 2048:65535 67583:65535 133118:65535 .... Pode ser com script, mas não vou escrever um agora.

Também só para ter certeza: não estou garantindo nada aqui, posso ter setores calculados incorretamente, fazer um backup de tudo antes de usar efetivamente --trim-setor-range.

Nota : se você cortar o espaço "vazio" antes da primeira partição, como mostrei, certifique-se de reinstalar o GRUB (ou qualquer outro carregador de inicialização que você use) antes de reiniciar, pois o GRUB armazena parte dele em setores "não utilizados" antes da primeira partição . Não conheço outros gerenciadores de inicialização, mas acho que pode ser o caso, então tome cuidado.

spuk
fonte
7
wiper.shé obsoleto pelo fstrimque é muito mais seguro, mas para esse uso específico é melhor que blkdiscardambos. Em 2013, não há necessidade de arriscar intervalos de computação manualmente.
Gabriel
6

Você pode dar uma olhada no script wiper.shincluído no pacote hdparm. Ele usa o comando hdparm --trim-sector-rangespara TRIM todos os setores vazios em uma partição, pelo menos se ele contiver um sistema de arquivos ext3 / 4. Não tenho certeza se funciona com partições não formatadas, mas você sempre pode formatá-lo temporariamente com ext4.

Jaap Eldering
fonte
A formatação com ext4 e, em seguida, a execução wiper.shreduziria quase toda a partição, exceto os metadados ext4. Mas eu gostaria de cortar toda a partição.
pts
2
@pts: sugiro que você analise o código do wiper.sh e tente descobrir como ele deduz os intervalos de ajuste. Em seguida, você pode enviar manualmente um intervalo de ajuste para o hdparm para TRIM a partição inteira.
Jaap Ancianidade
4

blkdiscardpode trabalhar em partições, não apenas em unidades inteiras. Eu testei com sucesso no Fedora 20. Verifiquei as fontes blkdiscard- é um programa muito simples que não sabe nada sobre partições. Presumo que o kernel faça a tradução.

Tenha muito cuidado, blkdiscardnão faça perguntas e não mostra informações de progresso.

Se blkdiscard não estiver disponível, use este script e alimente sua saída ao hdparm. O primeiro argumento é o número de setores a serem aparados, o segundo é o primeiro setor a ser aparado.

#! /bin/sh
# List ranges for hdparm --trim-sector-ranges-stdin
: ${MAXSECT=65535}
test $# = 2 || { echo "Usage: trimlist sectors offset" >&2; exit 1; }
sectors=$1
pos=$2
while test $sectors -gt 0; do
    if test $sectors -gt $MAXSECT; then
            size=$MAXSECT
    else
            size=$sectors
    fi
    echo $pos:$size
    sectors=$(($sectors-$size))
    pos=$(($pos+$size))
done
proski
fonte
-1

Aqui está um artigo interessante que fala sobre o uso do HDDErase para chamar o recurso de exclusão segura do SSD, que deve fazer com que você queira:

http://www.windowsitpro.com/article/file-systems/q-how-can-i-reset-a-solid-state-disk-ssd-to-a-fully-erased-clean-state-

Chris Thompson
fonte
Obrigado pela sua resposta, mas não funciona, pois 1) apaga toda a unidade 2) requer o Microsoft Windows, e eu estava procurando por uma solução Linux.
pts
2
Observe também que isso é basicamente o mesmo que blkdiscard --secureocorre.
Ntninja 18/05/19