В статье 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) на 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 и перед началом использования нужно:
- Расширить «корень» файловой системы (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
- Отключить SELinux
echo 'SELINUX=disabled' > /mnt/3/etc/selinux/config
- Удалить Мастера первоначальной настройки
find /mnt/3/etc/systemd/ -iname initial-setup.service -delete
- Разрешить доступ по 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 и подключиться к ней по сети.
Холодный старт занимает около полутора минут. ТТХ системы после загрузки:
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 карточки и двух разделов на ней:
- /boot/efi — EFI+FAT32, загрузочный, 100MB;
- / (корень) — 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 секунд. ТТХ системы после загрузки:
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»:
И в заключении небольшой
6. FAQ
6.1 Зачем делать Wi-Fi роутер на Raspberry?
Можно было бы ответить просто, мол «интересно попробовать и все такое».
Но на самом деле, как мне кажется, тема достаточно серьезная. В эпоху «кровопролитного» Интернета покупать роутер в магазине и оставаться заложником его производителя — весьма унылая перспектива. Сидеть с CVE- или вшитым бэкдором уже многие понимают, что нельзя.
Разумеется, можно мигрировать на WRT-прошивки от энтузиастов. Доверия к ним, наверное, больше, но если не хочется зависеть и от них, то только — собственное изделие. В идеале – полноценный компьютер для возможности реализации на нем всего на свете. В плане роутинга, разумеется.
Поэтому, выбор «малинки» — чисто экономический ход: настоящий компьютер и при этом — недорогой. Хотя, возможно тоже — со своими «двоянами» внутри.
6.2 Но ведь Raspberry – «недороутер»: медленный и с одним Ethernet портом!
Как домашний Wi-Fi роутер, «малинка» меня устраивает более чем. Про скорость «по воздуху» я уже рассказал выше. А всего один Ethernet, ну так в аналогичном продукте от Apple примерно точно также!
А если серьезно, то конечно хотелось бы побольше. И несмотря на то, что в моем хозяйстве все устройства подключены без проводов, иногда все-таки требуется медное соединение. Для таких случаев у меня припасен «мобильный хаб»:
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