- Advanced Features¶
- How to set wireless access point?¶
- How to connect IR remote?¶
- Outdated¶
- How to freeze your filesystem? (outdated)¶
- Add a Wi-Fi Connection #
- Method 2: nmcli #
- 1: list wireless networks #
- Connect to network (without password) #
- Connect to network (with password) #
- DiyTronic
- Получаем проблему
- Альтернативные драйвера
- Анализируем ошибки
- Linux и firmware
- Что не так в нашем случае
- Задаём код региона
- CRDA (central regulatory domain agent)
- cfg80211
- clm_blob
- И что таки делать?
- Всё чудесатее и чудесатее
- Я сдаюсь
- Итого
- Ссылки
Advanced Features¶
Docker works reliably with the distribution-provided builds. It is as simple as apt-get install docker.io .
If you prefer to use the latest Docker builds provided directly by Docker, please follow the guide below.
Though if you run into trouble using those please revert back to distribution binaries before complaining.
- Armbian 20.08.17 or newer with Kernel 3.10 or higher
- Debian Buster (might work elsewhere with some modifications)
- root access
This method is based on Docker Debian installation documentation. Execute this as root:
apt-get remove docker docker-engine docker.io containerd runc apt-get install ca-certificates curl gnupg lsb-release mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null apt update apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Test if Docker works correctly:
If you get that kind of output, then Docker install went fine:
Hello from Docker! This message shows that your installation appears to be working correctly.
If you would like to use Docker as a non-root user, you should now consider adding your user to the docker group with something like:
usermod -aG docker your-user
You will have to log out, and log in once more in order to be able to run Docker without being root.
Let’s try a last test to see if a Docker container can be seen outside of your Armbian machine:
docker run -d -p 80:80 hypriot/rpi-busybox-httpd
… and point the browser of any device in the same network to http:///
How to set wireless access point?¶
There are two different HostAP daemons. One is default and the other one is for some Realtek wifi cards. Both have their own basic configurations and both are patched to gain maximum performances.
Default binary and configuration location:
/usr/sbin/hostapd /etc/hostapd.conf
Realtek binary and configuration location:
/usr/sbin/hostapd-rt /etc/hostapd.conf-rt
Since its hard to define when to use which you always try both combinations in case of troubles. To start AP automatically:
- Edit /etc/init.d/hostapd and add/alter location of your conf file DAEMON_CONF=/etc/hostapd.conf and binary DAEMON_SBIN=/usr/sbin/hostapd
- Copy /etc/network/interfaces.hostapd to /etc/network/interfaces
- Reboot
- Predefined network name: “BOARD NAME” password: 12345678
- To change parameters, edit /etc/hostapd.conf BTW: You can get WPAPSK the long blob from wpa_passphrase YOURNAME YOURPASS
How to connect IR remote?¶
- Note: As of 2020-11-25, the above (Kodi / learn) link is broken. However I am not sure what to replace it with. If you know (or find out) please submit a PR. — TRS-80
You are going to need the list of all possible commands which you can map to your IR remote keys:
To start with learning process you need to delete old config:
Then start the process with:
irrecord --driver=default --device=/dev/lirc0 /etc/lircd.conf
And finally start your service when done with learning:
Outdated¶
How to freeze your filesystem? (outdated)¶
In certain situations it is desirable to have a virtual read-only root filesystem. This prevents any changes from occurring on the root filesystem that may alter system behavior and it allows a simple reboot to restore a system to its clean state.
You need an ODROID XU4 or Allwinner A10, A20 or H3 board with legacy kernel where we added support for overlayfs. Works only on Ubuntu Xenial. Login as root and execute:
apt-get install overlayroot echo 'overlayroot="tmpfs"' >> /etc/overlayroot.conf reboot
After your system boots up it will always remain as is. If you want to make any permanent changes, you need to run:
Changes inside this will be preserved.
Add a Wi-Fi Connection #
The nmtui tool, or NetworkManager Text User Interface , is a component of NetworkManager, and can be used (in a TUI style) to add and select a Wi-Fi network. Nmtui is, however, also capable of managing other types of networks, and depending on your circumstances may not be the best option. This leads is to…
Method 2: nmcli #
nmcli , like nmtui , is a component of networkmanager, and has the same features.
To connect to a wireless network, follow these instructions:
1: list wireless networks #
To show a list of Wi-Fi networks, at a sudo-enabled terminal, enter:
sudo nmcli device wifi list
The output should look like this:
* SSID MODE CHAN RATE SIGNAL BARS SECURITY * Orange-Pi-wifi Infra 11 54 Mbit/s 100 ▂▄▆█ -- A13-Wifi Infra 6 54 Mbit/s 30 ▂___ WPA1 WPA2 2WIRE533 Infra 10 54 Mbit/s 44 ▂▄__ WPA1 WPA2
Connect to network (without password) #
If your network does not require a password (I.E. is not secure), you can connect to it with the following command:
sudo nmcli device wifi connect 'WiFINetworkName' ifname wlan0
Give it a few seconds to connect, then verify your connectivity with:
ip -br address show dev wlan0
Connect to network (with password) #
However, if your network does require a password (as most should), you may connect to it with the following command, replacing WiFiNetworkName and WiFiNetworkPass with your network name and password, respectively:
sudo nmcli device wifi connect 'WiFiNetworkName' password 'WifiPass' ifname wlan0
Please do keep in mind that you will not receive feedback while typing the password component of the above command, for security reasons.
Once again, verify your connectivity with:
ip -br address show dev wlan0
DiyTronic
В ходе настройки Orange Pi Zero Plus 2 H3 обнаружил, что есть конкретные проблемы с Wi-Fi. В зависимости от используемого дистрибутива Linux имеем либо негрузящайся драйвер, либо работают только первые 11 каналов Wi-Fi, а учитывая, что моих сетей там нет, это проблема, которую пришлось решать. Решение я нашёл и ниже я его вам покажу и расскажу как с этой проблемой бороться.
Итак, хотелось мне запустить эту плату именно в Armbin, но именно этот дистрибутив славился тем, что данная плата в нём Wi-Fi не поддерживала. Но мы не ищем лёгких путей и из-за какого-то там чортова драйвера менять дистрибутив для меня просто унижение. Если драйвер есть и он в принципе работает, то и в Armbian он у меня заработает. Вызов принят!
Получаем проблему
Итак, первым делом накатываем Armbian. На официальной стрaнице образа для данной платы я не нашёл, но зато нашёл где эти сборки выкладываются. В общем качаем отсюда https://fi.mirror.armbian.de/archive/orangepizeroplus2-h3/archive/. Я использовал версию bullseye. Пробовал jammy, но там ровно тоже самое.
Альтернативные драйвера
Они существуют и возможно работают.
Проблема одна — их надо качать, а сети нет. Можно конечно скачать код на другом компьютере, залить на карточку и попытаться собрать на плате, но слишком много возни и вероятно потребуется докачивать зависимости.
Анализируем ошибки
В итоге имеем условно работающий Wi-Fi из каробки с куцым списком доступных сетей и ошибки в логах при загрузке фирмвари данного драйвера.
% dmesg | grep brcm brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1 brcmfmac mmc1:0001:1: Direct firmware load for brcm/brcmfmac43430-sdio.xunlong,orangepi-zero-plus2-h3.bin failed with error -2 brcmfmac mmc1:0001:1: Falling back to sysfs fallback for: brcm/brcmfmac43430-sdio.xunlong,orangepi-zero-plus2-h3.bin brcmfmac mmc1:0001:1: Direct firmware load for brcm/brcmfmac43430-sdio.xunlong,orangepi-zero-plus2-h3.txt failed with error -2 brcmfmac mmc1:0001:1: Falling back to sysfs fallback for: brcm/brcmfmac43430-sdio.xunlong,orangepi-zero-plus2-h3.txt brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1 brcmfmac: brcmf_c_process_clm_blob: no clm_blob available (err=-2), device may have limited channels available brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM43430/1 wl0: Mar 30 2016 11:30:56 version 7.45.77.h8.4 FWID 01-ee8a6268
Как видно оно пытается загрузить какую-то фирмварь и не может найти нужных файлов. Придётся таки разбираться, что такое firmware и как оно грузится
Linux и firmware
В общем, как выяснилось, для всяких проприетарных драйверов типа Broadcom-а у нас есть бинарные файлы (та самая firmware), которые и подгружаются родным линуксовым драйвером, чтобы всё работало как надо. Но кроме бинарника у нас есть некий конфиг, который есть ни что иное как набор переменных, которые заливаются в NVRAM драйвера.
Что не так в нашем случае
Для нашего случая всё выглядит вот так.
% ls -la /lib/firmware/brcm/*43430* ... /lib/firmware/brcm/brcmfmac43430-sdio.bin # /lib/firmware/brcm/brcmfmac43430-sdio.txt #
Но как видно из ошибки, драйвер пытается загрузить firmware из файла с суффиксом вендора устройства, то есть /lib/firmware/brcm/brcmfmac43430-sdio.xunlong,orangepi-zero-plus2-h3.bin вместо /lib/firmware/brcm/brcmfmac43430-sdio.bin . Поэтому я решил просто создать нужные симлинки.
Забегая вперёд должен отметить, что это оказалось необязательно, а эта ошибка это скорее предупреждение. Походу драйвер таки находит фирмварь и по существующим именам. Но что сделано, то сделано и как минимум убираются сообщения об ошибках при загрузке.
После исправления имеем такую картину.
% ls -la /lib/firmware/brcm/*43430* ... /lib/firmware/brcm/brcmfmac43430-sdio.bin # /lib/firmware/brcm/brcmfmac43430-sdio.txt # /lib/firmware/brcm/brcmfmac43430-sdio.xunlong,orangepi-zero-plus2-h3.bin -> /lib/firmware/brcm/brcmfmac43430-sdio.bin /lib/firmware/brcm/brcmfmac43430-sdio.xunlong,orangepi-zero-plus2-h3.txt -> /lib/firmware/brcm/brcmfmac43430-sdio.txt
Теперь при загрузке видим следующее
% dmesg | grep brcm brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1 # brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1 # brcmfmac: brcmf_c_process_clm_blob: no clm_blob available (err=-2), device may have limited channels available brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM43430/1 wl0: Mar 30 2016 11:30:56 version 7.45.77.h8.4 FWID 01-ee8a6268
Задаём код региона
Несмотря на успешную загрузку фирмвари, нас осталась ошибка как раз насчёт ограничения каналов и фирмварь ругается на какой-то clm_blob . Это как оказалось ещё один бинарник с региональными настройками для данного драйвера. И с этими самыми настройками полная чехарда. В разное время за это дело отвечали следующие подсистемы.
CRDA (central regulatory domain agent)
С этим связаны рекоммендации поправить регион в /etc/default/crda , но нифига не работает, так как эта тема устарела с версии ядра 4.15
cfg80211
Есть так же рекоммендации передать регион драйверу Linux cfg80211, но это тоже устарело и сегодня каждый драйвер должен сам уметь разбираться с такими делами.
echo "options cfg80211 ieee80211_regdom=US" > /etc/modprobe.d/cfg80211.conf
clm_blob
Это по факту кусок базы данных, типа той, что использовалась в CRDA, но специфичный для данного драйвера. Как оказалось и этот метод устарел и вся информация уже должна содержаться в недрах драйвера. К слову я таки нашёл этот бинарь от Raspberry PI и подсунул для загрузки, но работать лучше не стало.
И что таки делать?
В итоге пришлось лезть в конфиг фирмвари и уже там я обнаружил подозрительную переменную ccode=ALL , поменяв значение которой, после перезагрузки я получил полный список Wi-Fi сетей.
#AP6212_NVRAM_V1.0_20140603 # 2.4 GHz, 20 MHz BW mode # The following parameter values are just placeholders, need to be updated. . xtalfreq=26000 nocrc=1 ag0=255 aa2g=1 ccode=ALL # extpagain2g=0 .
Но тут есть проблема — при обновлении пакета с фирмварями этот файл будет перезаписываться.
Всё чудесатее и чудесатее
Гугля по теме обнаружил ссылки на исходники с такими комментариями
/* In some cases the EFI-var stored nvram contains "ccode=ALL" or * "ccode=XV" to specify "worldwide" compatible settings. ccode=ALL is * not understood by the firmware and some of the firmware files in * linux-firmware support only 2.4 GHz and not 5 GHz when ccode=XV. */
Так, что видимо стоит попробовать вместо RU использовать XV. Возможно даже появится диапазон 5ГГц.
Я сдаюсь
Кроме всего прочего искал способ прописать ccode в драйвер через /proc или /sys.
Декомпилировал devicetree в надежде найти там способ перезаписать значения NVRAM.
Все тщетно. Походу эти фирмвари и драйвера для Broadcom писались через жопу, на скорую руку и всё, что нам остаётся это грязно патчить через подмену значения в этом текстовом конфиге.
Итого
Как оказалось в принципе по минимуму достаточно поменять ccode=ALL на ccode=RU в конфиге фирмвари драйвера.
И видимо в автозагрузку придётся добавить скрипт для замены ccode в нужном файле.