ReadyNAS Duo v2: вторая жизнь! (Установка Debian на ARM)
Углубимся в реверс-инжиниринг операционных систем! Сегодня поставим полноценную и чистую операционную, серверную систему на ARM платформу — на старенький, но очень крутой NAS от NetGEAR. В итоге получим настоящий сервер с почти неограниченными возможностями! Велкам под кат!
Предыстория
Понадобилось мне развернуть несколько несложных сервисов на простом и дешевом оборудовании. Требования были немногочисленными, одно из которых было надежность, второе — простота (дешевизна). Так же хотелось, чтобы устройство занимало как можно меньше места. С местом, думаю, у многих проблемы. Чтобы кароч не шумело и не отсвечивало, но исправно выполняло поставленные, несложные задачи.
Начались поиски решения. Первым делом я пошел смотреть, что есть из мелкого и недорогого на рынке. Преимущественно рассматривал платы mini-ITX с паянным процессором. Такие системы стали крайне доступны и дешевы. Особо большая мощность не требуется. Например, целая микроплатформа (материнка) с паянным Celeron j1800, радиатором и кучей портов, в форм-факторе minit-ITX стоит всего 50$. Неплохо! Правда корпус, который мне понравился, стоит практически столько же сколько и материна - Chieftec CI-01B-OP:
Прикинув все остальное для сборки и посчитав общий бюджет — цифра вырисовывалась совсем не копеечная, хоть и небольшая. Закралась даже мысль собрать из кучи хлама что-то. Благо полно всего и задачи стояли не глобальные. Но все не то. Нет той красоты, простоты, компактности и элегантности. Так же собрать что-то из старого барахла, которое может отказать в любой момент, было не лучшей идеей.
И тут… стоя и осматриваясь по сторонам… мой взор упал на мирно стоящий, тихонько подмигивающий NAS от NetGEAR. Это был ReadyNAS Duo v2! Он уже третий год стоял в закутке и собирал пыль, совершенно не привлекая к себе никакого внимания 24 / 7 / 365. Устройство простое и надежное как автомат Калашникова. Вот!!! Вот оно — то, что я искал! Маленький, тихий, холодный, в меру производительный, красивый и лаконичный! Из железа! Все как в лучших домах.
Решено — сделано! NAS был остановлен, данные которые мне нужны были скопированы, а устройство разобрано и приведено в первозданный вид. Уборка и все такое. Сброс в FACTORY_DEFAULTS.
Что же дальше?.. У нас в руках ARM-система. В классном и крутом исполении, все на борту — и USB3.0 тебе, и Гигабитный LAN, и мобилреки для винтов на SATA3. В общем все — что надо для счастливой жизни. Но пока… это черный (серый) ящик с сомнительным софтом.
Подключение терминала
Покрутив устройство в руках и собравшись разбирать, я увидел наклеечку на задней части устройства. Кто-то туда заботливо приклеил ее, чтобы прикрывать порт TTL.
Поскольку разбирать не понадобилось, а многим кто сюда приходит будет интересно посмотреть (как и мне), что же там внутри — выкладываю фотку которую нашел в сети. Из того что видно — это именно та самая плата. Все очень достойно. Просто и по делу:
Спасибо NetGEAR за подарок! Не каждый день встречаешь устройства из железа с выведенным наружу хотя бы где TTL! Методом научного тыка и мультиметра быстро была найдена земля и другие контакты. Заработало, конечно, не сразу. Сначала терминал был пуст, затем перевернув Rx и Tx — все зашуршало. Для подключения я использовал всю ту же свою любимую мульку на PL2303 купленную когда-то на алиэкспрессе по цене доллар / ведро. Кстати — вот ссылка. USB-to-TTL должен быть в каждом доме, как например, сахар или соль.
Подключение устройства вы можете видеть ниже:
Адаптер установился как виртуальный COM-порт. Тоже, конечно, не сразу. Понадобилось скачать драйвера для старого чипа и Windows 10. Их много модификаций. Но все заработало достаточно быстро и в окне терминала я увидел вывод от ReadyNAS Duo v2.
Нас приветствует Marvell u-boot! Приятной неожиданностью было то, что процессор Feroceon 88FR131 работает на частоте 1600 MHz. Я думал там мегаГерц 400… или около того. Как видно из выдачи в терминале — имеем 256Mb оперативы и 128Mb NAND. NAND — это постоянная память в виде микросхемы на плате, вот она:
Эта память небыстрая, но почти самая главная! В ней содержатся образы первичной загрузки: kernel и initrd. Когда мы включаем устройство — именно из NAND взлетают эти 2 образа которые запускают весь процесс. Так же, NAND содержит раздел с архивами референсной файловой системы которая накатывается каждый раз, когда мы вставляем новые винты или делаем FACTORY RESET. Финальная загрузка происходит именно с RAID-массива. Организацию памяти девайса можно видеть ниже:
Прошивкокопательство
Пробегусь вкратце по тому, что происходило в видосе. Это не пошаговое руководство. А в целом взгляд на операцию с пояснением этапов. У вас может быть подругому или будут свои нюансы, но в целом суть будет такой же и мой опыт будет полезен. Итак,
Сначала подготовим флешку, с файловой системой ext2 — без журналирования.
Разбиваем ее с помощью fdisk. Создаем раздел, которому отдаем все свободное пространство. Затем — выполняем mkfs.ext2 /dev/sdc1 (sdc1 — раздел моей флешки). Таки образом создаем файловую систему. То есть форматирование.
Дальше, монтируем флешку командой
mount /dev/sdc1 /mnt/newroot
Где /mnt/newroot — путь к точке монтирования (папке) куда будет смотреть флешка. Папку создаем заранее командой mkdir /mnt/newroot.Затем, качаем установщик Debian — debootstrap. Я его скачал в виде пакета .deb. То есть пакет для Debian. Вполне может быть, что его можно было просто установить, но мы не ищем легких путей и все решаем тупо в лоб. Устанавливаем debootstrap командой dpkg -i debootstrap..[версия]..deb.
http://ftp.debian.org/debian/pool/main/d/debootstrap/
Потом прописываем актуальные репозитории Debian в файл /etc/apt/source.list. «Актуальные» — это как раз архивные, то есть http://archive.debian.org/debian. И делаем
echo "deb http://archive.debian.org/debian squeeze main" > /etc/apt/source.list
apt-get update
apt-get — если кто не знает — это пакетный менеджер. Программа для установки софта. Отслеживания зависимостей и т.п. Например, если надо Миднайт Коммандер — просто говорим apt-get install mc. И все. Пакетный менеджер сам определит, что нам надо, что не надо, где оно находится и что необходимо для работы этой программы. Скачает необходимые библиотеки и другие программы. Все будет скачано из репозиториев, установлено и настроено автоматически. В это и суть пакетных менеджеров. В разных дистрибутивах Linux — менеджеры пакетов разные (apt-get, dpkg, yum, rpm и т.д.).
Ставим binutils.
Так же на будущее нам понадобится упаковщик lzma
apt-get install binutils lzma
В принципе да и все. Дальше нам надо скачать и развернуть образ системы. Минимальный набор файлов и программных пакетов. Делается это как раз с помощью ранее установленного debootstrap:
debootstrap --arch=armel --no-check-gpg --extractor=ar squeeze /mnt/newroot http://archive.debian.org/debian
Таким образом, мы даем команду скачать дистрибутив версии Squeeze в папку /mnt/newroot. Архитектуру обозначаем как armel (для ARM) — бинарные файлы в этом дистрибутиве скомпилированы под ARM-процессор. Почему я выбрал такой относительно древний дистрибутив? Да потому, что ядро в накопителе версии 2.6. Для более новых дистров надо более свежее ядро. Можно было бы конечно заморочиться и собрать свое ядро. Новое и последнее! Но это сильно добавило бы времени к раскопкам. А мне устройство нужно было побыстрее и для тех задач, что мне требуются — достаточно и такого дистрибутива. Более чем. Он так же всем хорош.
Затем нам надо нырнуть в нашу флешку — изменить корень системы. Для этого используется команда chroot [имя папки]. После выполнения команды окружение изменится и все, что мы будем делать и выполнять далее — будет применено только к нашему образу новой систему. Мы будем работать в этом образе как буд-то только что загрузились с него. Но прежде чем смонтировать флеху в роли root — нам надо подмонтировать служебные файловые системы, делаем (если каких-то папок нет в целевой системе — создаем заранее):
mount -t proc proc /mnt/newroot/proc
mount -t sysfs sysfs /mnt/newroot/sys
mount -t tmpfs tmpfs /mnt/newroot/ramfs
mount --bind /dev /mnt/newroot/dev
mount --bind /dev/pts /mnt/newroot/dev/pts
и только потом выполняем
chroot /mnt/newroot
В новой системе первым делом обновим пакетный менеджер и установим локали:
apt-get update
apt-get install locales
Конфигурируем локаль. Это языковые параметры и поддержка языков на которых будет шпрехать операционная система. Выбираем en_US.UTF8. Я еще поставил и русскую.dpkg-reconfigure locales
Потом конфигурируем свой часовой пояс:dpkg-reconfigure tzdata
Затем накатим в будущую систему софт, который нам минимально понадобится в работе:
apt-get install mc lzma acpid hdparm sshd
Забираем важное и основное
Далее нам необходимо позабирать из родительской системы все необходимые компоненты. Это файлы конфигурации, модули ядра (обязательно! не забыть!!! /lib/modules), правила для udev и другое. Я пошарился по системе и файлам конфигурации и нашел несколько интересных и важных моментов.
В новой системе нам понадобится демон (daemon) обработки нажатия кнопок — buttond. Так же чтобы особо долго не париться я взял родительский inittab. Это файл конфигурации для первого процесса с PID1 — init. В нем задаются параметры запуска, терминалы итп. Так же был взят файл readynas_startup. Это скрипт инициализации устройства созданный разработчиком девайса. В нем происходят базовые установки переменных окружения во время старта системы. Создаются символьные ссылки и много другое. Я причесал этот скрипт под новую систему и он сильно похудел. Раза в 3-4. Выкинул оттуда барахло. Убрал запуск служб. Так как управление запуском служб у меня происходит штатно из rcN.d. Так как это задумано природой.
Поставив систему, я обнаружил, что девайс не выключается сам. Если подать ему команду poweroff из консоли. Так же он не выключался и с кнопки. Сама кнопка давала событие, все останавливалось, но выключения питания не происходило.
Стал разбираться… посмотрел, что там в скрипте halt родительской системы. А там я обнаружил интересные строчки:
Там последними командами происходит вызов программы mv_shell. Это статический файл — собранный без зависимостей. То есть его можно просто скопировать в новую систему и он будет работать не требуя никаких дополнительных библиотек. Забираем этот шелл в свою папку /sbin. Это Marvell Shell — утилита для общения с процессором! Она позволяет отдавать команды процессору напрямую. Получать и писать значения регистров итп. а вот это заклинание rw f1010100 0x0 отдает команду — «тупо тушить свет»:
echo "rw f1010100 0x0" | mv_shell > /dev/null
Это все перекочевало и в мою систему. Теперь все работает корректно и правильно.
Модификация NAND
Ну вот в принципе и все. Я сделал все первичные настройки, собрал необходимый минимум со старой системы. Образ на флешке готов. Что же дальше? А дальше надо его поместить как-то на системный раздел, чтобы initrd передавал на него управление. Но как это сделать? Пришлось повозиться. Пытался подменить root на ходу с помощью таких системных вызовов как pivot_root и прочих. Но ничего не получалось. То одно мешает, то другое то чего-то не хватает. Да и простая ручная подмена root это не очень удобно. В случае переустановки — снова гемор.
Поразмыслив, полез смотреть как устроен NAND. Нашел раздел в котором хранятся все образы — ядро, init и референсная файловая система в архиве. Это /dev/mtdblock4 с файловой системой jffs2. Посмотрел как организован образ референсной системы. Как упакован итп.
Далее было делом техники — грохнуть образ системы в смонтированном NAND, запаковать свою систему в файл с помощью tar и ужать потом поверх lzma. Мой образ получился на 10% меньше. Все. Просто заменяем файл своим. Перезагружаемся, удерживая кнопку sys на задней панели, и выбираем сброс в FACTORY_DEFAULTS. Выбор происходит путем нажатия кнопки backup на передней панели. Каждый пункт кодируется своим свечением диодов на морде. FACTORY_DEFAULTS — это светится только LED1 (первый HDD). LED2 — OS_REINSTALL.
Таким образом, накопитель использует все штатные механизмы. Работает с RAIDar — в котором задается тип RAID массива. Создает эти самые массивы, форматирует их и все подготавливает к установке операционной системы. Затем, распаковывает уже наш образ и складывает в md0 — т.е. на системный раздел, который монтируется как root — /. Перезагрузка… и УРА!
Итог
Что имеем в итоге? Я получил ровно то, что хотел, не потратив ни копейки! Вдохнул новую жизнь в этот старенький NAS путем установки полноценной, не укоцаной, операционной системы. Теперь возможности практически не ограничены! Выкинут весь хлам. Высвободились ресурсы. Установлены последние, на то время (обновленные по сравнению со старой) программные пакеты. У меня теперь есть мини-сервер в суперском форм-факторе. Компактный, тихий и холодный. Он так же продолжит выполнять задачи сетевого хранилища, но уже так — как следует + потянет новые сервисы которые мне так необходимы!
Файлы для скачивания
root.tlz — моя версия системы. Читый Debian Squeeze
original_root.tlz — оригинальная система ReadyNAS Duo v2. (RAIDiator 5.3.13)
USB Recovery tool — софт для раскирпичивания девайса
EnableSSH — плагин для активации SSH на штатной системе
Смотреть боевик:
Нет комментариев