Jump to content
From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Solid state drive. Дата последней синхронизации: 15 октября 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Ссылки по теме

- Solid state drive/NVMe
- Очистка ячеек памяти SSD
- Benchmarking (Русский)
- Увеличение производительности#Устройства хранения
- Flashcache

В этой статье рассматриваются особенности работы с твердотельными накопителями (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/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 позволяет передавать запросы 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][устаревшая ссылка 2023-07-30 ⓘ]).

Важно: Не пытайтесь изменить вышеуказанные настройки безопасности с помощью `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) на странице поддержки. Ссылка на последнюю версию прошивки появится после выбора модели. Последняя утилита обновления для Linux упакована вместе с прошивкой и должна быть запущена от имени root. Возможно, сначала потребуется установить правильные права на исполняемый файл.

### Crucial

Crucial предоставляет возможность обновления прошивки с помощью ISO-образа. Эти образы можно найти после выбора продукта на странице поддержки SSD и загрузки "Manual Boot File".

Примечание: ISO-образы, предоставляемые компанией Crucial, не являются гибридными. Если вы просто скопируете образ на какое-нибудь устройство с помощью `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 (документация).

Пример проверки состояния прошивки:

    # 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), не поддерживаются.

Примечание: 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 Заметки о выпуске прошивки и Руководство по обновлению прошивки версии 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-устройстве, выравнивание

Category:

- Storage (Русский)

Hidden category:

- Pages with dead links