Если первые 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
# smartctl --scan -d nvme
/dev/nvme0 -d nvme # /dev/nvme0, NVMe device
/dev/nvme1 -d nvme # /dev/nvme1, NVMe device
# 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”.