Temat: ALFA Network Quad-E4G: bootloader i OpenWrt
Pierwsza część artykułu: ALFA Network Quad-E4G
Druga część artykułu: ALFA Network Quad-E4G: zasilanie i peryferia
Sam sprzęt jest niczym bez odpowiedniego oprogramowania.
Bootloader
Jak każdy router, ALFA ma bootloader będący zmodyfikowaną wersją U-Boota od pepe2k. Zadaniem bootloadera jest ostatecznie wczytanie i uruchomienie systemu operacyjnego, ale ten ma jeszcze inne ciekawe funkcje.
____ __ ____ ____ _____ _ _
/ _ \ | | | __|/ _ \ | | |___| |_ _ _ _ ___ ___| |_
/ /_\ \| |_| __/ /_\ \ | | | | -_| _| | | | . | _| '_|
/__/ \___|____|_| /__/ \___\ |_|___|___|_| |_____|___|_| |_,_|
g77156204-SNAPSHOT_20210812
BOARD: ALFA Network Quad-E4G
SOC: MediaTek MT7621
DRAM: DDR3 256MB
FLASH: GD25Q256D 32MB (4-byte address mode)
Please select operation or press CTRL+C for CLI:
b: Run 'bootcmd'
w: Run 'httpd' (web-based recovery)
c: Run 'startnc' (start NetConsole)
0: Boot firmware via TFTP
1: Upgrade firmware via UART
2: Upgrade firmware via TFTP
* 3: Boot firmware from flash
4: Enter U-Boot CLI
7: Upgrade U-Boot via UART
8: Upgrade U-Boot via TFTP
Time left: 0s
>> Info: selecting miniSIM slot
>> Info: enabling power in M.2 slot
>> Info: enabling power in mini PCIe #0 slot
>> Info: enabling power in mini PCIe #1 slot
>> Info: enabling power in mini PCIe #2 slot
Selected '4': enter U-Boot CLI...
alfa-network > help
? - alias for 'help'
bootm - boot application image from memory
cp - memory copy
dhcp - invoke DHCP client to obtain IP/boot configuration
erase - erase SPI FLASH memory
go - start application in memory
help - print online help
httpd - start web-based recovery
loadb - load binary file over serial line (kermit mode)
mac - get/set MAC address stored in factory partition
md - memory display
mdio - Ralink PHY register R/W commands
mm - memory modify (auto-incrementing)
nm - memory modify (constant address)
printenv - print environment variable(s)
reset - perform RESET of the CPU
rf - read/write RF register(s)
saveenv - save environment variables to persistent storage
setenv - set environment variable(s)
spi - SPI FLASH commands
startnc - switch to NetConsole
startsc - switch to serial console
tftpboot - load image using TFTP protocol
tftpput - send file to TFTP server
version - print monitor version
alfa-network > version
____ __ ____ ____ _____ _ _
/ _ \ | | | __|/ _ \ | | |___| |_ _ _ _ ___ ___| |_
/ /_\ \| |_| __/ /_\ \ | | | | -_| _| | | | . | _| '_|
/__/ \___|____|_| /__/ \___\ |_|___|___|_| |_____|___|_| |_,_|
g77156204-SNAPSHOT_20210812
U-Boot version: 1.1.3 (2021-08-12)
MediaTek SDK: 5.0.0.0
Uruchomienie bootloadera oraz lista poleceń
(tak, bootloader widzi tylko 256MB pamięci RAM, system operacyjny widzi już całą)
Funkcja recovery
Bootloader ma kilka możliwości wgrania nowego obrazu systemu. Można skorzystać z poleceń instalujących oprogramowanie przy pomocy interfejsu UART lub wykorzystując protokół TFTP, ale jedną z ciekawszych rzeczy jest funkcja recovery przez HTTP. Wystarczy trzymać reset podczas podłączenia zasilania i puścić go po kilku sekundach aby uboot uruchomił swój własny serwer HTTP na adresie 192.168.1.1. Ustawiamy wtedy w komputerze na karcie sieciowej na stałe adres IP np. 192.168.1.2, podłączamy router kablem do komputera, uruchamiamy przeglądarkę internetową, wprowadzamy adres http://192.168.1.1 i można tak po prostu przesłać obraz który zostanie wgrany do flash.
Tryb recovery bootloadera
Jeżeli ktoś używał już takiego zmodyfikowanego bootloadera od pepe2k to sprawa jest dla niego oczywista.
Niezależnie od recovery po HTTP mamy jeszcze funkcję netconsole, umożliwiającą uzyskanie konsoli na porcie sieciowym 192.168.1.1:6666 po udp.
Dual image
Bootloader ma też funkcję podwójnego obrazu firmware. W flash przechowywany jest drugi obraz systemu który może być uruchomiony pod pewnymi warunkami. Steruje tym odpowiednia flaga w zmiennych środowiskowych ("dual_image") i oznacza dwa różne tryby pracy routera:
1. Jeden obraz firmware
Ustawiamy w zmiennych środowiskowych opcję "dual_image" na 0. Wgrywamy przez recovery nowy obraz i mamy działający system wraz z możliwością skorzystania z całego dostępnego obszaru pamięci. Na płytce mam 32MB pamięci flash, po wgraniu np. mojego MiFi zostało prawie 24,5MB wolnej przestrzeni którą możemy wykorzystać do własnych celów.
2. Dwa obrazy firmware
Po ustawieniu zmiennej środowiskowej "dual_image" na 1 zaczyna dziać się magia. Z pamięci flash zostaje wydzielony dodatkowy obszar prawie 16MB (będzie widoczny w OpenWrt jako partycja o nazwie "backup") który może posłużyć do przechowywania drugiego obrazu. Bootloader uruchamia wtedy obraz z partycji wskazanej w zmiennej środowiskowej "bootactive" (1 - uruchamia z pierwszej, 2 - uruchamia z drugiej). Co więcej - sam proces aktualizacji systemu (sysupgrade) wgrywa oprogramowanie zawsze na tą drugą nieużywaną partycję i ustawia ją jako aktywną, co zostawia "stary" system w nienaruszonym stanie. Przy takim podziale, po wgraniu wspomnianego obrazu MiFi zostaje dla użytkownika już niespełna 8,5MB wolnej przestrzeni.
Z dwoma obrazami związana jest jeszcze jedna funkcjonalność - sprawdzanie poprawności uruchomienia obrazu. Jeżeli z jakiegoś powodu obraz na partycji wskazanej przez "bootactive" nie uruchomił się - nastąpi cykliczna próba jego ponownego uruchomienia. Uboot przechowuje w odpowiedniej zmiennej liczbę prób i jeżeli trzy razy (to też jest konfigurowalne) nie uruchomi się poprawne system to uboot przełączy aktywną partycję na następną. Dzięki zewnętrznemu watchdogowi i systemowi podwójnego obrazu możemy mieć raczej pewność że system uruchomi się sprawny, nawet jeżeli np. wgrany obraz okazał się wadliwy.
Z powodu tego mechanizmu, jak pisałem wcześniej, dobrze że mamy bezpośredni dostęp do konsoli systemowej - można te zmienne ustawić jeszcze przez wgraniem systemu operacyjnego i skonfigurować system wg własnego uznania. Jeżeli mamy działający OpenWrt to zmienne środowiskowe bootloadera można także ustawić m.in poleceniem fw_setenv - jest pełny dostęp do partycji ze zmiennymi.
System operacyjny
Oczywiście jest to OpenWrt. W sumie jest to najbardziej nudny fragment zabawy bo wszystko co ma płytka po prostu działa i jest obsługiwane. Czy to czysty obraz, czy to LuCI, Gargoyle czy MiFi - nie ma problemu z obsługą poszczególnych elementów sprzętowych. Należy pamiętać że obrazy domyślnie nie zawierają obsługi kart Wi-Fi - należy zainstalować sterowniki stosownie do włożonych karty oraz doinstalować ew. firmware do nich i jedną z odmian programu hostapd/wpad. Podobnie jest z obsługą nośników - samo wsparcie dla karty microSD jest, ale należy doinstalować także obsługę danego systemu plików oraz np. block-mount czy sambę jeżeli chcemy udostępniać ten nośnik.
Pisałem już o tym ale muszę ponownie wspomnieć wsparciu dla sprzętowej obsługi flow offloadingu i sprzętowej obsłudze operacji kryptograficznych. Pierwsza sprawa była omawiana przy okazji innego urządzenia na tej samej platformie: https://eko.one.pl/forum/viewtopic.php? … 26#p232126, zaś druga - łatki zostały przeportowane przeze mnie do moich obrazów OpenWrt 23.05-snapshot i a sama sprawa omówiona została na forum openwrt: https://forum.openwrt.org/t/mediatek-ei … ess/111510
Flow offloading (w wersji programowej oraz sprzętowej) wspomaga proces natownia pakietów co powoduje mniejsze obciążenia procesora oraz zwiększenie sumarycznej wydajności routera przy procesie przerzucania pakietów. Sterownik EIP93 zaś umożliwia wykorzystanie kawała krzemu w tym SoC do wspomagania liczenia różnych algorytmów kryptograficznych co daje z kolei znaczne zwiększenie szybkości działania np. VPNów które używają określonych algorytmów.
root@192.168.11.1's password:
BusyBox v1.36.1 (2023-11-15 10:00:19 UTC) built-in shell (ash)
_______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| W I R E L E S S F R E E D O M
-----------------------------------------------------------------------------
| |
| OpenWrt 23.05-SNAPSHOT, r23755-48c81b80b2 |
| |
| Build time: 2024-02-26 18:55 CET |
| Cezary Jackiewicz, https://eko.one.pl |
| |
-----------------------------------------------------------------------------
| Machine: ALFA Network Quad-E4G |
| Uptime: 0d, 02:12:14 |
| Load: 0.00 0.00 0.00 |
| Flash: total: 21.4MB, free: 20.7MB, used: 3% |
| Memory: total: 434.0MB, free: 346.0MB, used: 20% |
| Leases: 1 |
| lan: static, 192.168.11.1 |
| wan: dhcp, 10.81.224.16 |
| wan6: dhcpv6, ? |
| radio0: lan, mode: ap, ssid: OpenWrt, channel: 36, conn: 13 |
| radio1: lan, mode: ap, ssid: OpenWrt, channel: 6, conn: 0 |
-----------------------------------------------------------------------------
Dodatek 1: ALFA Network Quad-E4G: wyświetlacz OLED na I2C
Dodatek 2: ALFA Network Quad-E4G: 3ginfo