V posledních letech se roztrhl pytel s různými miniaturními jednodeskovými počítači v celé výkonové škále - od lowendového Arduina s 8b AVRky a 32b embedded ARMy až po nabušený Odroid. Za cenu kolem 1000 Kč vám nabídnou výkon běžného PC před cca 10 lety na malé destičce velikosti kreditní karty s příkonem pár wattů. Ty výkonnější jsou většinou osazeny aplikačními SoC procesory ARM Cortex-A7 / A9, dnes běžně s více jádry a 64b architekturou. Počet nových modelů a jejich výkon neustále roste, ceny naopak klesají. Zde bych upozornil, že cena není až tak důležitá, mnohem důležitější je podpora výrobce a mohutnost uživatelské komunity. Sebelepší HW je totiž na nic, když na něm sotva běží neodladěný FW/OS, výrobce to neřeší, nejsou k dispozici zdrojáky ani dokumentace a slabá komunita s tím nedokáže pohnout... Zde je stručný přehled základních parametrů nejrozšířenějších jednodeskových počítačů (průběžně aktualizuju):
model CPU cores GPU RAM/Flash LAN USB SATA video audio ref Raspberry Pi Pico RP2040, 133MHz 2 - 264kB/2MB - 1 OTG - - - 1, 2 Raspberry Pi Zero BCM2835, 1GHz 1 VideoCore IV 512MB/µSD - 1 OTG - HDMI HDMI 1 Raspberry Pi A BCM2835, 700MHz 1 VideoCore IV 256MB/SD - 1 OTG - HDMI, CSI/DSI, analog HDMI, analog 1 Raspberry Pi A+ BCM2835, 700MHz 1 VideoCore IV 256/512MB/µSD - 1 OTG - HDMI, CSI/DSI, analog HDMI, analog 1 Raspberry Pi B BCM2835, 700MHz 1 VideoCore IV 256/512MB/SD 100Mbit 2 - HDMI, CSI/DSI, analog HDMI, analog 1 Raspberry Pi B+ BCM2835, 700MHz 1 VideoCore IV 512MB/µSD 100Mbit 4 - HDMI, CSI/DSI, analog HDMI, analog 1 Raspberry Pi 2 B BCM2836, 900MHz 4 VideoCore IV 1GB/µSD 100Mbit 4 - HDMI, CSI/DSI, analog HDMI, analog 1, 2 Raspberry Pi 3 BCM2837 64b, 1,2GHz 4 VideoCore IV 1GB/µSD 100Mbit + WiFi + BT 4.1 4 - HDMI, CSI/DSI, analog HDMI, analog 1, 2, 3 Raspberry Pi 3 B+ BCM2837B0 64b, 1,4GHz 4 VideoCore IV 1GB/µSD 1000Mbit + WiFi + BT 4.2 4 - HDMI, CSI/DSI, analog HDMI, analog 1 Raspberry Pi 4 B BCM2711B0 64b, 1,5GHz 4 VideoCore VI 1-4GB/µSD 1000Mbit + WiFi + BT 5.0 2x 3.0 + 2 - 2x µHDMI 2.0, DPI/CSI/DSI, analog HDMI, analog 1 Banana Pi M1 Allwinner A20, 1GHz 2 Mali-400MP2 1GB/SD 1000Mbit 2 + 1 OTG 1 HDMI, LVDS, CSI, analog HDMI, analog, onboard mic. 1 Banana Pi M1+ Allwinner A20, 1GHz 2 Mali-400MP2 1GB/µSD 1000Mbit + WiFi 2 + 1 OTG 1 HDMI, LVDS, CSI, analog HDMI, analog, onboard mic. 1 Banana Pi M2 Allwinner A31S, 1,2GHz 4 PowerVR SGX544MP2 1GB/µSD 1000Mbit + WiFi 4 - HDMI, LVDS, RGB, CSI HDMI, analog, onboard mic. 1 Banana Pi M2+ Allwinner H3, 1GHz 4 Mali-400MP2 1GB/µSD, 8GB eMMC 1000Mbit + WiFi + BT 4.0 2 + 1 OTG - HDMI, CSI HDMI 1 Banana Pi M3 Allwinner A83T, 1,8GHz 8 PowerVR SGX544MP1 2GB/µSD, 8GB eMMC 1000Mbit + WiFi + BT 4.0 2 + 1 OTG 1 HDMI, MIPI/DSI, CSI HDMI, analog, onboard mic. 1, 2, 3 Banana Pi M64 Allwinner A53 64b, 1,2GHz 4 Mali-400MP2 2GB/µSD, 8GB eMMC 1000Mbit + WiFi + BT 4.0 2 + 1 OTG - HDMI, MIPI/DSI, CSI HDMI, analog, onboard mic. 1 Orange Pi One Allwinner H3, 1,2GHz 4 Mali-400MP2 512MB/µSD 100Mbit 1 + 1 OTG - HDMI, CSI HDMI 1, 2 Orange Pi One Lite Allwinner H3, 1,2GHz 4 Mali-400MP2 512MB/µSD WiFi 2 + 1 OTG - HDMI, CSI HDMI, onboard mic. 1 Orange Pi+ Allwinner H3, 1,6GHz 4 Mali-400MP2 1GB/µSD 1000Mbit + WiFi 4 + 1 OTG 1 HDMI, CSI, analog HDMI, analog, onboard mic. 1, 2 Orange Pi PC Allwinner H3, 1,6GHz 4 Mali-400MP2 1GB/µSD 100Mbit 3 + 1 OTG - HDMI, CSI, analog HDMI, analog, onboard mic. 1 Orange Pi PC+ Allwinner H3, 1,3GHz 4 Mali-400MP2 1GB/µSD, 8GB eMMC 100Mbit + WiFi 3 + 1 OTG - HDMI, CSI, analog HDMI, analog, onboard mic. Orange Pi mini 2 Allwinner H3, 1,6GHz 4 Mali-400MP2 1GB/µSD 100Mbit 4 + 1 OTG - HDMI, CSI, analog HDMI, analog, onboard mic. 1 Orange Pi 2 Allwinner H3, 1,6GHz 4 Mali-400MP2 1GB/µSD 100Mbit + WiFi 4 + 1 OTG - HDMI, CSI, analog HDMI, analog, onboard mic. 1, 2 Orange Pi+ 2 Allwinner H3, 1,6GHz 4 Mali-400MP2 2GB/µSD, 16GB eMMC 1000Mbit + WiFi 4 + 1 OTG 1 HDMI, CSI, analog HDMI, analog, onboard mic. 1 Orange Pi PC 2 Allwinner H5 64b, 1,6GHz 4 Mali-450MP4 (4k) 1GB/µSD, 2MB SPI 1000Mbit 3 + 1 OTG - HDMI 1.4, CSI HDMI, analog, onboard mic. 1 Orange Pi Lite 2 Allwinner H6 64b, 1,8GHz 4 Mali T-722 (4k) 1GB/µSD WiFi + BT 4.1 1x 3.0 + 1 - HDMI 2.0a, CSI HDMI, onboard mic. 1 PINE A64 Allwinner A53 64b, 1,2GHz 4 Mali-400MP2 512MB/µSD 100Mbit 2 - HDMI, CSI, DSI HDMI, analog 1 PINE A64+ Allwinner A53 64b, 1,2GHz 4 Mali-400MP2 1GB/µSD 1000Mbit 2 - HDMI, CSI, DSI HDMI, analog 1 PINE H64 Allwinner H6 64b, 1,8GHz 4 Mali T-722 (4k) 1-4GB/µSD, eMMC5.0 1000Mbit, mini PCIe 1x 3.0 + 2 - HDMI 2.0a, analog HDMI, analog 1 ODROID-C0 Amlogic S805, 1,5GHz 4 Mali-450MP2 1GB/µSD, eMMC4.5 - 2 neos. - HDMI HDMI, I2S 1 ODROID-C1+ Amlogic S805, 1,5GHz 4 Mali-450MP2 1GB/µSD, eMMC4.5 1000Mbit 4 + 1 OTG - HDMI HDMI, I2S 1 ODROID-C2 Amlogic S905 64b, 2GHz 4 Mali-450MP3 2GB/µSD, eMMC5.0 1000Mbit 4 + 1 OTG - HDMI 2.0 HDMI 2.0, I2S 1 ODROID-XU4 Samsung Exynos5422, 2GHz 4+4 Mali-T628MP6 2GB/µSD, eMMC5.0 1000Mbit 2x 3.0 + 1 - HDMI 1.4a HDMI 1.4a, I2S 1, 2 CHIP Allwinner R8, 1GHz 1 Mali-400 512MB/4GB WiFi + BT 4.0 1 + 1 OTG - analog analog 1, 2, 3, 4 Omega2 MT7688K (MIPS), 580MHz 1 - 64MB/16MB WiFi 1 - - - 1, 2, 3 intel Edison Atom Z34XX x86, 500MHz 2 - 1GB/4GB eMMC WiFi + BT 4.0 1 + 1 OTG - - - 1, 2 intel Galileo Quark SoC X1000 x86, 400MHz 1 - 256MB/8MB, µSD 100Mbit 1 + 1 cli - ext. PCIe 2.0 - 1 86Duino Vortex86EX, 300MHz 1 - 128MB/8MB, µSD ext. 100Mbit 1 + 1 cli 1 ext. PCIe 1.0 ext. HD Audio 1, 2
25.10.2012 Různé vývojové destičky byly k dispozici i dříve, ale k masovému rozšíření došlo až po vydání prvního modelu Raspberry Pi 1 začátkem roku 2012. Vizí Raspberry Pi Foundation bylo vytvořit a dodávat malý, levný počítač pro výukové účely do škol. Eben Upton (jeden ze spoluzakladatelů) v té době pracoval ve společnosti Broadcom a podařilo se mu zajistit dodávku SoC BCM2835. Vývoj trval několik let a v době vydání už procesor nepatřil k nejvýkonnějším. Přesto však první několikatisícové série vyráběné v UK, prodávané za příznivých 25 $ (model A), resp. 35 $ (model B), zmizely z prodeje takřka okamžitě a do roku 2015 se jich prodalo už 5 miliónů kusů. Díky této rozšířenosti má Raspberry Pi silnou podporu OpenSource / OpenHW komunity (různé distribuce OS, knihovny a zveřejněné SW / HW projekty) a také řada výrobců začala nabízet pro Pi celou řadu produktů, od krabiček po různé periferie.
V práci používáme Raspberry Pi všude tam, kde je potřeba pro nějakou specifickou úlohu rychle nasadit komplexnější systém jak jednočipáky, ale klasické PC je pro to zbytečně velké, žravé a drahé. Např. pro různé HW testery do výroby nebo dataloggery s přenosem dat po síti. I já jsem si pořídil jednu malinu na hraní. Počkal jsem si na HW revizi 2.0 s 512 MB RAM (starší revize měly jen 256 MR RAM). Dále se nebudu moc ze široka rozepisovat, neboť by to bylo nošení dříví do lesa. Spíše si zde budu zapisovat osobní poznámky k instalaci a konfiguraci, abych je měl přehledně k dispozici. Když to pomůže i někomu dalšímu, tím lépe. S dotazy se lze obrátit na mezinárodní fórum nebo na české fórum.
Schéma zapojení a přehled parametrů:
SoC: Broadcom BCM2835 CPU jádro: ARM1176JZF-S, 1 jádro, 700 MHz GPU: VideoCore IV, 250 MHz, OpenGL ES 2.0, HW kodeky MPEG-2, VC-1 (s licencí),
H264/MPEG-4 AVC (1080p30)Paměť: 512 MB DDR3 SDRAM (sdílená s GPU) Samsung K4P4G324EB
slot na SD/MMC/SDIO kartuSíťovka: SMSC LAN9514-JZX 10/100 Mbit Ethernet na vnitřním USB portu, RJ-45 Audio: analogový stereo výstup na 3,5mm jack, digitální přes HDMI Porty: 2 x USB 2.0 (S7) + 1 x napájecí microUSB (S1)
1 x RJ45 pro LAN (P4)
1 x HDMI 1.3, max. 1920 x 1200 @60 Hz (S3)
1 x RCA kompozitní analogový video-výstup (S4)
1 x 15-pinový DSI digitální video-výstup (sériový, 2-lane) na LCD (S2)
1 x 15-pinový MIPI digitální vstup pro kameru (S5)
1 x 3,5mm analogový audio-výstup (S6)
2x13-pinový GPIO header s UART, I2C, SPI, I2S, 5 V, 3,3 V... (P1)
2x4-pinový neosazený GPIO header (P5)Příkon: 3,5 W (700 mA) Rozměry: 85,6 x 56,5 mm Hmotnost: 45 g Vydání: v roce 2012 Cena: 35 $
Operační systémy a instalace
Každá distribuce je zaměřená trochu na jiný účel a jinou skupinu uživatelů, takže podle toho se liší i její SW vybavení a paměťová náročnost. Kdyby někdo toužil po Windows, jsou nově k dispozici i Windows 10 IoT Core. Jelikož mám na PC nainstalovaný Debian Linux a mám s ním pár zkušeností, tak jsem si nainstaloval Raspbian (Debian-Jessie) lite. Pro zkopírování image na SD kartu lze použít např. WinHex nebo v Linuxu klasicky příkaz dd. Image SD karty je připravený pro jednu velikost SD karty, proto nezapomeň při úvodním nastavení expandovat souborový systém na plnou kapacitu konkrétně použité SD karty.
- Raspbian (Debian-Jessie) full - velikost image: ~4 GB, nutná min. 8GB SD karta
- Raspbian (Debian-Jessie) lite - velikost image: ~1,4 GB, nutná min. 2GB SD karta, neobsahuje X-server a GUI.
přidání X-serveru s Openbox: ~ 100 MB (apt-get install xinit xrdp openbox)
přidání X-serveru s LXDE: ~ 770 MB
- XBian (Debian-Jessie) - velikost image: ~950 MB, nutná min. 1GB SD karta
- DietPi - velikost image: ~600 MB, nutná min. 1GB SD karta
- Moebius 2.x - velikost image: ~120 MB, nutná min. 128MB SD karta
- OpenELEC 6.x - velikost image: ~580 MB, nutná min. 1GB SD karta
- OSMC - velikost image: ~270 MB, nutná min. 512MB SD karta
Základní nastavení
- výchozí přihlašovací údaje pro Raspbian: user = pi, password = raspberry (root nemá nastavené heslo)
- výchozí přihlašovací údaje pro DietPi: user = root, password = dietpi
- základní nastavení: příkaz raspi-config - změň heslo uživatele pi, povol přihlášení po SSH (standardně na portu 22), expanduj FS
- nastavení hesla pro uživatele root: příkaz sudo passwd root, dále předpokládám práci pod rootem, takže už bez sudo
- povolení přihlašování uživatele root přes SSH: v souboru /etc/ssh/sshd_config přepiš řádek:
PermitRootLogin without-password -> PermitRootLogin yesZapnutí DHCP
- v souboru /etc/network/interfaces přepiš řádek:
iface eth0 inet manual -> iface eth0 inet dhcp- zkontroluj přidělení IP adresy: příkaz ifconfig
Nastavení dynamické DNS služby
Pokud máte k dispozici veřejnou IP adresu, avšak nikoliv pevnou (např. u ISP UPC) a chcete se na malinu snadno připojovat zvenku, je dobré si zařídit takovouto službu, která bude na DNS serveru automaticky aktualizovat vaši IP adresu a vy se budete připojovat na vaši registrovanou doménu.
- vytvoř si účet na DNSdynamic a zaregistruj doménové jméno (na výběr je více top domén)
- nainstaluj klienta ddclient: apt-get install ddclient
- vytvoř konfigurační soubor /etc/ddclient.conf a uprav zvýrazněné údaje podle své registrace:
# Configuration file for ddclient: /etc/ddclient.conf daemon=600 # IP update check period [s] syslog=yes #mail=root #mail-failure=root pid=/var/run/ddclient.pid ssl=yes use=web, web=myip.dnsdynamic.org # get IP from server server=www.dnsdynamic.org login=username # username password='pwd' # password protocol=dyndns2 userdomain.dnsd.info # user domain- aby správně fungovalo načítání IP adresy při bootu, kdy startuje ddclient démon, je třeba v raspi-config zapnout volbu "Wait for Network at Boot" (bez připojení k síti pak čeká asi 20s) nebo přidat zpožděnou obnovu IP adresy jako úkol do cronu:
zadej příkaz crontab -e (ukládá se do souboru /var/spool/cron/crontabs) a přidej řádky:
# zpozdena aktualizace DDNS, kdyz uz je spravne nactena IP adresa @reboot sleep 30 ; /usr/sbin/ddclient -force # pro sichr jeste opakuj 1 denne @daily /usr/sbin/ddclient -force
Bez této úpravy jsem měl problém v tom, že po startu systému (démon ddclient zřejmě startuje dříve, než se stihne přiřadit IP adresa z DHCP) obsahoval soubor /var/cache/ddclient/ddclient.cache prázdnou položku ip=, která se už nikdy neaktualizovala. Pomohlo jedině smazání cache souboru nebo vynucené obnovení příkazem ddclient -force.- otestuj funkčnost příkazy ddclient -force nebo ddclient -query -verbose
- přihlaš se na DNSdynamic a zkontroluj svou IP adresu, jestli odpovídá dle ifconfig
Instalace a nastavení OpenVPN serveru
Už dříve jsem si říkal, že náhodné připojování přes různé pochybné Wi-Finy ve městě či v zahraničí a přihlašování se skrz ně na své účty není zrovna nejbezpečnější. Komunikaci si může odposlechnout kde kdo - majitel Wi-Fi hotspotu (nebo ten, kdo ho hacknul), jeho ISP, či nějaký čmuchal sedící poblíž. Někteří vtipálci se dokonce baví tím, že spustí na místě, kde se vyskytuje hodně lidí, vlastní free Wi-Fi hotspot právě za účelem sběru dat. Zajímavý je též popis, jak pomocí VPN zachytávat a dešifrovat HTTPS komunikaci. Napadlo mě tedy zkusit si rozběhnout vlastní VPNku a malina se k tomu se svou malou spotřebou docela hodí. Android standardně podporuje VPN protokoly PPTP (už není bezpečný) a L2TP. Já jsem zvolil OpenVPN, pro níž je třeba na Androidu nainstalovat klientskou aplikaci. Vycházel jsem z těchto tutoriálů: Building A Raspberry Pi VPN pt.1, 2 a Set up a Hardened OpenVPN Server on Debian 8 pt.1, 2 3 a aplikoval je na Raspbian-Jessie. Podobný postup by šel použít i na chytřejší routery s Linuxem.
- nainstaluj openvpn: apt-get install openvpn
- zkopíruj všechny soubory z /usr/share/easy-rsa do /etc/openvpn/easy-rsa
- v souboru /etc/openvpn/easy-rsa/vars nastav proměnné:
export EASY_RSA="/etc/openvpn/easy-rsa"
export KEY_SIZE=1024
- vygeneruj CA certifikát a Root CA certifikát:
cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
./build-ca
a vyplň identifikační údaje do certifikátu (nepovinné)- vygeneruj serverový klíč:
./build-key-server servername
položka Common Name musí být shodná se jménem serveru servername
položka A challenge password musí být prázdná
na dotaz "Sign the certificate? [y/n]" odpověz "y"
na dotaz "1 out of 1 certificate requests certified, commit? [y/n]" odpověz "y"
- vygeneruj klientský klíč:
./build-key-pass clientname
na dotaz "Enter PEM pass phrase" zadej uživatelské heslo, kterým se budeš přihlašovat do VPN (zopakuj dvakrát po sobě)
položka A challenge password musí být prázdná
na dotaz "Sign the certificate? [y/n]" odpověz "y"
na dotaz "1 out of 1 certificate requests certified, commit? [y/n]" odpověz "y"
zopakuj příp. tento postup pro další klienty
- zašifruj klientský klíč algoritmem Triple DES:
cd cd /etc/openvpn/easy-rsa/keys
openssl rsa -in clientname.key -des3 -out clientname.3des.key
na dotaz "Enter pass phrase for clientname.key" zadej uživatelské heslo zadané v předchozím kroku
na dotaz "Enter PEM pass phrase" zadej uživatelské heslo zadané v předchozím kroku (zopakuj dvakrát po sobě)
zopakuj příp. tento postup pro další klienty
- vygeneruj Diffie-Hellman key exchange:
cd /etc/openvpn/easy-rsa
./build-dh
(na Raspberry Pi 1 to trvá asi minutu pro délku klíče 1024 bitů)
- vygeneruj statický HMAC pro obranu OpenVPN proti případným DoS útokům a skenování portů:
openvpn --genkey --secret keys/ta.key
(pokud klient nezahájí přihlašovací fázi správným klíčem, bude server veškeré neplatné pakety zahazovat)
- vytvoř konfigurační soubor /etc/openvpn/server.conf a uprav zvýrazněné údaje:
dev tun proto udp #Some people prefer to use tcp. Don't change it if you don't know. port 1194 ca /etc/openvpn/easy-rsa/keys/ca.crt cert /etc/openvpn/easy-rsa/keys/servername.crt # SWAP WITH YOUR CRT NAME key /etc/openvpn/easy-rsa/keys/servername.key # SWAP WITH YOUR KEY NAME dh /etc/openvpn/easy-rsa/keys/dh1024.pem # If you changed to 2048, change that here! server 10.8.0.0 255.255.255.0 # server and remote endpoints ifconfig 10.8.0.1 10.8.0.2 # Add route to Client routing table for the OpenVPN Server #push "route 10.8.0.1 255.255.255.255" # Add route to Client routing table for the OpenVPN Subnet #push "route 10.8.0.0 255.255.255.0" # your local subnet #push "route 89.212.77.131 255.255.255.0" # SWAP THE IP NUMBER WITH YOUR RASPBERRY PI IP ADDRESS # Use Google DNS push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" # Override the Client default gateway by using 0.0.0.0/1 and # 128.0.0.0/1 rather than 0.0.0.0/0. This has the benefit of # overriding but not wiping out the original default gateway. push "redirect-gateway def1" client-to-client duplicate-cn # keepalive sends ping-like messages between server and client keepalive 10 120 # use tls-auth key : 0=server, 1=client tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0 cipher AES-128-CBC comp-lzo user nobody group nogroup persist-key persist-tun status /var/log/openvpn-status.log 20 log /var/log/openvpn.log verb 1- zapni IP forwarding:
v souboru /etc/sysctl.conf najdi a odkomentuj tento řádek:
net.ipv4.ip+forward=1
aplikuj změnu příkazem sysctl -p- spusť OpenVPN server: service openvpn start
zkontroluj log soubor /var/log/openvpn.log
OpenVPN 2.3.4 arm-unknown-linux-gnueabihf [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Jan 23 2016 library versions: OpenSSL 1.0.1t 3 May 2016, LZO 2.08 Control Channel Authentication: using '/etc/openvpn/easy-rsa/keys/ta.key' as a OpenVPN static key file TUN/TAP device tun0 opened do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0 /sbin/ip link set dev tun0 up mtu 1500 /sbin/ip addr add dev tun0 local 10.8.0.1 peer 10.8.0.2 GID set to nogroup UID set to nobody UDPv4 link local (bound): [undef] UDPv4 link remote: [undef] Initialization Sequence Completed
zkontroluj výpis otevřených portů, jestli openvpn běží správně na UDP portu 1194 příkazem netstat -tulpna
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 449/sshd tcp6 0 0 :::22 :::* LISTEN 449/sshd udp 0 0 0.0.0.0:1194 0.0.0.0:* 408/openvpn udp 0 0 0.0.0.0:5353 0.0.0.0:* 371/avahi-daemon: r udp 0 0 0.0.0.0:68 0.0.0.0:* 377/dhcpcd udp 0 0 0.0.0.0:60275 0.0.0.0:* 371/avahi-daemon: r udp 0 0 89.187.24.113:123 0.0.0.0:* 486/ntpd udp 0 0 10.8.0.1:123 0.0.0.0:* 486/ntpd udp 0 0 127.0.0.1:123 0.0.0.0:* 486/ntpd udp 0 0 0.0.0.0:123 0.0.0.0:* 486/ntpd udp6 0 0 :::45256 :::* 371/avahi-daemon: r udp6 0 0 :::5353 :::* 371/avahi-daemon: r udp6 0 0 fe70::ca3:fab6:f014:123 :::* 486/ntpd udp6 0 0 ::1:123 :::* 486/ntpd udp6 0 0 :::123 :::* 486/ntpd
nebo příkazem lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME avahi-dae 371 avahi 12u IPv4 8309 0t0 UDP *:mdns avahi-dae 371 avahi 13u IPv6 8310 0t0 UDP *:mdns avahi-dae 371 avahi 14u IPv4 8311 0t0 UDP *:60275 avahi-dae 371 avahi 15u IPv6 8312 0t0 UDP *:45256 dhcpcd 377 root 8u IPv4 9072 0t0 UDP *:bootpc openvpn 408 nobody 4u IPv4 8233 0t0 UDP *:openvpn sshd 449 root 3u IPv4 8703 0t0 TCP *:ssh (LISTEN) sshd 449 root 4u IPv6 8713 0t0 TCP *:ssh (LISTEN) ntpd 486 ntp 16u IPv4 8749 0t0 UDP *:ntp ntpd 486 ntp 17u IPv6 8750 0t0 UDP *:ntp ntpd 486 ntp 18u IPv4 8847 0t0 UDP localhost:ntp ntpd 486 ntp 19u IPv4 8848 0t0 UDP 10.8.0.1:ntp ntpd 486 ntp 20u IPv6 8849 0t0 UDP localhost:ntp ntpd 486 ntp 22u IPv6 9093 0t0 UDP [fe80::ba3:fbe8:f121:97d3]:ntp ntpd 486 ntp 23u IPv4 9199 0t0 UDP ip-xxx.cz:ntp
- nastav automatické spuštění openvpn serveru při startu systému: update-rc.d openvpn defaults
- nainstaluj perzistentní iptables: apt-get install iptables-persistent
- přidej pravidlo pro NAT routování: iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
- ulož trvalé nastavení pravidel iptables: iptables-save >/etc/iptables/rules.v4
- restartuj systém, ve výpisech při startu by se měl objevit řádek: [OK] Started OpenVPN service.
- zkontroluj, jestli se načetla pravidla iptables: iptables-save
- zkontroluj, jestli se objevil nový virtuální síťový adaptér tun0 ve výpisu ifconfig
- užitečné příkazy pro ladění síťovin (předpokládá instalaci utilit tcpdump a netcat):
low-level dump UDP paketu: tcpdump -i eth0 -nvvv udp port 1194
odeslání UDP paketu: echo "Ahoj" | nc -u xx.xx.xx.xx 1194
příjem a výpis obsahu UDP paketu: nc -ulp 1194
Instalace a nastavení klienta OpenVPN Connect pro Android
Nejprve si vytvoříme OpenVPN profil v unifikovaném formátu - jediný, snadno přenositelný soubor, který obsahuje všechny potřebné certifikáty a klíče (soubory: ca.crt, clientname.crt, clientname.3des.key a ta.key, které jsme si vytvořili v postupu výše).
- zkopíruj si někam soubor /usr/share/doc/openvpn/examples/sample-config-files/client.conf, přejmenuj ho na client.ovpn a uprav zvýrazněné údaje. Zejména nezapomeň přidat řádek key-direction 1, který určuje směr TLS autentizace (v našem případě klient). V původním příkladu konfiguráku měla tento význam 1 za názvem souboru ta.key, ale tím, že jsem řádek zakomentoval, tak klient tuto důležitou informaci nedostal. Pak jsem dlouho nemohl přijít na to, proč mi od klienta na server přicházely 42B UDP pakety, ale server neodpovídal. Přitom server dělal to, co měl - pakety s neplatným HMAC zahazoval (při použití UDP protokolu, nelze takto nastavený VPN server odhalit skenováním portů).
############################################## # Sample client-side OpenVPN 2.0 config file # # for connecting to multi-client server. # # # # This configuration can be used by multiple # # clients, however each client should have # # its own cert and key files. # # # # On Windows, you might want to rename this # # file so it has a .ovpn extension # ############################################## # Specify that we are a client and that we # will be pulling certain config file directives # from the server. client # Use the same setting as you are using on # the server. # On most systems, the VPN will not function # unless you partially or fully disable # the firewall for the TUN/TAP interface. ;dev tap dev tun # Windows needs the TAP-Win32 adapter name # from the Network Connections panel # if you have more than one. On XP SP2, # you may need to disable the firewall # for the TAP adapter. ;dev-node MyTap # Are we connecting to a TCP or # UDP server? Use the same setting as # on the server. ;proto tcp proto udp # The hostname/IP and port of the server. # You can have multiple remote entries # to load balance between the servers. remote userdomain.dnsd.info 1194 # Keep trying indefinitely to resolve the # host name of the OpenVPN server. Very useful # on machines which are not permanently connected # to the internet such as laptops. resolv-retry infinite # Most clients don't need to bind to # a specific local port number. nobind # Downgrade privileges after initialization (non-Windows only) user nobody group nobody # Try to preserve some state across restarts. persist-key persist-tun # If you are connecting through an # HTTP proxy to reach the actual OpenVPN # server, put the proxy server/IP and # port number here. See the man page # if your proxy server requires # authentication. ;http-proxy-retry # retry on connection failures ;http-proxy [proxy server] [proxy port #] # Wireless networks often produce a lot # of duplicate packets. Set this flag # to silence duplicate packet warnings. ;mute-replay-warnings # SSL/TLS parms. # See the server config file for more # description. It's best to use # a separate .crt/.key file pair # for each client. A single ca # file can be used for all clients. ;ca ca.crt ;cert client.crt ;key client.key <ca> -----BEGIN CERTIFICATE----- zde vlož celý obsah souboru ca.crt -----END CERTIFICATE----- </ca> <cert> -----BEGIN CERTIFICATE----- zde vlož obsah z konece souboru clientname.crt -----END CERTIFICATE----- </cert> <key> -----BEGIN RSA PRIVATE KEY----- zde vlož celý obsah souboru clientname.3des.key -----END RSA PRIVATE KEY----- </key> # Verify server certificate by checking that the # certicate has the correct key usage set. # This is an important precaution to protect against # a potential attack discussed here: # http://openvpn.net/howto.html#mitm # # To use this feature, you will need to generate # your server certificates with the keyUsage set to # digitalSignature, keyEncipherment # and the extendedKeyUsage to # serverAuth # EasyRSA can do this for you. # Options: server|client remote-cert-tls server # If a tls-auth key is used on the server # then every client must also have the key. # 0=server, 1=client ;tls-auth ta.key 1 key-direction 1 <tls-auth> -----BEGIN OpenVPN Static key V1----- zde vlož obsah souboru ta.key -----END OpenVPN Static key V1----- </tls-auth> # Select a cryptographic cipher. # If the cipher option is used on the server # then you must also specify it here. cipher AES-128-CBC # Enable compression on the VPN link. # Don't enable this unless it is also # enabled in the server config file. comp-lzo # Set log file verbosity. verb 3 # Silence repeating messages ;mute 20 # The keepalive directive causes ping-like # messages to be sent back and forth over # the link so that each side knows when # the other side has gone down. # Ping every 10 seconds, assume that remote # peer is down if no ping received during # a 120 second time period. keepalive 10 120
- na telefon nainstaluj androidí aplikaci OpenVPN Connect
- nahraj soubor client.ovpn do telefonu
- ve správci souborů najdi soubor client.ovpn, ťukni na něj a naimportuj ho do aplikace OpenVPN Connect
- zadej uživatelské heslo, zadané při generování klíče a ťukni na tlačítko "Connect".
Po chvilce připojování by se v okně "Connection stats" měly začít inkrementovat počítadla "Bytes in" a "Bytes out" a během další vteřinky by mělo dojít k navázání spojení. Ve stavové liště se objeví ikonka klíčku a od této chvíle by měly všechny androidí aplikace komunikovat skrze VPNku. To si lze ověřit i na straně serveru třeba pomocí tcpdump, kde by měl být poznat zvýšený traffic v okamžiku načtení nějaké webové stránky na telefonu.
Elektronický mikroskop s Raspberry Pi
3.1.2022 Zajímavou aplikací Raspberry Pi je také třeba poměrně levný elektronický mikroskop pro jemnou elektroniku či mechaniku s realtime výstupem na monitor přes HDMI. Stačí malinu doplnit o kvalitní modul 12MP kamery s C-mountem za 1499 Kč a mikroskopovým objektivem s 300x zvětšením za 1999 Kč. Pracovní vzdálenost objektivu nad pozorovaným předmětem je cca 10 - 15 cm a proti levným plastovým USB čumítkům má mnohem menší latence přenášeného obrazu. Takto s ním uživatel zxcygnus na OldCompu vyfotil čip staré EPROM Tesla 2716: downscale 1600 x 1199 a výřez 1:1. Za ty peníze bych řekl, že je to docela použitelný výsledek.
Raspberry Pi Pico
22.1.2022 Loni vydala organizace Raspberry Pi Foundation novou malou levnou destičku Raspberry Pi Pico, která se velmi podobá různým Arduino / BluePill destičkám s STM32, srovnání zde. Je osazena novým MCU RP2040 (navrženým přímo organizací) s 2 jádry ARM Cortex-M0+ na 133 MHz, 264 kB SRAM, 2x UART, 2x SPI, 2x I2C, 16x PWM, 4x 12b ADC 0,5 MS/s, DMA. Zajímavé jsou programovatelné jednotky PIO bloků (nezávisle běžící stavová mašina - max. 32 instrukcí v ASM). Destička dále obsahuje externí 2MB QuadSPI FlashROM (na čipu je pouze malá ROM s USB bootloaderem), krystalový oscilátor, USB konektor (podporuje USB 1.1 device i host) a 40 pinů ve tvaru pouzdra obvodu DIL. Napájecí napětí je 1,8 – 5,5 V. GPIO nejsou 5 V tolerantní, max. 3,3 V a dají proud kolem 12 mA, max. jen 50 mA na všechny GPIO. U nás se dá Pico koupit za 109 Kč (v Praze ho má i GM Electronic za 149 Kč), či ještě menší destička s více GPIO, případně i samotný MCU RP2040 za pouhých 29 Kč (a v dnešní době nedostatku čipů jsou kupodivu skladem).
Dozvěděl jsem se o něm z vlákna na OldCompu, kde si s ním začal hrát Panda (samozřejmě že né v Pythónu, ale pěkně low-level) a naprogramoval pěknou OpenSource C-čkovou grafickou knihovnu PicoVGA, resp. zjednodušené verze Pico16VGA a PicoQVGA, s kterou lze s pomocí pár odporů zobrazovat grafiku na běžném VGA monitoru nebo LCD s paralelním RGB interfacem. Zde je podobný projekt pro generování obrazu na kompozitní výstup s jednoduchým odporovým R-2R DACem a experimentální projekt digitálního výstupu PicoDVI se silně přetaktovaným MCU. Spolehlivě prý běží cca do 250 MHz (jako první začne chybovat SPI FlashROM, ale zjistilo se, jak zvýšit děličku SPI hodin pro flešku a pak se dá dostat v pohodě přes 300 MHz), utilita pro nastavení PLL je zde. Panda také připravil minimalistické RaspPicoSDK včetně popisu pro začátečníky, které se obejde bez dalšího bloatware a vystačí si jen s ARM-GCC (použité binárky neběží na Windows XP, ale dají se nahradit těmito ze SourceForge). Věnoval se též assembleru a měření doby zpracování instrukcí.
28.1.2022 mi z RPiShopu dorazily 2 Pico destičky a 1 samostatný čip RP2040. Dále jsem se dozvěděl o další větší OpenHW destičce VGA, SD Card & Audio Demo board for Raspberry Pi Pico aka Pimoroni Pico VGA Demo Base. Ta obsahuje VGA konektor s odporovým DACem RGB555, audiokodek PCM5101 s výstupem na stereo jack, slot na microSD kartu, microUSB host konektor, 3 tlačítka a ladicí pin header. PCB Layout a schéma v KiCADu je zde a zdrojáky demo programů jsou na GitHubu. Za jednu neosazenou destičku děkuju vanthomasovi z OldComp fóra. Chtěl bych na ní zkusit rozjet Pandovu knihovnu PicoVGA, která používá méně barevný výstup RGB332 mapovaný na jiné GPIO a také sloučený signál SYNC místo HSYNC a VSYNC. Snad to půjde přizpůsobit úpravou souboru vga_config.h. Nechal jsem si také vyrobit u JLCPCB 5 destiček PicoDVI.
5.2.2022 Od Pandy jsem se dozvěděl, že výstupy pro RGB DAC na výše zmíněné destičce bohužel přemapovat nepůjdou, protože program pro PIO blok prochází popořadě za sebou jednotlivé GPIO, což zde není splněno, neboť GPIO5 je použit pro hodiny microSD karty. Také nepotěší, že použité footprinty pro tyto SMD odpory jsou zcela zbytečně velikosti 0402, když by se tam v pohodě vešly 0603. Vyřešil jsem to jednoduše přelepením dané oblasti na desce proužkem kaptonové pásky a připájením 0603 odpůrků podle Pandova zapojení přímo k vývodům Pico modulu. Na druhé konce odpůrků jsem připájel drátky a propojil je v odpovídajícími R, G, B piny VGA konektoru. Panda šetří GPIO a používá smíšenou synchronizaci zavedenou na pin HSYNC (13) místo původních HSYNC a VSYNC.
Po prvním připojení Pica do PC přes USB se mi detekovalo složené USB zařízení se zařízením třídy mass storage a neznámé zařízení "RP2 Boot" s USB PID: 0003h, k němuž není pro Windows žádný ovladač, ale není pro naprogramování potřeba. Raspberry Pi Foundation používá USB VID: 2E8Ah a zde je seznam všech jejich PIDů. Některé programy dále používají virtuální sériový port (CDC), pro který stačí nainstalovat tento INF soubor. Jak jsem zjistil, zařízení "RP2 Boot" využívá utilita picotool (zdrojáky zde) ke komunikaci s bootloaderem přes knihovnu libusb. Zařízení je třeba ručně zaregistrovat k WinUSB/libusb driveru pomocí utility Zadig, viz obrázek níže. Jediná binárka picotool.exe 1.1.0, kterou jsem našel, bohužel neběží pod Windows XP a pod Windows 10 mi při pokusu o spojení s Picem opakovaně spadla. Nakonec se mi podařilo zkompilovat vlastní build verze 1.1.0 [422 kB], který funguje i pod Windows XP. Umožňuje nahrávat a verifikovat programy pro Pico do/z SPI FlashROM, restartovat z boot módu do aplikačního módu (obráceně mi to nefungovalo) a vypsat nějaké informace, viz níže.
C:\RaspPicoSDK\_exe>picotool.exe info -a Program Information name: pico web site: https://github.com/raspberrypi/pico-examples features: USB stdin / stdout binary start: 0x10000000 binary end: 0x10055bc0 Fixed Pin Information none Build Information sdk version: 1.0.1 pico_board: pico build date: Jun 6 2021 build attributes: Release Device Information flash size: 2048K ROM version: 2
Zkusil jsem do Pica nahrát program Vlak (Train), který je portem stejnojmenné staré DOSové hry od Golem Software. Naprogramování (pokud už bylo do Pica dříve něco nahráno, je třeba zmáčknout tlačítko BOOTSEL a RUN/RESET#, pak se jednoduše zkopíruje zkompilovaný .UF2 soubor na virtuální disk Pica) a start programu proběhl bez problémů a na monitoru se objevil starý známý Vlak, který jsem mohl ovládat klávesama přes Putty (115200 baud) skrz virtuální sériák (lze překonfigurovat i na UART na GPIO). Obraz běžel rychle a stabilně bez jakýchkoliv rušivých jevů. UPDATE: Na Pico byla portována i legendární střílečka Doom. Zdrojáky jsou k dispozici na GitHubu a ukázkové video je zde. Sharewarová epizoda Doomu se díky kompresi vešla do standardní 2MB SPI FlashROM a obraz se generuje odporovým DACem na VGA v 16-bitových barvách RGB565. Za zmínku stojí také projekt emulátoru Pico-ZXspectrum, který využívá výše zmíněnou knihovnu PicoDVI.
30.3.2022 Tak mi konečně s várkou plošňáků z JLCPCB dorazily 4-vrstvé destičky na PicoDVI zmíněné výše, mírně upravené pro jiný footprint HDMI konektoru. Mám navíc 5 ks, takže případným zájemcům můžu z tohoto přebytku nabídnout. Zatím jsem osadil MCU RP2040 v QFN pouzdru a 12MHz krystal, ale chybí mi pasiva velikosti 0402, která budu muset někde koupit (toto smetí běžně nevedu).
PicoDVI PCB top PicoDVI PCB bottom
20.4.2022 Před 2 týdny jsem sehnal součástky a doosadil destičku, ale nevyzkoušel ji, protože jsem nikde nenašel zkompilovanou binárku s nějakým demem pro správnou konfiguraci pinů (našel jsem akorát zkompilované binárky, které byly určené pro Wrenův adaptér DVI Sock s jiným zapojením TMDS párů). Nyní jsem konečně překonal nechuť a odhodlal se rozběhnout toolchain s CMake. Kompilace se samozřejmě (na Windows) neobešla bez problémů. Použil jsem poslední verzi CMake 3.23.1, Python 3.10.4 (vyžadovaný nějakými build skripty) a ARM-GCC 9.3.1 toolchain. Dále je potřeba mít někde staženou a rozbalenou originální verzi PicoSDK 1.3.0 (ne tu upravenou Pandovu verzi). Pustil jsem CMD a nastavil cesty k ARM-GCC, MinGW, CMake, Pythonu a nastavil proměnnou PICO_SDK_PATH do adresáře s rozbaleným PicoSDK. V top-level adresáři zdrojáků PicoDVI jsem v souboru CMakeLists.txt změnil řádek s konfigurací pinů z set(DVI_DEFAULT_SERIAL_CONFIG "pico_sock_cfg" CACHE STRING na set(DVI_DEFAULT_SERIAL_CONFIG "picodvi_dvi_cfg" CACHE STRING (příp. lze předat jako parametr CMake -DDVI_DEFAULT_SERIAL_CONFIG=picodvi_dvi_cfg). Vytvořil jsem podadresář build, vstoupil do něj a spustil cmake -G "MinGW Makefiles" -DPICO_COPY_TO_RAM=1 .., měl by vzniknout soubor Makefile a mělo by stačit už jen zavolat make. Ale protože mi nějak selhala kompilace utilit pioasm a elf2uf2 z PicoSDK, tak jsem nakopíroval staženou binárku pioasm.exe do build\pioasm\ a elf2uf2.exe do build\elf2uf2\. Pak jsem musel zavolat make -i, aby se ignorovaly errory během kompilace, protože CMake se pokoušel pomocí ARM-GCC zkompilovat nějaký testovací soubor pro Windows s neznámým linker parametrem --major-image-version, ale to nemá vliv na kompilaci ARMového kódu a nakonec se mi přeložily všechny dema. Pro test zde přikládám zkompilovaný image dema christmas_snowflakes.uf2 [114 kB], které je vidět na fotce níže. Vyzkoušel jsem všechny dema a zobrazení bylo v pořádku, až na 1 demo vista-palette, které mi negenerovalo žádný obraz.
PicoDVI top PicoDVI bottom Christmas snowflakes Pico-ZXspectrum
Povedlo se mi též zkompilovat emulátor Pico-ZXspectrum, který využívá knihovnu PicoDVI. Pro jeho kompilaci je třeba navíc stáhnout balíčky (nejlépe přes GIT dle popisu v odstavci Build) no-OS-FatFS-SD-SPI-RPi-Pico, pico-dvi-menu, pico-emu-utils a upravenou knihovnu TinyUSB, kterou nahradíme starší verzi v PicoSDK (nezapomenout na git checkout hid_micro_parser). Konfigurace pinů pro HDMI výstup se použije dle konfigurační proměnné DVI_DEFAULT_SERIAL_CONFIG z nadřazeného CMakeLists.txt z PicoDVI knihovny, pak už jen stačí přeložit make -i zxspectrum. Emulátor podporuje funkci USB host a lze ho ovládat USB HID zařízeními (klávesnice a joysticky), které lze připojit i přes USB hub. Zatím ale nemám připájený konektor pro microSD kartu.
30.6.2022 Raspberry Pi Foundation představilo novou verzi Raspberry Pi Pico W za 6$, která ke stávajícímu MCU RP2040 přidává WiFi modul založený na čipu Infineon CYW43439. Ten podporuje též Bluetooth 5.2, ale tato funkcionalita zatím není na Pico W k dispozici (v budoucnu možná bude). Softwarová podpora založená na síťovém stacku lwIP je zahrnutá v Pico SDK. Rozměrově a pinově je nové Pico kompatabilní s předchozí verzí.
12.1.2023 Raspberry Pi Pico lze také použít jako levný logický analyzátor s 21 digitálními kanály s vzorkováním do 120 MHz a 3 analogovými kanály s vzorkováním do 500 KHz. Viz též diplomová práce z ČVUT: Vít Vaněček - Logický analyzátor s Raspberry Pi Pico. Zásadní omezení je úzké hrdlo v podobě pomalého USB, nicméně kratší záznamy se vejdou do interní RAM (lze samplovat rychle na limitu přenosu GPIO-DMA) a u signálů s málo změnami v čase může pomoci RLE komprese. Uživatel Pico-coder na svém GitHubu dal k dispozici OpenSource firmware pro Pico včetně zkompilovaného UF2 souboru, napsal driver do knihovny libsigrok (zatím se nedostal do oficiální větve), kterou využívá populární aplikace PulseView - zde je třeba použít speciální build se zakompilovaným driverem (může vyžadovat knihovnu mscvr100.dll, pokud ji už nemáte v systému). Firmware Pica komunikuje s libsigrok přes virtuální sériový port (CDC). Po připojení se objeví jako USB zařízení s VID, PID: 2E8A:000A:00 - Board CDC (Interface 0) a je pro něj třeba nainstalovat INF soubor zmíněný výše. Číslo sériového portu zjistíme ve Správci zařízení a v PulseView v menu "Connect to Device" vybereme driver "raspberrypi-pico" a příslušný Serial Port (bitovou rychlost není třeba u CDC zadávat). Pozor na to, že GPIO na Pico jsou nechráněné a snadno by se mohly odprásknout větším napětím než 3,3 V, takže doporučuji přidat alespoň nějaké sériové odpory pár set ohmů.
9.2.2023 Raspberry Pi Pico bylo použito jako základ OpenHW/FW emulátoru PicoGUS historické zvukové karty Gravis Ultrasound (podporuje též AdLib/OPL2 a MPU-401 MIDI v provedení 8-bitové ISA karty). Zatím není zdaleka 100% kompatabilní, ale s novějším FW se to postupně zlepšuje, viz compatibility list.