Linux on ssd with trim

Активация discard (TRIM) на Linux для SSD

Современные накопители данных такие как SSD нуждаются в команде TRIM интерфейса ATA и для этого в ОС построенных на базе ядра Linux предусмотрено два метода управления на уровне файловых систем:

  • discard — устанавливается как опция монтировании файловой системы. Позволяет ядру Linux сразу отправлять команду TRIM на устройство, как только об этом сообщит файловая система.
  • fstrim — утилита которая запускается вручную или по расписанию как сервис ОС, отправляет список удаленных блоков с ФС для зачистки их на устройстве.

Для включения fstrim достаточно активировать сервис fstrim.service в systemd, но лучше вместо сервиса, который будет висеть в памяти, использовать таймер fstrim.timer который будет запускать еженедельный TRIM.

Пример включения сервиса:

Но этих мер недостаточно, если у вас файловые системы располагаются на томах LVM, а LVM в LUKS игла в яйце, яйцо в утке, утка в зайце :

Первое что нужно сделать, это проверить, что контроллер SATA работает в режиме AHCI, а не IDE, иначе TRIM работать не будет:

Ключевое слово здесь это TRIM supported , значит контроллер SATA работает в режиме AHCI и вам не нужно ничего менять в BIOS или UEFI.

Итак, опция discard может устанавливаться:

  • в суперблоке ФС (как опция монтирования по умолчанию)
  • в конфигурации монтирования ФС — /etc/fstab
  • в конфигурации cryptsetup — /etc/crypttab
  • в конфигурации LVM — /etc/lvm/lvm.conf
  • в конфигурации загрузчика — /boot/grub/grub.cfg

Мы рассмотрим все эти варианты. Примеры будут даны для дистрибутива Arch Linux и его производных, но я думаю вас не затруднит адаптировать тему к любому другому дистрибутиву Linux.

discard в суперблоке EXT4

Если в /etc/fstab для файловой системы опция discard не указана или в опциях монтирования указана опция defaults , то система будет использовать опции монтирования прописанные в суперблоке файловой системы. Это актуально для файловой системы EXT4. Запись опций монтирования в суперблоке ФС может быть выгодна тем, что если у вас съёмное устройство которое подключается по SATA к разным машинам в которых вы не можете по каким-то причинам вносить изменения в /etc/fstab .

Добавляем опцию монтирования discard по умолчанию в суперблок файловой системы EXT4. У меня это три раздела:

Убедиться в установленной опции можно через tune2fs . Здесь /dev/mapper/vg1-lvroot это устройство, раздел с файловой системой EXT4 в томе LVM:

discard в fstab

Если это единственная система куда разделы SSD будут монтироваться, то мы можем прописать опцию discard явно в /etc/fstab для автомонтирования разделов, но устанавливать опцию необязательно для EXT4, если она уже была ранее задана в суперблоке.

Также, опцию discard следует добавить для swap раздела:

discard на LVM

В конфигурационном файле /etc/lvm/lvm.conf устанавливаем значение опции issue_discards в значение равное 1 :

Важно отметить, что включение этой опции не пересылает команду TRIM с файловых систем когда на них производятся команды удаления файлов, эта опция посылает команду TRIM только когда производятся манипуляции изменения логического тома, например, через такие команды как lvremove, lvreduce и т.д.

discard для зашифрованного root-раздела

Прежде, чем вы решите включить discard на зашифрованных томах, необходимо оценить риск безопасности утечки метаданных (тип файловой системы, используемое пространство и т. д.) которые могут быть извлечены из физического устройства при его завладении нежелательными лицами, об этом говорит предупреждение в мануале crypttab :

WARNING: This command can have a negative security impact because it can make filesystem-level operations visible on the physical device. For example, information leaking filesystem type, used space, etc. may be extractable from the physical device if the discarded blocks can be located later. If in doubt, do not use it.

Если вы Джеймс Бонд или секретный агент который занимается незаконными делами или работаете с гостайной и рискуете потерять жизнь, то эту опцию нежелательно использовать. В иных случаях, для простого пользователя, который шифрует разделы на устройстве с целью защиты информации от посторонних глаз, защиты себя и своих близких от шантажа неким домашним хакером в случае кражи ноута или устройства, то возможно ли расшифровать данные, если злой хакер получит метаданные файловой системы? Каким уровнем знаний должен обладать этот хакер, чтобы справится с расшифровкой данных? Какова цена? Предлагаю обсудить это в комментариях 🙂

В приведенной выше схеме разметки таблицы разделов на накопителе, некоторые разделы являются зашифрованными и «заперты» в криптоконтейнере LUKS. Чтобы TRIM был разрешен для этих разделов, корневой раздел должен быть открыт cryptsetup ‘ом с аргументом —allow-discards или опция должна быть прописана в /etc/crypttab для нужного раздела, но проблема заключается в том, что мы не можем прописать опцию в /etc/crypttab , так как root-раздел в нашей схеме изначально зашифрован и система не может прочитать его до того как откроет криптоконтейнер.

Читайте также:  Key manager mac os

Решением этой проблемы является указать опцию при открытии криптоконтейнера на раннем этапе загрузки в initramfs, а передать эту опцию в initramfs поможет опция в конфигурации загрузчика grub для ядра Linux.

Добавляем значение allow-discards в конфигурационный файл /etc/default/grub для параметра cryptdevice в параметре для ядра GRUB_CMDLINE_LINUX .

Меняем эту строчку:

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

Также проверьте, что у вас образ initramfs скомпилирован с хуком encrypt который позволяет открывать криптоконтейнеры с помощью cryptsetup и он расположен до хука lvm2 :

После внесения изменений в grub систему следует перезагрузить для применения изменений.

discard для других зашифрованных разделов устройства

В приведенной выше схеме разметки, раздел /home не является корневым и находится в контейнере LUKS. В этом случае, следует прописать опцию монтирования discard в конфигурационном файле /etc/crypttab который зачитывается системой до зачитывания и выполнения /etc/fstab .

Формат записи опции в конфигурационном файле вы найдете в мануале: man crypttab

Проверка TRIM

Выполните следующую команду:

Если вы видите нулевые значения в колонках DISC-GRAN (discard granularity) и DISC-MAX (discard max bytes), значит TRIM не работает.

Проверить еще можно командой ручного вызова TRIM:

Если вы видите положительный результат, значит TRIM работает. При полной поддержке TRIM значения должны быть на всех разделах:

Здесь DISC-GRAN равен 512B потому что размер сектора на моём SSD равен 512 bytes. Операционная система посылает команду TRIM контроллеру накопителя с указанием номеров секторов, которые могут быть очищены. Размер вашего сектора можно узнать из следующих команд:

UPDATE 14.04.2020 14:20: Добавил предупреждение использования опции на зашифрованных томах. Спасибо AAngstrom который отметил в комментариях это упущение.
UPDATE 23.04.2020 22:00: Подправил текст, убрал слово «диск» из текста, так как оно не соответствует описываемому в статье устройству. Спасибо vitaliy2

Источник

Оптимизация Ubuntu (и прочих Linux-ов) под SSD

Доброго времени суток всем читающим. В данной мини-статье мне хотелось бы собрать и рассмотреть основные моменты оптимизации работы (и, конечно, продления жизненного цикла ) твердотельных накопителей. Практически всю информацию можно легко найти в сети, но тут я попытаюсь упомянуть пару подводных камней.

Первое, с чего стоит начать — это выбор файловой системы. Если система на десктопе — то особо вопросов не возникает — брать журналируемую ext4 — у которой масса преимуществ перед остальными ФС. Да, будет больше циклов записи на носитель, но будет гарантия того, что в случае сбоя питания вы не потеряете данные. На ноутбуках, нетбуках — имеются батареи, и вероятность отключения из-за потери питания — практически нулевая (но, конечно, всякое бывает), в связи с чем журналирование, обычно рекомендуют отключать. Если это очень хочется сделать, то после установки системы грузимся с liveCD, и пишем в терминале

tune2fs -O ^has_journal /dev/sda1
e2fsck -f /dev/sda1

Другие способы не рекомендуются — потеряете поддержку TRIM. Также не стоит отключать журнал, добавляя параметр «writeback» в конфигурацию fstab — система не запустится из-за ошибки монтирования (если до этого был включен трим).

Следующее, что нужно учесть — файл подкачки. Под моим никсом (сейчас — убунту 11.04) обычно пишется код, смотрятся фильмы в HD и активно серфится интернет. За это время файл подкачки не понадобился ни разу, максимальное потребление ОЗУ было 1Гб, из 2х доступных в нетбуке.
Если Ваш сценарий использования системы подобен моему, или у Вас не десктоп — файл подкачки не нужен. Иначе стоит его перенести на HDD. Если журналирование еще можно оставить, ввиду его относительной безобидности, то своп-раздел — однозначно зло, сжирающее как ограниченные циклы перезаписи, так и недешевые гигабайты, количеством которых современные SSD пока не могут похвастаться.

Ну вот, система поставлена — можно заниматься оптимизацией! Самый первый шаг — включение TRIM — главная технология, которая должна продлить жизнь и распределить нагрузку SSD.
Делается очень просто — открываем fstab (например так)

gksudo gedit /etc/fstab

ищем строчки
«UUID=[NUMS-AND-LETTERS] / ext4 errors=remount-ro 0 1»
и заменяем на
«UUID=[NUMS-AND-LETTERS] / ext4 disсard,errors=remount-ro 0 1»

Обычно по умолчанию трим отключен, но выкладываю способ проверить — заходим под рут и выполняем команды

1. dd if=/dev/urandom of=tempfile count=10 bs=512k oflag=direct //запись 5Мб рандомных данных

2. hdparm —fibmap tempfile //Ищем любой стартовый LBA адрес у файла

3. hdparm —read-sector [ADDRESS] /dev/sdX //Читаем данные со стартового LBA адреса файла, замените [ADDRESS] на свой Starting LBA address из вывода предыдущей команды

4. rm tempfile //Теперь удалим временный файл и синхронизируем ФС:
5. sync

Повторяем пункт 3 — и смотрим на вывод консоли. Если выведутся нули — то трим работает. Если вы исправили fstab, перезагрузились, но трим не активировался — ищите ошибки в неверном отключении журналирования.

Далее стоит вспомнить о том, что наш никс очень любит вести разнообразные логи. И либо перенести их на HDD, либо держать в ОЗУ до перезагрузки системы. Я считаю, что если у Вас дома не сервер — то оптимален второй вариант, и реализуется он добавлением в fstab следующих строчек
tmpfs /tmp tmpfs defaults 0 0
tmpfs /var/tmp tmpfs defaults 0 0
tmpfs /var/lock tmpfs defaults 0 0
tmpfs /var/spool/postfix tmpfs defaults 0 0

Читайте также:  Product key windows 10 enterprise 2016

По умолчанию, после каждого открытия файла — система оставляет отметку времени последнего открытия — лишние операции записи. Отучить просто — добавить в fstab перед параметрами
disсard,errors=remount-ro 0
еще парочку опций —
relatime,nodiratime Первая разрешает записывать только время изменения (порой необходимо для стабильной работы некоторых программ), вторая — отменяет запись времени доступа к директориям. В принципе, вместо relatime можно поставить и noatime, который вообще ничего не будет обновлять.

После этого стоит настроить отложенную запись — ядро будет копить данные, ожидающие записи на диск, и записывать их либо при острой необходимости, либо по истечении таймаута. Я ставлю таймаут на 60 секунд, кто-то — на 150.
Для этого открываем /etc/sysctl.conf и добавляем параметры
vm.laptop_mode = 5 // Включение режима
vm.dirty_writeback_centisecs = 6000 время в сСк. Т.е. 100ед = 1секунда

И, напоследок, отключаем I/O планировщик, который был когда-то нужен для лучшего позиционирования головок HDD. Для этого заходит в конфиг граба /etc/default/grub
и в строчку
GRUB_CMDLINE_LINUX_DEFAULT=«quiet splash» вставляем параметр elevator=noop
По пути можно убрать ненужный и малоинформатиынй сплэш-скрин, сократив время старта системы еще на секунду, просто убрав quiet splash.

Вот, в общем основные моменты. Дальше стоит проявить фантазию — например, перенести куда-нибудь, или вовсе отключить кеш браузеров и тд. В награду за проделанные манипуляции Ваш SSD прослужит вам верой и правдой, и с каждым стартом будет радовать хорошей скоростью.

Источник

Настройка TRIM для SSD-хранилища на сервере Linux

Длительное использование SSD-хранилища (или твердотельного накопителя) приводит к снижению его производительности. Чтобы такое хранилище прослужило дольше, его работу нужно тщательно продумывать. Команда TRIM сообщает SSD, какие блоки данных больше не используются. Это позволяет внутренней системе SSD-накопителя выровнять износ устройства и подготовить его к дальнейшим операциям записи. TRIM может оказать существенное влияние на производительность и долговечность устройства.

В Linux можно настроить непрерывное выполнение TRIM, однако такая нагрузка может негативно сказаться на производительности. Существует также более мягкий альтернативный вариант – периодическое выполнение TRIM. При этом устройство получит все преимущества команды без ущерба для производительности.

Данное руководство поможет настроить периодический запуск TRIM на различных дистрибутивах Linux.

Как SSD-накопители хранят данные?

Чтобы лучше понимать, какие именно проблемы устраняет TRIM, нужно ознакомиться с особенностями хранения данных на SSD.

Ограничение циклов перезаписи

SSD-накопители могут записывать данные постранично, но они удаляют данные только на уровне блоков. Кроме того, данные записываются на страницы только после обнуления: то есть, перезаписать существующие данные напрямую невозможно.

Чтобы изменить данные, SSD-накопитель должен прочитать их старую версию, отредактировать её в памяти, а затем записать обновлённые данные на новую – обнулённую – страницу. После этого устройство обновляет внутреннюю таблицу и задаёт новое местонахождение данных. Предыдущее местонахождение данных становится устаревшим – оно больше не используется, но еще не обнулено.

Восстановление устаревших страниц

Чтобы восстановить устаревшие страницы, внутренние процессы сборщика мусора SSD должны прочитать все действительные страницы из блока и записать их в новый блок. После этого снова обновляется внутренняя таблица. Старый блок, который в настоящее время не содержит никаких уникальных и востребованных данных, можно обнулить и использовать для дальнейшей записи.

Как работает TRIM?

Процессы сборщика мусора SSD отвечают за удаление блоков и выравнивание износа устройства. Однако файловые системы, как правило, удаляют данные, просто отмечая занятое ими пространство как доступное для записи пространство. На самом деле они не удаляет данные из базового хранилища, а просто позволяют перезаписать ранее занятую область памяти.

Это означает, что SSD-накопитель обычно не знает, что страница больше не нужна, пока файловая система не использует это логическое местоположение для записи новых данных. Накопитель не может выполнять процедуру сборки мусора, потому что ему просто не сообщили об удалении данных, он узнаёт об этом только тогда, когда ранее занятое пространство используется для записи других данных.

Команда TRIM уведомляет SSD-устройство о блоках данных, которые больше не содержатся в файловой системе. Благодаря этому накопитель может своевременно выполнить сборку мусора и обнулить страницы, чтобы использовать их в дальнейшем. SSD может очистить устаревшие страницы и поддерживать себя в хорошем рабочем состоянии.

Как говорилось ранее, запуск TRIM после каждой операции удаления данных может негативно повлиять на производительность устройства. Потому рекомендуется распланировать запуск команды TRIM, что позволит ей передавать SSD-устройству общую информацию обо всех ненужных страницах.

Отключение непрерывного выполнения TRIM

Если вы уже настроили непрерывное выполнение команды TRIM на смонтированном устройстве, отключите команду, чтобы настроить её периодический запуск.

Непрерывное выполнение команды включается с помощью опции discard при монтировании устройства или раздела.

Найдите текущую файловую систему, смонтированную с опцией discard.

findmnt -O discard
TARGET SOURCE FSTYPE OPTIONS
/mnt/data /dev/sda1 ext4 rw,relatime, discard ,data=ordered
/mnt/data2 /dev/sdb1 ext4 rw,relatime, discard ,data=ordered

Перемонтируйте эти файловые системы, убрав опцию discard. Для этого используйте команду mount и опцию -o remount,nodiscard:

sudo mount -o remount,nodiscard /mnt/data
sudo mount -o remount,nodiscard /mnt/data2

Читайте также:  Как убрать ускорение мыши windows 10

Снова запустите команду findmnt, теперь она должна не вернуть никакого вывода:

findmnt -O discard

Откройте файл /etc/fstab, чтобы просмотреть текущие опции монтирования файловой системы. Этот файл определяет, как монтируется файловая система при запуске сервера.

sudo nano /etc/fstab

Найдите в нём опцию discard и удалите её:

. . .
# /dev/sda1 /mnt/data ext4 defaults,nofail, discard 0 0
/dev/sda1 /mnt/data ext4 defaults,nofail 0 0
# /dev/sdb1 /mnt/data2 ext4 defaults,nofail, discard 0 0
/dev/sdb1 /mnt/data2 ext4 defaults,nofail 0 0

Сохраните и закройте файл. Теперь при повторном монтировании файловой системы опция discard не будет использоваться.

Настройка TRIM в дистрибутивах systemd

В данном разделе показано, как настроить периодический запуск TRIM в дистрибутивах, которые используют систему инициализации systemd.

Ubuntu 16.04

Дистрибутив Ubuntu 16.04 предоставляет сценарий, который еженедельно запускается с помощью cron.

Примечание: Стратегия настройки TRIM в Ubuntu 16.04 не зависит от systemd и отличается от остальных дистрибутивов этого типа.

Чтобы просмотреть сценарий, введите:

cat /etc/cron.weekly/fstrim
#!/bin/sh
# trim all mounted file systems which support it
/sbin/fstrim —all || true

Как видите, сценарий требует версии fstrim с флагом –all. Многие версии fstrim, поставляющиеся в ранних версиях Ubuntu, не поддерживают этого флага.

Другие дистрибутивы systemd

В остальных дистрибутивах на основе systemd поддержка TRIM включается в файле fstrim.timer, который запускает операции TRIM на всех доступных смонтированных устройствах один раз в неделю. Он тоже использует опцию fstrim –all.

На момент написания этого руководства к таким дистрибутивам относятся:

В CentOS 7, Fedora 23, Fedora 24 и CoreOS юниты fstrim.service и fstrim.timer доступны по умолчанию. Чтобы настроить еженедельный запуск TRIM на всех смонтированных накопителях, включите юнит .timer:

sudo systemctl enable fstrim.timer

В Debian 8 юниты fstrim.service и fstrim.timer доступны внутри файловой системы, но по умолчанию не загружены в systemd. Сначала просто скопируйте эти файлы:

sudo cp /usr/share/doc/util-linux/examples/fstrim.service /etc/systemd/system
sudo cp /usr/share/doc/util-linux/examples/fstrim.timer /etc/systemd/system

Затем вы можете активировать этот юнит так же, как и в других дистрибутивах.

sudo systemctl enable fstrim.timer

Теперь команда TRIM будет выполняться на всех доступных устройствах раз в неделю.

Настройка TRIM в других дистрибутивах

Большинство дистрибутивов, которые используют не Systemd, а другую систему инициализации, также поставляются с fstrim без флага –all. Это несколько усложняет автозапуск TRIM.

Важно! Использовать TRIM на устройствах, которые не поддерживают эту команду или выполняют её не правильно, очень опасно и может привести к потере данных. Флаг –all может обеспечить безопасное выполнение команды, однако не пытайтесь определить вручную, корректно ли поддерживают подключенные диски данную операцию.

В системе Ubuntu 14.04 существует короткий сценарий fstrim-all, который еженедельно выполняется демоном cron. Однако данный сценарий не всегда правильно интерпретирует поддержку TRIM на подключенных дисках.

Существует обходное решение для этого и других дистрибутивов с поддержкой fstrim без флага –all: нужно скомпилировать статически скомпонованную версию fstrim с поддержкой этого флага. Эту версию можно установить и явно вызывать с помощью cron.

Такой вариант лучше всего сработает в:

  • Ubuntu 14.04
  • Ubuntu 12.04
  • Debian 7
  • CentOS 6

В Ubuntu 14.04 нужно сначала отключить сценарий fstrim-all, поскольку он не может корректно определять статус.

sudo chmod a-x /etc/cron.weekly/fstrim
sudo mv /etc/cron.weekly/fstrim /etc/cron.weekly/fstrim.bak

Установка инструментов для компиляции

Установите набор инструментов для сборки программ.

В Ubuntu и Debian:
sudo apt-get update
sudo apt-get install build-essential
В CentOS:
sudo yum groupinstall ‘Development Tools’

Загрузка и извлечение исходного кода

Утилита fstrim поставляется в наборе инструментов util-linux. Исходный код можно найти здесь.

Выберите самую новую версию пакета. На момент написания руководства это v2.28.

Откройте каталог и найдите самый новый архив (его название должно начинаться с util-linux- и заканчиваться расширением .tar.gz). На данный момент наиболее актуальным является util-linux-2.28.1.tar.gz. Кликните правой кнопкой и скопируйте ссылку в буфер обмена.

Вернитесь на сервер и откройте каталог /tmp. С помощью утилиты curl или wget загрузите необходимый файл.

cd /tmp
curl -LO https://www.kernel.org/pub/linux/utils/util-linux/v2.28/util-linux-2.28.1.tar.gz

tar xzvf util-linux*

Теперь исходный код можно скомпилировать.

Настройка и компиляция исходного кода

Откройте извлечённый каталог:

Теперь нужно настроить программное обеспечение. Создайте бинарный файл для fstrim.

Для этого необходимо включить статические ссылки и отключить расшаренные библиотеки. Введите:

./configure —enable-static —disable-shared

Чтобы скомпилировать утилиту fstrim, введите:

Скопируйте бинарный файл в каталог, который не указан в PATH. Этот файл будет вызываться только демоном cron, потому нужно убедиться, что он не будет конфликтовать со стандартной утилитой fstrim.

Создайте каталог /cron-bin и переместите в него бинарный файл:

sudo mkdir /cron-bin
sudo cp /tmp/util-linux*/fstrim /cron-bin

Теперь у вас есть доступ к пользовательской версии утилиты fstrim.

Настройка cron

Теперь нужно создать новый сценарий, который будет запускаться демоном cron.

Это делается почти так же, как в Ubuntu 16.04 (нужно также указать место хранения бинарного файла).

sudo nano /etc/cron.weekly/fstrim

Вставьте в него следующие строки. Это включит поддержку флага –all:

#!/bin/sh
# trim all mounted file systems which support it
/cron-bin/fstrim —all || true

Сохраните и закройте файл.

Сделайте сценарий исполняемым.

sudo chmod a+x /etc/cron.weekly/fstrim

Демоны cron и anacron смогут использовать этот сценарий для выполнения проверки TRIM.

Заключение

Теперь сервер Linux запускает TRIM раз в неделю. Команда TRIM увеличивает производительность и уменьшает износ SSD-устройств.

Источник

Оцените статью