Solid state drive (Русский)
В этой статье рассматриваются особенности работы с твердотельными накопителями (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][устаревшая ссылка 2024-10-12 ⓘ] |
Проверить поддержку 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
Пакет util-linux предоставляет systemd-службу fstrim.service
, а также таймер fstrim.timer
, который вы можете включить. Он настроен на еженедельное включение службы. Служба выполняет fstrim(8) на всех смонтированных файловых системах на устройствах, поддерживающих операцию discard.
Таймер полагается на метку времени /var/lib/systemd/timers/stamp-fstrim.timer
(которую он создаст при первом запуске), чтобы проверять, прошла ли неделя с момента его последнего запуска. Поэтому нет необходимости беспокоиться о слишком частых вызовах, как это бывает с anacron.
Посмотреть статус юнитов можно в журнале. Чтобы изменить периодичность таймера или выполнения команд, отредактируйте файлы юнитов.
Непрерывный TRIM
fstrim
. Если вы хотите использовать TRIM, используйте либо периодический TRIM, либо непрерывный TRIM.Вместо того чтобы выдавать команды TRIM время от времени (по умолчанию раз в неделю при использовании fstrim.timer
), можно также выдавать команды TRIM при каждом удалении файлов. Этот вариант известен как непрерывный TRIM.
ata_device_blacklist
в исходном коде Linux), для которых выполнение команд TRIM через очередь было запрещено из-за повреждения данных. На таких устройствах система может быть вынуждена отправлять на SSD команды TRIM без использования очереди. Смотрите Wikipedia:Trim (computing)#Disadvantages для более подробной информации.Использование опции монтирования discard
в /etc/fstab
включает непрерывный TRIM в операциях с устройствами:
/dev/sda1 / ext4 defaults,discard 0 1
/etc/fstab
не работает для раздела /
с файловой системой XFS. Согласно этой теме, она должна быть установлена с помощью параметра ядра rootflags=discard
.В файловой системе ext4 флаг discard
также может быть установлен как опция монтирования по умолчанию с помощью tune2fs:
# tune2fs -o discard /dev/sdXY
Использование опций монтирования по умолчанию вместо записи в /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
в файле /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.
Безопасность
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-устройство, сначала проверьте, доступны ли обновления для:
Даже если это ошибка прошивки, ее можно избежать, поэтому если обновления прошивки нет или вы не решаетесь обновить прошивку, вам может помочь следующее.
Решение ошибок 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) на странице поддержки. Ссылка на последнюю версию прошивки появится после выбора модели. Последняя утилита обновления для Linux упакована вместе с прошивкой и должна быть запущена от имени root. Возможно, сначала потребуется установить правильные права на исполняемый файл.
Crucial
Crucial предоставляет возможность обновления прошивки с помощью ISO-образа. Эти образы можно найти после выбора продукта на странице поддержки SSD и загрузки "Manual Boot File".
dd
, на нём будет отсутствовать MBR и загрузиться с него не получится.Владельцы модели M4 Crucial могут проверить необходимость обновления прошивки с помощью команды smartctl
.
$ smartctl --all /dev/sdX
==> 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-toolAUR (документация[устаревшая ссылка 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_updaterAUR.
Mushkin
Менее известные твердотельные накопители марки Mushkin также используют контроллеры Sandforce и имеют утилиту Linux (почти идентичную Kingston) для обновления прошивки.
OCZ
У OCZ есть Command Line Online Update Tool (CLOUT), доступный для Linux. AUR предоставляет ocz-ssd-utilityAUR, ocztoolboxAUR и oczcloutAUR.
Samsung
Хотя Samsung считает методы обновления прошивки, не поддерживаемые программным обеспечением Magician, "неподдерживаемыми", они могут работать. Программа Magician может создать загрузочный USB-накопитель, содержащий обновление прошивки, однако Samsung больше не предоставляет это программное обеспечение для потребительских SSD. Samsung также предоставляет готовые загрузочные ISO-образы, которые можно использовать для обновления прошивки. Другой вариант - использовать утилиту Samsung magician (пакет samsung_magician-consumer-ssdAUR). Magician поддерживает только SSD под маркой Samsung; SSD, которые производит Samsung для OEM-производителей (например, Lenovo), не поддерживаются.
Пользователи, предпочитающие запускать обновление прошивки с Live USB, созданного через Linux (без использования программы Magician от Samsung на Microsoft Windows), могут обратиться к [12] за более подробной информацией.
Обновление под Linux
Прошивку твердотельного накопителя можно обновить из обычного Linux (без создания загрузочного USB-накопителя), как показано ниже. Сначала посетите страницу Samsung downloads page, перейдите в раздел «Samsung SSD Firmware» и загрузите последнюю версию прошивки для вашего SSD - это должен быть 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 Заметки о выпуске прошивки и Руководство по обновлению прошивки версии R211.
- SanDisk Ultra SSD Заметки о выпуске прошивки и Руководство по обновлению прошивки версии 365A13F0
- SanDisk Ultra+ SSD Заметки о выпуске прошивки и Руководство по обновлению прошивки версии X2316RL — используйте
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-устройстве, выравнивание