Искусство шаманства или кастомная прошивка для Olinuxino. Kernel и Ubuntu Часть 3 +3


Сборка kernell


Объясню, почему не подходят существующие образы. Основная их проблема в том что они собраны на старом ядре 3.4, а это сразу накладывает ограничение на компилятор максимум версии 4 и ubuntu 12.04 точно, 14.04 не помню. Вот и выходит что если хочешь использовать последний софт и библиотеки то придется пересобирать последнее ядро. Конечно можно в исходниках снять ограничение на компилирование не ниже 5 версии gcc и исправить код чтоб собрался и под 4 версией, но это тот еще геморой. Не говоря уже о том что в нашем случае графическая часть линуха лишняя.

Для начала с kernel.org выкачиваем ядро 4.14.57 на тот момент это была последняя стабильная версия.

В папке с исходником создаем скрипт запускающий конфигурирование:

#!/bin/sh
make  	O=../olimex-kernel-4.14.57 		# папка где будет собрано ядро
	-j2 					# собирать в два потока
	ARCH=arm 				# тип процессора под который собирать
	CROSS_COMPILE=arm-linux-gnueabihf-  	# кросс компилятор
	xconfig				# запуск конфига

Получим что то вроде этого:



В меню файл по адресу /linux-4.14.57/arch/arm/configs/ выбираем файл sunxi_defconfig, там базовые настройки процессоров серии sunxi. И дальше необходимо дополнить некоторые настройки. Т.е. ищем ниже указанные флаги и конфигурируем их.

Все по возможности встраиваем в ядро.

CONFIG_BLK_DEV_INITRD — не будем использовать ramfs вместо этого потом заведем Aufs(advanced multi-layered unification filesystem). Короче снимаем чекбокс.
CONFIG_MEMCG — включаем как и все что внутри
CONFIG_BLK_CGROUP — включаем
CONFIG_CGROUP_DEVICE — включаем
CONFIG_CGROUP_CPUACCT — включаем
CONFIG_CGROUP_PERF — включаем как и все что внутри
CONFIG_EXPERT — просто выбираем и все что внутри оставляем по умолчанию
CONFIG_BLK_WBT — выбираем как и все что внутри
CONFIG_PARTITION_ADVANCED — выбираем и внутри
CONFIG_SUN_PARTITION — выбираем
ARCH_SUNXI — внутрях оставляем только MACH_SUN5I

В bus support выбираем CONFIG_PCI, поскольку USB wifi требует поддержки шины PCI. Явно при включении поддержки wifi kernell не требует pci шины, однако без этого wpa суппликант не находит usb wifi. Почему так происходит, можете заглянуть в глубины истории но судя повсему так сложилось исторически, в общем это надо знать и помнить.

CONFIG_CPU_FREQ_STAT — находим и выбираем
Внутрях CONFIG_NET выбираем WIRELESS а дальше CONFIG_CFG80211 а там отмечаем CONFIG_NL80211_TESTMODE и CONFIG_CFG80211_WEXT последний включает драйвер нашего wifi для суппликанта.
CONFIG_MAC80211 — включаем сетевой стек.
CONFIG_MAC80211_MESH — включаем
CONFIG_MAC80211_LED — ну и это выберем
CONFIG_NFC — включаем как и то что внутри кроме CONFIG_NFC_NCI.
CONFIG_PARPORT — включаем
CONFIG_LED_TRIGGER_PHY — выбираем
CONFIG_REALTEK_PHY — выбираем
CONFIG_WLAN — выбираем
CONFIG_RTL8XXXU — выбираем а внутри CONFIG_RTL8XXXU_UNTESTED отмечаем.
CONFIG_SERIO_SUN4I_PS2 — включаем
CONFIG_SERIAL_DEV_BUS — включаем а внутри выбираем SERIAL_DEV_CTRL_TTYPORT.
CONFIG_USB_WUSB_CBAF — включаем
CONFIG_USB_WUSB_CBAF_DEBUG — включаем
CONFIG_USB_WDM — включаем
CONFIG_USB_SERIAL — выбираем
CONFIG_UWB — выбираем а внутри выбираем CONFIG_UWB_HWA и CONFIG_UWB_I1480U а после этого появится CONFIG_USB_WUSB и тоже выбираем.
Выбираем CONFIG_STAGING а внутри выбираем драйвер CONFIG_RTL8192U и CONFIG_RTLLIB, а внутри последнего тоже все выбираем. Они отмечаются модулями поэтолму позже придется их прикручивать отдельно.
CONFIG_R8188EU — выбираем

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

make  	O=../olimex-kernel-4.14.57/ 
	-j2 
	ARCH=arm 
	CROSS_COMPILE=arm-linux-gnueabihf- 
	uImage 			# собрать ядро
	modules 			# собрать модули
	LOADADDR=0x40008000	# адрес в памяти откуда будет загружено ядро

Заодно собирем и devicetree файлы:

make  	O=../olimex-kernel-4.14.57 
	-j2 
	ARCH=arm 
	CROSS_COMPILE=arm-linux-gnueabihf- 
	dtbs

Это нужно на всякий случай, потому как исходные файлы могут быть с ошибкой хоть они и одинаковы в kernel и в uboot. Поэтому не один так другой заработает.

Следующим шагом собираем на первом разделе sd карты собранные файлы:
/olimex-kernel-4.14.57/arch/arm/boot/ отсюда достаём собранное ядро, оно называется uImage и весит всего 4.7 метра.
/olimex-uboot/arch/arm/dts/ отсюда достаём скомпиленное дерево, файл sun5i-a13-olinuxino.dtb
- /u-boot-2018.05/ отсюда достаём скомпиленный загрузочный скрипт boot.scr.

Сборка ubuntu


Поскольку все необходимые части для загрузки rootfs подготовлены осталось собрать ubuntu и для этого возъмём последнюю версию 18.04.

Для начала создадим в корневой директории папку:

sudo mkdir /destrupt

Именно тут потому что для того чтоб потом применить chroot необходимы либо полные права как в корневой директории, либо прописать конфигурацию chroot для любой другой папки. Корче проще создать папку в корневой директории и не морочится с конфигурированием.

Для сборки нам понадобятся следующие пакеты, их нужно поставить если нету:
— Qemu-user-static
— debootstarp
— schroot

Дальше запускаем сборку ubuntu:

sudo qemu-debootstrap # используем именно qemu так как вместе со сборкой ubuntu установится и qemu что позволит сразу запускать chroot на собранную версию ubuntu
--arch armhf # тип архитектуры процессора
--variant=minbase # сборка в минимальной версии
bionic # версия для сборки 18.04
/destrup/ # адрес где собирать
http://ports.ubuntu.com/ubuntu-ports # откуда собирать исходники

Ну вот и собранна ubuntu 18.04 приступим теперь к пошаговой настройке:

1. Перед запуском лезем в /destrup/etc/apt/ и правим sources.list, добавляем следующее:

deb http://ports.ubuntu.com/ubuntu-ports bionic main restricted
	deb http://ports.ubuntu.com/ubuntu-ports bionic universe
	deb http://ports.ubuntu.com/ubuntu-ports bionic multiverse

Это просто источники для дистрибутивов под наш процессор.

2. Запускаем change root на только что созданный дистриб ubuntu:

sudo chroot /destrup 

Первым делом выставляем пароль для root пользователя:

passwd root

Этот пароль необходим для входа в систему при загрузке.

3. Устанавливаем следующие пакеты.

apt update — обновляем пакеты

Ставим перечень пакетов для работы сети: iputils-ping, dhcpcd5, iproute2, iw, networkd-dispatcher, wireless-tools, net-tools.

Системные пакеты для работы с сетью: linux-firmware, wpasupplicant, systemd, hostapd, kmod, udev.

Ну и остальное чтоб удобно все это было редактировать и настраивать: nano, mc, usbutils, sudo.
А описывать я то все не буду ибо растянется это еще на пару статей, лишь пройдемся по некоторым пакетам необходимым в настройке.

Настройка wpa supplicant.


Для начала в кратце разберем что представляет из себя usb wifi.

Сама микросхема которая обеспечивает wifi (в данном случае rtl8188) представляет собой навернутый АЦП, со своим особенным представлением данных и выходом на usb. т.е. если запустить команду lsmod без загруженного модуля r8188eu.ko то мы увидим только то что кто то занял usb порт. При загрузке модуля, будет видно уже и название устройства, проще говоря этот модуль представляет собой лишь программный интерфейс управления этой микросхемой.

Следующая по важности библиотека это lib80211.ko сам стандарт IEEE 802.11, простыми словами это интерпретация оцифрованных сигналов эфира в представление конкретных ehternet протоколов. Но вот чтоб всем этим управлять необходимо ставить linux-firmware в его составе будет драйвер -wext- который и будет всем этим заниматься. Его мы будем подключать в суппликанте дальше.

Начнем конфигурацию суппликанта.

Лезем в свежесобранной ubunte по этому адресу:

/ etc / wpa_supplicant / wpa_supplicant.conf

И создаём файл конфигурации если нету а если есть, правим к такому виду:

ctrl_interface_group=0	# означает что не будет использоваться графический интерфейс
ctrl_interface=/var/run/wpa_supplicant	# ссыль  где будет лежать файл устройства
	# когда суппликант подключится и опознает наш usb свисток 
	# тут будет лежать файл устройства
ap_scan=1   	#wpa_supplicant сканирует точку доступа, используется по-умолчанию
network={
ssid="SSID_сети"	
psk="пароль сети"
key_mgmt=WPA-PSK	# протокол аутентификации
proto=WPA2
pairwise=CCMP
}

Если все настроено верно и выше описанные модули загружены, то по адресу указанному в конфигурации (параметр ctrl_interface) будет создан файл устройства.

Настройка systemd


Суппликант то мы настроили, но вот запускать его пока некому. Можно конечно установить network-manager и наслаждаться автонастройкой, но где же тогда хардкор где треш. В общем сплошная скука.

Потому лезем по адресу:

/ etc / systemd / system/

И тут создаем файл с именем network-wireless.service если нет, а если есть начинаем править:

[Unit]	# описание порядка запуска и остановки сервиса
Description=Wireless network connectivity	
Wants=network.target	 	
After=sys-subsystem-net-devices-wlx007005012449.device 
Before=network.target
BindsTo=sys-subsystem-net-devices-wlx007005012449.device
[Service] # описание запуска юнита
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/ifconfig wlx007005012449 up	# включение устройства
ExecStart=/sbin/wpa_supplicant -B -i wlx007005012449 -D wext -c /etc/wpa_supplicant/wpa_supplicant.conf   # запуск супликанта
ExecStart=/sbin/dhcpcd wlx007005012449	# запуск dhcp для свистка
[Install]
WantedBy=multi-user.target

Остановимся подробнее на запуске суппликанта:

ExecStart=/sbin/wpa_supplicant # путь доступа к супликанту
-B # запускать в фоновом режиме
-i wlx007005012449 # интерфейс для запуска, тот самый файл устройства
-D wext # имя драйвера для свистка из linux-firmware
-c /etc/wpa_supplicant/wpa_supplicant.conf # адрес файла конфигурации суппликанта

Ну в общем то все необходимое настроено, переходим к установке модулей.

Установка модулей.


Для установки модулей вернемся немножко назад, а именно в папку с исходником ядра и запустим от туда команду копирования модулей из kernel в папку с ubuntu:

make  O=../olimex-kernel-4.14.57 
	-j2 
	ARCH=arm 
	CROSS_COMPILE=arm-linux-gnueabihf- 
	modules_install 	# команда для установки модуля
	INSTALL_MOD_PATH=/destrup	# адрес установки модуля

После этого все наши собранные модули скопированы в ubuntu по адресу:

/ lib / modules / 4.14.57 / kernel

Теперь самое главное нужно прописать запуск скопированных модулей и всех их зависимостей, поэтому лезем по адресу:

/ etc / modules

И запускаем открываем файл modules на редактирование и дописываем следующие модули:

michael_mic
r8188eu		#	наш модуль
r8192e_pci
rtllib			
rtllib_crypt_ccmp
rtllib_crypt_tkip
rtllib_crypt_wep
r8192u_usb		#
lib80211		#	библиотека стандарта  IEEE 802.11

Теперь осталось скопировать всю собранную ubuntu в раздел sd карты помеченный в предыдущей статье как раздел для ubuntu.

После этого можно вставлять флешку в борду, подавать питание и садится на её uart для доступа к её управлению или по ssh влезть. Можно в systemd добавить команду на установку ip адреса или другой конфигурации в общем то все остальное в ваших руках…

Первая часть статьи
Вторая часть статьи




К сожалению, не доступен сервер mySQL