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

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

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

Любимата ми CentOS за ARM архитектура от «Userland» не бързаше да премине на последната версия на ядрото и да се превърне в 64-битова. А репозиторият EPEL, свързан без цифров подпис, беше кошмар в неспокойния ми сън...

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

Raspberry Pi + Fedora (aarch64) = Wi-Fi Hotspot (или малинов рутер в синя шапка)
В тази статия ще разкажа за начина на инсталиране на 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 и да се свържете с нея по мрежата.

Студеното стартиране отнема около една и половина минути. Характеристики на системата след стартиране:

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

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 и ключове, поради което всяка нова инсталация е уникална.

Още веднъж, системата – е минимална! /etc/resolv.conf.

Затова не се притеснявайте: DNF – е наличен, но за нормалната му работа ще трябва да "сочините" правилния

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

Студеното стартиране на "малинката" отнема около 40 секунди. Техническите характеристики на системата след зареждане:

rpm -qa | wc -l 191

5. Wi-Fi статията.

Няма да спирам на особеностите на реализцията на Wi-Fi точка за достъп. За конкретиката можете да се обърнете към моята предишна

EPEL вече не е необходима – всички пакети се съдържат в официалните репозитории. dnsmasqМоже би, струваше си да се откажа от , тъй като в Fedora, за разлика от CentOS, има достатъчно актуален systemd-networkd, в който – са нормални вградени DHCP\/DNS сървъри. Но фактът, че в RHEL8 разработчицитесе отказаха от поддръжката на мрежовия стека с нещо освен NM

, не вдъхва увереност в светлото бъдеще на проекта (негодяи). Кратко казано, не съм пробвал. github.

След това, актуалните драйвери на вградения Wi-Fi адаптер не може да се "крадат" от дистрибуцията Raspbian, а да се свалят директно от

Така изглеждат файловете с фърмуера 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:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

2: wan:  mtu 1500 qdisc fq_codel state UP group default qlen 1000

3: lan:  mtu 1500 qdisc noqueue state UP group default qlen 1000

4: int:  mtu 1500 qdisc fq_codel master lan state UP group default qlen 1000

5: ext:  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 Мбит/сек)Raspberry Pi + Fedora (aarch64) = Wi-Fi Hotspot (или малинов рутер в синя шапка)
И накрая, малък FAQ.

6. FAQ

6.1 Защо да направим Wi-Fi рутер на Raspberry?

Можеше да отговорим просто с „интересно е да го опиташ и това е всичко“.

Но всъщност, както смятам, темата е доста сериозна. В епохата на „кървавия“ интернет да купуваш рутер от магазин и да бъдеш заложник на производителя му — това е доста мрачна перспектива. Да седиш с CVE или вграден бекдор вече много хора осъзнават, че не е допустимо.

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

Поради това, изборът на „малинка“ е чисто икономически ход: истински компютър и освен това — на достъпна цена. Въпреки това, може също така — със своите „двойствени“ характеристики.

6.2 Но нали Raspberry е „недо рутер“: бавен и с един Ethernet порт!

Като домашен Wi-Fi рутер, „малинката“ ме удовлетворява повече от достатъчно. За скоростта „въздуха“ вече разказах по-горе. А само един Ethernet, е, в аналогичния продукт от Apple е точно така!

А ако сме сериозни, разбира се, би било хубаво да има повече. И, независимо от факта, че всичките мои устройства са свързани безжично, понякога все пак е необходимо медно свързване. За такива случаи имам запазен „мобилен хъб“:

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

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!

За подготовката на инсталатора „за всички“ ще са необходими известно време и усилия. Ако (изведнъж!) на някого това наистина се струва интересно и необходимо – пишете, нещо ще измислим.

На това — ще завърша.

Пожелавам на всички безопасно сърфиране и максимален контрол над инфраструктурата!

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster