Banana Pi 64 adalah komputer papan tunggal yang mirip dengan Raspberry Pi, tetapi dengan beberapa port Ethernet, menjadikannya router distribusi Linux untuk keperluan umum.

Ya, ada Openwrt, tetapi ia memiliki keunikan tersendiri, GUI dan CLI-nya sendiri; ada Mikrotik, tetapi ia juga memiliki GUI/CLI-nya sendiri, dan Wireguard Ini tidak langsung berfungsi tanpa perlu pengaturan tambahan... Pada dasarnya, saya menginginkan router dengan pengaturan yang fleksibel, namun tetap berada dalam kerangka kerja Linux standar yang saya gunakan setiap hari.
Dalam artikel dengan nama BPI, R64, papan tunggal, maksud saya sama - papan tunggal Banana Pi R64 itu sendiri.
Pemilihan gambar. Unduh melalui eMMC
Keterampilan pertama yang diperoleh saat bekerja dengan secara umum, dan dengan R64 khususnya, itu berarti mempelajari cara memuat OS ke dalamnya dan dapat berinteraksi dengannya, karena R64 tidak memiliki port monitor (HDMI, misalnya). Ketika semuanya jatuh - Wifi berhenti berfungsi, jaringan Ethernet, Bluetooth, USB, dll. ada UART, melalui antarmuka yang Anda selalu dapat melihat apa yang salah, dan juga menjalankan beberapa perintah dari konsol, jika perlu.
Algoritme koneksi ke R64 melalui USB-UART:
- lari ke toko komponen radio untuk kabel USB-UART (PL2303, Serial-to-USB)
- kami menghubungkan satu ujung USB ke komputer, dan ujung lainnya, UART, ke R64, dengan tiga dari empat kabel, seperti pada gambar di bawah
- di konsol komputer dijalankan
sudo minicom
Setelah itu, dalam banyak kasus, konsol papan tunggal akan muncul = sukses.
Anda dapat melihat lebih banyak .

Selanjutnya, cara termudah adalah memuat sistem operasi dari kartu SD: unduh dengan gambar dan unggah:
unzip -p 2019-08-23-ubuntu-16.04-lite-preview-bpi-r64-sd-emmc.img.zip | pv | sudo dd of=/dev/mmcblk0 bs=10M status=noxferkami memasukkan kartu ke slot R64 SD, menyalakannya, amati pemuatan uboot terlebih dahulu di konsol yang terhubung, kemudian boot Linux standar.
Opsi boot alternatif menggunakan kartu 64Gb yang sudah tertanam di R8, disebut eMMC. Menurut petunjuk di wiki, kami menulis ulang gambar ke perangkat
/dev/mmcblk0 ke BPI, reboot, lepas kartu SD, aktifkan BPI lagi... dan tidak berhasil. Bagaimana menuju ke sana Boot select jangan bertahan.
Faktanya adalah setidaknya untuk BPI Anda perlu menyetel bendera khusus agar dapat melakukan booting dari flash drive internal:
root@bpi-r64:~# ./mmc extcsd read /dev/mmcblk1 | grep 'PARTITION_CONFIG'
Boot configuration bytes [PARTITION_CONFIG: 0x00]
root@bpi-r64:~# ./mmc bootpart enable 1 1 /dev/mmcblk1
root@bpi-r64:~# ./mmc extcsd read /dev/mmcblk1 | grep 'PARTITION_CONFIG'
Boot configuration bytes [PARTITION_CONFIG: 0x48]Selanjutnya, Anda perlu menulis preloader ke partisi boot khusus
root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0Pabrikan R64 (Cina) memposting biner ini . Apa yang dia lakukan tidak diketahui (tidak ada kode sumber), tetapi tanpa dia itu juga tidak akan berhasil.
Secara umum, setelah itu gambar mulai dimuat dari eMMC. Jika Anda ingin mengetahuinya dan membuat gambar dari awal, maka untuk kedua kasus (SD / eMMC) Anda perlu menulis beberapa file lagi (preloader untuk kartu SD, ATF, u-boot), hanya untuk masuk ke kernel boot. Topik ini masih , tetapi bagi kami yang utama adalah berfungsi dan baik-baik saja.
Sekarang, sejujurnya, saya tidak menggunakan unduhan eMMC, kartu SD sudah cukup, tetapi saya menghabiskan cukup banyak waktu untuk membuatnya berfungsi, jadi biarlah di artikel.
Pilihan sistem operasi. Armbia
Tugas praktis pertama adalah meluncurkan VPN, tentu saja. WireguardSaya langsung menemukan bahwa kernel tidak dikompilasi dengan benar, dan tidak ada header. Saya membangun ulang kernel dan, seperti kebiasaan saya dengan x86, membangun modul kernel menggunakan DKMS. Namun, kecepatan build pada ARM64, bahkan untuk utilitas kecil, sangat mengejutkan. Kemudian dibutuhkan modul kernel lain, dan seterusnya. Pada dasarnya, ternyata apa pun yang berhubungan dengan kernel paling baik dikompilasi pada laptop x86 yang kurang mumpuni, kemudian cukup disalin dan ditempel ke ARM64, di-reboot, dan diuji.
Aspek penggunaan ruang adalah masalah lain. Dalam kasus saya, pilihannya adalah... DebianSemua yang dibutuhkan untuk arsitektur arm64 sudah tersedia dalam bentuk paket.debian.org dan tidak perlu mengkompilasi ulang apa pun.
Agar tidak memproduksi sepeda lagi, I pada BPI R64.
Atau lebih tepatnya: bagian ruang pengguna adalah Armbian, dan intinya diambil dari repositori -A. Gambar terbaru dapat diunduh .
Semua aktivitas pengembangan bagian perangkat lunak R64 dilakukan Secara umum, pabrikan sendiri berupaya mempopulerkan router untuk OpenWrt, tetapi berkat aktivitas pengembang Frank dari Jerman, semua fitur tersebut dengan cepat masuk ke dalam kernel. Debian-a. Anehnya, Frank aktif di setiap utas forum.
Organisasi ruang kerja: kabel
Secara terpisah, saya ingin memberi tahu Anda cara menempatkan SBC (bukan hanya BPI) di atas meja selama pengembangan / pengujian agar tidak mengarahkan kabel Ethernet ke sana dari sumber Internet melalui seluruh ruangan / kantor. Faktanya adalah, di satu sisi, Anda perlu menyediakan Internet ke sepotong besi, dan di sisi lain, semuanya dapat merusak besi ini, dan terutama Wifi.
Awalnya saya memutuskan untuk membeli "peluit" USB-Wifi murah, sambungkan ke satu-satunya port di BPI dan lupakan kabelnya. Untuk melakukan ini, saya membeli TP-LINK TL-WN725N USB 2.0 yang murah, tetapi segera menjadi jelas bahwa itu tidak akan lepas landas: agar peluit berfungsi, diperlukan driver kernel, yang, tentu saja, tidak ada (kemudian saya mengkompilasi driver RTL8XXXU yang diperlukan, tetapi masih tidak praktis). Dan kabel ethernet merusak pemandangan ruangan untuk sementara.
Hasilnya, saya berhasil melepaskan kabel dengan bantuan Tenda MW3 (Wifi mesh system): Saya cukup meletakkan satu kubus di bawah meja dan menghubungkan BPI ke port LAN yang terakhir dengan kabel Ethernet meteran. Kesuksesan.
Wireguard, RKN, Burung
Salah satu tujuan saya menggunakan Banana PI adalah memiliki akses gratis ke situs yang diblokir oleh RKN, khususnya, agar Telegram dan panggilan ke Slack berfungsi. Artikel tentang topik ini telah diusulkan di Habré: , , .
Saya menerapkan penerapan solusi seperti itu menggunakan Ansible: .
Diasumsikan bahwa VPS tersebut berjalan di bawah Ubuntu 18.04 April. Saya menguji fungsionalitasnya pada dua penyedia hosting di Eropa: Amazon dan Digital Ocean.
Jadi, kami memasang Armbian di atas pada R64, tersedia melalui ssh dengan nama hm-bananapi-1 dan memiliki akses internet. Kami menerapkan skrip otomatisasi yang memungkinkan secara berurutan dan menjalankan penginstalan itu sendiri di R64:
# зависимости для Debian-based дистрибутивов
$ sudo apt install --no-install-recommends python3-pip python3-setuptools python3-wheel git
$ which pip3
/usr/bin/pip3
# ansible с pybook, скриптование на Python
$ pip3 install https://github.com/muravjov/ansible/archive/ansible-2.10.0.dev0-pybook2019.tar.gz
$ export PATH=~/.local/bin:$PATH
$ which ansible-playbook
/home/sa/.local/bin/ansible-playbook
$ git clone https://github.com/muravjov/ansible-bpi-r64.git
$ cd ansible-bpi-r64
$ git submodule update --init
# убеждаемся в доступности hm-bananapi-1
$ ssh hm-bananapi-1 which python3
/usr/bin/python3
# собственно установка
$ ansible-playbook ./router.py -l hm-bananapi-1Selanjutnya, Anda perlu menerapkan VPN kami ke VPS dengan cara yang sama:
ansible-playbook ./router.py -l current-vpnDi sini, argumennya selalu current-vpn, dan nama VPS itu sendiri dikonfigurasikan dalam sebuah variabel (dalam hal ini, paris-vpn-aws-t2-micro-1):
$ grep current_vpn group_vars/all
current_vpn: paris-vpn-aws-t2-micro-1
#current_vpn: frankfurt-vpn-d0-starter-1Oh ya, sebelum semua operasi ini, Anda perlu membuat rahasia (khususnya kunci). Wireguard) ke folder ./secrets, direktori akan terlihat seperti .
Otomatisasi yang memungkinkan dengan Python
Anda mungkin memperhatikan bahwa alih-alih format YAML, perintah Ansible dikodekan dalam skrip Python. Sebagai perbandingan, cara mengaktifkan daemon burung dengan cara biasa:
- name: start bird
systemd:
name: bird
state: started
enabled: yesdan caranya sama via Python:
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")Menulis perintah yang mungkin dengan kode Python memungkinkan Anda untuk menggunakan kembali kode tersebut, dan secara umum, semua kemungkinan bahasa tujuan umum terbuka. Misalnya menginstal burung di R64 dan VPS:
install_bird("router/bird.conf.j2")
install_bird("vpn/bird.conf.j2")lihat kode fungsi .
Fitur ini disebut pybook diimplementasikan . Belum ada dokumentasi tentang pybook, maka saya akan memperbaiki cacat ini.
Apa yang dia pikirkan tentang ini.
Pemantauan. Prometheus
Total: telegram berfungsi, linkedin dan pornhub juga, secara umum, pengalaman pengguna baik-baik saja. Tapi semuanya bisa pecah, dan potongan besi Cina juga.
Pembaruan kernel juga bisa menarik: misalnya, saya ingin memperbarui kernel 5.4 => 5.6, nah, di sana Wireguard Langsung dari pabrik, tidak perlu patch... Tak lama kemudian, saya dengan susah payah memindahkan patch dari 5.4 ke 5.6, kernel berjalan, tunnel ke VPS melakukan ping, tetapi Bird tidak dapat terhubung dengan error "BGP Error"... "Dengan ngeri, saya melakukan rollback" (c) ke 5.4; pemindahan ke 5.6 telah dimasukkan ke dalam TODO.
Oleh karena itu, selain memasang router dan VPS, saya menambahkan pemantauan (pada x86) Ubuntu 18.04), yang diinstal pada host terpisah dengan komponen-komponen berikut:
- prometheus, alertmanager, blackbox_exporter - semuanya ada di buruh pelabuhan
- peringatan dikirim ke saluran telegram menggunakan bot metalmatze/alertmanager-bot - juga di buruh pelabuhan
- tor untuk bot, agar bot dapat memperingatkan situasi ketika Internet tersedia, tetapi telegram tetap tidak berfungsi, dan bot itu sendiri tidak dapat terhubung
- terapan : NodeVPNTroubles (tidak ada ping ke VPS), BirdVPNTroubles (tidak ada sesi Bird), AntifilterDownloadTroubles (gagal memuat alamat IP yang diblokir), SiteTroubles (sayangnya telegram tidak tersedia)
- peringatan sistem seperti HostGrowingDiskReadLatency (kartu SD murah berhenti dibaca)
Contoh pengaturan pemantauan:
ansible-playbook ./monitoring.py -l monitoring-preprodPenemuan Otomatis untuk prometheus diatur ke folder /etc/prometheus/auto_http, contoh menambahkan host ke pemantauan (host tidak dipantau secara default):
bash << 'EOF'
HOSTNAME=hm-bananapi-1
IP_ADDRESS=`ssh -G $HOSTNAME | awk '/^hostname / { print $2 }'`
ssh monitoring-preprod sudo sponge /etc/prometheus/auto_http/$HOSTNAME.json << EOF2
[
{
"targets": ["$IP_ADDRESS:9100"],
"labels": {
"env": "prod",
"hostname": "$HOSTNAME"
}
}
]
EOF2
EOFTODO: 2 penyedia, 2 BPI, failover siaran mana saja
Selain semuanya, saya berencana untuk menyambungkan ke dua penyedia agar Internet terus berfungsi, bahkan jika satu penyedia mengalami masalah dengan jaringan, atau mereka lupa membayar untuk Internet, dll., dan faktor manusia lainnya.
Pengalaman pengguna paling canggih tentang topik multi-wan dijelaskan untuk sistem Mwan3 di bawah Openwrt. Solusi ini memiliki fungsionalitas yang kaya, tetapi pengaturan dan pengoperasian secara umum untuk multi-wan agak merepotkan. Hanya satu contoh: jika Anda datang ke beberapa situs dari dua alamat IP sekaligus, mereka mungkin tidak menyukainya, mereka akan berhenti bekerja => "Internet tidak berfungsi."
Mengingat pengalaman ini, saya memutuskan bahwa multihoming belum menjadi prioritas, hanya failover. Meskipun tampaknya di versi terbaru linux semuanya harus bekerja dengan satu perintah seperti:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5Jadi, untuk menghindari satu titik kegagalan, kami mengambil 2 BPI, masing-masing terhubung ke satu penyedia, menghubungkannya bersama dan membuat komunikasi satu sama lain secara dinamis dialihkan melalui burung / OSPF.
Selanjutnya, pada masing-masing kami mengumumkan alamat IP yang sama jika layanan tersedia (Internet, DNS). Artinya, kami sendiri tidak akan meletakkan rute default, tetapi melalui burung. Solusinya memata-matai .
Fungsionalitas ini belum diimplementasikan, virus korona yang berbahaya kacau (tidak semuanya berasal dari aliexpress; toko online lain, Layta, berjanji untuk mengirim dalam seminggu, dan lebih dari sebulan telah berlalu; penyedia kedua tidak berhasil memperpanjang kabel sebelum karantina, hanya berhasil membuat lubang di dinding untuk mengebor kabel).
Cara memesan R64
Papan itu sendiri di toko resmi .
Lebih baik juga memesan segera:
- + menginformasikan standar steker UE atau AS
- unit pendingin: radiator/kipas; karena baik CPU dipanaskan dan chip sakelar
- antena wifi,
Ada nuansa - harga pengiriman dari beberapa waktu menjadi tidak cukup tinggi di toko resmi. Manajer Judy Huang meyakinkan saya bahwa tidak ada kesalahan, dan Anda dapat memilih ePacket seharga $5, tetapi saya melihat bahwa untuk Rusia hanya ada EMS seharga >33$. Tidak menyenangkan, tetapi tidak kritis. Selain itu, jika Anda memilih negara lain untuk pengiriman (saya melewati semua benua), pengiriman akan dikenakan biaya ~5$. Russophobes?.. Tapi kemudian saya menemukan bahwa untuk Prancis harga pengiriman juga ~$30, dan tenang.
Akibatnya, Judy menawarkan untuk memesan, tetapi tidak membayar (mengisyaratkan: kurangi kartu agar pembayaran tidak dilakukan secara otomatis); menulis kepadanya dan dia akan mengurangi harga pengiriman normal. Kesuksesan.
Isu
Belum semuanya bekerja dengan sempurna.
Performa
Perintah Ansible=Python dijalankan dengan lambat, bahkan saat idle, selama 20-30 detik; urutan besarnya lebih lama dari pada laptop x86. Selain itu, pada awalnya dilakukan dengan cukup cepat, ~ 3 detik, kemudian melambat dengan tajam. Mungkin ini karena CPU memanas (throttling). Kode Go juga berjalan lama:
# запрос метрик для прометея из node_exporter на Go
$ time curl -s http://172.30.1.1:9100/metrics > /dev/null
real 0m6,118s
user 0m0,005s
sys 0m0,009s
# однако температура 51 градус, не так и много
sa@bananapir64:~$ cat /sys/devices/virtual/thermal/thermal_zone0/temp
51700wifi
Wifi berfungsi, tetapi berhenti di Armbian setelah sekitar satu hari, menulis:
sa@bananapir64:~$ dmesg | grep -E 'mt7622_wmac.*timeout'
[470303.802539] mt7622_wmac 18000000.wmac: Message 38 (seq 3) timeout
[470314.042508] mt7622_wmac 18000000.wmac: Message 50 (seq 4) timeout
...Hanya restart membantu. Kita perlu melangkah lebih jauh .
Ethernet
Ethernet berfungsi, tetapi setelah ~ sehari paket (DHCP) dari R64 berhenti datang.
Memulai ulang antarmuka membantu:
ifdown br0; sleep 30; ifup br0Sopirnya baru, kernelnya belum diterima, saya harap Chinese Landen Chao .
Sumber: www.habr.com
