- PVSM.RU - https://www.pvsm.ru -
В статье Raspberry Pi + CentOS = Wi-Fi Hotspot (или малиновый роутер в красной шляпе) [1] я рассказал о способе превращения «малинки» в беспроводную точку доступа при помощи операционной системы CentOS. Собрав по такому чертежу мой домашний роутер, я удовлетворил свое творческое эго и получил заряд спокойствия за критически важный элемент моей уютной инфраструктуры. Однако ощущение незаконченности решения и внутренний перфекционизм не давали покоя: «несовершенный результат работы не имеет права на существование». Мысль о том, «что идеал может и должен быть достигнут» не покидала меня ни на минуту.
И вот однажды на одном из тематических форумов я натолкнулся на обсуждение разрядности существующих операционных систем для «малинки» (aarch64 vs armhfp): какие 64-битные ОС в принципе могут влезть и заработать на Raspberry версии 3++?
Моя любимая CentOS для архитектуры ARM от «Userland» не спешила переходить на ядро последней версии и превращаться в 64-битную. А репозиторий EPEL, подключенный Бог весть откуда без цифровой подписи, являлся кошмаром в мой неспокойный сон…
Выступая адептом RPM-based дистрибутивов, я с удивлением обнаружил, что в обсуждениях ОС для «малинки» абсолютно забытой оказалась Fedora! И это при том, что ее релиз
с 28-ой версии официально поддерживает Raspberry Pi 3B+ в 64-битном исполнении! [2]
В этой статье я расскажу о способе установки Fedora (aarch64) на Raspberry Pi 3 Model B+ в экстра минимальном исполнении. Кратко остановлюсь на особенностях поднятия Wi-Fi точки доступа, выявленных в результате опытной эксплуатации моей предыдущей конфигурации на CentOS 7 [1].
Все тоже самое, что перечислено в предыдущей статье:
Подобно итеративной LFS [6]-сборке собственного Linux, будет использован дистрибутивный образ Fedora, а потом на его основе — создана минимальная система (без «компиляции из исходников»).
Координаты raw-образа системы в Сети:
https://.../fedora-secondary/releases/.../Spins/aarch64/images/Fedora-Minimal-...xz [7]
После его записи на microSD и перед началом использования нужно:
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
echo 'SELINUX=disabled' > /mnt/3/etc/selinux/config
find /mnt/3/etc/systemd/ -iname initial-setup.service -delete
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
К сожалению, «минимальный дистрибутив» от разработчиков оказывается далеко не самым скромным в потреблении ресурсов. Образ системы можно сделать еще меньше.
Для этого на «малинке» нужно выполнить скрипт:
#!/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.
Установка сводится к копированию файлов минимального «образа» ОС (полученного на предыдущем шаге) на специально подготовленную microSD в соответствующие каталоги.
Достаточно 2GB карточки и двух разделов на ней:
После подготовки microSD и копирования на нее файлов, нужно:
Починка загрузки заключается в замене 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 [8]:
systemctl disable systemd-networkd
systemctl enable systemd-networkd
Доступ суперпользователю по ssh настраивается аналогично п.1.
Сделав все аккуратно и без ошибок, можно переставлять microSD в «малинку» и начинать работать с 64-битной ОС в экстра минимальном исполнении.
«Образ» готовой системы, созданный по приведенной выше инструкции, можно скачать по ссылке:
Fedora-Tiny-31-5.5.7-200.aarch64 [9]
Это будет архив, содержащий в себе два файла: скрипт инсталляции и TGZ с файлами ОС. Архив нужно распаковать на рабочей станции Linux, вставить microSD (достаточно 2GB карты) и запустить скрипт с параметром — именем устройства:
./install /dev/mmcblk0
Будьте внимательны!
Без каких-либо предупреждений устройство будет отформатировано и на него – установлена операционная система.
После безошибочной отработки скрипта карточку можно переставлять в «малинку» и пользоваться: ловить по dhcp, пароль — «1».
Система очищена от всяких ID и ключей, из-за чего каждая новая установка – уникальна.
Повторюсь еще раз, система — минимальна! Поэтому не пугайтесь: DNF — в наличии, для его работоспособности придется «сочинить» правильный /etc/resolv.conf [10]
Холодный старт «малинки» занимает около 40 секунд. ТТХ системы после загрузки:
rpm -qa | wc -l
191
Немного остановлюсь на особенностях реализации Wi-Fi точки доступа. За конкретикой можно обратиться к моей предыдущей статье [1].
EPEL теперь не понадобится — все пакеты содержатся в официальных репозиториях.
Наверное, стоило бы отказаться от dnsmasq [11], так как в Fedora, в отличии от CentOS, — достаточно свежий systemd-networkd, в котором — нормальные встроенные DHCP/DNS серверы. Но факт того, что в RHEL8 разработчики отказались от поддержки сетевого стека чем-либо кроме NM [12], не вселяет уверенности в светлом будущем проекта (негодяи). Короче, не пробовал.
Далее, актуальные драйверы встроенного Wi-Fi адаптера можно не «воровать» из дистрибутива Raspbian, а качать напрямую с github [13].
Вот так выглядят на моей «малинке» файлы прошивки 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 [14]), которые привносят значительную нагрузку в сетевой стек и угнетают маршрутизацию. Если не планируется несколько беспроводных адаптеров, то использовать следует исключительно физические интерфейсы. У меня — два Wi-Fi, поэтому только их я объединяю в программный мост (хотя можно обойтись и без этого, по другому взглянув на настройку hostapd).
А переименовывать интерфейсы я люблю.
Для этого в Fedora нужно создать символическую ссылку:
/etc/systemd/network/99-default.link -> /dev/null
и тогда давать осмысленные названия можно будет, не ковыряясь в udev [15], а только средствами 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
Заметили? fq_codel [16] — действительно зачетная штука. Вместе со свежим ядром Linux творят настоящие чудеса в беспроводном диапазоне: лютый «торент-качек» не приведет к внезапной деградации скорости у соседей. Даже работающее «по воздуху» домашнее IP-TV при нагруженном канале не «распадается» и не «заикается» от слова вообще!
Претерпел небольшие изменения сервисный файл демона hostapd [17].
Выглядит теперь он так (на примере встроенного адаптера):
[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»:
И в заключении небольшой
Можно было бы ответить просто, мол «интересно попробовать и все такое».
Но на самом деле, как мне кажется, тема достаточно серьезная. В эпоху «кровопролитного» Интернета покупать роутер в магазине и оставаться заложником его производителя — весьма унылая перспектива. Сидеть с CVE- или вшитым бэкдором уже многие понимают, что нельзя.
Разумеется, можно мигрировать на WRT-прошивки от энтузиастов. Доверия к ним, наверное, больше, но если не хочется зависеть и от них, то только — собственное изделие. В идеале – полноценный компьютер для возможности реализации на нем всего на свете. В плане роутинга, разумеется.
Поэтому, выбор «малинки» — чисто экономический ход: настоящий компьютер и при этом — недорогой. Хотя, возможно тоже — со своими «двоянами» внутри.
Как домашний Wi-Fi роутер, «малинка» меня устраивает более чем. Про скорость «по воздуху» я уже рассказал выше. А всего один Ethernet, ну так в аналогичном продукте от Apple примерно точно также!
А если серьезно, то конечно хотелось бы побольше. И несмотря на то, что в моем хозяйстве все устройства подключены без проводов, иногда все-таки требуется медное соединение. Для таких случаев у меня припасен «мобильный хаб»:
Помимо настройки сетевого стека (tcp_fastopen, YeAH и т.п.), в этой и предыдущей статье не раскрыты другие нюансы, в частности, процесс подготовки microSD для оптимального использования (правда инсталлятор пытается отформатировать карту памяти хитрым способом). Процесс совершенствования – бесконечен, нужно только вовремя остановиться.
Потому что мне нравится! Fedora — «мейнстрим» — система гиков, для которых, собственно, и предназначена эта статья. На момент написания, пожалуй, единственная ОС, которая для Raspberry в 64-битном исполнении официально поддерживается весомым штатом разработчиков (от которых никак не дождусь ядра 5.6 [18]).
Не знаю. Статья – про минимальную установку системы и ее последующее использование в качестве Wi-Fi роутера.
Потому что система – минимальна, в ней нет даже файрвола и утилит по его настройке. Кому потребуется – могут установить дополнительно все что необходимо.
Есть DNF [19]. Или этот вариант установки не для вас – воспользуйтесь дистрибутивом от разработчиков.
Правда? Ну, хорошо:
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
Для подготовки инсталлятора «для всех» потребуется некоторое количество времени и усилий. Если (вдруг!) кому-то это действительно покажется интересным и необходимым – пишите, что-нибудь придумаем.
Автор: aliend
Источник [20]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/nastrojka-linux/349566
Ссылки в тексте:
[1] Raspberry Pi + CentOS = Wi-Fi Hotspot (или малиновый роутер в красной шляпе): https://habr.com/ru/post/458994
[2] с 28-ой версии официально поддерживает Raspberry Pi 3B+ в 64-битном исполнении!: https://fedoraproject.org/wiki/Architectures/ARM/Raspberry_Pi
[3] parted: https://ru.wikipedia.org/wiki/GNU_Parted
[4] dd: https://ru.wikipedia.org/wiki/Dd
[5] mkfs: https://en.wikipedia.org/wiki/Mkfs
[6] LFS: https://ru.wikipedia.org/wiki/Linux_From_Scratch
[7] https://.../fedora-secondary/releases/.../Spins/aarch64/images/Fedora-Minimal-...xz: https://mirror.yandex.ru/fedora-secondary/releases/31/Spins/aarch64/images/Fedora-Minimal-31-1.9.aarch64.raw.xz
[8] systemd-networkd: https://wiki.archlinux.org/index.php/Systemd-networkd
[9] Fedora-Tiny-31-5.5.7-200.aarch64: https://download.aliennet.ru/f6275b4e-1736-44c5-9926-6a96137af3b5/xXeCfREmlV0tOMdkqKTxnpyR3J6HyELB
[10] /etc/resolv.conf: https://en.wikipedia.org/wiki/Resolv.conf
[11] dnsmasq: https://ru.wikipedia.org/wiki/Dnsmasq
[12] отказались от поддержки сетевого стека чем-либо кроме NM: https://bugzilla.redhat.com/show_bug.cgi?id=1650342
[13] github: https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm
[14] bridge: https://en.wikipedia.org/wiki/Bridging_(networking)
[15] udev: https://en.wikipedia.org/wiki/Udev
[16] fq_codel: https://en.wikipedia.org/wiki/CoDel
[17] hostapd: https://www.w1.fi/hostapd/
[18] ядра 5.6: https://www.wireguard.com/install/
[19] DNF: https://ru.wikipedia.org/wiki/DNF_(%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2)
[20] Источник: https://habr.com/ru/post/492322/?utm_source=habrahabr&utm_medium=rss&utm_campaign=492322
Нажмите здесь для печати.