Utilitaire pour TRIM espace non alloué sur le lecteur

11

J'ai un lecteur (carte SD) avec quelques partitions ext4 mais aussi de l'espace non alloué. L' fstrimutilitaire ne peut fonctionner que dans un système de fichiers. Avant de réinventer la roue et d'en écrire une, existe-t-il un autre utilitaire qui peut TRIM l'espace non alloué (ou qui peut TRIM une plage explicitement spécifiée)?

Je peux vérifier que la majorité de l'espace non alloué sur le périphérique n'est pas actuellement connue comme étant libre par le contrôleur, car j'ai observé que, sur cette carte particulière, lit à l'espace coupé des retours de 0, mais une analyse de l'appareil montre beaucoup de données sur les ordures restantes.

Edit: J'ai un problème avec hdparm. L'exemple ci-dessous élimine le premier secteur, mais je vois les mêmes résultats quelle que soit la plage que je spécifie. fstrimn'a aucun problème sur l'appareil:

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

J'enquête plus, mais quelqu'un a-t-il une idée?

Jason C
la source
1
Si vous mappez l'espace non partitionné avec une ou plusieurs partition (s) (temporairement), vous pouvez utiliser blkdiscardsur celles-ci un découpage de l'ensemble du périphérique.
frostschutz
Merci! Cela ressemble au bon outil, mais blkdiscardne semble pas être disponible dans mes référentiels de packages standard (Ubuntu 12.04, ne semble pas être présent dans util-linux).
Jason C
Je n'ai jamais pu hdparmtravailler pour moi pour une raison quelconque, mais j'ai récupéré la source util-linux de github.com/karelzak/util-linux/tree/stable/v2.23 , je l'ai construite ( ./autogen.sh ; ./configure ; make blkdiscard) et ça marche très bien. Toujours mystifié hdparmmais blkdiscardfait exactement ce que je veux. Bonus: il n'est pas nécessaire de créer un système de fichiers temporaire en premier, vous pouvez l'utiliser sfdisk -lpour déterminer l'espace entre les partitions et le blkdiscardcouper.
Jason C
Oh, je n'étais même pas au courant de blkdiscardpouvoir travailler avec des options de décalage / longueur. Les partitions temporaires que j'ai suggérées ne sont donc même pas nécessaires. Agréable!
frostschutz

Réponses:

16

Si vous avez une version assez récente de util-linux, elle contient l'outil blkdiscardqui est capable de TRIM des appareils entiers, ou des plages au sein d'un appareil à l'aide des options --offsetet --length.

Veuillez noter: blkdiscard est dangereux, si vous le laissez TRIM les mauvaises régions, vos données ont disparu!

Vous pouvez donc déterminer les régions non partitionnées (libres) de votre table de partition, puis les TRIM à l'aide de cet outil. Pour msdoset gptpartitions, partedfournit les régions libres comme ceci:

# parted -m /dev/sda unit b print free | grep ':free;'
1:17408B:1048575B:1031168B:free;
1:64022904832B:64023240191B:335360B:free;

Ajoutez-y une boucle ...

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;')

qui imprime

blkdiscard --offset 17408 --length 1031168 /dev/sda
blkdiscard --offset 64022904832 --length 335360 /dev/sda

Vérifiez que cette sortie est correcte pour vous, ajoutez des options supplémentaires si vous le souhaitez (verbeux?), Et supprimez enfin le echoafin qu'il soit réellement exécuté, et vous devriez être défini.

La deuxième commande de cet exemple échoue en fait parce que la longueur est trop petite - il peut être utile de vérifier à l'intérieur de la boucle, ignorez les régions inférieures à 1 Mo car il est peu probable qu'elles soient correctement coupées.


Si vous utilisez LVM au lieu de partitions, vous pouvez créer un LV pour l'espace inoccupé et découper qui:

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

Si vous définissez issue_discards = 1votre lvm.conf, vous pouvez ignorer l' blkdiscardappel car LVM émettra le TRIM lvremovepar lui-même.

frostschutz
la source
1
Merci! J'ai remarqué cela comme la réponse parce que cela fonctionne pour moi, même si la réponse de Michael est également valable. Aussi je vais ajouter ce que je dit dans les commentaires de question: Si vous n'avez disponible; vous pouvez récupérer la source util-linux à partir de github.com/karelzak/util-linux/tree/stable/v2.23 puis construire (exécuter ) - il a été construit proprement (bien que vous deviez peut-être installer certaines dépendances et modifier les options) et comme tant que vous ne l'installez pas, il n'entre pas en conflit avec util-linux existant. blkdiscardblkdiscard./autogen.sh ; ./configure ; make blkdiscardconfigure
Jason C
1
J'observais des échecs avec certaines valeurs également transmises blkdiscard, mais j'ai remarqué que les valeurs étaient basées sur le décalage, pas sur la longueur. Il est possible qu'il y ait un problème blkdiscard, je suis en train d'enquêter. Voir unix.stackexchange.com/questions/98473/…
Jason C
J'ai créé un script qui supprime l'espace libre sur tous les systèmes de fichiers montés ainsi que les VG LVM gratuits: github.com/stefanct/discard-everything
stefanct
7

hdparm --trim-sector-rangespeut couper une plage. La page de manuel vous avertit de l'utiliser, vous devez donc être sûr d'avoir la bonne plage et la bonne syntaxe.

Je pense que l'envoi d'un trim pour toutes les données en dehors d'une partition serait dangereux, car il y a parfois des données cachées comme le code du chargeur de démarrage ou les deuxièmes tables de partition. Vous auriez besoin de savoir exactement, quelles zones en dehors des partitions sont vraiment inutilisées.

Michael Suelmann
la source
Parfait merci! Je peux saisir la taille de l'appareil avec hdparm, les plages inutilisées de sfdisket couper en conséquence. Je sais ce qu'il y a sur le disque. S'il existe un schéma de partitionnement qui masque les données dans des zones accessibles mais non allouées, cela casserait les fonctionnalités de base de n'importe quel éditeur de partition. Je présume (j'espère) que des projets comme celui-ci ont depuis longtemps été abandonnés (je n'en connais aucun du haut de ma tête). Tous les schémas que je connais stockent le MBR dans un espace non alloué bien connu au début de l'appareil, et des VBR / EBR dans les partitions allouées. Il peut y avoir de vieux schémas obscurs qui sont différents. :)
Jason C
J'ai des difficultés avec hdparm, j'ai édité ma question avec des détails; me demandant si vous avez un aperçu.
Jason C
1
Il semble qu'au moins une partie de hdparm ne fonctionne pas sur / dev / mmcblk0. Désolé, je n'ai aucune autre idée.
Michael Suelmann