Возможности подсистемы хранения данных одноплатного компьютера Raspberry Pi можно расширить, подключив к нему NVMe-диск. Такие диски обычно подключают к PCIe, что даёт им потенциальную возможность считывать и записывать данные на скорости более 3000 Мб/с.

Я уже слышу слова критиков этой идеи, в частности, касающиеся реально достижимой скорости работы с данными, поэтому сразу сделаю оговорку.

Раскрыть весь потенциал NVMe-накопителя на Raspberry Pi 4 не удастся. Но у NVMe-диска есть пара преимуществ перед обычной SD-картой. Это — надёжность и скорость. Покупка подобного диска и адаптера к нему не потребует заметно больше средств, чем покупка более старого диска M.2. А если понадобится, то NVMe-диску можно найти и другое применение (ниже, при разговоре о CM4, я ещё к этому вернусь).



Если у вас имеется внешний SSD с интерфейсом USB или M.2-диск, то вы тоже можете воспользоваться этим руководством.

Поиск и сборка аппаратных компонентов


Вот список компонентов, которые использованы в этом проекте:

  • Raspberry Pi 4 — в моём случае — версия с 8 Гб памяти.
  • Официальный источник питания.
  • SD-карта — карта размером 16-32 Гб нас вполне устроит.
  • Кардридер для SD-карт
  • USB-адаптер NVMe — обратите внимание на то, чтобы это была модель, поддерживающая USB3. Иначе скорость работы с данными будет ниже.
  • NVMe-диск — M.2-диски выглядят почти так же, но у них две выемки, а не одна. Обычно скорость работы SSD-дисков измеряется сотнями Мб/с, а не тысячами.


Компоненты, готовые к сборке

Вставьте NVMe-диск в адаптер и подключите его к компьютеру для того чтобы быстро его проверить.


Внутренняя печатная плата не закреплена. Поэтому проверьте всё при открытом корпусе

Я мог бы выбрать и более быстрый диск, не WD Blue, а, например, Samsung EVO 970 Plus. Но такой диск дороже на ?50-60. Скорость передачи данных будет ограничена интерфейсом USB3 Raspberry Pi, поэтому тратиться на более быстрый диск смысла нет.

Настройка Raspberry Pi и тестирование диска


Загрузим 32-битную RaspiOS.

Мои инструкции должны сработать и на Ubuntu 20.04. Если при этом возникнут какие-то сложности — взгляните на этот материал.

Теперь запишем ОС на SD-карту, создадим файл boot.txt в первом разделе, подключим карту к Raspberry Pi и загрузимся. После этого подключимся к плате:

ssh pi@raspberrypi.local

Обновим систему:

sudo apt update -qy  && sudo apt upgrade -qy

Проверим версию загрузчика:

sudo vcgencmd bootloader_version
Sep  3 2020 13:11:43
version c305221a6d7e532693cc7ff57fddfc8649def167 (release)
timestamp 1599135103

Теперь включим загрузку с USB-накопителей, перейдя по пути Advanced Options > Boot Order > USB Boot.


Включение загрузки с USB-накопителей

Мы занимаемся настройкой Raspberry Pi, а поэтому нам ничто не мешает зайти в раздел настроек Options > GPU Memory и изменить размер видеопамяти с 65 Мб на 16 Мб. Если Raspberry Pi не используется для работы с графическими программами, то мы, благодаря этому, ничего не потеряем, а лишь вернём системе немного оперативной памяти.


А вы знали о том, что можно вернуть Raspberry Pi немного оперативной памяти?

Выключим Raspberry Pi.

Теперь воспользуемся компьютером, который применялся для записи ОС на SD-карту, или другим Raspberry Pi. Подключим к компьютеру NVMe-диск по USB и SD-карту с помощью кардридера. Я, для решения этой задачи, воспользовался компьютером Intel NUC с установленной на нём Linux.

После выполнения на этом компьютере команды lsblk должны быть выведены сведения о нашем диске:

alex@nuc7:~$ lsblk
NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sdb                   8:16   1  29.7G  0 disk
+-sdb1                8:17   1   256M  0 part
L-sdb2                8:18   1  29.5G  0 part
sdc                   8:32   0 465.8G  0 disk
+-sdc1                8:33   0   256M  0 part
L-sdc2                8:34   0  29.5G  0 part

Теперь отзеркалим SD-карту на NVMe-диск. При этом нужно очень внимательно следить за правильностью имён накопителей. Иначе можно перезаписать загрузочный диск компьютера, на котором осуществляется подготовка NVMe-диска к работе:

sudo -I
root@nuc7:~# time dd if=/dev/sdb of=/dev/sdc bs=1M

Теперь нужно загрузить Raspberry Pi по USB и попробовать подключиться к плате:

ssh pi@raspberrypi.local

Далее, установим hdparm для исследования производительности диска:

sudo apt install -qy hdparm

Проверим скорость работы диска.


Хороший прирост производительности в сравнении с SD-картой!

Попробуем записать на диск файл размером 500 Мб из памяти:

pi@raspberrypi:~ $ dd if=/dev/zero of=test bs=1048576 count=500
500+0 records in
500+0 records out
524288000 bytes (524 MB, 500 MiB) copied, 2.63385 s, 199 MB/s
pi@raspberrypi:~ $

Правда, если сравнить это с тем, что показывает Samsung EVO 970 Plus на моём шестиядерном Intel NUC, то это будет, так сказать, просто небо и земля.


Исследование производительности разных дисков и интерфейсов

Если посмотреть на скорость буферизованного чтения данных, то очевидным становится то, что интерфейс USB3 Raspberry Pi не даёт диску работать в полную силу:

  • M.2 SSD, подключённый по USB3 — 33,94 Мб/с
  • NVMe-диск, подключённый по USB3 — 344 Мб/с
  • NVMe в компьютере, подключённый по PCIe — 2531 Мб/с

Интересно то, что на той же операции SD-карта даёт результаты, которые лучше, чем результаты M.2 SSD, а именно — 43,35 Мб/с.

Тут хочется отметить то, что у нас есть шанс раскрыть потенциал NVMe-дисков тогда, когда широко распространится плата CM4 (Raspberry Pi Compute Module 4), имеющая один PCIe-канал. К ней можно будет напрямую подключать подобные диски. Вот видео, в котором идёт речь о CM4 и о различных возможностях ввода-вывода платы.

Итоги


Теперь в вашем распоряжении есть новое хранилище данных для Raspberry Pi, более быстрое и надёжное, чем SD-карта.

Планируете ли вы подключить NVMe-диск к Raspberry Pi?