W artykule Opisałem sposób przekształcenia «malinki» w bezprzewodowy punkt dostępu przy użyciu systemu operacyjnego CentOS. Budując mój domowy router według tego schematu, zaspokoiłem swoje twórcze ego i zyskałem poczucie spokoju co do krytycznie ważnego elementu mojej przytulnej infrastruktury. Jednak uczucie niedokończonego rozwiązania oraz wewnętrzny perfekcjonizm nie dawały mi spokoju: «niedoskonały efekt pracy nie ma prawa istnieć». Myśl, że «ideał można i należy osiągnąć», nie opuszczała mnie ani na chwilę.
I pewnego dnia natknąłem się na jednym z tematycznych forów na dyskusję o architekturach istniejących systemów operacyjnych dla «malinki» (aarch64 vs armhfp): jakie 64-bitowe OS mogą w ogóle obsłużyć i działać na Raspberry wersji 3++?
Mój ulubiony CentOS dla architektury ARM od «Userland» nie spieszył się z przejściem na jądro ostatniej wersji i przekształceniem w 64-bitowy. A repozytorium EPEL, podłączone Bóg wie skąd bez cyfrowego podpisu, stało się koszmarem w moich niespokojnych snach...
Jako zwolennik dystrybucji opartych na RPM, zaskoczyło mnie to, że w dyskusjach o OS dla «malinki» całkowicie zapomniano o Fedora! I to mimo, że jej wydanie

W tym artykule opowiem o sposobie instalacji Fedora (aarch64) na Raspberry Pi 3 Model B+ do w wersji super minimalnej. Krótko omówię cechy konfiguracji Wi-Fi punktu dostępu, które ujawniły się w wyniku praktycznych testów mojej poprzedniej konfiguracji na .
0. Co będzie potrzebne
Wszystko to, co zostało wymienione w poprzednim artykule:
- Raspberry Pi 3 Model B+;
- microSD >= 4GB (później można «przenieść» system na 2GB nośnik);
- Stacja robocza z Linuxem i czytnikiem kart microSD;
- Przewodowe połączenie sieciowe «malinki» i stacji roboczej z Linuxem (w tym przypadku nie będą potrzebne dodatkowy monitor i klawiatura do konfiguracji), dostęp do Internetu z obu urządzeń;
- Zaawansowane umiejętności w Linuxie (znać i się nie bać: , i ).
Podobnie jak w iteracyjnej -kompilacji własnego Linuxa, zostanie użyty dystrybucyjny obraz Fedora, a następnie na jego podstawie stworzony zostanie minimalny system (bez «kompilacji z źródeł»).
1. Instalacja oryginalnej dystrybucji
Lokalizacja obrazu raw systemu w Sieci:
Po zapisaniu na microSD i przed rozpoczęciem użytkowania należy:
- Rozszerzyć „korzeń” systemu plików (3. partycja, 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 - Wyłączyć SELinux
echo 'SELINUX=disabled' > /mnt/3/etc/selinux/config - Usunąć Kreatora pierwszego uruchomienia:
find /mnt/3/etc/systemd/ -iname initial-setup.service -delete - Zezwolić na dostęp przez 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
Teraz można uruchomić „malinkę” z microSD i połączyć się z nią przez sieć.
Zimny start trwa około półtorej minuty. Właściwości systemu po uruchomieniu:

rpm -qa | wc -l
444
2. Budowa minimalnego systemu
Niestety, „minimalny dystrybucyjny” od twórców okazuje się być daleki od najskromniejszego pod względem zużycia zasobów. Obraz systemu można uczynić jeszcze mniejszym.
Aby to zrobić, na „malince” należy wykonać skrypt:
#!/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
Po wykonaniu skryptu w bieżącym katalogu zostanie utworzony podkatalog ($P) z zawartością korzenia nowej minimalnej edycji systemu operacyjnego. Można wyłączyć „malinkę” i zwrócić microSD do stacji roboczej Linux.
3. Instalacja minimalnego systemu
Instalacja polega na skopiowaniu plików minimalnego „obrazka” systemu (uzyskanego na poprzednim kroku) na specjalnie przygotowaną microSD do odpowiednich katalogów.
Wystarczy karta 2GB i dwie partycje na niej:
- /boot/efi — EFI+FAT32, rozruchowa, 100MB;
- / (korzeń) — EXT4, całe pozostałe miejsce.
Po przygotowaniu microSD i skopiowaniu na nią plików, należy:
- naprawić uruchamianie systemu;
- włączyć sieć;
- konfigurować dostęp przez ssh.
Naprawa uruchamiania polega na wymianie UUID partycji w plikach:
microSD:/boot/efi/EFI/fedora/grub.cfg
microSD:/boot/efi/EFI/fedora/grubenv
i parametru saved_entry= w ostatnim pliku
W pliku:
microSD:/etc/fstab
można znaleźć stare wartości, a bieżące (aktualne) — w wyniku polecenia:
blkid | grep mmcblk | sort
Po wymianie należy również poprawić zawartość fstab na microSD, aby punkty montowania odpowiadały nowym UUID partycji.
Sieciową sprawność przy pierwszym włączeniu „malinki” można osiągnąć drobnym „strojeniem” — utworzyć link (schematycznie):
ln -s /usr/lib/systemd/system/systemd-networkd.service
microSD:/etc/systemd/system/multi-user.target.wants
i plik:
mkdir -p microSD:/etc/systemd/network
cat > microSD:/etc/systemd/network/dhcp.network << EOF
[Match]
Name=*
[Network]
DHCP=ipv4
EOF
Po pomyślnym uruchomieniu — uporządkować start :
systemctl disable systemd-networkd
systemctl enable systemd-networkd
Dostęp superużytkownika przez ssh konfiguruje się analogicznie do punktu 1.
Po wykonaniu wszystkich kroków starannie i bez błędów, można przestawiać microSD w „malince” i zaczynać pracę z 64-bitowym systemem operacyjnym w ultra minimalnej wersji.
4. Gotowy system
„Obraz” gotowego systemu, utworzony zgodnie z powyższą instrukcją, można pobrać pod tym linkiem:
Będzie to archiwum, które zawiera dwa pliki: skrypt instalacyjny oraz TGZ z plikami systemu operacyjnego. Archiwum należy rozpakować na stacji roboczej Linux, włożyć microSD (wystarczy karta 2GB) i uruchomić skrypt z parametrem — nazwą urządzenia:
.\/install \/dev\/mmcblk0
Uważaj!
Bez żadnych ostrzeżeń urządzenie zostanie sformatowane i zostanie na nim zainstalowany system operacyjny.
Po bezbłędnym wykonaniu skryptu kartę można przestawiać w „malinkę” i korzystać: złapać przez dhcp, hasło — „1”.
System został oczyszczony ze wszelkich ID i kluczy, dzięki czemu każda nowa instalacja jest unikalna.
Powtarzam jeszcze raz, system — minimalny! Dlatego nie martwcie się: DNF jest dostępny, aby działał, trzeba „stwórzyć” odpowiedni .
Zimny start „malinki” trwa około 40 sekund. TTH systemu po załadowaniu:

rpm -qa | wc -l
191
5. Wi-Fi
Chcę zwrócić uwagę na specyfikę realizacji punktu dostępu Wi-Fi. Po szczegóły można skontaktować się z moim wcześniejszym .
EPEL nie będzie już potrzebny — wszystkie pakiety znajdują się w oficjalnych repozytoriach.
Możliwe, że warto byłoby zrezygnować z , ponieważ w Fedora, w przeciwieństwie do CentOS, — wystarczająco świeży systemd-networkd, w którym znajdują się normalne wbudowane serwery DHCP/DNS. Ale fakt, że w RHEL8 deweloperzy , nie napawa optymizmem co do jasnej przyszłości projektu (łobuziaki). W skrócie, nie próbowałem.
Dalej, aktualne sterowniki wbudowanego adaptera Wi-Fi można pobierać bezpośrednio z .
Tak wyglądają na mojej „malince” pliki firmware Broadcom (schematycznie):
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
Bez nich nie uzyskamy 5GHz/AC.
Co do liczby i nazw interfejsów. Teraz wszystkim gorąco zalecam, bez szczególnej potrzeby, nie korzystać z „usług” programowych przełączników (), które wprowadzają znaczące obciążenie do stosu sieciowego i tłumią routowanie. Jeśli nie przewiduje się użycia kilku adapterów bezprzewodowych, należy korzystać wyłącznie z interfejsów fizycznych. Mam dwa Wi-Fi, dlatego tylko je łączę w mostek programowy (choć da się obejść bez tego, spoglądając inaczej na konfigurację hostapd).
Lubię zmieniać nazwy interfejsów.
W tym celu w systemie Fedora trzeba stworzyć symboliczne łącze:
/etc/systemd/network/99-default.link -> /dev/null
i wtedy można nadać sensowne nazwy, nie grzebiąc w , a jedynie środkami systemd-networkd.
Tak, na przykład, nazywają się adaptery sieciowe w moim routerze:
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 — wbudowany, ext — zewnętrzne adaptery Wi-Fi (USB), złączone w „mostek” lan;
- wan — adapter Ethernet, do którego podłączony jest Internet.
Zauważyłeś? — to naprawdę świetna rzecz. Razem z nowym jądrem Linuxa robią prawdziwe cuda w zakresie łączności bezprzewodowej: intensywne pobieranie torrentów nie prowadzi do nagłej degradacji prędkości u sąsiadów. Nawet domowe IPTV działające „w powietrzu” nie „łamią się” ani nie „przerywa” w ogóle, nawet przy obciążonym kanale!
Służbowy plik demona przeszedł niewielkie zmiany .
Teraz wygląda on tak (na przykładzie wbudowanego adaptera):
[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
I „magiczny” hostapd-int.conf do pracy w 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]
Trochę „Photoshopa”, zrobionego z mojego „Ericsson A1018s”:
(połączenie z Internetem — 100Mbit/s)
I na koniec małe FAQ.
6. FAQ
6.1 Po co robić router Wi-Fi na Raspberry?
Można by odpowiedzieć krótko, że 'ciekawie spróbować i tyle'.
Jednak w rzeczywistości, moim zdaniem, temat jest dość poważny. W epoce 'krwawych' Internetów kupowanie routera w sklepie i bycie więźniem jego producenta to dość smutna perspektywa. Siedzenie z CVE lub wbudowanym backdoorem już wielu zrozumiało, że nie jest wskazane.
Oczywiście, można migrować na firmware WRT od entuzjastów. Zaufanie do nich, prawdopodobnie, jest większe, ale jeśli nie chce się być od nich zależnym, to tylko — własny produkt. W idealnym przypadku – pełnoprawny komputer do realizacji na nim wszystkiego, co można sobie wyobrazić. Mówiąc o routingu, oczywiście.
Dlatego wybór 'malinki' to czysto ekonomiczny ruch: prawdziwy komputer i przy tym — niedrogi. Choć, być może, też — ze swoimi 'dwuznacznościami' w środku.
6.2 Ale Raspberry to 'nie-router': wolny i z jednym portem Ethernet!
Jako domowy router Wi-Fi, 'malinka' mnie bardziej niż zadowala. O prędkości 'po powietrzu' już wspomniałem powyżej. A tylko jeden Ethernet, no cóż, w analogicznym produkcie od Apple jest to dokładnie to samo!
A jeśli mówimy serio, to oczywiście chciałbym więcej. I mimo że w moim gospodarstwie wszystkie urządzenia są podłączone bezprzewodowo, czasami jednak potrzebne jest połączenie przewodowe. Na takie okazje mam przygotowany 'mobilny hub':
urządzenie — coś takiego
6.3 Jeśli to router, to nic nie mówi o 'tuningu' TCP/IP, a to ważne!
Oprócz konfiguracji stosu sieciowego (tcp_fastopen, YeAH itp.), w tym i poprzednim artykule nie zostały przedstawione inne niuanse, w szczególności proces przygotowania microSD do optymalnego użycia (prawda, instalator podejmuje próbę sformatowania karty pamięci w sprytny sposób). Proces doskonalenia jest nieskończony, trzeba tylko w porę się zatrzymać.
6.4 Dlaczego Fedora?
Bo mi się podoba! Fedora to 'mainstream' — system geeków, dla których ta artykuł jest właściwie przeznaczony. W momencie pisania, to właściwie jedyny system operacyjny, który dla Raspberry w 64-bitowej wersji jest oficjalnie wspierany przez solidny zespół programistów (na których niestety nie mogę się doczekać ).
6.5 A Bluetooth działa? Jak z wideo/dźwiękiem/GPIO?
Nie wiem. Artykuł dotyczy minimalnej instalacji systemu i jego późniejszego użycia jako routera Wi-Fi.
6.6 Dlaczego wszystkie artykuły o CentOS/Fedora/RedHat zaczynają się od wyłączenia SELinux?
Ponieważ system jest minimalny, nie ma w nim nawet zapory ogniowej ani narzędzi do jej konfiguracji. Kto potrzebuje, może dodatkowo zainstalować wszystko, co niezbędne.
6.7 Z systemu nie można korzystać, nie można zmienić hasła — nie ma passwd. Nie ma ping, nie ma nic!
Tak . Lub ta metoda instalacji nie jest dla Ciebie – skorzystaj z dystrybucji od deweloperów.
6.8 A gdzie SWAP? Nie mogę bez niego żyć!
Naprawdę? No dobrze:
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 Chciałbym pobrać od razu gotowy obraz z skonfigurowanym punktem dostępu Wi-Fi!
Przygotowanie instalatora „dla wszystkich” będzie wymagało pewnego czasu i wysiłku. Jeśli (nagle!) ktoś uzna to za naprawdę interesujące i niezbędne – napisz, coś wymyślimy.
Na tym — zakończę.
Życzę wszystkim bezpiecznego surfowania i maksymalnej kontroli nad infrastrukturą!
Źródło: habr.com
