LINUX.ORG.RU
решено ФорумAdmin

SSD TRIM на LVM томах упакованных в LUKS

 , , , ,


3

2

Привет!

Перерыл весь инет, читал мануалы wiki Arch’евой, но это всё какой-то мусор, не работает и внятного ответа не нашел :(

Поплакался, теперь к делу :)

Хочу чтобы работал TRIM. Оборудование подерживает, диск - SSD Samsung 860 EVO. Чтобы много букв не писать, сразу показываю lsblk, где cryptlvm - это контейнер LUKS:

lsblk

NAME             MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                8:0    0 232,9G  0 disk  
├─sda1             8:1    0   285M  0 part  /boot/efi
└─sda2             8:2    0 232,6G  0 part  
  └─cryptlvm     254:0    0 232,6G  0 crypt 
    ├─vg1-lvroot 254:1    0    15G  0 lvm   /
    ├─vg1-lvvar  254:2    0    15G  0 lvm   /var
    ├─vg1-lvswap 254:3    0    15G  0 lvm   [SWAP]
    └─vg1-lvhome 254:4    0 187,6G  0 lvm   /home

В /etc/fstab опция discard прописана:

# /dev/mapper/vg1-lvroot
UUID=e86ab458-341d-4f59-8344-0271d2c363e8       /               ext4            rw,noatime,discard      0 0

# /dev/mapper/vg1-lvvar
UUID=44b31816-1193-4dc1-9f58-f70df2250e1a       /var            ext4            rw,noatime,discard      0 0

# /dev/mapper/vg1-lvhome
UUID=372bc9ae-b581-49a4-abed-ca9f3b67edb6       /home           ext4            rw,noatime,discard      0 0

# /dev/sda1
UUID=0BE5-60FB          /boot/efi       vfat            rw,relatime,discard,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro       0 0

# /dev/mapper/vg1-lvswap
UUID=cf67ae1e-3a17-4e5e-ac58-ef23725d2359       none            swap            defaults,discard,pri=-2 0 0

Для LVM в файле /etc/lvm/lvm.conf значение для issue_discards установлено в 1, но это не влияет на TRIM при удалении файлов с раздела файловой системы, а пересылает устройству команду только в случае изменений LVM томов, таких операций как lvreduce, lvresize и т.д.

В /etc/crypttab ничего не прописано, там одни комментарии. Как я понял, записи в этом файле это не для моего случая, это для разделов которые открываются после монтирования корневой ФС, где LUKS находится на LVM разделах. У меня же LVM внутри LUKS который открывает initramfs (насколько я вообще пониманию процесс загрузки верно) для которого прописаны хуки в конфиге /etc/mkinitcpio.conf.

Стало быть где-то надо что-то прописать для ядра в grub’e чтобы это передалось в initramfs. Что и как - загадка, тайна, и главный вопрос - Что прописать, как и где?

P.S. Дистрибутив - Manjaro

Сейчас TRIM работает только /dev/sda1:

sudo fstrim -v /boot/efi/
/boot/efi/: 284 MiB (297762816 bytes) trimmed

sudo fstrim -v /
fstrim: /: the discard operation is not supported


ничего не понял, но luks надо монтировать с –allow-discards (только man cryptsetup почитать). По моему одного монтирования достаточно, но точно не помню. В любом случае можно перманентно задать эту настройку с помощью cryptsetup

anonymous ()
Ответ на: комментарий от boowai

Попытался:

sudo cryptsetup --allow-discards --persistent refresh /dev/sda2
Device sda2 not found

Затем попытался вот так:

sudo cryptsetup --allow-discards --persistent refresh /dev/mapper/cryptlvm 
Enter passphrase for /dev/sda2: 
This operation is supported only for LUKS2 device.
Device activated but cannot make flags persistent.
dva20 ()
Ответ на: комментарий от dva20

как написал выше, с помощью ключа –persistent изменения применяются навсегда, т.е. прописываются в метаданные и больше указывать –allow-discards нет необходимости

This operation is supported only for LUKS2 device. Device activated but cannot make flags persistent.

Если на –allow-discards реагирует нормально, то возможно надо копать в сторону systemd

https://www.freedesktop.org/software/systemd/man/systemd-cryptsetup-generator.html

luks.options=, rd.luks.options= Takes a LUKS super block UUID followed by an «=» and a string of options separated by commas as argument. This will override the options for the given UUID.

anonymous ()

Всё, всем спасибо за оказанную помощь, разобрался. Может, кому-то пригодится и облегчит путь.

Итак, чтобы TRIM заработал, нужно разрешить discard при открытии криптоконтейнера, в моём случае это делается на ранней стадии загрузки в мини-дистрибутиве - initramfs. Чтобы initramfs понял, что от него хотят, нужно ему как-то передать параметр. Сделать это можно через передачу параметров в ядро Linux, а чтобы туда ему передать, надо прописать в конфигурационном файле загрузчика grub :) Иголка в яйце, яйцо в утке… Ну вы поняли :)

Прописываем значение allow-discards в /etc/default/grub для параметра cryptdevice в параметре для ядра GRUB_CMDLINE_LINUX:

GRUB_CMDLINE_LINUX="cryptdevice=UUID=3c121aac-ead9-4d57-88be-c1199acf72f0:cryptlvm:allow-discards"

Затем нужно скомпилировать «правильный» конфиг grub’а:

sudo grub-mkconfig -o /boot/grub/grub.cfg

Рестартуем систему и проверяем вручную, сработает или нет trim:

sudo fstrim -v /

/: 7,4 GiB (7906193408 bytes) trimmed

Всё. TRIM работает :)

Еще проверить можно так, если значения не нулевые напротив блок-девайсов, в колонках DISC-GRAN и DISC-MAX, значит TRIM работает:

lsblk --discard

NAME             DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda                     0      512B       2G         0
├─sda1                  0      512B       2G         0
└─sda2                  0      512B       2G         0
  └─cryptlvm            0      512B       2G         0
    ├─vg1-lvroot        0      512B       2G         0
    ├─vg1-lvvar         0      512B       2G         0
    ├─vg1-lvswap        0      512B       2G         0
    └─vg1-lvhome        0      512B       2G         0
dva20 ()
Последнее исправление: dva20 (всего исправлений: 3)
Ответ на: комментарий от dva20

Мне достаточно было при монтировании указать

cryptsetup luksOpen –allow-discards /dev/sda4 sda

mount /dev/mapper/sda /usr/data/sda

и в crypttab указать

sda /dev/sda4 none luks,discard,noauto

Но у меня не LVM

arsik ()
Последнее исправление: arsik (всего исправлений: 2)
Ответ на: комментарий от arsik

Дело не в LVM, у вас скорее всего незашифрованная корневая файловая система, поэтому можно прописать в /etc/crypttab параметры для cryptsetup который открывает шифрованные разделы до монтирования разделов прописанных в /etc/fstab.

У меня иначе, все разделы зашифрованы, в том числе и корневая ФС, кроме загрузчика grub который находится на другом разделе диска, поэтому немного по другому настраивается.

dva20 ()
Последнее исправление: dva20 (всего исправлений: 1)