Краткий обзор существующих решений
Большое количество разнообразных одноплатников или Single Board Computer (SBC), все чаще оснащаются PCIe интерфейсом, выведеным на FPC или M.2. Как правило количество лэйнов (lane) PCIe и максимально достижимая скорость зависят от конкретного процессора, установленного на SBC. Самые известные SBC, такие как Raspberry Pi 5, Orange Pi 5, Radxa Rock 5x, Banana BPI-Mx и другие, применяют ARM процессоры с контроллером PCIe Gen2 и PCIe Gen3. При этом у некоторых процессоров, например RK35xx, есть как комбинированные PCIe хосты для подключения USB3, SATA и PCIe Gen2, так и специализированные PCI Gen3.
Наличие PCIe интерфейса значительно расширяет возможности любого SBC по подключению самых разнообразных устройств. Чем больше портов может предоставить встроенный контроллер PCIe, тем больше устройств можно подключить. Если же портов окажется недостаточно, то можно добавить чип (микросхему) коммутатора PCIe.
Существует достаточно большое количество как просто проектов, так и законченных устройств на базе подобных SBC с применением PCIe. Уровень технической реализации и схемотехнических решений тоже разнообразен, хотя не стоит забывать, что речь идет про устройства с интерфейсом от 5Гбит/с до 8Гбит/с на лэйн.Чтобы как-то помочь энтузиастам с разработкой, Raspberry PI даже составило специальный документ - A 16-way PCIe FFC Connector Specification. Документ очень хороший получился, в результате теперь чего только не подключают к этому SBC, начиная от NVME и заканчивая AI ускорителями.
В отличие от Raspberry PI, китайские производители SBC, не предлагают подобных документов в помощь разработчикам. Хотя часто процессоры, которые они применяют, во многом выигрывают у процессора Raspberry PI. Поэтому, приходится ориентироваться исключительно на свой опыт, китайскую документацию и специализированные форумы.
О самом проекте портативного NAS
Чтобы как-то помочь в деле создания устройств на базе китайских одноплатников, хотелось бы поделиться своим опытом по разработке портативного NAS на основе платы Banana Pi BPI-M7:

До этого мы применяли только стандартные контроллеры или использовали референсные проекты для подключения дисков. В этот же раз, нам предстояло разработать кастомное решение, как в аппаратном, так и программном плане.
Ключевые особенности проекта - поддержка двух NVME M.2 в режиме 2x 2 lanes и габаритные размеры, сопоставимые с пачкой сигарет:

Два диска позволяют создать RAID 0 или RAID 1 в зависимости от того, что больше важно, надежность хранения или объем данных. Можно просто использовать два отдельных диска. В любом случае, даже понимая, что область применения это очень важная тема, в этой статье хочется остановиться все таки больше на технических вопросах.
Устройство портативного NAS
Одноплатник BPI-M7 построен на полноценном процессоре RK3588, у которого 4 лэйна PCIe Gen3 выведены на M.2 M-key для подключения одного NVME диска размером 2280:

Для подключения двух дисков пришлось разбить интерфейс на два отдельных интерфейса. Такая возможность существует благодаря тому, что процессор RK3588 поддерживает режим 2x 2 lanes, другими словами, два отдельных порта по два лэйна PCIe Gen3 в каждом порту. В теории даже два лэйна позволяют обмениваться с диском на скорости 16Гбит/с или 2ГБайт/с, что не мало:

Проблемы и решения
На языке технической документации, требуется установить режим без агрегации и без бифуркации:

Такой режим задается соответствующим полем [2:0] регистра pcie30_phy_mode. Если изначально для режима агрегации значение этого поля задавалось как 3’b100, то в данном случае необходимо его поменять на 3’b000:

Вместе со сменой режима на программном уровне, также меняется набор управляющих пинов для обслуживания NVME интерфейсов - Digital GPIO, как следует из таблицы выше.В этом есть определенная проблема, так как нужных пинов для работы с двумя NVME попросту нет.
Нужные пины, а это PEWAKE#, CLKREQ# и PERST#, уже задействованы для других целей. Однако, это не такая большая проблема, потому что часть этих пинов, такие как PEWAKE# и CLKREQ# является опцией, а оставшийся PERST# можно сформировать самим, либо управляя специальным пином уже как GPIO, либо добавив цепь аппаратного сброса. Так или иначе, получается довольно простая схема подключения двух NVME дисков к одному M.2:

У одноплатника BPI-M7 на сайте Armbian есть официальная страница. Поэтому, для внесения изменений в device tree существующего образа BPI-M7, мы решили связаться с поддержкой производителя. В результате совместной работы, нам удалось создать оверлей, который задаёт нужную конфигурацию портов PCIe Gen3.

Дизайн и сборка
Дизайн корпуса выполнен для пассивного охлаждения. Предусмотрен отвод тепла от процессора непосредственно на верхнюю часть корпуса-радиатора через термоинтерфейс:

Для подключения модуля с двумя дисками к одноплатнику, применяется дополнительный адаптер M.2 / FFC, который также был разработан для этого NAS. Плата-адаптер вставляется в M.2 и крепится как обычный диск. Далее к плате подключается гибкий кабель FFC, по которому передаются все сигналы интерфейса PCIe x4. Также отдельным кабелем на модуль дисков подается питание 5В:

Два диска NVME крепятся на основной плате-модуля дисков. Устанавливаются термоподложки / термопрокладки так чтобы сразу отводить температуру на корпус:

После установки дисков, модуль крепится на одной из половин корпуса. Не самое удобное решение по установке дисков, но в данном случае это только прототип:

Для соединения одноплатника и модуля дисков, остаётся только подключить FFC кабель и кабель питания:



В самом конце сборки корпуса, обе половины скрепляются винтами, а также устанавливаются передняя и задняя пластины:



Подключение антенн к встроенному модулю WiFi 6 пока прорабатывается. Есть варианты с размещением как внутренних, так и внешних антенн. Пока только рендер:

Единственный тип питания одноплатника - это Type-C PD. В спецификации Type-C, помимо обычного разъема, есть также описание разъёмов с дополнительной фиксацией. Для одного из таких разъемов на корпусе были предусмотрены резьбовые отверстия:

Тестирование
Пока выполнены только несколько основных тестов. Это тест потребления, температурный тест, измерена скорость сетевого интерфейса и есть предварительная оценка производительности дискового интерфейса.
Потребление измерялось как во время выполнения встроенных тестов Armbian, так и при обычных задачах.В качестве измерительного устройства использовался USB тестер:

Результаты измерения представлены в основном для питания 12В. Судя по всему, потребление немного зависит от питающего напряжения. Было замечено, что когда портативный NAS питался от 5В источника, потребление было немного меньше, чем при питании от 12В. Напряжений выше чем 12В контроллер PD не запрашивал, видимо не надо было::
Нагрузка на систему | Потребление, Вт |
Не более 5% | 4Вт..6Вт в зависимости от входного напряжения Type-C PD. Наименьшее значение 4Вт при питании от 5В, наибольшее значение 6Вт при питании от 12В |
Выше средней при выполнении тестов 7z | 9Вт..11Вт |
Чтение / запись дисков | Порядка 6Вт..7Вт |
Просмотр 4k видео | Не более 7Вт |
Температура обычно не поднимается выше 45..50 градусов в комнате летом в жаркую погоду, при том, что используется пассивное охлаждение. Также для эксперимента проводился обдув турбиной 40мм для 3D принтеров. В целом применение даже такого незначительного охлаждения, снижает температуру примерно на 10 градусов. Поэтому, был разработан также вариант корпуса с активным охлаждением, при этом удалось полностью уложиться в существующие габариты корпуса с пассивным охлаждением:

У одноплатника BPI-M7 есть только два сетевых интерфейса 2.5Гбит/с каждый. При этом два встроенных гигабитных контроллера процессора не используются совсем. С одной стороны это удорожает дизайн, но зато появляется возможность существенно увеличить скорость сетевого интерфейса. Тестирование велось как с помощью утилиты Iperf, так и записью / чтением файлов по сети:



Даже эти данные, полученные на скорую руку, показывают значительный прирост скорости по сравнению с гигабитным соединением.
Последнее, что было проверено, это скорость работы дисковой подсистемы. Проверка проводилась с единственной целью, необходимо было убедиться, что передача сигналов по PCIe не нарушена. Всё таки достаточно много дополнительных разъемов на пути передачи от процессора до дисков, вдобавок несколько плат новых, хотя и с контролем импеданса. Поэтому, оценка показателей типа IOPS и других еще будет проводиться. При копировании локально с диска на диск, с учетом только двух задействованных лэйнов у каждого диска, достигается примерно половина от заявленной производителем максимальной скорости. В общем быстро диски работают, да и ошибок не было:
Планы на будущее
Самое главное, мы хотим довести этот проект до коммерческого продукта. Это может быть как набор для самостоятельной сборки, например, если такой одноплатник уже есть, так и готовый к применению портативный NAS. Пока еще рано говорить про цену, так как многое зависит от этапа индустриализации, которым мы только начинаем заниматься.
Помимо разработки портативного NAS - BananaNAS, мы также продолжаем работать над еще одним нашим проектом мобильного NAS - PixelNAS. Дело это очень интересное, но пока не прибыльное. Поэтому, полностью заняться разработкой в этом плане так и не удается. Хотя идей много, а главное есть интерес со стороны производителей одноплатников, которые мы применяем, в плане совместных проектов. Так что, читайте наш новостной канал и присоединяйтесь к нашему сообществу, где с нами можно обсудить детали разработок как текущих, так и будущих.