La mia partizione /dev/sda3
su un'unità SSD non contiene alcun filesystem, ma contiene spazzatura. Come si esegue un'operazione TRIM / DISCARD sull'intera partizione?
La mia partizione /dev/sda3
su un'unità SSD non contiene alcun filesystem, ma contiene spazzatura. Come si esegue un'operazione TRIM / DISCARD sull'intera partizione?
Risposte:
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.sh
rifiutano 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.
blkdiscard
. Comando pericoloso ... :)
WARNING: All data in the discarded region on the device will be lost!
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.)
mkfs.ext4 -J size=4 -N1 /dev/my/device
-E lazy_journal_init
sembra comportare un numero di scritture leggermente inferiore rispetto a quello -J size=4
utilizzato. (Basato su esperimenti usando un file sparse anziché un SSD fisico e du
per verificare quanto era stato scritto.)
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.
wiper.sh
è obsoleto, il fstrim
che è molto più sicuro, ma per questo specifico utilizzo blkdiscard
batte entrambi. Nel 2013 non è necessario rischiare manualmente i range di calcolo.
Puoi dare un'occhiata allo script wiper.sh
incluso nel pacchetto hdparm. Usa il comando hdparm --trim-sector-ranges
per 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.
wiper.sh
taglierebbe quasi tutta la partizione tranne i metadati ext4. Ma vorrei tagliare l'intera partizione.
blkdiscard
può 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, blkdiscard
non 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
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:
blkdiscard --secure
fa.