В статье изложена идея разработки NAS с самого начала, от проектирования плат, портирования софта и до дизайна корпуса. Для чего нам этот проект? - Есть следующие основные причины: Интерес к разработке своими силами сложного устройства, такого как NAS. Создание открытого проекта, который требует максимального использования стандартных процессов разработки, а также улучшает внутреннее взаимодействие в команде. Получение дохода, с целью продолжения работы над другими интересными устройствами из нашего списка разработок, в котором NAS занимает основную позицию. Мы довольно малочисленная команда энтузиастов, которая объединяет схемотехников, программистов, конструкторов и менеджеров. Несмотря на значительный опыт работы в разных компаниях, это наш первый общий проект. Поэтому хочется всё сделать по уму, используя не только свои предпочтения, но и хорошо известные подходы организации процесса проектирования. Посмотрим на план того, что мы собираемся сделать, чтобы спроектировать и запустить в производство NAS: Открытая платформа нашего проекта подразумевает, что все схемы, файлы для производства, 3D модели корпусных деталей, исходники и другие файлы, можно будет скачать в открытом доступе по Creative Commons лицензии - Атрибуция 3.0 Непортированная. Ну или адаптированный для чтения вариант: При наличии большого количества NAS, отлично зарекомендовавших себя за долгие годы эксплуатации и к тому же не требующих особых навыков настроек, наш проект может показаться малозначительным. Но это только на первый взгляд. В наших дизайнах мы нацелены на ряд функций, которые доступны в дорогих и продвинутых NAS. Например, в зависимости от модели модуля, будет реализована поддержка памяти ECC, горячая замена дисков, встроенное резервное питание, объем оперативной памяти до 32ГБ, возможность выбора процессора для создания не только хранилища данных, но и стриминга видео и другие продвинутые функции. Модульность железа - это основа нашего дизайна, на которую мы опираемся. Если вам нужен NAS в виде уже готового устройства, которое остается только включить и он будет работать годами, то лучше всего выбрать решения от ряда известных фирм. Конечно, мы понимаем, что это и есть то к чему следует стремиться, но кто из нас не собирал компьютер для себя и своих близких? Ведь реально, если вашим родителям или детям нужен компьютер, то большинство будет радо собрать нужный компьютер самостоятельно, установит нужный софт, сконфигурирует его и настроит. Это то, чем можно гордиться по-настоящему. Большое количество всевозможных плат с разным функционалом и определяет модульность. Можно собрать как NAS начального уровня только для хранения различных файлов, а с другой стороны ничто не мешает сразу или постепенно собрать более навороченный NAS для стриминга видео, музыки и с набором полезных сервисов, выполняющих рутинные задачи. Кастомизация корпуса - очень важный для нашего проекта принцип. С большой долей вероятности, можно с первого раза определить, что перед нами NAS. Сменные отсеки дисков, большая вентилируемая панель, работающий компьютер где-то на антресолях, ноутбук со сломанным экраном и несколькими дисками, да много чего еще странного и не очень, но все эти устройства собранные с большой любовью и вниманием к деталям, как раз таки могут представлять собой NAS. Поэтому, нет смысла ограничиваться одним дизайном корпуса, гораздо эффективней предложить конструктивные решения, которые позволят улучшить потребительские качества. Например, красивый, легко трансформируемый дизайн за счет замены только одной детали конструкции, эффективное, но тихое охлаждение, параметрическая модель корпуса и его составляющих, простой доступ к дискам и так далее. Чтобы появилась некая архитектура NAS, необходимо сформулировать технические требования. В предыдущей статье - Что такое свой NAS и как его начать делать?, был сформулирован ряд ключевых требований, в кратком виде это: Также была представлена таблица с техническими характеристиками базового / начального варианта NAS, основные параметры которого приведены ниже: Название Характеристика Вычислительный модуль SODIMM на базе процессора ARM Операционная система Armbian / Debian Жесткие диски SATA с поддержкой RAID 5, 6 Сетевое подключение 1GbE Внешний порт данных 3x USB 3.1 Gen1 / Type-C PD Видео выход со звуком Mini DP / Type-C DP Alt Mode Питание 230В Резервное питание Батарея не менее 20Вт•ч На первый взгляд всё просто, только необходимый функционал и ничего лишнего. Такой NAS может хранить данные с достаточной надежностью за счет организации дисков в RAID5 или RAID6, и при этом будет доступным. Однако, даже в простых дизайнах есть свои сильные стороны. Давайте посмотрим, что из этого может выйти. Попробуем расширить / изменить базовый набор за счет уже имеющихся интерфейсов. Например, что мешает подключить дополнительную сетевую карту к интерфейсу USB или дополнительный контроллер дисков SATA: Вариант расширения Тип интерфейса SATA Gen3 PCIe 2.1 / 3.0 USB 3.0 / Type-C Подключение нескольких SATA дисков хранилища SATA Port Multiplier до 15 дисков на один порт SATA PCIe / SATA Bridge  5-6 дисков на PCIe x2 2-4 диска на PCIe x1 USB / SATA adapter 1-2 диска Системный SSD  NVME x2 / x4 SATA / NVME x2 adapter Ethernet   1GbE / 2.5GbE В таблице показана только часть возможных расширений, относящихся к дисковой подсистеме. Существующий набор интерфейсов в современных процессорах ARM позволяет создавать и другие варианты, что особенно ценно, если цель спроектировать не просто NAS, а еще и поддержать развлекательный контент. Попробуем определить связи между техническими требованиями и конкретными узлами, которые за них отвечают. Для этого разобьем дизайн на ряд основных блоков и попытаемся их “прокачать”. Рассмотрим особенности шин PCIe и SATA, которые нам позволят снять ограничения по количеству дисков в системе (с разумной точки зрения, ясное дело). Так зачастую PCIe контроллеры процессоров поддерживают разветвление шины PCIe - bifurcation, что позволяет организовывать несколько независимых шин PCIe: Получив несколько независимых шин, к одному процессору теперь можно подключить уже не один, а несколько PCIe / SATA Bridge контроллеров, и тем самым увеличить количество дисков в системе: Еще один из вариантов расширения размера хранилища - это подключение нескольких SATA дисков к одному порту, если контроллер SATA поддерживает функцию PMP - Port Multiplier: Хотя функция PMP довольно известная, но среди производителей контроллеров SATA найдется не так много вариантов чипсетов и встроенных контроллеров, которые могут “увидеть” на одном порту SATA сразу несколько дисков. К сожалению, в ARM процессоры довольно редко встраивают контроллер SATA. На мой взгляд, производители таким образом пытаются всеми способами выжить данную технологию и заменить её на более универсальную PCIe. В отличие от Intel и AMD процессоров, для которых выпускаются специальные чипсеты с поддержкой нескольких SATA портов, у ARM процессоров даже таких вариантов нет. Тем не менее, некоторые производители до сих пор размещают PCIe Gen2 “рядом” с PCIe Gen3. Спрашивается для чего? - Лучше бы увеличили ширину PCIe Gen3. Но если разобраться, то ответ становится очевидным: Высокоскоростные лэйны PCIe Gen2 имеют практически такую же скорость как USB3.0 (иначе USB3.1 Gen1) и самое важное SATA Gen3. Это позволяет подключать нужный контроллер внутри процессора к комбинированным лэйнам со скоростью до 6Гб/с в зависимости от интерфейса. Далее, как мы видели на рисунке выше, даже к одному SATA с поддержкой функции PMP можно подключить до 15 SATA дисков. Не хотелось бы сейчас подробно останавливаться на теме, связанной с возможностями современных ARM процессоров. Для этого мы постараемся приготовить отдельный материал, с оценкой возможностей нескольких процессоров, которые для нашего проекта являются целевыми. Тем не менее, хочется рассказать ещё об одном элементе системы - вычислительном модуле SODIMM. Идея размещения на одном модуле самых важных компонентов процессорной системы, широко известна. Для каждого встраиваемого процессора в мире существует хотя бы один универсальный модуль. Действительно удобно, одна универсальная плата служит основой для создания совершенно разных устройств. Мы тоже придерживаемся этого пути, поэтому, спроектировали вычислительный модуль с минимумом периферии для нашего варианта NAS начального уровня: На плате модуля есть 200-pin краевой разъём, на который выведены практически все интерфейсы процессора, питание и цепи управления: Назначение Название интерфейса 100/1000 Ethernet RGMII DIY, управление системой GPIO x50 (UART, SPI, I2C, I2S, PWM, etc) / ADC x5 Подключение SD SDMMC Подключение дисков PCIe x4 Gen2 USB устройства и модули Type-C / USB 3.1 / USB 2.0 x2 Дисплеи и камеры MIPI TX x4 / RX x4 / TX-RX x2 / eDP Сброс / Питание Reset / Power Enable / 5V Конструкция вычислительного модуля - это многослойная печатная плата, производство, сборка и начальное тестирование которой, рассчитано на контрактное производство - EMS (Electronic Manufacturing Service) provider: На модуле размещены только самые необходимые компоненты для работы системы: процессор, оперативная память, eMMC и NOR флэш, а также PMU / PMIC (контроллер питания и DC/DC преобразователи). Никаких WiFi модулей, SD карт, Ethernet Phy и т.д. Почему? - Ответ прост: В наше время некоторые чипы достать очень сложно, то что есть на стоках сейчас, может пропасть на долгое время в любой момент. По сути, модульность конструкции - это вынужденная мера на тот случай, если нужного компонента не окажется в наличии, и тогда проще будет заменить один модуль, а не всю систему. С другой стороны, благодаря модульности всегда можно “прокачать” устройство в нужную сторону. Например, сейчас мы планируем дополнительно разработать ещё два вычислительных модуля, один с увеличенным объемом памяти, а другой с ECC для аппаратной поддержки ZFS. Все вычислительные модули будут совместимы как конструктивно, так и в части электрического подключения (есть такая надежда), и замена одного модуля на другой пройдет безболезненно. Есть еще один момент в пользу выбора модульного дизайна. Многие используют контроллеры определенных производителей: JMicron, Marvell, ASMedia и т.д. В случае модульного дизайна и стандартного разъёма, у пользователей будет возможность подключить свой контроллер. К примеру, на рисунке представлены варианты контроллеров PCIe / SATA Bridge на 5 и 6 дисков фирм JMicron и ASMedia (качество скринов не очень, в нашем распоряжении пока только один контроллер M.2 и тот в работе): В качестве конструктива несущей платы начального уровня был выбран nano-ITX с размерами 120мм x 120мм. Это на 50мм меньше чем mini-ITX по каждой стороне.  На плате размещен минимальный набор компонентов и разъемов как для подключения внешних устройств, так и для модулей. Для примера, ниже показана структурная схема несущей платы с установленными модулями резервного питания - UPS, контроллером дисков с разъемом M.2 и модулем сетевого адаптера 2.5GbE:  Спецификация несущей платы: Название Характеристика Тип разъема Вычислительный модуль ARM SODIMM 200-pin Подключение USB / Type-C DisplayPort Alt Mode 2x USB2.0 2x USB3.0 Front Panel 2x USB3.0 Type-C PD Pin Header 2x5 Twin USB Type A Pin Header 2x10 Сетевое подключение 100 / 1000 Ethernet RJ45 Контроллер дисков PCIe Gen2 x 4lanes M.2 key M Дисплей / камера DisplayPort MIPI CSI / DSI MIPI-CSI MIPI-DSI DP FPC-30 FPC-30 FPC-30 Низкоскоростная периферия I2C I2C / UART / SPI ADC 4-channel Pin Header 1x6 Pin Header 2x5 - UEXT Pin Header 1x6 Консоль USB / UART Type-C Аудио вход / выход Кодек ES8388 HD Audio Header Основное питание  12В Mini-DIN / ATX 4-pin Несущая плата сейчас активно разводится, при этом все основные разъемы для подключения кабелей и модулей уже расставлены: Понятно, что лёгкость смены одного контроллера на другой с таким же интерфейсом подключения, всего лишь миф. На практике разработчики встраиваемых систем могут столкнуться с массой проблем как в железе, так и в софте. Это может быть не только сложность написания драйвера, но и возможное отличие протоколов обмена. Несмотря на все стандарты, очень часто производители не полностью поддерживают все разрешенные варианты. В этом случае должен быть некий референсный набор железа с известными багами, которые закрываются грамотной техподдержкой. Например, контроллеры PCIe и SATA, о которых рассказывалось выше, не работают нормально, если при включении питания они не будут проинициализированы либо из локальной EEPROM, либо по SPI. Причем последовательность команд инициализации чаще всего известна только производителю. Среди этих команд есть очень специфичные, касающиеся процедуры тренинга линков перед началом работы. Если этот тренинг не пройдет успешно, то нестабильная работа на высоких скоростях практически гарантирована. Мы уже столкнулись с нестабильной работой одной из новых плат с SATA Multiplier, на которой производитель попросту не обновил конфигурационную EEPROM. В результате регулярно терялся линк на произвольном SATA диске. Пришлось на время отложить тесты с этой платой и обращаться в поддержку с просьбой выслать рабочую конфигурацию. Хотя можно было бы скопировать эту конфигурацию из рабочего контроллера самостоятельно, благо такой был. На практике очень сложно поддерживать все возможные варианты контроллеров, а тем более отслеживать качество прошивок. В этом смысле, открытый дизайн хорош тогда, когда он ограничен проверенными железками. Очевидно, что проверять концепцию следует в самом начале перед стартом основных работ. В этом плане мы тоже не исключение, поскольку заранее начали проводить тесты с железом, для чего собрали несколько прототипов NAS. У нас не было особых ограничений по стоимости прототипов, поэтому, мы не экономили. В результате получилось собрать три прототипа. Два из них, собраны на одинаковой платформе ARM - процессоре RK3588, но только с разными вариантами подключения дисков. Еще один прототип NAS мы собрали на x86 материнке с процессором Core i3, где диски подключались стандартно к чипсету. С помощью этих трех прототипов мы планировали провести и потом сравнить результаты тестов производительности NAS. Также мы хотели оценить возможные проблемы, связанные с работой дисков при их подключении через SATA Multiplier и PCIe / SATA Bridge. Характеристика x86 Mini Server RK3588 19” RK3588 Mini Server Процессор Core i3-10100 RK3588 RK3588 Память DDR4 - 8ГБ LPDDR4 - 16ГБ LPDDR4 - 16ГБ Материнская плата H510M-ITX/ac ITX-3588J ITX-3588J Контроллер SATA / чипсет Intel H510 PCIe / SATA Bridge JMB585 SATA Multiplier JMB575 Поддержка SATA PMP нет да да Количество дисков NAS 4 5 4 Модель дисков Toshiba P300 Toshiba P300 Toshiba P300 RAID 5 6 5 Системный SSD M.2 NVME SATA SATA ОС Debian 11 Armbian / Debian 11 Armbian / Debian 11 ПО для NAS OMV6 OMV6 OMV6 Сборка NAS на x86 никаких трудностей не вызвала, все четыре диска были подключены к разъемам на плате: Особой необходимости в NAS на x86 не было, хотели просто оценить разницу в производительности между x86 и ARM. Сборка второго и третьего NAS на ARM процессорах также прошла относительно просто, благодаря стандартной плате формата mini-ITX. В одном из них диски были подключены к плате PCIe с контроллером PCIe / SATA Bridge JMB585: Для этого NAS был специально собран прототип модульного UPS, состоящий из модуля контроля и модуля батарей 2S2P. В основу конструкции UPS легла идея, подробно изложенная в нашей предыдущей статье: В третьем прототипе NAS на базе ARM процессора, диски были подключены в разъемы, расположенные на самой плате. В качестве контроллера на плате установлен чип JMB575 - SATA Multiplier на 5 дисков, который подключен прямо к процессору также через SATA интерфейс: В этом NAS был размещён наш первый прототип UPS с интегрированной батареей 2S1P: Смоук тест всех трех NAS прошел успешно. После этого на все три прототипа был установлен Debian 11 / Armbian, поверх которого мы установили openmediavault. Но обнаружилась одна проблема со стабильной работой дисков хранилища на прототипе с SATA Multiplier. Диски, подключенные к контроллеру SATA PMP спонтанно “терялись” и вновь “находились”, при этом скорость линка снижалась доходя с 6Гб/с до 3Гб/с и даже 1.5Гб/с. Причем, чем выше нагрузка была на диски, тем чаще происходили такие события: Мы предположили, что проблема могла быть в начальной конфигурации контроллера JMB575 - SATA Multiplier. Дело в том, что после подачи питания, контроллер считывает конфигурацию внутренних регистров из локальной EEPROM, и если, к примеру, эти данные отсутствуют, то работа линков SATA может быть нестабильной. Проверку этой гипотезы отложили до лучших времен, а для того чтобы понять, что чип JMB575 в принципе работает нормально, мы подключили внешний адаптер с таким же контроллером к прототипу x86: В этот момент пришло осознание того, что в действительности не все чипсеты с контроллерами SATA, выпускаемые Intel и другими фирмами, поддерживают SATA Port Multiplier. В нашем случае, чипсет H510 не поддерживал эту функцию. Контроллер SATA видел только один диск из четырех, при этом на произвольном порту. К слову, функция SATA PMP не является обязательной. Так что пришлось подключать SATA PMP адаптер к другому прототипу, но уже в один из портов PCIe / SATA Bridge адаптера. На слух звучит запутано, поэтому, приведу схему тестирования для этого случая: Выглядело такое подключение следующим образом: Так как на этом прототипе уже был поднят RAID6, то после загрузки сразу удалось убедиться, что проблем с дисками нет и контроллер JMB575 на этой плате работает нормально. После обсуждения пришли к выводу, что необходимо связаться с техподдержкой производителя и решить с ними вопрос, касающийся стабильной работы контроллера JMB575, установленного на материнской плате. Хотя можно было бы и содержимое рабочего EEPROM скопировать и перенести на проблемную плату. Результат, который мы получили, вполне нас устроил, так как мы столкнулись с типичными проблемами и особенностями интеграции различных контроллеров с целью создания массива дисков. В добавок, проверили теорию на практике. Если бы всё прошло гладко, то не факт, что в следующий раз мы не столкнулись бы с подобным, а так уже будем готовы. Основные итоги проверки концепта в части создания дискового массива приведены в таблице: Название Результат Общая проверка SATA Multiplier В целом работает Необходима начальная конфигурация чипа от производителя Поддержка SATA Multiplier в чипсетах и HOST контроллерах Необходимо смотреть на поддержку данной функции в контроллерах SATA, без этой поддержки применение SATA Multiplier невозможно Общая проверка PCIe / SATA Bridge Работает без вопросов Не требует особой поддержки со стороны Root контроллера PCIe Проверка PCIe / SATA Bridge в режиме PMP Успешно проверен в режиме работы PMP с подключенным SATA Multiplier Предварительные тесты производительности дисковых массивов для ARM процессора c PCIe / SATA Bridge контроллером и референсной платформы x86 на чипсете H510 представлены в следующей таблице: Название теста RK3588 19” / 5 дисков / RAID6 x86 Mini Server / 4 диска / RAID5 fio RANDOM 4k READ 5168KiB/s (5292kB/s) 4724KiB/s (4837kB/s) fio RANDOM 4k WRITE 1000KiB/s (1024kB/s) 981KiB/s (1005kB/s) fio SEQUENTIAL 512k READ 624MiB/s (654MB/s) 1626MiB/s (1705MB/s) fio SEQUENTIAL 512k WRITE 216MiB/s (227MB/s) 287MiB/s (301MB/s) В итоге, мы рассомтрели концепцию модульного NAS с открытой аппаратной архитектурой.  Оценили возможные риски, связанные с применением различных аппаратных решений, в особенности контроллеров для создания дисковых массивов. Были представлены вычислительный модуль на ARM процессоре и универсальная несущая плата, которые могут быть испоьзованы для сборки NAS начального уровня. В конце оценили результы отладки и тестирования прототипов и показали, что разработка собственного NAS имеет достаточное обоснование. Если вернуться к самому началу и посмотреть на этапы процесса разработки, то станет понятно, что мы находимся в стадии проектирования и во многом завершили предыдущие этапы декомпозиции и создания архитектуры. Что необходимо доделать в первую очередь, так это завершить тесты производительности системы с различными способами подключения дисков. Часть этих тестов уже была проведена, как только завершим остальные, то обобщим результаты и расскажем, что из этого получилось. В статье удалось рассказать только о части этапов, которые нам предстоит пройти. Например, осталась не раскрытой вся правая половина процесса разработки, связанная с интеграцией решений, тестированием и валидацией. Также есть отдельная и интересная тема промышленного дизайна. В любом случае, если это интересно, то у нас есть канал, где мы публикуем новости, обсуждаем результаты и делимся своими идеями. Это значительно облегчает нам жизнь с точки зрения обновления уже проделанной работы и небольшого анонса о предстоящих планах.  Инженер