Comment TRIM / DISCARD une partition SSD entière sous Linux?

28

Ma partition /dev/sda3sur un lecteur SSD ne contient aucun système de fichiers, mais elle contient des ordures. Comment effectuer une opération TRIM / DISCARD sur toute la partition?

pts
la source
7
Je pense que le fait est qu'il ne veut pas écrire de données, il veut que le SSD efface le bloc flash mais le laisse vide afin qu'il soit disponible pour être écrit, connu sous le nom de rafraîchissement d'un lecteur SSD.
Chris Thompson
@joe: Votre lien ATA Secure Erase ne mentionne même pas les partitions. Je ne veux pas effacer le disque entier, juste une partition. Et je ne veux pas risquer d'effacer accidentellement tout le lecteur.
pts
11
@Doc: Remplir la partition avec des données inutiles est tout à fait le contraire de l'intention de pts: cela indiquera au SSD que la partition est complètement remplie et utilisée. Cela diminuera les performances et la durée de vie du SSD.
Black

Réponses:

40

Si votre version d'util-linux est suffisamment nouvelle (septembre 2012), il existe en fait un outil spécialement conçu blkdiscard, c'est la meilleure façon de le faire:

sudo blkdiscard /dev/sda3

Mais si vous avez besoin de compatibilité avec les anciennes versions de distribution Linux, lisez la suite ... Il y a des cas où hdparm/ wiper.shrefusez de toucher un volume parce que ce n'est pas une partition, nous avons donc besoin de quelque chose au-delà.

Le moyen le plus pris en charge que j'ai trouvé est de tirer parti du fait que les volumes d'échange Linux prennent en charge DISCARD lorsqu'ils sont activés. Les wipefs à la fin sont là, donc le volume n'est pas reconnu comme swap plus tard.

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

Cela émet la DISCARD sur la majorité de l'appareil.

robbat2
la source
1
Merci, je ne savais pas blkdiscard. Commande dangereuse ... :)
frostschutz
Pourquoi? Je viens de le chercher dans le manuel:WARNING: All data in the discarded region on the device will be lost!
MrCalvin
9

Je sais que cette question est assez ancienne, mais ...

La façon la plus simple de le faire est de simplement créer un système de fichiers ext4 sur la partition avec une version raisonnablement récente de mkfs.ext4. La première chose que cet outil fait est TRIM la partition entière. Une fois que vous avez fait cela, vous pouvez remplacer les données créées par le système de fichiers que vous souhaitez.

(Je viens de faire cela pour créer une nouvelle partition vfat sur une carte SD, par exemple.)

David Given
la source
Merci pour le tuyau! FYI Après TRIMming, écrit certains blocs avec des métadonnées pour un système de fichiers ext4 vide, de sorte que les quelques pour cent de la partition restent non TRIMmed.
pts
4
@pts Vous pouvez réduire la taille des métadonnées en réduisant la taille du journal et le nombre d'inodes:mkfs.ext4 -J size=4 -N1 /dev/my/device
Aryeh Leib Taurog
2
@AryehLeibTaurog L'utilisation -E lazy_journal_initsemble entraîner un peu moins d'écritures que le -J size=4fait. (Basé sur des expériences utilisant un fichier clairsemé plutôt qu'un SSD physique et dupour vérifier combien avait été écrit.)
kasperd
@kasperd Une expérience intelligente avec des résultats intéressants! Merci.
Aryeh Leib Taurog
8

hdparm --trim-sector-range est de bas niveau, il est censé parler directement au SSD, donc pas de dépendance sur le système de fichiers. Ce que wiper.sh fait, c'est utiliser des programmes spécifiques au système de fichiers pour mapper les régions libres (système de fichiers) aux secteurs (matériels) SSD, ils utilisent hdparm pour les couper.

En répondant à la question, vous pouvez utiliser hdparm pour découper cette partition, mais vous devez être très prudent . Pour ce faire, obtenez la plage de secteurs utilisée par la partition, puis utilisez hdparm sur cette plage de secteurs. Vous devrez probablement passer plusieurs plages de secteurs, car chaque plage de plages de secteurs --trim peut avoir au maximum 65535 secteurs.

fdisk -l peut vous indiquer le début et la taille des partitions. Faites attention aux unités utilisées par fdisk et à la taille du secteur de votre SSD.

Exemple (mon SSD):

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

Pour supprimer l'espace avant cette partition, je pouvais couper 2047 (512 octets de taille, sur mes SSD) secteurs à partir du secteur 1: hdparm --trim-sector-ranges 1:2047. Je ne peux pas couper à partir du secteur 0 car c'est le MBR (je ne sais pas comment ça se passe pour GPT).

Pour supprimer l'espace utilisé par la partition, je le ferais hdparm --trim-sector-ranges 2048:65535 67583:65535 133118:65535 .... Il peut être scénarisé mais je ne vais pas en écrire un maintenant.

Juste pour être sûr: je ne garantis rien ici, je peux avoir des secteurs mal calculés, faire une sauvegarde de tout avant d'utiliser efficacement --trim-sector-range.

Remarque : si vous supprimez l'espace "vide" avant la première partition, comme je l'ai montré, assurez-vous de réinstaller GRUB (ou le chargeur de démarrage que vous utilisez) avant de redémarrer, car GRUB en stocke une partie sur les secteurs "inutilisés" avant la première partition . Je ne connais pas d'autres chargeurs de démarrage mais je suppose que cela peut être le cas, alors faites attention.

spuk
la source
7
wiper.shest obsolète, fstrimce qui est beaucoup plus sûr, mais pour cette utilisation spécifique blkdiscardbat les deux. En 2013, il n'est pas nécessaire de risquer manuellement les plages de calcul.
Gabriel
6

Vous pouvez jeter un œil au script wiper.shinclus avec le package hdparm. Il utilise la commande hdparm --trim-sector-rangespour TRIM tous les secteurs vides sur une partition, au moins si elle contient un système de fichiers ext3 / 4. Je ne sais pas si cela fonctionne avec des partitions non formatées, mais vous pouvez toujours le formater temporairement avec ext4.

Jaap Eldering
la source
Le formater avec ext4 puis l'exécuter wiper.shréduirait presque toute la partition à l'exception des métadonnées ext4. Mais je voudrais couper toute la partition.
pts
2
@pts: je vous suggère de regarder le code de wiper.sh et d'essayer de comprendre comment il déduit les plages de trim. Vous pouvez ensuite envoyer manuellement une plage de découpage à hdparm pour TRIM la partition entière.
Jaap Eldering
4

blkdiscardpeut fonctionner sur des partitions, pas seulement sur des disques entiers. Je l'ai testé avec succès sur Fedora 20. J'ai vérifié les sources de blkdiscard- c'est un programme très simple qui ne connaît rien aux partitions. Je suppose que le noyau fait la traduction.

Soyez très prudent, blkdiscardne posez aucune question et ne montrez aucune information de progression.

Si blkdiscard n'est pas disponible, utilisez ce script et alimentez sa sortie vers hdparm. Le premier argument est le nombre de secteurs à rogner, le second est le premier secteur à rogner.

#! /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
la source
-1

Voici un article intéressant qui parle de l'utilisation de HDDErase pour invoquer la fonction d'effacement sécurisé intégrée du SSD, qui devrait vous donner ce que vous voulez:

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
la source
Merci pour votre réponse, mais cela ne fonctionne pas, car 1) il efface tout le lecteur 2) il nécessite Microsoft Windows et je cherchais une solution Linux.
pts
2
Notez également que c'est essentiellement la même chose blkdiscard --secure.
ntninja