Raspberry Pi + Fedora (aarch64) = Wi-Fi Hotspot (или малиновый роутер в синей шляпе)

в 9:55, , рубрики: fedora aarch64 raspberry pi wi-fi, Настройка Linux, Разработка на Raspberry Pi

В статье Raspberry Pi + CentOS = Wi-Fi Hotspot (или малиновый роутер в красной шляпе) я рассказал о способе превращения «малинки» в беспроводную точку доступа при помощи операционной системы CentOS. Собрав по такому чертежу мой домашний роутер, я удовлетворил свое творческое эго и получил заряд спокойствия за критически важный элемент моей уютной инфраструктуры. Однако ощущение незаконченности решения и внутренний перфекционизм не давали покоя: «несовершенный результат работы не имеет права на существование». Мысль о том, «что идеал может и должен быть достигнут» не покидала меня ни на минуту.

И вот однажды на одном из тематических форумов я натолкнулся на обсуждение разрядности существующих операционных систем для «малинки» (aarch64 vs armhfp): какие 64-битные ОС в принципе могут влезть и заработать на Raspberry версии 3++?

Моя любимая CentOS для архитектуры ARM от «Userland» не спешила переходить на ядро последней версии и превращаться в 64-битную. А репозиторий EPEL, подключенный Бог весть откуда без цифровой подписи, являлся кошмаром в мой неспокойный сон…

Выступая адептом RPM-based дистрибутивов, я с удивлением обнаружил, что в обсуждениях ОС для «малинки» абсолютно забытой оказалась Fedora! И это при том, что ее релиз
с 28-ой версии официально поддерживает Raspberry Pi 3B+ в 64-битном исполнении!

Fedora aarch64

В этой статье я расскажу о способе установки Fedora (aarch64) на Raspberry Pi 3 Model B+ в экстра минимальном исполнении. Кратко остановлюсь на особенностях поднятия Wi-Fi точки доступа, выявленных в результате опытной эксплуатации моей предыдущей конфигурации на CentOS 7.

0. Что понадобится

Все тоже самое, что перечислено в предыдущей статье:

  • Raspberry Pi 3 Model B+;
  • microSD >= 4GB (в последствии можно «перенести» систему на 2GB накопитель);
  • Рабочая станция с Linux и картридером microSD;
  • Проводная сетевая связанность «малинки» и рабочей станции с Linux (в этом случае не понадобятся дополнительные монитор и клавиатура для настройки), доступ в Интернет с обоих устройств;
  • Продвинутый скилл в Linux (знать и не бояться: parted, dd и mkfs).

Подобно итеративной LFS-сборке собственного Linux, будет использован дистрибутивный образ Fedora, а потом на его основе — создана минимальная система (без «компиляции из исходников»).

1. Установка оригинального дистрибутива

Координаты raw-образа системы в Сети:
https://.../fedora-secondary/releases/.../Spins/aarch64/images/Fedora-Minimal-...xz
После его записи на microSD и перед началом использования нужно:

  1. Расширить «корень» файловой системы (3-ий раздел, ext4)
    parted /dev/mmcblk0 resizepart 3 100%
    e2fsck -f /dev/mmcblk0p3; resize2fs /dev/mmcblk0p3; e2fsck -f /dev/mmcblk0p3
    for i in 1 2 3; do mkdir -p /mnt/$i; mount /dev/mmcblk0p$i /mnt/$i; done
    

  2. Отключить SELinux
    echo 'SELINUX=disabled' > /mnt/3/etc/selinux/config
    

  3. Удалить Мастера первоначальной настройки
    find /mnt/3/etc/systemd/ -iname initial-setup.service -delete
    

  4. Разрешить доступ по ssh
    mkdir -p /mnt/3/root/.ssh
    cp -fv ~/.ssh/id_rsa.pub /mnt/3/root/.ssh/authorized_keys
    sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/g' /mnt/3/etc/ssh/sshd_config
    

Вот теперь можно загрузить «малинку» с microSD и подключиться к ней по сети.
Холодный старт занимает около полутора минут. ТТХ системы после загрузки:

Fedora aarch64

rpm -qa | wc -l
444

2. Сборка минимальной системы

К сожалению, «минимальный дистрибутив» от разработчиков оказывается далеко не самым скромным в потреблении ресурсов. Образ системы можно сделать еще меньше.

Для этого на «малинке» нужно выполнить скрипт:

#!/bin/bash

. /etc/os-release
P=$(mktemp --directory $(pwd)/$ID-$VERSION_ID.XXX)

dnf --installroot=$P --releasever=$VERSION_ID --setopt=install_weak_deps=false 
--assumeyes install  
    bcm283x-firmware 
    dnf              
    grub2-efi-aa64   
    kernel           
    openssh-server   
    shim-aa64

for f in /boot/efi/EFI/fedora/grub.cfg 
         /boot/efi/EFI/fedora/grubenv  
         /boot/efi/rpi3-u-boot.bin     
         /etc/default/grub             
         /etc/fstab
do
  cp -fv $f $P$f
done

rm  -fv $P/dev/*
rm -rfv $P/var/cache/dnf

echo "--------------------------------------------------------------------------------"
du -hs $P

После отработки скрипта в текущем каталоге будет создан подкаталог ($P) с содержимым корня новой минимальной редакции ОС. Можно выключить «малинку» и вернуть microSD в рабочую станцию Linux.

3. Установка минимальной системы

Установка сводится к копированию файлов минимального «образа» ОС (полученного на предыдущем шаге) на специально подготовленную microSD в соответствующие каталоги.

Достаточно 2GB карточки и двух разделов на ней:

  1. /boot/efi — EFI+FAT32, загрузочный, 100MB;
  2. / (корень) — EXT4, все оставшееся место.

После подготовки microSD и копирования на нее файлов, нужно:

  • починить загрузку ОС;
  • включить сеть;
  • настроить доступ по ssh.

Починка загрузки заключается в замене UUID разделов в файлах:

microSD:/boot/efi/EFI/fedora/grub.cfg
microSD:/boot/efi/EFI/fedora/grubenv

и параметра saved_entry= в последнем файле

В файле:

microSD:/etc/fstab

можно найти старые значения, а текущие (актуальные) — в выводе команды:

blkid | grep mmcblk | sort

После замены, следует также поправить содержимое fstab на microSD, чтобы точки монтирования соответствовали новым UUID разделов.

Сетевой работоспособности при первом включении «малинки» можно добиться небольшим «костылем» — создать ссылку (схематично):

ln -s /usr/lib/systemd/system/systemd-networkd.service 
  microSD:/etc/systemd/system/multi-user.target.wants

и файл:

mkdir -p microSD:/etc/systemd/network
cat > microSD:/etc/systemd/network/dhcp.network << EOF
[Match]
Name=*
[Network]
DHCP=ipv4
EOF

После успешной загрузки — привести в порядок запуск systemd-networkd:

systemctl disable systemd-networkd
systemctl enable systemd-networkd

Доступ суперпользователю по ssh настраивается аналогично п.1.

Сделав все аккуратно и без ошибок, можно переставлять microSD в «малинку» и начинать работать с 64-битной ОС в экстра минимальном исполнении.

4. Готовая система

«Образ» готовой системы, созданный по приведенной выше инструкции, можно скачать по ссылке:

Fedora-Tiny-31-5.5.7-200.aarch64

Это будет архив, содержащий в себе два файла: скрипт инсталляции и TGZ с файлами ОС. Архив нужно распаковать на рабочей станции Linux, вставить microSD (достаточно 2GB карты) и запустить скрипт с параметром — именем устройства:

./install /dev/mmcblk0

Будьте внимательны!

Без каких-либо предупреждений устройство будет отформатировано и на него – установлена операционная система.

После безошибочной отработки скрипта карточку можно переставлять в «малинку» и пользоваться: ловить по dhcp, пароль — «1».

Система очищена от всяких ID и ключей, из-за чего каждая новая установка – уникальна.

Повторюсь еще раз, система — минимальна! Поэтому не пугайтесь: DNF — в наличии, для его работоспособности придется «сочинить» правильный /etc/resolv.conf

Холодный старт «малинки» занимает около 40 секунд. ТТХ системы после загрузки:

Fedora aarch64

rpm -qa | wc -l
191

5. Wi-Fi

Немного остановлюсь на особенностях реализации Wi-Fi точки доступа. За конкретикой можно обратиться к моей предыдущей статье.

EPEL теперь не понадобится — все пакеты содержатся в официальных репозиториях.

Наверное, стоило бы отказаться от dnsmasq, так как в Fedora, в отличии от CentOS, — достаточно свежий systemd-networkd, в котором — нормальные встроенные DHCP/DNS серверы. Но факт того, что в RHEL8 разработчики отказались от поддержки сетевого стека чем-либо кроме NM, не вселяет уверенности в светлом будущем проекта (негодяи). Короче, не пробовал.

Далее, актуальные драйверы встроенного Wi-Fi адаптера можно не «воровать» из дистрибутива Raspbian, а качать напрямую с github.

Вот так выглядят на моей «малинке» файлы прошивки Broadcom (схематично):

ls /usr/lib/firmware/brcm | grep 43455

 [612775] brcmfmac43455-sdio.bin
  [14828] brcmfmac43455-sdio.clm_blob
[symlink] brcmfmac43455-sdio.raspberrypi,3-model-b-plus.txt -> brcmfmac43455-sdio.txt
   [2099] brcmfmac43455-sdio.txt

Без них не получится 5GHz/AC.

По поводу количества и названий интерфейсов. Теперь я уже всем настоятельно рекомендую без особой нужды не прибегать к «услугам» программных свичей (bridge), которые привносят значительную нагрузку в сетевой стек и угнетают маршрутизацию. Если не планируется несколько беспроводных адаптеров, то использовать следует исключительно физические интерфейсы. У меня — два Wi-Fi, поэтому только их я объединяю в программный мост (хотя можно обойтись и без этого, по другому взглянув на настройку hostapd).

А переименовывать интерфейсы я люблю.

Для этого в Fedora нужно создать символическую ссылку:

/etc/systemd/network/99-default.link -> /dev/null

и тогда давать осмысленные названия можно будет, не ковыряясь в udev, а только средствами systemd-networkd.

Вот так, например, называются сетевые адаптеры в моем роутере:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

2: wan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000

3: lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000

4: int: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master lan state UP group default qlen 1000

5: ext: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master lan state UP group default qlen 1000

  • int — встроенный, ext — внешний (USB) Wi-Fi адаптеры, собранные в «бридж» lan;
  • wan — Ethernet адаптер, в который подключен Интернет.

Заметили? fq_codel — действительно зачетная штука. Вместе со свежим ядром Linux творят настоящие чудеса в беспроводном диапазоне: лютый «торент-качек» не приведет к внезапной деградации скорости у соседей. Даже работающее «по воздуху» домашнее IP-TV при нагруженном канале не «распадается» и не «заикается» от слова вообще!

Претерпел небольшие изменения сервисный файл демона hostapd.
Выглядит теперь он так (на примере встроенного адаптера):

[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
After=network.target
BindsTo=sys-subsystem-net-devices-int.device

[Service]
Type=forking
PIDFile=/run/hostapd-int.pid
#ExecStartPre=/usr/sbin/iw dev int set power_save off
ExecStart=/usr/sbin/hostapd /path/to/hostapd-int.conf -P /run/hostapd-int.pid -B

[Install]
RequiredBy=sys-subsystem-net-devices-int.device

И «волшебный» hostapd-int.conf для работы в 5GHz/AC:

ssid=rpi
wpa_passphrase=FedoRullezZ

# 5180 MHz  [36] (20.0 dBm)
# 5200 MHz  [40] (20.0 dBm)
# 5220 MHz  [44] (20.0 dBm)
# 5240 MHz  [48] (20.0 dBm)
# 5745 MHz [149] (20.0 dBm)
# 5765 MHz [153] (20.0 dBm)
# 5785 MHz [157] (20.0 dBm)
# 5805 MHz [161] (20.0 dBm)
# 5825 MHz [165] (20.0 dBm)

channel=36
#channel=149

# channel+6
# http://blog.fraggod.net/2017/04/27/wifi-hostapd-configuration-for-80211ac-networks.html

vht_oper_centr_freq_seg0_idx=42
#vht_oper_centr_freq_seg0_idx=155

country_code=US

interface=int
bridge=lan

driver=nl80211

auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

macaddr_acl=0

hw_mode=a
wmm_enabled=1

# N
ieee80211n=1
require_ht=1
ht_capab=[HT40+][SHORT-GI-40][SHORT-GI-20]

# AC
ieee80211ac=1
ieee80211d=0
ieee80211h=0
vht_oper_chwidth=1
require_vht=1
vht_capab=[SHORT-GI-80]

Немного «фотошопа», сделанного с моего «Ericsson A1018s»:

(подключение к Интернет - 100Мбит/сек)

Fedora aarch64

И в заключении небольшой

6. FAQ

6.1 Зачем делать Wi-Fi роутер на Raspberry?

Можно было бы ответить просто, мол «интересно попробовать и все такое».

Но на самом деле, как мне кажется, тема достаточно серьезная. В эпоху «кровопролитного» Интернета покупать роутер в магазине и оставаться заложником его производителя — весьма унылая перспектива. Сидеть с CVE- или вшитым бэкдором уже многие понимают, что нельзя.

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

Поэтому, выбор «малинки» — чисто экономический ход: настоящий компьютер и при этом — недорогой. Хотя, возможно тоже — со своими «двоянами» внутри.

6.2 Но ведь Raspberry – «недороутер»: медленный и с одним Ethernet портом!

Как домашний Wi-Fi роутер, «малинка» меня устраивает более чем. Про скорость «по воздуху» я уже рассказал выше. А всего один Ethernet, ну так в аналогичном продукте от Apple примерно точно также!

А если серьезно, то конечно хотелось бы побольше. И несмотря на то, что в моем хозяйстве все устройства подключены без проводов, иногда все-таки требуется медное соединение. Для таких случаев у меня припасен «мобильный хаб»:

девайс - типа такого

Fedora aarch64

6.3 Если это роутер, то ничего не сказано о «тюнинге» TCP/IP, ведь это важно!

Помимо настройки сетевого стека (tcp_fastopen, YeAH и т.п.), в этой и предыдущей статье не раскрыты другие нюансы, в частности, процесс подготовки microSD для оптимального использования (правда инсталлятор пытается отформатировать карту памяти хитрым способом). Процесс совершенствования – бесконечен, нужно только вовремя остановиться.

6.4 Почему Fedora?

Потому что мне нравится! Fedora — «мейнстрим» — система гиков, для которых, собственно, и предназначена эта статья. На момент написания, пожалуй, единственная ОС, которая для Raspberry в 64-битном исполнении официально поддерживается весомым штатом разработчиков (от которых никак не дождусь ядра 5.6).

6.5 А Bluetooth работает? Как там видео/звук/GPIO?

Не знаю. Статья – про минимальную установку системы и ее последующее использование в качестве Wi-Fi роутера.

6.6 Почему все статьи про CentOS/Fedora/RedHat начинаются с отключения SELinux?

Потому что система – минимальна, в ней нет даже файрвола и утилит по его настройке. Кому потребуется – могут установить дополнительно все что необходимо.

6.7 Системой невозможно пользоваться, нельзя изменить пароль — нет passwd. Нет ping-а, нет ничего!

Есть DNF. Или этот вариант установки не для вас – воспользуйтесь дистрибутивом от разработчиков.

6.8 А где же SWAP? Жить без него не могу!

Правда? Ну, хорошо:

fallocate -l 1G /swap
chmod -v 0600 /swap
mkswap -f /swap
swapon -v /swap
grep "/swap" /etc/fstab || echo "/swap swap swap defaults 0 0" >> /etc/fstab

6.9 Хотелось бы скачать сразу готовый образ с настроенной точкой доступа Wi-Fi!

Для подготовки инсталлятора «для всех» потребуется некоторое количество времени и усилий. Если (вдруг!) кому-то это действительно покажется интересным и необходимым – пишите, что-нибудь придумаем.


На этом — закончу.
Желаю всем безопасного серфинга и максимального контроля над инфраструктурой!

Автор: aliend

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js