SMART и NVMe

31 января 2020

Если первые SSD-диски (а) подключались к материнской плате через SATA-интерфейс (б) обслуживались в Линуксе стандартным драйвером SATA/SCSI и (в) были видны в системе как /dev/sda, /dev/sdb и т.д, то для NVMe-дисков ситуация изменилась.

Они не только подключаются через отдельный физический интерфейс M.2, но и обслуживаются отдельным драйвером, а в системе видны как /dev/nvme0, /dev/nvme1 и т.д.

В этом случае мы сталкиваемся с двумя тремя проблемами:

Во-первых, по умолчанию smartmontools ищет в /dev подкаталоги, создаваемые SATA-драйвером, но в системе без SATA-устройств этих каталогов не будет:

$ sudo smartctl --scan
# scan_smart_devices: glob(3) aborted matching pattern /dev/discs/disc*

Эту ошибку легко победить - достаточно создать пустой /dev/discs вручную.

Однако при перезагрузке содержимое /dev не сохраняется, поэтому данный каталог необходимо создавать автоматически перед каждым запуском smartd:

mkdir -p /etc/systemd/system/smartd.service.d/

echo '
# Visit https://cdnnow.ru/blog for new tips! 
[Service]
ExecStartPre=-/bin/mkdir -p /dev/discs
' > /etc/systemd/system/smartd.service.d/Mkdir-dev-discs.conf

systemctl daemon-reload

Теперь “smartctl --scan” перестанет выдавать ошибку, но её вывод будет пустым.

Это подводит нас к проблеме №2:

smartctl ищет автоматически только диски IDE и SCSI/SATA, но для поиска NVME-устройств надо указывать соответствующий тип явно:

# smartctl --scan
# smartctl --scan -d nvme
/dev/nvme0 -d nvme # /dev/nvme0, NVMe device
/dev/nvme1 -d nvme # /dev/nvme1, NVMe device

Ключ “-d nvme” требуется указывать не только в командной строке для smartctl, но и для smartd в директиве DEVICESCAN в файле /etc/smartd.conf.

Например, в Ubuntu 18.04 значение DEVICESCAN по умолчанию такое:

DEVICESCAN -d removable -n standby -m root -M exec /usr/share/smartmontools/smartd-runner

Результат: сервис smartd стартует с ошибкой и не увидит ни одного диска.

Правильный вариант для поддержки NVME должен быть таким:

DEVICESCAN -d nvme -n standby -m root -M exec /usr/share/smartmontools/smartd-runner

И это подводит нас к проблеме №3:

По умолчанию “smartctl --scan” и DEVICESCAN используют набор распространённых драйверов.

Но если используется ключ “-d”, то набор по умолчанию перестаёт использоваться и ищется только явно указанный тип.

Например:

  • с параметрами по умолчанию — видим SATA без NVME:
  • # smartctl --scan
    /dev/sda -d scsi # /dev/sda, SCSI device
    /dev/sdb -d scsi # /dev/sdb, SCSI device
    /dev/bus/0 -d megaraid,1 # /dev/bus/0 [megaraid_disk_01], SCSI device
  • явно включаем поиск NVME — перестаём видеть всё остальное:
  • # smartctl --scan -d nvme
    /dev/nvme0 -d nvme # /dev/nvme0, NVMe device
    /dev/nvme1 -d nvme # /dev/nvme1, NVMe device
  • явно включаем поиск SATA и NVME — видим всё:
  • # smartctl --scan -d nvme -d scsi
    /dev/sda -d scsi # /dev/sda, SCSI device
    /dev/sdb -d scsi # /dev/sdb, SCSI device
    /dev/bus/0 -d megaraid,1 # /dev/bus/0 [megaraid_disk_01], SCSI device
    /dev/nvme0 -d nvme # /dev/nvme0, NVMe device
    /dev/nvme1 -d nvme # /dev/nvme1, NVMe device

Поэтому на системе, использующей кроме NVME диски других типов, мы должны явно указывать в DEVICESCAN и аргументах “smartctl --scan” не только “-d nvme”, но и драйверы всех остальных устройств, включая те, которые без “-d” использовались автоматически.

Замечено, что при перестановке типов местами smartmontools могут перестать видеть тот или иной тип.
Например, на системе с SATA-дисками вторая команда отрабатывает правильно, а первая возвращает пустой список:

# smartctl --scan -d scsi -d nvme
# smartctl --scan -d nvme -d scsi
/dev/sda -d scsi # /dev/sda, SCSI device
/dev/sdb -d scsi # /dev/sdb, SCSI device

На системе с NVMe-дисками обе команды работают правильно.

Мы не сумели полностью победить эту проблему в Smartmontools 6.5 и использовали в /etc/smartd.conf раздельные настройки для систем с SATA- и NVMe-устройствами, но обновление до 7.0 её решило:

apt install -t bionic-backports smartmontools

Теперь “smartctl --scan” видит NVMe-устройства без дополнительных ключей, а DEVICESCAN в /etc/smartd.conf с ключами из дистрибутивных настроек, т.е. “-a” или “-d removable”.



← Назад в Блог

Подпишитесь на новые статьи: