Solid state drive (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
Solid state drive
. Дата последней синхронизации: 15 октября 2022. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
Ссылки по теме
Solid state drive/NVMe
Очистка ячеек памяти SSD
Benchmarking (Русский)
Увеличение производительности#Устройства хранения
В этой статье рассматриваются особенности работы с
твердотельными накопителями
(SSD) и другими устройствами хранения данных на основе флэш-памяти. Если вы хотите разбить SSD на разделы для конкретной цели, возможно, стоит изучить
список файловых систем, оптимизированных для флеш-памяти
. Для обычного использования можно использовать любую предпочитаемую вами
файловую систему
.
Использование
TRIM
Большинство твердотельных накопителей поддерживает
команду ATA_TRIM
для обеспечения стабильной долгосрочной производительности и выравнивания износа.
Статья на TechSpot
приводит сравнение производительности до и после заполнения SSD данными.
Начиная с версии 3.8 ядра Linux, поддержка TRIM постоянно добавлялась для различных
файловых систем
. Ориентировочный обзор приведён в следующей таблице:
File system
Непрерывный TRIM
(опция
discard
)
Периодический TRIM
(
fstrim
)
Ссылки
и примечания
Btrfs
Да
Да
exFAT
Да
Да
fstrim
поддерживается с версии ядра 5.13,
[1]
ext3
Да
Да
ext4
Да
Да
"discard, nodiscard(*)" в
[2]
F2FS
Да
Да
JFS
Да
Да
[3]
NILFS2
Да
Да
NTFS-3G
Нет
Да
с версии 2015.3.14,
[4]
VFAT
Да
Да
fstrim
поддерживается с версии ядра 4.19,
[5]
XFS
Да
Да
[6]
Важно
Убедитесь, что ваш SSD поддерживает TRIM, прежде чем пытаться использовать его, иначе возможна потеря данных!
Проверить поддержку TRIM можно с помощью команды:
$ lsblk --discard
Проверьте значения столбцов DISC-GRAN (discard granularity) и DISC-MAX (discard max bytes). Ненулевые значения означают поддержку TRIM.
Другой вариант —
установить
пакет
hdparm
и выполнить команду:
# hdparm -I /dev/sda | grep TRIM
*    Data Set Management TRIM supported (limit 1 block)
Примечание
Спецификация определяет различные типы поддержки TRIM. Следовательно, вывод может отличаться в зависимости от того, что поддерживает диск. Смотрите
Wikipedia:Trim (computing)#ATA
для более подробной информации.
Периодический TRIM
Пакет
util-linux
предоставляет systemd-службу
fstrim.service
, а также таймер
fstrim.timer
, который вы можете
включить
. Он настроен на еженедельное включение службы. Служба выполняет
fstrim(8)
на всех смонтированных файловых системах на устройствах, поддерживающих операцию
discard
.
Таймер полагается на метку времени
/var/lib/systemd/timers/stamp-fstrim.timer
(которую он создаст при первом запуске), чтобы проверять, прошла ли неделя с момента его последнего запуска. Поэтому нет необходимости беспокоиться о слишком частых вызовах, как это бывает с
anacron
.
Посмотреть статус юнитов можно в
журнале
. Чтобы изменить периодичность таймера или выполнения команд,
отредактируйте
файлы юнитов.
Непрерывный TRIM
Примечание
Нет необходимости включать непрерывный TRIM, если вы периодически запускаете
fstrim
. Если вы хотите использовать TRIM, используйте либо периодический TRIM, либо непрерывный TRIM.
Вместо того чтобы выдавать команды TRIM время от времени (по умолчанию раз в неделю при использовании
fstrim.timer
), можно также выдавать команды TRIM при каждом удалении файлов. Этот вариант известен как непрерывный TRIM.
Важно
До
SATA 3.1
все команды TRIM выполнялись без очереди, поэтому непрерывный TRIM приводил к частым зависаниям системы. В этом случае
#Периодический TRIM
является более хорошей альтернативой. Аналогичная проблема существует и для ряда устройств (смотрите
ata_device_blacklist
в
исходном коде Linux
), для которых выполнение команд TRIM через очередь было запрещено из-за повреждения данных. На таких устройствах система может быть вынуждена отправлять на SSD команды TRIM без использования очереди. Смотрите
Wikipedia:Trim (computing)#Disadvantages
для более подробной информации.
Примечание
Continuous TRIM не является наиболее предпочтительным способом подачи команд TRIM в сообществе Linux. Например, Ubuntu включает периодический TRIM по умолчанию
[7]
, Debian не рекомендует использовать
непрерывный TRIM
, а Red Hat рекомендует использовать периодический TRIM вместо непрерывного TRIM, если это возможно
[8]
.
Использование опции монтирования
discard
в
/etc/fstab
включает непрерывный TRIM в операциях с устройствами:
/dev/sda1  /           ext4  defaults,
discard
0  1
Примечание
Использование опции discard в
/etc/fstab
не работает для раздела
/
с файловой системой XFS. Согласно
этой теме
, она должна быть установлена с помощью
параметра ядра
rootflags=discard
.
В файловой системе ext4 флаг
discard
также может быть установлен как
опция монтирования по умолчанию
с помощью
tune2fs
:
# tune2fs -o discard /dev/sd
XY
Использование опций монтирования по умолчанию вместо записи в
/etc/fstab
особенно полезно для внешних дисков, поскольку такой раздел будет монтироваться с опциями по умолчанию и на других машинах. Таким образом, нет необходимости редактировать
/etc/fstab
на каждой машине.
Примечание
Опции монтирования, которые используются по умолчанию, не видны в
/proc/mounts
.
Выполнение TRIM на устройстве целиком
Если вы хотите очистить сразу весь SSD, например, перед новой установкой или продажей диска, можно использовать команду
blkdiscard
.
LVM
Запросы TRIM, передаваемые из файловой системы на логический том, автоматически передаются на физические томы. Дополнительная настройка не требуется.
По умолчанию ни одна операция
LVM
(
lvremove
,
lvreduce
и все остальные) не отправляет запросы TRIM на физические томы. Это сделано для того, чтобы можно было восстановить предыдущую конфигурацию группы томов с помощью
vgcfgrestore(8)
. Параметр
issue_discards
в
/etc/lvm/lvm.conf
управляет тем, посылаются ли запросы TRIM на физические тома, лежащие в основе логического тома, когда логический том больше не использует пространство физических томов.
Примечание
Внимательно прочитайте комментарий в
/etc/lvm/lvm.conf
перед изменением параметра
issue_discards
. Он никак не влияет на запросы TRIM, которые передаются от файловой системы к диску (например, удаление файлов внутри файловой системы), и не влияет на управление пространством в тонком пуле.
Важно
Включение
issue_discards
лишит возможности восстановления метаданных группы томов с помощью
vgcfgrestore
. Не будет никаких вариантов восстановления в случае ошибочно выполненной команды LVM.
dm-crypt
Важно
Опция discard позволяет передавать запросы TRIM на зашифрованное блочное устройство. Это может улучшить или не улучшить производительность SSD
[9]
, но имеет последствия для безопасности. Дополнительную информацию см. ниже:
Debian:SSDOptimization#Mounting SSD filesystems
dm-crypt/Specialties#Discard/TRIM support for solid state drives (SSD)
Для некорневых файловых систем добавьте опцию
discard
в файле
/etc/crypttab
для зашифрованных блочных устройств, расположенных на SSD (смотрите
dm-crypt/System configuration#crypttab
).
Для корневой файловой системы следуйте инструкциям из раздела
dm-crypt/Specialties#Discard/TRIM support for solid state drives (SSD)
, чтобы добавить нужный параметр ядра в конфигурацию загрузчика.
Максимизация производительности
Следуйте советам из раздела
Увеличение производительности#Устройства хранения
, чтобы максимально увеличить производительность дисков.
Размер сектора
Смотрите
Advanced Format#NVMe solid state drives
.
Очистка ячеек памяти SSD
Можно полностью сбросить ячейки SSD до начального состояния, восстановив таким образом
заводскую производительность записи
. Известно, что производительность записи со временем снижается даже на SSD со встроенной поддержкой TRIM: он работает только при удалении файлов, но не при замене, например, инкрементном сохранении.
Сброс можно выполнить, следуя соответствующей процедуре, описанной в статье
Очистка ячеек памяти SSD
, для
#SATA
или
#NVMe
.
Примечание
Если вы выполняете сброс ради очистки данных, вы можете усомниться в том, что контроллер SSD выполнит его безопасно, например, если вы не доверяете производителю или опасаетесь потенциальных ошибок. В этом случае смотрите дополнительную информацию и примеры ручного стирания в разделе
Securely wipe disk#Flash memory
.
Безопасность
Hdparm показывает состояние "frozen"
Прошивки некоторых материнских плат отправляют команду «security freeze» SATA-устройствам при инициализации. Аналогичным образом, прошивки некоторых SSD (и HDD) переходят в состояние «security freeze» уже с завода. В обоих случаях параметры безопасности пароля устройства устанавливаются в состояние
frozen
:
# hdparm -I /dev/sda
Security: 
 	Master password revision code = 65534
 		supported
 	not	enabled
not	locked
frozen
not	expired: security count
 		supported: enhanced erase
 	4min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
На операции вроде форматирования или установки операционной системы это не влияет.
Приведённый выше вывод показывает, что устройство не заблокировано паролем HDD при загрузке (
not locked
), а состояние
frozen
защищает устройство от вредоносных программ, которые могут попытаться заблокировать его, установив на него пароль во время работы.
Если вы хотите установить пароль на устройство в состоянии «frozen», необходимо, чтобы BIOS материнской платы поддерживал эту функцию. Многие ноутбуки имеют такую поддержку, поскольку она требуется для
аппаратного шифрования
, но поддержка может оказаться нетривиальной для настольных/серверных плат. Например, в материнской плате Intel DH67CL/BL для доступа к настройкам необходимо перевести её в «режим обслуживания» с помощью физической перемычки (
[10]
,
[11]
).
Важно
Не пытайтесь изменить вышеуказанные настройки безопасности с помощью
hdparm
, если вы точно не знаете, что делаете.
Если вы собираетесь стереть SSD, смотрите статьи
Securely wipe disk#hdparm
и
Очистка ячеек памяти SSD
.
Перевод SSD в состояние "frozen" после возвращения из ждущего режима
После возвращения из ждущего режима SSD обычно теряет состояние «frozen», что делает его уязвимым для команд
ATA SECURE ERASE
, подобных тем, что описаны в статье
Очистка ячеек памяти SSD
.
Чтобы предотвратить эту проблему, можно запустить скрипт
после пробуждения от сна
:
/usr/lib/systemd/system-sleep/ssd-freeze.sh
#!/bin/sh
if [ "$1" = 'post' ]; then
	sleep 1
	if hdparm --security-freeze /dev/disk/by-id/
ata-name-of-disk
; then
		logger "$0: SSD freeze command executed successfully"
	else
		logger "$0: SSD freeze command failed"
	fi	
fi
Аппаратное шифрование
Как отмечалось в разделе
#Hdparm показывает состояние "frozen"
, установка пароля для устройства хранения данных (SSD/HDD) в BIOS может также инициализировать аппаратное шифрование поддерживающих его устройств. Если устройство также соответствует стандарту OPAL, это может быть достигнуто и без соответствующей функции BIOS для установки парольной фразы; смотрите статью
Self-encrypting drives
.
Решение проблем
Возможно, что проблема, с которой вы столкнулись, является ошибкой прошивки, не связанной с Linux, поэтому прежде чем пытаться устранить проблему, затрагивающую SSD-устройство, сначала проверьте, доступны ли обновления для:
Прошивки SSD
Прошивки BIOS/UEFI материнской платы
Даже если это ошибка прошивки, ее можно избежать, поэтому если обновления прошивки нет или вы не решаетесь обновить прошивку, вам может помочь следующее.
Решение ошибок NCQ
Некоторые SSD и чипсеты SATA не работают должным образом с Linux Native Command Queueing (NCQ). Характерные ошибки выглядят в
dmesg
следующим образом:
[ 9.115544] ata9: exception Emask 0x0 SAct 0xf SErr 0x0 action 0x10 frozen
[ 9.115550] ata9.00: failed command: READ FPDMA QUEUED
[ 9.115556] ata9.00: cmd 60/04:00:d4:82:85/00:00:1f:00:00/40 tag 0 ncq 2048 in
[ 9.115557] res 40/00:18:d3:82:85/00:00:1f:00:00/40 Emask 0x4 (timeout)
Чтобы отключить NCQ при загрузке, добавьте
libata.force=noncq
в командную строку ядра в настройках
загрузчика
. Чтобы отключить NCQ только для определённого устройства (например, для диска 0 на порту 9), используйте
libata.force=9.00:noncq
Также можно отключить NCQ для определённого диска без перезагрузки через sysfs:
# echo 1 > /sys/block/sdX/device/queue_depth
Если это (а также обновление прошивки) не решит проблему или вызовет другие проблемы, то
отправьте сообщение об ошибке
.
Решение ошибок, связанных с управлением питанием SATA
У некоторых SSD (например, Transcend MTS400) возникают проблемы при включенном управлении питанием SATA Active Link Power Management,
ALPM
.
ALPM отключен по умолчанию и включается демоном энергосбережения (например,
TLP
,
Laptop Mode Tools
).
Если вы начинаете сталкиваться с ошибками, связанными с SATA, при использовании такого демона, попробуйте отключить ALPM, установив его состояние в
max_performance
и для профиля работы от батареи, и для профиля работы от сети.
Внешний SSD с поддержкой TRIM
Чипы некоторых USB-SATA мостов (например, VL715, VL716 и т.д.), а также USB-PCIe (например,
JMicron JMS583
, используемые во внешних NVMe, таких как
IB-1817M-C31
) поддерживают TRIM-подобные команды, которые могут быть отправлены через драйвер
USB Attached SCSI
(под именем «uas» в Linux).
Но ядро может не обнаружить эту возможность автоматически и из-за этого не использовать её.
Например, если ваше блочное устройство — это /dev/sdX, вы можете узнать, так ли это, выполнив команду
# sg_readcap -l /dev/sdX
Если в её выводе вы найдёте строку «Logical block provisioning: lbpme=0», значит ядро предполагает, что устройство не поддерживает "
Logical Block Provisioning Management
", поскольку бит (LBPME) не установлен.
Если это так, то вам следует выяснить, есть ли в
странице «Vital Product Data» (VPD) в разделе «Logical Block Provisioning»
вашего устройства информация о поддерживаемых механизмах разметки данных. Это можно сделать с помощью команды:
# sg_vpd -a /dev/sdX
Найдите в выводе строки, которые выглядят следующим образом:
Unmap command supported (LBPU): 1
Write same (16) with unmap bit supported (LBPWS): 0
Write same (10) with unmap bit supported (LBPWS10): 0
Этот пример говорит о том, что устройство поддерживает команду «UNMAP».
Взгляните на вывод
$ cat /sys/block/sdX/device/scsi_disk/*/provisioning_mode
Если ядро не обнаружило поддержку unmap, то, скорее всего, будет возвращено значение «full».
Кроме «full», драйвер накопителей SCSI в настоящее время знает следующие значения для provisioning_mode:
unmap
writesame_16
writesame_10
writesame_zero
disabled
Для приведённого выше примера теперь можно записать «unmap» в «provisioning_mode», чтобы попросить ядро использовать этот режим:
# echo "unmap" >/sys/block/sdX/device/scsi_disk/*/provisioning_mode
Это сразу же позволит вам использовать такие инструменты, как «blkdiscard» на /dev/sdX или «fstrim» на примонтированных файловых системах, расположенных на /dev/sdX.
Если вы хотите автоматически включать «provisioning_mode» при подключении внешнего устройства определённого производителя/продукта, это можно автоматизировать с помощью
udev
. Сначала найдите идентификаторы производителя и продукта USB:
$ cat /sys/block/sdX/../../../../../../idVendor
$ cat /sys/block/sdX/../../../../../../idProduct
Затем создайте или добавьте в файл правил
udev
(пример здесь использует idVendor 152d и idProduct 0583):
# echo 'ACTION=="add|change", ATTRS{idVendor}=="152d", ATTRS{idProduct}=="0583", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"' >>/etc/udev/rules.d/10-uas-discard.rules
(Вы также можете использовать команду
lsusb
для поиска соответствующего idVendor/idProduct).
Прошивка
Если поддерживается производителем устройства, рекомендуется обновить прошивку с помощью утилиты
fwupd
.
ADATA
У ADATA есть утилита, доступная для Linux (i686) на
странице поддержки
[
устаревшая ссылка
2024-12-15 ⓘ]
. Ссылка на последнюю версию прошивки появится после выбора модели. Последняя утилита обновления для Linux упакована вместе с прошивкой и должна быть запущена от имени root. Возможно, сначала потребуется установить правильные права на исполняемый файл.
Crucial
Crucial предоставляет возможность обновления прошивки с помощью ISO-образа. Эти образы можно найти после выбора продукта на
странице поддержки SSD
и загрузки "Manual Boot File".
Примечание
ISO-образы, предоставляемые компанией Crucial, не являются гибридными. Если вы просто скопируете образ на какое-нибудь устройство с помощью
dd
, на нём будет отсутствовать
MBR
и загрузиться с него не получится.
Владельцы модели M4 Crucial могут проверить необходимость обновления прошивки с помощью команды
smartctl
.
$ smartctl --all /dev/sd
X
==> WARNING: This drive may hang after 5184 hours of power-on time:
https://www.tomshardware.com/news/Crucial-m4-Firmware-BSOD,14544.html
See the following web page for firmware updates:
https://www.crucial.com/usa/en/support-ssd
Если вы увидели это предупреждение — сделайте резервную копию важных данных и
немедленно обновите прошивку
. Смотрите
инструкцию
, как обновить прошивку Crucial MX100 с помощью ISO-образа и Grub.
Intel
У Intel есть
Firmware Update Tool
для операционных систем, не совместимых с Windows
Intel® Memory and Storage Tool (GUI)
.
Существует также более новая утилита командной строки для Linux для перепрошивки под названием
Intel Memory and Storage (MAS) Tool
, доступная в AUR как
intel-mas-cli-tool
AUR
(
документация
[
устаревшая ссылка
2024-07-30 ⓘ]
).
Пример проверки состояния прошивки:
# intelmas show -intelssd 0
DevicePath : /dev/nvme0n1
DeviceStatus : Healthy
Firmware : 002C
FirmwareUpdateAvailable : The selected Intel SSD contains current firmware as of this tool release.
-intelssd 0
можно опустить, если в системе только один SSD Intel, или передать
1
для второго SSD, и так далее.
Если обновление доступно, оно выполняется путём запуска
intelmas load -intelssd 0
. В документации указано, что в Linux эту процедуру нужно выполнить дважды, с отключением и повторным включением питания между выполнениями. Последняя версия прошивки для всех устройств распространяется как часть MAS Tool, поэтому её не нужно скачивать отдельно.
Kingston
Для накопителей на базе Sandforce на AUR доступен инструмент KFU,
kingston_fw_updater
AUR
.
Mushkin
Менее известные твердотельные накопители марки Mushkin также используют контроллеры Sandforce и имеют утилиту Linux (почти идентичную Kingston) для обновления прошивки.
OCZ
У OCZ есть
Command Line Online Update Tool (CLOUT)
, доступный для Linux. AUR предоставляет
ocz-ssd-utility
AUR
,
ocztoolbox
AUR
и
oczclout
AUR
.
Samsung
Хотя Samsung считает методы обновления прошивки, не поддерживаемые программным обеспечением Magician, "неподдерживаемыми", они
могут
работать. Программа Magician может создать загрузочный USB-накопитель, содержащий обновление прошивки, однако Samsung больше не предоставляет это программное обеспечение для потребительских SSD. Samsung также предоставляет готовые
загрузочные ISO-образы
, которые можно использовать для обновления прошивки. Другой вариант - использовать утилиту Samsung
magician
(пакет
samsung_magician-consumer-ssd
AUR
). Magician поддерживает только SSD под маркой Samsung; SSD, которые производит Samsung для OEM-производителей (например, Lenovo), не поддерживаются.
Примечание
Samsung вообще не даёт понять, что они действительно предоставляют их. Похоже, что у них есть 4 разные страницы обновления прошивки, и каждая из них ссылается на разные способы выполнения действий.
Пользователи, предпочитающие запускать обновление прошивки с Live USB, созданного через Linux (без использования программы Magician от Samsung на Microsoft Windows), могут обратиться к
[12]
за более подробной информацией.
Обновление под Linux
Прошивку твердотельного накопителя можно обновить из обычного Linux (без создания загрузочного USB-накопителя), как показано ниже. Сначала посетите страницу
Samsung downloads page
, перейдите в раздел «Samsung SSD Firmware» и загрузите последнюю версию прошивки для вашего SSD - это должен быть ISO-образ.
Примечание
В некоторых ISO-образах отсутствует
initrd
образ Linux, упомянутый ниже. Смотрите раздел
#Старые SSD
вместо этого.
Извлеките
initrd
образ Linux из ISO-образа:
$ bsdtar xf
samsung_ssd_firmware
.iso initrd
Извлеките
root/fumagician/
. Этот каталог содержит файлы обновления прошивки:
$ bsdtar xf initrd root/fumagician
Наконец, запустите
root/fumagician/fumagician
с правами root и перезагрузитесь (если прошивка была успешно обновлена).
Старые SSD
Некоторые ISO-образы прошивок SSD содержат образ FreeDOS вместо Linux-образа
initrd
, поэтому шаги, необходимые для обновления прошивки SSD, отличаются от описанных выше. В следующей таблице перечислены эти SSD (и соответствующие пути):
Модель SSD
Путь к образу FreeDOS
Путь к прошивке
470, 830
BTDSK.IMG
SSR/
840
isolinux/btdsk.img
samsung/DSRD/
840 EVO (mSATA), Pro
ISOLINUX/BTDSK.IMG
Сначала извлеките образ FreeDOS из ISO-образа:
$ bsdtar xf
samsung_ssd_firmware
.iso
freedos_image_path
.
Смонтируйте образ FreeDOS в
/mnt/
:
# mount
freedos_image_path
/mnt
Получите номер диска SSD под
Disk Number
из утилиты управления SSD Magician:
# magician --list
Обновите прошивку SSD для указанного диска, указав путь к пакету прошивки:
# magician --disk
disk_num
--firmware-update --fwpackage-path /mnt/
firmware_package_path
Наконец, убедитесь, что прошивка была успешно обновлена, проверив версию в разделе
Firmware
из вывода
magician --list
(запускать с правами root). В случае положительного ответа перезагрузите систему.
SanDisk
SanDisk создаёт ISO-образы с прошивками, чтобы можно было обновлять прошивку SSD в операционных системах, которые не поддерживает SanDisk SSD Toolkit.
Нужно выбрать прошивку для правильной
модели
SSD
и
правильной
ёмкости
(например, 60 ГБ,
или
256 ГБ). После записи ISO-образа просто загрузитесь с созданного загрузочного диска CD/DVD (может работать и с USB-накопителя).
Образы iso содержат только ядро linux и initrd. Распакуйте их в раздел
/boot
и загрузитесь с помощью
GRUB
или
Syslinux
для обновления прошивки.
Смотрите также:
SanDisk Extreme SSD
Заметки о выпуске прошивки
[
устаревшая ссылка
2024-12-15 ⓘ]
и
Руководство по обновлению прошивки версии R211
[
устаревшая ссылка
2024-12-15 ⓘ]
.
SanDisk Ultra SSD
Заметки о выпуске прошивки
[
устаревшая ссылка
2024-12-15 ⓘ]
и
Руководство по обновлению прошивки версии 365A13F0
[
устаревшая ссылка
2024-12-15 ⓘ]
SanDisk Ultra+ SSD
Заметки о выпуске прошивки
[
устаревшая ссылка
2024-12-15 ⓘ]
и
Руководство по обновлению прошивки версии X2316RL
[
устаревшая ссылка
2024-12-15 ⓘ]
— используйте
smartctl -a /dev/sdX
, чтобы определить, используется ли модель «H2» или «HP».
Смотрите также
Обсуждение на Reddit об установке Arch на SSD
Re: Варьирование Leafsize и Nodesize в Btrfs
Re: Выравнивание SSD и размер сектора в Btrfs
Erase Block (Alignment) Misinformation?
Нужно ли выравнивание по размеру блока стирания для современных SSD?
Поддержка Btrfs для эффективной работы SSD (выравнивание блоков данных)
SSD, Erase Block Size & LVM: PV на raw-устройстве, выравнивание