Trim avec LVM et dm-crypt

J'ai essayé d'installer TRIM avec LVM et dm-crypt sur ubuntu 13.04 suivant ce tutoriel:

http://blog.neusortingno.es/2013/howto-properly-activate-sortingm-for-your-ssd-on-linux-fssortingm-lvm-and-dmcrypt/

Voir les notes sur ma configuration et ma procédure de test ci-dessous.

Des questions

  1. Existe-t-il un test fiable si TRIM fonctionne correctement?

  2. Ma routine de test est-elle incorrecte ou mon TRIM ne fonctionne-t-il pas?

  3. Si cela ne fonctionne pas: qu'est-ce qui ne va pas avec mon installation?

  4. Comment puis-je déboguer TRIM pour mon installation et faire fonctionner TRIM?

Configuration

Voici ma configuration:

cat /etc/crypttab

 sda3_crypt UUID=[...] none luks,discard 

et

cat /etc/lvm/lvm.conf

 # [...] devices { # [ ... ] issue_discards = 1 # [ ... ] } # [...] 

Le SSD est un Samsung 840 Pro.

Voici ma procédure de test

Pour tester la configuration, je viens de faire sudo fssortingm -v / qui a abouti à

/: [...] bytes were sortingmmed

Pour ce faire, le résultat de /: 0 bytes were sortingmmed ce qui semble logique et a indiqué que TRIM semble fonctionner.

Cependant, j'ai fait ce test:

dd if=/dev/urandom of=tempfile count=100 bs=512k oflag=direct

 sudo hdparm --fibmap tempfile tempfile: filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors. byte_offset begin_LBA end_LBA sectors 0 5520384 5521407 1024 524288 5528576 5529599 1024 1048576 5523456 5525503 2048 2097152 5607424 5619711 12288 8388608 5570560 5603327 32768 25165824 5963776 5980159 16384 33554432 6012928 6029311 16384 41943040 6275072 6291455 16384 50331648 6635520 6639615 4096 

sync

 sudo hdparm --read-sector 5520384 /dev/sda /dev/sda: reading sector 5520384: succeeded 7746 4e11 bf42 0c93 25d3 2825 19fd 8eda bd93 8ec6 9942 bb98 ed55 87eb 53e1 01d5 c61a 3f52 19a1 0ae5 0798 c6e2 39d9 771a b89f 3fc5 e786 9b1d 3452 d5d7 9479 a80d 114a 7528 a79f f475 57dc aeaf 25f4 998c 3dd5 b44d 23bf 77f3 0ad9 8688 6518 28ee 81db 1473 08b5 befe 8f2e 5b86 c84e c7d2 1bdd 1065 6a23 fd0f 2951 d879 e823 021b fa84 b9c1 eadd 9154 c9f4 2ebe cd70 64ec 75a8 4d93 c8fa 3174 7277 1ffb e858 5eca 7586 8b2e 9dbc ab12 40ab eb17 8187 e67d 5e0d 0005 5867 b924 5cfd 6723 9e4a 6f5f 99a4 a3b0 eeac 454a 83b6 c528 1106 6682 ca77 4edf 2180 bf0c b175 fabb 3d4b 37e2 b834 9e3e 82f2 2fdd 2c6a c6ca 873f e71e f979 160f 5778 356f 2aea 6176 46b6 72b9 f76e ee51 979c 326b 1436 7cfe f677 bfcd 4c3c 9e11 4747 45c1 4bb2 4137 03a1 e4c8 e9dd 43b4 a3b4 ce1b d218 4161 bf64 727b 75d8 dcc2 e14c ebec 2126 25da 0300 12bd 6b1a 28b3 824f 3911 c960 527d 97cd de1b 9f08 9a8e dcdc e65f 1875 58ca be65 82bf e844 50b8 cc1b 7466 58b8 e708 bd3d c01f 64fb 9317 a77a e43b 671f e1fb e328 93a9 c9c7 291c 56e0 c6c1 f011 b94d 9dc7 71e6 c8b1 5720 b8c9 b1a6 14f1 7299 9122 912b 312a 0f2f a31a 8bf9 9f8c 54e6 96f3 60b8 04a7 7dc9 3caa db0a a837 e5d7 2752 b477 c22d 7598 44e1 84e9 25d4 5db5 9f19 f73b 85a0 c656 373a ec34 55fb e1fc 124e 4674 1ba8 1a84 6aa4 7cb5 455e f416 adc6 a125 c4d4 8323 4eee 2493 2920 4e38 524c 1981 

sudo rm tempfile

sync

sudo fssortingm /

sync

 sudo hdparm --read-sector 5520384 /dev/sda /dev/sda: reading sector 5520384: succeeded 7746 4e11 bf42 0c93 25d3 2825 19fd 8eda bd93 8ec6 9942 bb98 ed55 87eb 53e1 01d5 c61a 3f52 19a1 0ae5 0798 c6e2 39d9 771a b89f 3fc5 e786 9b1d 3452 d5d7 9479 a80d 114a 7528 a79f f475 57dc aeaf 25f4 998c 3dd5 b44d 23bf 77f3 0ad9 8688 6518 28ee 81db 1473 08b5 befe 8f2e 5b86 c84e c7d2 1bdd 1065 6a23 fd0f 2951 d879 e823 021b fa84 b9c1 eadd 9154 c9f4 2ebe cd70 64ec 75a8 4d93 c8fa 3174 7277 1ffb e858 5eca 7586 8b2e 9dbc ab12 40ab eb17 8187 e67d 5e0d 0005 5867 b924 5cfd 6723 9e4a 6f5f 99a4 a3b0 eeac 454a 83b6 c528 1106 6682 ca77 4edf 2180 bf0c b175 fabb 3d4b 37e2 b834 9e3e 82f2 2fdd 2c6a c6ca 873f e71e f979 160f 5778 356f 2aea 6176 46b6 72b9 f76e ee51 979c 326b 1436 7cfe f677 bfcd 4c3c 9e11 4747 45c1 4bb2 4137 03a1 e4c8 e9dd 43b4 a3b4 ce1b d218 4161 bf64 727b 75d8 dcc2 e14c ebec 2126 25da 0300 12bd 6b1a 28b3 824f 3911 c960 527d 97cd de1b 9f08 9a8e dcdc e65f 1875 58ca be65 82bf e844 50b8 cc1b 7466 58b8 e708 bd3d c01f 64fb 9317 a77a e43b 671f e1fb e328 93a9 c9c7 291c 56e0 c6c1 f011 b94d 9dc7 71e6 c8b1 5720 b8c9 b1a6 14f1 7299 9122 912b 312a 0f2f a31a 8bf9 9f8c 54e6 96f3 60b8 04a7 7dc9 3caa db0a a837 e5d7 2752 b477 c22d 7598 44e1 84e9 25d4 5db5 9f19 f73b 85a0 c656 373a ec34 55fb e1fc 124e 4674 1ba8 1a84 6aa4 7cb5 455e f416 adc6 a125 c4d4 8323 4eee 2493 2920 4e38 524c 1981 

Cela semble indiquer que TRIM ne fonctionne pas. Depuis

 sudo hdparm -I /dev/sda | grep -i TRIM * Data Set Management TRIM supported (limit 8 blocks) * Deterministic read ZEROs after TRIM 

modifier

Voici la sortie de la sudo dmsetup table

 lubuntu--vg-root: 0 465903616 linear 252:0 2048 lubuntu--vg-swap_1: 0 33308672 linear 252:0 465905664 sda3_crypt: 0 499222528 crypt aes-xts-plain64 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 8:3 4096 1 allow_discards 

Voici mon /etc/fstab :

 # <file system> <mount point> <type> <options> <dump> <pass> /dev/mapper/lubuntu--vg-root / ext4 errors=remount-ro 0 1 # /boot was on /dev/sda2 during installation UUID=f700d855-96d0-495e-a480-81f52b965bda /boot ext2 defaults 0 2 # /boot/efi was on /dev/sda1 during installation UUID=2296-2E49 /boot/efi vfat defaults 0 1 /dev/mapper/lubuntu--vg-swap_1 none swap sw 0 0 # tmp tmpfs /tmp tmpfs nodev,nosuid,noexec,mode=1777 0 0 

Modifier:

Je l'ai finalement signalé comme un bug dans https://bugs.launchpad.net/ubuntu/+source/lvm2/+bug/1213631

J'espère que quelqu'un va find une solution là ou au less tester la configuration et vérifier le bug.

Mettre à jour

Maintenant cela fonctionne, voir la réponse acceptée.

Je suggère d'utiliser une méthode de test différente. hdparm est un peu bizarre car il donne des adresses de périphérique plutôt que des adresses de filesystems, et ne dit pas à quel périphérique ces adresses se rapportent (par exemple, il résout les partitions, mais pas les cibles devicemapper, etc.). Beaucoup plus facile d'utiliser quelque chose qui colle aux adresses du système de files, de cette façon il est cohérent (peut-être à l'exception des filesystems non traditionnels comme zfs / btrfs).

Créer un file de test: (pas au hasard)

 # yes | dd iflag=fullblock bs=1M count=1 of=sortingm.test 

Obtenir l'adresse, la longueur et la taille du bloc: (la command exacte dépend de la version de filefrag )

 # filefrag -s -v sortingm.test File size of sortingm.test is 1048576 (256 blocks, blocksize 4096) ext logical physical expected length flags 0 0 34048 256 eof sortingm.test: 1 extent found 

Obtenez le périphérique et le sharepoint assembly:

 # df sortingm.test /dev/mapper/something 32896880 11722824 20838512 37% /mount/point 

Avec cette configuration, vous avez un file sortingm.test rempli de yes -pattern on /dev/mapper/something à l'adresse 34048 avec une longueur de 256 blocs de 4096 octets.

La lecture de l'appareil directement devrait produire le yes -pattern:

 # dd bs=4096 skip=34048 count=256 if=/dev/mapper/something | hexdump -C 00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a |yyyyyyyy| * 00100000 

Si TRIM est activé, ce model devrait changer lorsque vous supprimez le file. Notez que les caches doivent également être supprimés, sinon dd ne relira pas datatables du disque.

 # rm sortingm.test # sync # fssortingm -v /mount/point/ # when not using 'discard' mount option # echo 1 > /proc/sys/vm/drop_caches # dd bs=4096 skip=34048 count=256 if=/dev/mapper/something | hexdump -C 

Sur la plupart des disques SSD, il en résulterait un motif zéro:

 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00100000 

Si le encryption est impliqué, vous verrez un motif random à la place:

 00000000 1f c9 55 7d 07 15 00 d1 4a 1c 41 1a 43 84 15 c0 |..U}....JAC..| 00000010 24 35 37 fe 05 f7 43 93 1e f4 3c cc d8 83 44 ad |$57...C...<...D.| 00000020 46 80 c2 26 13 06 dc 20 7e 22 e4 94 21 7c 8b 2c |F..&... ~"..!|.,| 

C'est parce que physiquement parée, la couche crypto lit les zéros et décrypte ces zéros à des données "randoms".

Si le motif yes persiste, il est très probable qu'aucune coupe n'a été effectuée.

Votre routine de test est incorrecte: vous obtenez des numéros de secteur par rapport au périphérique de bloc sur lequel le système de files se trouve. Dans ce cas, il s'agit d'un volume logique. Le volume logique, bien sûr, ne démarre pas au premier secteur du volume physique (et peut même ne pas être contigu).

Même si le volume logique a démarré au secteur 0 du volume physique (ce qui n'est pas le cas), le volume physique est en fait une autre cible de mappeur de périphériques, celle-ci pour le chiffrement. Et il y a probablement un en-tête LUKS devant, donc les numéros de secteur ne correspondent pas non plus.

Si vous souhaitez faire correspondre le numéro de secteur au disque sous-jacent, les dmsetup tables vous fourniront les informations dont vous avez besoin. Si vous le collez ici, assurez-vous que le vôtre est une version qui ne montre pas la key dans la sortie (il devrait montrer tous les 0 à la place)! (Il n'y a pas de récupération de la divulgation de la key – elle ne peut pas être modifiée – c'est bien pire que la divulgation du mot de passe).

Je suggère que pour déboguer (une fois que vous obtenez la cartographie sectorielle), vous commencez au niveau le plus bas et confirmez que cela fonctionne. TRIM un système de files directement sur / dev / sdaX et assurez-vous que fonctionne (il est tout à fait possible que le périphérique se trouve, et sortingm ne lit pas les zéros). Puis dm-crypt en plus de cela, et couper un système de files sur cela, et assurez-vous que cela fonctionne. Enfin, mettez LVM sur le dessus, et vérifiez que cela fonctionne.

Ceci est juste un script que je voudrais partager si une personne paresseuse viennent ici. Il était fait de la réponse acceptée de frostschutz .


 #! / bin / bash
 #
 # Ce script est fourni «tel quel» sans garantie d'aucune sorte, expresse ou implicite, y compris, mais sans s'y limiter, les garanties implicites de qualité marchande, d'adéquation à un usage particulier ou de non-contrefaçon.
 #
 # Licence GPL2
 #
 # par desgua 2014/04/29

 fonction CLEAN {
 cd "$ pâtes"
 [-f test-sortingm-by-desgua] && rm test-sortingm-by-desgua && echo "Fichier temporaire supprimé"
 echo "Au revoir"
 exit 0
 }

 piège 'écho;  echo "Abandonné".  ;  NETTOYER;  écho ;  exit 0 'INT HUP

 if [["$ (echo $ USER)"! = "root"]];  puis

 read -n 1 -p 'Devenir root?  [O / n] 'a
     si [[$ a == "Y" ||  $ a == "y" ||  $ a == ""]];  puis
         sudo $ 0 $ 1
         exit 0
     autre
         écho "
         Ce script a besoin de privilèges root.
         "
         sortie 1

     Fi

 Fi


 nom = $ (echo $ 0 | sed 's /.*\///')
 si [$ # -ne 1];  puis

 écho "
 Utilisation: $ name / folder / to / test /

 "
 sortie 1
 Fi

 pâtes = 1 $

 read -n 1 -p 'Utiliser fssortingm?  [y / N] 'a
 si [[$ a == "Y" ||  $ a == "y"]];  puis
     fs = 1
 Fi

 méthode =
 while [["$ method"! = "1" && "$ method"! = "2"]];  faire
 read -n 1 -s -p 'Choisissez une méthode:
 [1] hdparm (échouera dans LUKS sur LVM)
 [2] filefrag (avertissement: vous devrez peut-être forcer quit - fermez le terminal - dans certains cas de succès sortingm si vous voyez une sortie qui ne se termine jamais) 
 ' méthode
 terminé

 fonction SDATEST {
 disque = $ (fdisk -l | grep / dev / sda)
 si ["$ disk" == ""];  puis
 écho "
 fdisk n'a pas trouvé / dev / sda 
 "
 sortie 1
 Fi
 }

 test de fonctionnalité {
 echo "Entrant /";  écho
 cd $ pâtes
 echo "Création du file test-sortingm-by-desgua à $ pâtes";  écho
 dd si = / dev / urandom de = nombre de test-sortingm-by-desgua = 10 bs = 512k
 echo "Synchronisation et sumil 2 secondes."  ;  écho
 synchroniser
 dormir 2

 hdparm --fibmap test-sortingm-by-desgua
 lbab = $ (hdparm --fibmap test-coupe-par-desgua | tail -n1 | awk '{imprimer $ 2}')

 echo "Comme vous pouvez le voir, le file a été créé et son LBA commence à $ lbab";  écho

 echo "Synchronisation et sumil 2 secondes."  ;  écho
 synchroniser
 dormir 2

 echo "Suppression du file test-sortingm-by-desgua";  écho 
 rm test-sortingm-by-desgua

 piège 'écho;  écho ;  echo "Abandonné".  ;  écho ;  exit 0 'INT
 echo "Synchronisation et sumil 2 secondes."  ;  écho
 synchroniser
 dormir 2

 si [["$ fs" == "1"]];  puis 
     echo "fssortingm $ pasta && sleep 2";  écho
     fssortingm $ pâtes
     dormir 2
 Fi

 echo "Ceci est lu dans le secteur $ lbab:"
 hdparm --read-secteur $ lbab / dev / sda

 pass = $ (hdparm --read-secteur $ lbab / dev / sda | grep "0000 0000 0000 0000")

 si [[$ pass == ""]];  puis
     écho "
 Trim a échoué ... 
 Vous devriez voir seulement 0000 0000 0000 0000 ...
 "
 autre
     echo "Succès !!!"
 Fi
 exit 0

 }

 fonction LUKSTEST {
 # Référence: https://unix.stackexchange.com/questions/85865/sortingm-with-lvm-and-dm-crypt#
 echo 1> / proc / sys / vm / drop_caches
 cd $ pâtes
 echo "Création d'un file" yes "". "
 oui |  dd iflag = fullblock bs = 1M count = 1 de = test-sortingm-by-desgua

 # position = `filefrag -s -v test-sortingm-by-desgua |  grep "eof" |  awk '{print $ 3}' `
 position = `filefrag -s -v test-sortingm-by-desgua |  grep "eof" |  sed 's |  || g;  s |. * 255: ||  ;  s | \. \ .. * || '`
 [["$ position" == ""]] && echo "Impossible de find la position du file. Êtes-vous sur LUKS sur LVM?"  && NETTOYER;

 device = `df test-sortingm-by-desgua |  grep "dev /" |  awk '{print $ 1}' `

 oui = `dd bs = 4096 sauter = $ count de position = 256 si = $ périphérique |  hexdump -C`

 echo "Dans la ligne suivante, vous devriez voir un model comme: 
 00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a | yyyyyyyy |
 $ oui
 "

 if [["echo" $ yes "| grep" yyy "` "==" "]];  puis 
     echo "Le motif n'a pas pu être vérifié, quelque chose s'est mal passé.
     NETTOYER;
 autre
     echo "Motif confirmé."
 Fi

 echo "Suppression du file temporaire." 
 rm test-sortingm-by-desgua

 echo "Synchronisation".
 synchroniser
 dormir 1

 si [["$ fs" == "1"]];  puis 
     echo "fssortingm -v $ pasta && sleep 2";  écho
     fssortingm -v $ pâtes
     dormir 2
 Fi

 # Cache de cache
 echo 1> / proc / sys / vm / drop_caches

 echo "Dans la ligne suivante, vous ne devriez ** PAS ** voir un schéma oui comme: 
 00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a | yyyyyyyy | 
 Si vous voyez, alors l'assiette ne fonctionne pas:
 `dd bs = 4096 skip = $ nombre de positions = 256 si = $ device |  hexdump -C` "

 oui = `dd bs = 4096 sauter = $ count de position = 256 si = $ périphérique |  hexdump -C`
 if [["` echo "$ yes" | grep "yyy" `"! = ""]];  puis 
     echo "TRIM ne fonctionne pas."
 autre
     echo "TRIM fonctionne!"
 Fi
 NETTOYER;
 }

 si [["$ method" == "1"]];  puis
     SDATEST;
     TESTER;
 elif [["$ method" == "2"]];  puis
     LUKSTEST;
 Fi
 exit 0