Disques SSD - Rognage

Mise à jour : Debian Buster / 10.5

Le rognage des disques SSD consiste à effacer les blocs qui ne sont plus utilisés, ce qui contribue à conserver dans le temps les performances du stockage

Références :

Sommaire

1 - Principe

le support du rognage est assuré sans modification et la commande fstrim est directement opérationnelle

2 - Vérification du support du rognage

$ lsscsi N
[N:0:4:1] disk Samsung SSD 970 EVO 250GB__1 /dev/nvme0n1
$ lsblk -f /dev/nvme0n1
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
nvme0n1
├─nvme0n1p1 vfat ESP 2521-3D3F 403,3M 23% /boot/efi
├─nvme0n1p2 ext4 boot f948cd31-18b2-4144-91f4-7840e122dfa7 201,5M 52% /boot
├─nvme0n1p3 crypto_LUKS 435e0f3b-e392-42b0-881f-ffc5dd834025
│ └─buster ext4 buster 06f0c737-9cc2-4959-be25-03db609d983e 7,2G 80% /
└─nvme0n1p4 crypto_LUKS 33ec8c3f-d533-405e-a92e-3f37dc46e44d
└─swap swap swap 22746c64-19b9-4427-8678-f0740f55efd4 [SWAP]
$ grep . /sys/block/nvme0n1/queue/rotational
0
$ lsblk --discard /dev/nvme0n1 |head -2
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
nvme0n1 0 512B 2T 0
$ lsblk --discard  /dev/nvme0n1
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
nvme0n1 0 512B 2T 0
├─nvme0n1p1 0 512B 2T 0
├─nvme0n1p2 0 512B 2T 0
├─nvme0n1p3 0 512B 2T 0
│ └─buster 0 512B 2T 0
└─nvme0n1p4 0 512B 2T 0
└─swap 0 0B 0B 0

Dans le cas présent,

3 - Rognage des systèmes de fichier

3.1 - Fstrim

$ sudo fstrim -V
fstrim de util-linux 2.33.1

et s'utilise en désignant le système de fichier à rogner

$ lsblk -f /dev/nvme0n1
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
nvme0n1
├─nvme0n1p1 vfat ESP 2521-3D3F 403,3M 23% /boot/efi
├─nvme0n1p2 ext4 boot f948cd31-18b2-4144-91f4-7840e122dfa7 201,5M 52% /boot
├─nvme0n1p3 crypto_LUKS 435e0f3b-e392-42b0-881f-ffc5dd834025
│ └─buster ext4 buster 06f0c737-9cc2-4959-be25-03db609d983e 7,2G 80% /
└─nvme0n1p4 crypto_LUKS 33ec8c3f-d533-405e-a92e-3f37dc46e44d
└─swap swap swap 22746c64-19b9-4427-8678-f0740f55efd4 [SWAP]
$ sudo fstrim -v /
/ : 9,9 GiB (10575622144 octets)
$ sudo fstrim -av
/home : 220 KiB (225280 octets) réduits sur /dev/mapper/ssd2
/boot/efi : 403,3 MiB (422850560 octets) réduits sur /dev/nvme0n1p1
/boot : 0 B (0 octets) réduits sur /dev/nvme0n1p2
/ : 0 B (0 octets) réduits sur /dev/mapper/buster

3.2 - Rognage périodique

$ cat /lib/systemd/system/fstrim.service 
[Unit]
Description=Discard unused blocks on filesystems from /etc/fstab
Documentation=man:fstrim(8)

[Service]
Type=oneshot
ExecStart=/sbin/fstrim -Av
$ cat /lib/systemd/system/fstrim.timer
[Unit]
Description=Discard unused blocks once a week
Documentation=man:fstrim

[Timer]
OnCalendar=weekly
AccuracySec=1h
Persistent=true

[Install]
WantedBy=timers.target
$ systemctl status fstrim.timer 
● fstrim.timer - Discard unused blocks once a week
Loaded: loaded (/lib/systemd/system/fstrim.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Fri 2020-08-28 12:07:06 CEST; 38min ago
Trigger: Mon 2020-08-31 00:00:00 CEST; 2 days left
Docs: man:fstrim

sinon l'autoriser et le lancer

$ sudo systemctl enable fstrim.timer
$ sudo systemctl start fstim.timer

4 - Rognage de la partition de swap

4.1 - Principe

Extrait de man swapon

-d, --discard[=policy] Enable swap discards, if the swap backing device supports the discard or trim operation. This may improve performance on some Solid State Devices, but often it does not. The option allows one to select between two available swap discard policies: --discard=once to perform a single-time discard operation for the whole swap area at swapon; or --discard=pages to asynchronously discard freed swap pages before they are available for reuse. If no policy is selected, the default behavior is to enable both discard types. The /etc/fstab mount options discard, discard=once, or discard=pages may also be used to enable discard flags.
$ sudo swapoff -a
$ sudo swapon -a --discard=once

4.2 - Rognage au démarrage du système

# grep swap /etc/fstab
# swap was on /dev/sda2 during installation
UUID=e08131c8-298b-4368-81e4-502c3b83bef5 none swap sw,discard=once 0 0

5 - Containers chiffrés et volumes logiques

Si des partitions sont chiffrées comme dans le cas ci-dessous
$ lsblk /dev/nvme0n1 -o Name,Type,Mountpoint
NAME TYPE MOUNTPOINT
nvme0n1 disk
├─nvme0n1p1 part /boot/efi
├─nvme0n1p2 part /boot
├─nvme0n1p3 part
│ └─buster crypt /
└─nvme0n1p4 part
└─swap crypt [SWAP

ou bien utilisent des volumes logiques

# lsblk /dev/sda2 -o Name,Fstype,Mountpoint
NAME FSTYPE MOUNTPOINT
sda2 crypto_LUKS
└─luks-debian LVM2_member
├─vgdebian-debian ext4 /
├─vgdebian-swap swap [SWAP]
└─vgdebian-home ext4 /home

chaque "couche" intermédiaire jusqu'au système de fichier doit supporter le rognage.

Par défaut, le support du rognage n'est pas activé au niveau des couches intermédiaires et doit-être spécifié

5.1 - Containers chiffrés Luks - activation ponctuelle du rognage

Pour activer ponctuellement le support du rognage au niveau d'un container luks, utiliser l'option --allow-discards

$ sudo cryptsetup luksOpen --allow-discards /dev/sdb1 DATA
$ sudo cryptsetup --allow-discards refresh DATA
$ lsblk --discard /dev/sdb
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sdb 0 512B 4G 0
└─sdb1 0 512B 4G 0
└─test 0 512B 4G 0

5.2 - Containers chiffrés Luks - activation permanente du rognage

$ cat /etc/crypttab
# <target name> <source device> <key file> <options>

# SWAP chiffrée
swap UUID=33xxxxxx44d /etc/keys/swapkey luks,discard

# Racine chiffrée
buster UUID=43exxxxxx025 none luks,discard

# Home chiffré
ssd2 UUID=7bxxxxxxxe2 /etc/keys/datakey luks,discard
$ sudo update-initramfs -u -k all
$ sudo reboot
$ lsblk --discard /dev/nvme0n1
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
nvme0n1 0 512B 2T 0
├─nvme0n1p1 0 512B 2T 0
├─nvme0n1p2 0 512B 2T 0
├─nvme0n1p3 0 512B 2T 0
│ └─buster 0 512B 2T 0
└─nvme0n1p4 0 512B 2T 0
└─swap 0 512B 2T 0

5.3 - Volumes logiques

$ grep issue_discards /etc/lvm/lvm.conf
# Configuration option devices/issue_discards.
issue_discards = 0

Passer la valeur à 1 :

$ sudo sed -i 's/issue_discards = 0/issue_discards = 1/' /etc/lvm/lvm.conf
$ sudo update-initramfs -u -k all
$ sudo reboot
$ sudo fstrim -v /
/ : 792,7 MiB (831197184 octets) taillés

$ sudo fstrim -v /home
/home : 216,7 MiB (227229696 octets) taillés

6 - Disques rattachés par une interface USB

$ lsscsi -t 4
[4:0:0:0] disk usb:1-2:1.0 /dev/sdc

le rognage n'est généralement pas supporté et des 0 apparaissent au niveau des colonnes DSIC-GRAN et DISC-MAX :

$ lsblk --discard  /dev/sdc
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sdc 0 0B 0B 0
└─sdc1 0 0B 0B 0
$ sudo dmesg
.....
[ 3309.724715] usb 2-3: new SuperSpeedPlus Gen 2 USB device number 3 using xhci_hcd
[ 3309.745673] usb 2-3: New USB device found, idVendor=174c, idProduct=55aa, bcdDevice= 1.00
[ 3309.745678] usb 2-3: New USB device strings: Mfr=2, Product=3, SerialNumber=1
[ 3309.745680] usb 2-3: Product: Ugreen Storage Device
[ 3309.745682] usb 2-3: Manufacturer: Ugreen
[ 3309.745684] usb 2-3: SerialNumber: 123458F03274
[ 3309.749969] scsi host3: uas
[ 3309.751399] scsi 3:0:0:0: Direct-Access KINGSTON SHSS37A240G 0 PQ: 0 ANSI: 6
[ 3309.752259] sd 3:0:0:0: Attached scsi generic sg1 type 0
[ 3309.752851] sd 3:0:0:0: [sdb] 468862128 512-byte logical blocks: (240 GB/224 GiB)
[ 3309.752980] sd 3:0:0:0: [sdb] Write Protect is off
[ 3309.752983] sd 3:0:0:0: [sdb] Mode Sense: 43 00 00 00
[ 3309.753183] sd 3:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 3309.753436] sd 3:0:0:0: [sdb] Optimal transfer size 33553920 bytes
[ 3309.790745] sdb: sdb1
[ 3309.792003] sd 3:0:0:0: [sdb] Attached SCSI disk
$ lsscsi -t 3
[3:0:0:0] disk usb:2-3:1.0 /dev/sdb

$ lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 10000M
|__ Port 3: Dev 3, If 0, Class=Mass Storage, Driver=uas, 10000M
.....
$ lsblk --discard /dev/sdb
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sdb 0 512B 4G 0
└─sdb1 0 512B 4G 0

7 - Effacement du disque

$ sudo blkdiscard /dev/sdc
$ sudo dd if=/dev/sdc bs=1GiB count=1 |hexdump -C
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
1+0 enregistrements lus
1+0 enregistrements écrits
1073741824 octets (1,1 GB, 1,0 GiB) copiés, 3,55006 s, 302 MB/s
40000000