По данным Intel, важно, чтобы блоки не отбрасывались при создании файловой системы Linux на твердотельном диске. В документе указано, что поведение по умолчанию ( mke2fs
в марте 2015 г.) — не отбрасывать блоки. Однако текущая mke2fs
страница руководства гласит, что:
отказаться:Попытайтесь сбросить блоки во время mkfs (сброс блоков изначально полезен на твердотельных устройствах и разреженных/тонко-выделенных хранилищах). Когда устройство объявляет, что сброс также обнуляет данные (любое последующее чтение после сброса и перед записью возвращает ноль), то пометьте все еще не обнуленные таблицы inode как обнуленные. Это значительно ускоряет инициализацию файловой системы.Это установлено по умолчанию..
Когда я форматирую SSD вручную, я могу предотвратить отбрасывание блоков во время форматирования, добавив -E nodiscard
в mke2fs
командную строку, но поскольку установщики дистрибутивов автоматические, сделать это невозможно. Стоит ли об этом беспокоиться?
решение1
Связанный документ, по-видимому, служит конкретной цели (разработка драйвера NVME для ядра Linux и тестирование производительности) и не представляет собой общие рекомендации для конечных пользователей.
Утверждается, что ext4 не сбрасывает данные во время mkfs...
Основные файловые системы:
- ext4 — расширенная опция по умолчанию — не отбрасывать блоки во время создания файловой системы, сохраните ее и не добавляйте расширенную опцию «отбрасывать», хотя в некоторой информации вам будет предложено сделать это.
- xfs – в mkfs.xfs добавьте опцию –K, чтобы не отбрасывать блоки.
...и все же это происходит. Это первое, что он делает.
# mkfs.ext4 /dev/loop0
mke2fs 1.46.4 (18-Aug-2021)
Discarding device blocks: done
Creating filesystem [...]
Поэтому, если вы не хотите сбрасывать все данные, вам необходимо активно предотвратить это, для xfs используя mkfs.xfs -K
, как предлагается, для ext4 с помощью mkfs.ext4 -E nodiscard
.
# mkfs.ext4 -E nodiscard /dev/loop0
mke2fs 1.46.4 (18-Aug-2021)
Creating filesystem [...]
Я не знаю, менялось ли поведение по умолчанию когда-либо. Насколько я могу судить, оно всегда было по умолчанию. До того, как появились опции -E discard,nodiscard, была также опция -K для сохранения данных (отключение default-on discard) без соответствующей опции для включения discard, если бы она была отключена по умолчанию.
На странице руководства когда-то утверждалось, что nodiscard является значением по умолчанию, но я не вижу отражения этого в коде где-либо в истории коммитов, так что, возможно, это связано с ошибкой документации.
mke2fs: Отменить опцию -K, ввести discard/nodiscard
(На самом деле, в этом коммите одновременно утверждалось, что discard и nodiscard являются значениями по умолчанию.)
Было бы здорово, если бы nodiscard был по умолчанию, а fstrim не был бы доступен до следующей недели. Linux слишком быстро сбрасывает ваши данные. Отформатируйте неправильное устройство, и даже если вы сразу заметите свою ошибку, будет уже слишком поздно выполнять какое-либо восстановление данных.
решение2
Сразу скажу: не особо верю.
Этот документ устарел и может быть неточным.
Кроме того, это может быть просто неверно; исторически было много недопонимания по этому поводу, и люди, пишущие руководства, не обязательно те же самые, что и люди, вносящие вклад в ядро Linux из той же компании. Ситуация действительно сложная — оптимизация для одного SSD может быть худшим, что можно сделать для другого, и производители чипсетов не нашли способа сообщить предпочтения своих контроллеров.
Однако функциональность сброса NVMe давно стандартизирована (Intel участвовала — на самом деле, доминировала — в этом), и это ее предполагаемое использование, поэтому я был бы довольно удивлен, если бы она не была «хорошей».
В целом, использование discard дает SSD больше информации — что он с ней делает, зависит от SSD. Так что, работая хуже с большим количеством информации, которую вы могли бы просто игнорировать: это на самом деле проблема прошивки контроллера SSD, а не проблема драйвера. Держу пари, что Intel, будучи очень заинтересованной в хорошей поддержке в центрах обработки данных Linux, давно исправила эту проблему.