Linux на X96 или какой же этот ваш ARM овно
Подогрел мне кум неудачно прошитую андроид-приставку X96-mini. Он вообще любитель «обновляться» без нужды, вот и этот девайс окирпичил.
Беззащитная машинка умещается на ладошке, и содержит в себе с понтом четырехядерный Amlogic S905w, два гига ОЗУ, и 16 Г флешку.
Что вам сказать, мужчины и женщины. Во время раскирпичивания девайса, я познал всю боль устройств на базе ARM и на меня снизошло просветление, почему ARM никогда не будет на десктопах, по крайней мере в том исполнении, котором он теперь.
Итак, начнем с того, что готового образа НЭД (уже молчу о том, что его сперва нужно создать). Нет, образы конечно есть. Только вот они под другие модификации. Образ под устройство с 1Гб отличается от образа под устройство с 2Гб. Они все отличаются от образа сделанного под устройство на базе памяти Samsung, а этот образ отличается от образа сделанного на базе памяти Hynix.
Визуально это видно как либо ОС не запускается вовсе, либо ядро падает в overflow и kernel panic, потому что не совпадают пару байтов откуда это ядро читать.
Ладно, готового образа нет, попробуем сделать свой. Но не тут-то было. Сначала нужно записать загрузчик. Но это загрузчик НЕ ПОД ARM, и даже не загрузчик под этот процессор. Это загрузчик под конкретное устройство.
Вот нагуглился аналогичный по процессору девайс Khadas VIM1. Вроде все красиво, u-boot стянулся, флешка стартонула. Но нет, это еще не все. Нужен DTB-файл. Это описание дерева устройств. У нас в X86 вроде такое тоже есть, но оно вшито производителем. Ладно, с горем пополам накопали в базе CoreElec такой вот DTB, переименовали в dtb.img, поскольку это имя файла захардкожено. И ничего. Потому что нужен еще файл с командами сраному u-boot’у. Мы не можем просто передать управление ядру под данную архитектуру (или хотя бы загрузчику который загрузит ядро), нет. Мы должны сначала определить откуда идет запуск, скопировать оттуда ядро в память по определенному адресу, а уже потом передать управление в начало этого адреса. Ладно. Так я и сделал.
Kernel panic, stack overflow. Сцука. И тут я присмотрелся: оказывается эта система считает себя Khadas VIM1 с одним гигом ОЗУ. Ну да, на месте ядра я бы тоже зафейлился, но на месте гребанной архитектуры, я бы разрешил ядру самому определить сколько в компьютере ОЗУ, а не основываться на каком-то левом файле.
Разумеется готовых u-boot в сети я не нашел, хотя нашел маны как конпельнуть. Жаль только в этом мане нету defconfig’а под это устройство, посему конпеляция увенчалась неуспехом. Более того, под Дебианом компилятор выдал какую-то ошибку шото типа duplicate или already defined, не помню. Поставил Арч. Скомпильнулось нормально, но не запустилось. Предсказуемо.
Нашел прошивку Андроида мало-мальски предназначенную под похожее устройство. Конечно же она тоже не завелась, но благодаря полутора утилитам, удалось с нее вытащить u-boot.
Но этот u-boot грузит по умолчанию recovery.img — андроидный рекавери. Окай, в порядке эксперимента качаю TWRP, переименовываю его в recovery.img, перезагружаюсь — вуаля, работает. При чем даже радиоклава с радиомышкой и видит подключенную USB-флешку. Хотя и изображение на мониторе раздваивается. Ну да ладно, напуркуа мне эти рекавери. Записываю файл с командами u-boot’а, который собственно копирует ядро в память и его оттуда запускает, записываю ядро (у меня их два, с armbian и с manjaro) — болт тебе. booti: command not found. И таки да, через UART удалось вызвать консоль сраного u-boot’a (чем-то напоминает наш grub, лал), там такой команды нет. Пояндексив, нагуглил что команда booti загружает линуксовое ядро, команда bootm андроидное, и эта команда у меня есть. Окей, поменял. Но нет, не тот формат ядра. Конечно нет, ведь Андроид это ж не Линукс.
Подменив ядра на CoreElec (видимо с андроидной базой) — CoreElec таки запустился. Ура.
Я бы оторвал руки изобретателям подобной архитектуры. Или производителю железки. Или хоть кому-нибудь.
Если уж хочется дроч с загрузчиками — почему не выделить в процессоре область ? Это ж гребанный SoC. Этот загрузчик занимает полмегабайта. И может быть readonly. Ну как на один и тот же процессор могут использоваться разные загрузчики, в зависимости от которых у вас либо стартонет система либо нет ? Вы хоть представляете себе установочный образ Винды заточенный на работу под 8Гб ОЗУ и вылетающий если стоит 16Гб ? Вот и я нет. А представляете чтобы вы в grub прописали шота типа «RAM=2G» и ваш Линукс думал что у вас 2 Гб ? Более того, стал вылетать если вы его запустили на 4 Гб ?
Повторюсь, сей звиздец с прошивками и Линуксами творится в пределах нескольких девайсов с идентичным именем, на идентичной архитектуре, а зачастую даже на совершенно идентичных процессорах.
Короче ARM не светит на десктоп. И как мне кажется именно по причине прибитости гвоздями загрузчика к железу, железа к реализации в загрузчике. Если ваш девайс по каким-то причинам теряет свою ОС — он превращается в кирпич, по крайней мере пока вы не вкатите туда ОС с точно такого же девайса.
И да, если у кого-то есть дельные предложения по запуску Linux на этом девайсе — буду премного благодарен, пушо пока на нем работает только две ОС — CoreElec (андроид) и Khadas recovery (который хоть и Linux, но покоцанный дюже), впрочем видящий только гиг ОЗУ. X96 2G на Amlogic S905W.
Моя записная книжка
Мне попала в руки приставка X96 Max с нерабочим HDMI-выходом. Через AV-выход она работала, но с разрешимостью не более 576p, что делало возможным использовать ее только с кинескопными телевизорами, которых у меня нет :). Т. к. данная приставка по характеристикам превосходит разные Raspberry (Orange) Pi, а по цене дешевле, решено было установить на нее Linux и попытаться использовать в системе домашней автоматизации. Что из этого вышло – узнаете, дочитав данную статью.
Смотрим, что из себя представляет X96 Max:
• OS: Android 8.1 | Android 9.0
• CPU: Amlogic S905X2 четырехъядерный процессор Cortex A53 до 2 ГГц
• GPU: Mali-G31 MP2 Dvalin
• ROM/RAM: 32GB + 4GB LPDDR4
• Сеть: Gigabit Ethernet, WIFI 802.11 b/g/n/ac, Bluetooth 4.0 | Ampack AP6356S
• Видео выход: HDMI 2.1 до 4K при 75 Гц с HDR, AV-порт 3,5-мм (композитный).
• Аудио: аналоговый стереозвук через AV-порт, цифровой звук через HDMI и оптический S/PDIF
• USB: USB 3,0×1, USB 2,0×1
• Разное: ИК-порт для внешнего приемника, светодиодный дисплей и слот для карт памяти microSD
Приступаем к установке:
Подготавливаем загрузочную microSD карточку
1) Если у Вас, как и у меня установлен Android 9, то его необходимо понизить до версии 8.1, т.к. на девятой android используется другой загрузчик, который имеет проблемы с загрузкой с карточки microSD и работой сетевой карты под linux. Как установить на приставку Android 8.1 я описал в этой статье. Если же у Вас установлена прошивка на Android 8.1, то переходим к пункту 2.
2) Далее переходим по ссылке https://github.com/ophub/amlogic-s9xxx-armbian/releases и скачиваем последний актуальный образ с Debian для нашего ТВ бокса. На момент написания статьи это Armbian_22.11.0_Aml_s905x2-km3_bullseye_5.15.72_server_2022.10.06.img.gz
3) Используя balenaEtcher или Rufus записываем образ карточку microsd объемом не менее 4Гб(Я использовал Rufus и карточку на 32Гб)):
4) На единственном доступном под Windows разделе microSD-карточки Boot переходим в папку \dtb\amlogic и копируем имя *.dtb-файла нашей приставки (meson-g12a-x96-max.dtb):
5) Вставляем скопированное *.dtb-файла в строки FDT=/dtb/amlogic/*** файлов \extlinux\extlinux.conf и uEnv, заменяя существующие имена dvb-файлов и сохраняем. Должно получиться так:
Загружаемся с карточки MicroSD:
6) Далее нужно вставить microSD-карточку в x96 max и выполнить загрузку с нее. Это можно сделать двумя способами:
a) Зажать при помощи спички или зубочистки на кнопку сброса, расположенную внутри AV-выхода, подключить питание и отпустить кнопку через 5-10 секунд:
b) Или установить на TV Box с плеймаркета или apk-файла программу Reboot to LibreELEC и перезагрузиться с android через нее:
7) Начнется загрузка Debian с microSD-карточки. В конце загрузки видим ip-адрес приставки и предложение создать пароль пользователя root:
8) Можно подключить клавиатуру и выполнить настройку используя экран телевизора. Для меня же удобней подключиться с компьютера при помощи PuTTY по этому адресу и выполнять все задачи с ПК:
9) Пользователь «root», стартовый пароль «1234». После входа необходимо сменить пароль для пользователя «root»:
10) Далее нужно выбрать кома́ндную оболо́чку (Command-line shell) Debian. Я выбрал zsh:
11) Следующим шагом создаем нового пользователя (root использовать в Linux не комильфо). У меня это логин пользователя chvv:
12) Задаем пароль для нового пользователя. Если попытаться ввести слишком простой паль пароль – система его не примет и скажет, что « it does not contain enough DIFFERENT characters ». Это значит, что должно использоваться правило «3 из 4», то есть в пароле должны быть одновременно как минимум три разных типа символов из четырех возможных: строчные буквы (напр. abcde), ЗАГЛАВНЫЕ (ABCD), цифры (12345), а также спецсимволы (!@#$): .
14) Подтверждаем часовой пояс:
15) Выбираем кодировку языка ввода:
16) Первоначальная настройка закончена. При желании можно выйти из системы и войти под вновь созданным пользователем.
Устанавливаем ARMBIAN на встроенную NAND-память
17) Обновляем списки пакетов
18) Проверяем и устанавливаем обновления Debian
На предложения системы соглашаемся:
19) Запускаем процесс установки на NAND
20) Выбираем ID своей приставки – по типу процессора, модели приставки и файла dtb. Для ТВ бокса x96 max это «301»:
21) Выбираем тип файловой системы:
22) Установка Armbian закончена. Теперь можно извлечь из x96 max microSD-карточку и передернуть разъем питания. Пойдет загрузка Armbian из встроенной памяти NAND.
Настройка ARMBIAN после установки
23) Снова подключаемся при помощи putty к ТВ боксу (обратите внимание, IP может измениться и быть не тот, что при загрузке с microSD-карточки).
Также смотрим версию Debian следующей командой (как видно из скриншота ниже у меня Debian 11.5)
24) Подключаем встроенный в ТВ Бокс x96 max цифровой дисплей. Для этого вводим команду:
и вводим пароль пользователя:
25) Выбираем тип (ID) дисплея (в нашем случае 11):
После этой команды на приставке включится дисплей:
26) Экран будет светиться до перезагрузки. Если перезагрузить x96 max то цифровой дисплей отключится и чтоб его снова включить, нужно будет повторить действия предыдущего пункта.
Чтоб дисплей после перезагрузки не отключался нужно ввести две команды:
sudo sed -i '/armbian-led/d' /etc/rc.local
В следующей команде ‘/exit 0/i\armbian-led 11 ‘ число 11 обозначает тип дисплея из предыдущего 25-го пункта
sudo sed -i '/exit 0/i\armbian-led 11' /etc/rc.local
Теперь дисплей будет работать и после перезагрузки.
27) Далее я расскажу как подключить WIFI вместо LAN. Проверяем состояние сетевых адаптеров:
28) Теперь подключаем с помощью команды
sudo nmcli dev wifi connect "dream2" password "network-password"
Где вместо » dream2 » – нужно ввести название Вашей точки доступа Wifi, а вместо » network-password » – пароль доступа к этой точке.
29) Проверить активные подключения можно командой
Теперь LAN кабель можно отключать. Приставка будет работать по WIFI.
На этом пока все. В следующей статье я расскажу как установить систему умного дома Home Assistant на x96max