Come TRIM / DISCARD un'intera partizione SSD su Linux?


28

La mia partizione /dev/sda3su un'unità SSD non contiene alcun filesystem, ma contiene spazzatura. Come si esegue un'operazione TRIM / DISCARD sull'intera partizione?


7
Penso che il punto sia che non vuole scrivere alcun dato, vuole che l'SSD CANCELLA il blocco flash ma lo lasci vuoto in modo che sia disponibile per la scrittura, noto come aggiornamento di un'unità SSD.
Chris Thompson,


@joe: il tuo link ATA Secure Erase non menziona nemmeno le paritizioni. Non voglio cancellare l'intero disco, solo una partizione. E non voglio rischiare di cancellare accidentalmente l'intero disco.
punti

11
@Doc: riempire la partizione di dati inutili è esattamente l'opposto dell'intenzione di pts: dirà all'SSD che la partizione è completamente riempita e in uso. Ciò ridurrà le prestazioni e la durata dell'SSD.
Black

Risposte:


40

Se la tua versione di util-linux è abbastanza nuova (settembre 2012), in realtà esiste uno strumento appositamente costruito blkdiscard, questo è il modo migliore per farlo:

sudo blkdiscard /dev/sda3

Ma se hai bisogno di compatibilità con le versioni precedenti della distro Linux, continua a leggere ... Ci sono casi in cui hdparm/ wiper.shrifiutano di toccare un volume perché non è una partizione, quindi abbiamo bisogno di qualcosa oltre.

Il modo più supportato che ho trovato è sfruttare il fatto che i volumi di scambio Linux supportano DISCARD quando sono abilitati. Il wipefs alla fine è lì, quindi il volume non viene riconosciuto come swap in seguito.

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

Questo emette DISCARD sulla maggior parte del dispositivo.


1
Grazie, non lo sapevo blkdiscard. Comando pericoloso ... :)
frostschutz,

Perché? L'ho appena WARNING: All data in the discarded region on the device will be lost!
consultato

9

So che questa domanda è piuttosto vecchia, ma ...

Il modo più semplice per farlo è semplicemente creare un filesystem ext4 sulla partizione con una versione ragionevolmente recente di mkfs.ext4. La prima cosa che fa questo strumento è TRIM l'intera partizione. Una volta fatto, puoi sovrascrivere i dati che vengono creati con qualsiasi file system desideri.

(Ho appena fatto questo per creare una nuova partizione vfat su una scheda SD, per esempio.)


Grazie per il suggerimento! FYI Dopo TRIMming, scrive alcuni blocchi con metadati per un filesystem ext4 vuoto, quindi un po 'della percentuale della partizione rimane senza limiti.
punti

4
@pts È possibile ridurre al minimo le dimensioni dei metadati riducendo le dimensioni del journal e il numero di inode:mkfs.ext4 -J size=4 -N1 /dev/my/device
Aryeh Leib Taurog

2
@AryehLeibTaurog L'utilizzo -E lazy_journal_initsembra comportare un numero di scritture leggermente inferiore rispetto a quello -J size=4utilizzato. (Basato su esperimenti usando un file sparse anziché un SSD fisico e duper verificare quanto era stato scritto.)
kasperd,

@kasperd Un esperimento intelligente con risultati interessanti! Grazie.
Aryeh Leib Taurog,

8

hdparm --trim-sector-range è di basso livello, si suppone che parli direttamente con l'SSD, quindi nessuna dipendenza dal filesystem. Quello che fa wiper.sh è usare programmi specifici per filesystem per mappare regioni libere (filesystem) su settori (hardware) SSD, usando hdparm per tagliare quelle.

Rispondendo alla domanda, puoi usare hdparm per tagliare quella partizione, ma dovresti esserlo molto attento . Il modo per farlo è ottenere l'intervallo di settori utilizzato dalla partizione, quindi utilizzare hdparm su quell'intervallo di settori. Probabilmente dovrai superare più intervalli di settore, poiché ogni intervallo per --trim-settori-range può avere un massimo di 65535 settori.

fdisk -l può dirti l'inizio e la dimensione delle partizioni. Presta attenzione alle unità utilizzate da fdisk e alle dimensioni del settore del tuo SSD.

Esempio (il mio SSD):

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

Per eliminare lo spazio prima di questa partizione, potrei tagliare i settori 2047 (512 byte, sul mio SSD) a partire dal settore 1: hdparm --trim-sector-ranges 1:2047 . Non posso tagliare a partire dal settore 0 perché quello è il MBR (non so come va per GPT).

Per scartare lo spazio utilizzato dalla partizione, lo farei hdparm --trim-sector-ranges 2048:65535 67583:65535 133118:65535 .... Può essere scritto ma non ne scriverò uno adesso.

Anche solo per essere sicuri: non sto garantendo nulla qui, potrei avere settori calcolati male, fare un backup di tutto prima di utilizzare in modo efficace --trim-sector-range.

Nota : se tagli lo spazio "vuoto" prima della prima partizione, come ho mostrato, assicurati di reinstallare GRUB (o qualunque boot loader usi) prima di riavviare, poiché GRUB ne memorizza una parte in settori "non utilizzati" prima della prima partizione . Non conosco altri bootloader ma immagino che potrebbe essere il caso, quindi state attenti.


7
wiper.shè obsoleto, il fstrimche è molto più sicuro, ma per questo specifico utilizzo blkdiscardbatte entrambi. Nel 2013 non è necessario rischiare manualmente i range di calcolo.
Gabriel,

6

Puoi dare un'occhiata allo script wiper.shincluso nel pacchetto hdparm. Usa il comando hdparm --trim-sector-rangesper TRIM tutti i settori vuoti su una partizione, almeno se contiene un filesystem ext3 / 4. Non sono sicuro che funzioni con partizioni non formattate, ma puoi sempre formattarlo temporaneamente con ext4.


La formattazione con ext4 e quindi in esecuzione wiper.shtaglierebbe quasi tutta la partizione tranne i metadati ext4. Ma vorrei tagliare l'intera partizione.
punti

2
@pts: ti suggerisco di guardare il codice di wiper.sh e provare a capire come deduce gli intervalli di assetto. Quindi è possibile inviare manualmente un intervallo di ritaglio a hdparm per TRIM l'intera partizione.
Jaap Eldering,

4

blkdiscardpuò lavorare su partizioni, non solo su intere unità. L'ho provato con successo su Fedora 20. Ho controllato le fonti di blkdiscard- è un programma molto semplice che non sa nulla delle partizioni. Presumo che il kernel esegua la traduzione.

Fai molta attenzione, blkdiscardnon fa domande e non mostra informazioni sui progressi.

Se blkdiscard non è disponibile, utilizza questo script e invia il suo output a hdparm. Il primo argomento è il numero di settori da tagliare, il secondo è il primo settore da tagliare.

#! /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

-1

Ecco un articolo interessante che parla dell'utilizzo di HDDErase per invocare la funzione di cancellazione sicura integrata dell'SSD, che dovrebbe farti desiderare che desideri:

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


Grazie per la tua risposta, ma non funziona, dal momento che 1) cancella l'intera unità 2) richiede Microsoft Windows e stavo cercando una soluzione Linux.
punti

2
Nota anche che questo è fondamentalmente lo stesso che blkdiscard --securefa.
ntninja,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.