Banana Pi 64 เป็นคอมพิวเตอร์บอร์ดเดียวที่คล้ายกับ Raspberry Pi แต่มีพอร์ตอีเธอร์เน็ตหลายพอร์ต ทำให้เป็นเราเตอร์การกระจาย Linux ที่ใช้งานทั่วไป
ใช่ Openwrt มีอยู่แล้ว แต่มี GUI และ CLI เป็นของตัวเอง มี Mikrotik แต่ก็มี GUI / CLI ของตัวเองอีกครั้งและ Wireguard ไม่ทำงานนอกกรอบ ... โดยทั่วไปฉันต้องการเราเตอร์ที่มีการตั้งค่าที่ยืดหยุ่นในขณะที่ยังคงอยู่ในกรอบของ Linux มาตรฐานที่คุณทำงานด้วย ทุกวัน.
ในบทความภายใต้ชื่อ BPI, R64, single-board ฉันจะหมายถึงสิ่งเดียวกัน - Banana Pi R64 single-board เอง
การเลือกรูปภาพ ดาวน์โหลดผ่าน eMMC
ทักษะแรกที่ได้รับเมื่อทำงานด้วย
อัลกอริทึมการเชื่อมต่อกับ R64 ผ่าน USB-UART:
- วิ่งไปที่ร้านอะไหล่วิทยุสำหรับสาย USB-UART (PL2303, Serial-to-USB)
- เราเชื่อมต่อปลาย USB ด้านหนึ่งเข้ากับคอมพิวเตอร์และอีกด้าน UART กับ R64 โดยใช้สายสามในสี่สายดังภาพด้านล่าง
- ในการเรียกใช้คอนโซลคอมพิวเตอร์
sudo minicom
หลังจากนั้น ในกรณีส่วนใหญ่ คอนโซลเดี่ยวจะปรากฏขึ้น = สำเร็จ
สามารถดูรายละเอียดเพิ่มเติมได้
ต่อไป วิธีที่ง่ายที่สุดคือการโหลดระบบปฏิบัติการจากการ์ด SD: ดาวน์โหลดโดย
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=noxfer
เราใส่การ์ดลงในสล็อต R64 SD เปิดเครื่อง สังเกตการโหลด uboot บนคอนโซลที่เชื่อมต่อก่อน จากนั้นจึงบูต Linux มาตรฐาน
ตัวเลือกการบู๊ตทางเลือกคือการใช้การ์ด 64Gb ที่ฝังอยู่ใน R8 ซึ่งเรียกว่า eMMC ตามคำแนะนำใน wiki เราเขียนรูปภาพใหม่ลงในอุปกรณ์
/dev/mmcblk0 เป็น BPI, รีบูต, ลบการ์ด SD, เปิดใช้งาน BPI อีกครั้ง... และใช้งานไม่ได้ วิธีการเดินทาง Boot select
อย่ารอช้า
ความจริงก็คืออย่างน้อยสำหรับ BPI คุณต้องตั้งค่าสถานะพิเศษเพื่อให้สามารถบู๊ตจากแฟลชไดรฟ์ภายในได้:
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]
ถัดไป คุณต้องเขียนตัวโหลดล่วงหน้าไปยังพาร์ติชันสำหรับเริ่มระบบพิเศษ
root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0
ผู้ผลิต R64 (จีน) โพสต์ไบนารีนี้
โดยทั่วไปแล้ว หลังจากนั้น รูปภาพจะเริ่มโหลดจาก eMMC หากคุณต้องการคิดออกและสร้างรูปภาพตั้งแต่เริ่มต้นสำหรับทั้งสองกรณี (SD / eMMC) คุณต้องเขียนไฟล์เพิ่มอีกสองสามไฟล์ (ตัวโหลดล่วงหน้าสำหรับการ์ด SD, ATF, u-boot) เพื่อไปที่เคอร์เนล บูต หัวข้อนี้ยังคงอยู่
เอาตรงๆ ตอนนี้ฉันไม่ได้ใช้การดาวน์โหลด eMMC การ์ด SD ก็เพียงพอแล้ว แต่ฉันใช้เวลาค่อนข้างมากในการทำให้มันใช้งานได้ ดังนั้นปล่อยให้มันอยู่ในบทความ
ทางเลือกของระบบปฏิบัติการ อาร์มเบียน
งานแรกของแอปพลิเคชันคือการเปิดใช้งาน VPN แน่นอนว่า Wireguard ปรากฎว่าไม่ได้ประกอบจากด้านเคอร์เนลและไม่มีส่วนหัว ฉันสร้างเคอร์เนลใหม่และสร้างโมดูลเคอร์เนลโดยใช้ x86 โดยใช้ DKMS อย่างไรก็ตามความเร็วในการประกอบบนแขน 64 ของยูทิลิตี้ขนาดเล็กแม้แต่น้อยก็ทำให้ฉันประหลาดใจ จากนั้นจึงจำเป็นต้องมีโมดูลเคอร์เนลอื่น และอื่น ๆ โดยทั่วไปแล้วปรากฎว่าทุกอย่างที่เกี่ยวข้องกับเคอร์เนลนั้นดีกว่าที่จะประกอบเข้ากับแล็ปท็อป x86 warm-tube จากนั้นถ่ายโอนไปยัง R64 โดยการคัดลอกรีบูตและทดสอบอย่างง่าย
อีกอย่างคือส่วนของ userspace ในกรณีของฉันที่เลือก Debian ทุกอย่างสำหรับสถาปัตยกรรม arm64 อยู่ใน package.debian.org แล้ว และไม่จำเป็นต้องสร้างอะไรใหม่
เพื่อไม่ให้มีการผลิตจักรยานอีก I
หรือมากกว่านั้น: ส่วน userspace คือ Armbian และแกนหลักนำมาจากที่เก็บ
กิจกรรมทั้งหมดเกี่ยวกับการพัฒนาส่วนซอฟต์แวร์ของ R64 นั้นดำเนินต่อไป
องค์กรพื้นที่ทำงาน: สายไฟ
ฉันอยากจะบอกคุณถึงวิธีวาง SBC (ไม่ใช่แค่ BPI) บนโต๊ะในระหว่างการพัฒนา / ทดสอบเพื่อไม่ให้สายอีเธอร์เน็ตจากแหล่งอินเทอร์เน็ตผ่านห้อง / สำนักงานทั้งหมด ความจริงก็คือ ในแง่หนึ่ง คุณต้องจัดหาอินเทอร์เน็ตให้กับชิ้นส่วนเหล็ก และในทางกลับกัน ทุกสิ่งสามารถทำลายได้ในชิ้นส่วนเหล็กนี้ และโดยเฉพาะอย่างยิ่ง Wifi
ก่อนอื่นฉันตัดสินใจซื้อ "นกหวีด" USB-Wifi ราคาถูกเสียบเข้ากับพอร์ตเดียวบน BPI แล้วลืมสายไฟ ในการทำเช่นนี้ฉันซื้อ TP-LINK TL-WN725N USB 2.0 ราคาไม่แพง แต่ในไม่ช้าก็เห็นได้ชัดว่ามันจะไม่ถอดออก: เพื่อให้นกหวีดใช้งานได้จำเป็นต้องมีไดรเวอร์เคอร์เนลซึ่งแน่นอนว่าไม่ได้อยู่ที่นั่น (ภายหลังฉันรวบรวมไดรเวอร์ RTL8XXXU ที่จำเป็น แต่ก็ยังใช้งานไม่ได้) และสายเคเบิลอีเธอร์เน็ตก็ทำลายมุมมองของห้องไปชั่วขณะ
เป็นผลให้ฉันจัดการเพื่อกำจัดสายเคเบิลด้วยความช่วยเหลือของ Tenda MW3 (ระบบตาข่าย Wifi): ฉันเพียงแค่วางลูกบาศก์หนึ่งลูกบาศก์ไว้ใต้โต๊ะและเชื่อมต่อ BPI เข้ากับพอร์ต LAN ของอันหลังด้วยสายอีเธอร์เน็ตแบบมิเตอร์ ความสำเร็จ.
ไวร์การ์ด, RKN, นก
สิ่งหนึ่งที่ฉันใช้ Banana PI คือการเข้าถึงไซต์ที่ถูกบล็อกโดย RKN ได้ฟรี โดยเฉพาะอย่างยิ่ง เพื่อให้ Telegram และการโทรไปยัง Slack ทำงานได้ บทความในหัวข้อนี้ได้รับการเสนอในHabré:
ฉันดำเนินการปรับใช้โซลูชันดังกล่าวโดยใช้ Ansible:
VPS ควรจะใช้งาน Ubuntu 18.04 ฉันตรวจสอบประสิทธิภาพของโฮสต์สองแห่งในยุโรป: Amazon และ Digital Ocean
ดังนั้นเราจึงติดตั้ง Armbian ด้านบนบน R64 ซึ่งมีให้ใช้งานผ่าน ssh ภายใต้ชื่อ hm-bananapi-1
และมีอินเตอร์เน็ต เราปรับใช้สคริปต์การทำงานอัตโนมัติตามลำดับและเรียกใช้การติดตั้งเองบน 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-1
ต่อไป คุณต้องปรับใช้ VPN ของเรากับ VPS ในลักษณะเดียวกัน:
ansible-playbook ./router.py -l current-vpn
ในที่นี้ อาร์กิวเมนต์จะเป็น current-vpn เสมอ และชื่อ VPS เองก็ได้รับการกำหนดค่าในตัวแปร (ในกรณีนี้คือ 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-1
ใช่ ก่อนดำเนินการทั้งหมดนี้ คุณต้องสร้างความลับ (โดยเฉพาะ คีย์ Wireguard) ในโฟลเดอร์ ./secrets
ไดเร็กทอรีควรมีลักษณะดังนี้
ระบบอัตโนมัติ Ansible ใน Python
คุณอาจสังเกตเห็นว่าแทนที่จะใช้รูปแบบ YAML คำสั่ง Ansible จะถูกเข้ารหัสในสคริปต์ Python สำหรับการเปรียบเทียบ วิธีเปิดใช้งานภูตนกด้วยวิธีปกติ:
- name: start bird
systemd:
name: bird
state: started
enabled: yes
และเหมือนกันผ่าน Python:
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")
การเขียนคำสั่ง Ansible ด้วยโค้ด Python ช่วยให้คุณนำโค้ดกลับมาใช้ใหม่ได้ และโดยทั่วไปแล้ว ความเป็นไปได้ทั้งหมดของภาษาที่ใช้งานทั่วไปจะเปิดอยู่ ตัวอย่างเช่น การติดตั้ง bird บน R64 และ VPS:
install_bird("router/bird.conf.j2")
install_bird("vpn/bird.conf.j2")
ดูรหัสฟังก์ชัน
คุณสมบัตินี้เรียกว่า pybook
นำไปใช้
เขาคิดอย่างไร
การตรวจสอบ โพร
ทั้งหมด: โทรเลขใช้งานได้, LinkedIn และ PornHub เช่นกัน โดยทั่วไปแล้วประสบการณ์ของผู้ใช้ก็โอเค แต่ทุกอย่างสามารถแตกหักได้และชิ้นส่วนเหล็กของจีนก็เช่นกัน
การอัปเดตเคอร์เนลก็น่าสนใจเช่นกัน ตัวอย่างเช่น ฉันต้องการอัปเดตเคอร์เนล 5.4 => 5.6 เอาล่ะ มี Wireguard อยู่แล้ว ไม่ต้องแพตช์ ... ไม่พูดเร็วกว่าทำ: ถ่ายโอนแพตช์อย่างระมัดระวังจาก 5.4 เป็น 5.6, เคอร์เนลเริ่มทำงาน, อุโมงค์ไปยัง VPS ส่งคำสั่ง ping แต่นกไม่สามารถเชื่อมต่อกับข้อผิดพลาด "BGP Error"… "ย้อนกลับด้วยความสยดสยอง" (c) เป็น 5.4; การย้ายไปยัง 5.6 ถูกเลื่อนออกไปใน TODO
ดังนั้น นอกเหนือจากการติดตั้งเราเตอร์และ VPS แล้ว ฉันได้เพิ่มการตรวจสอบ (บน x86 Ubuntu 18.04) ซึ่งติดตั้งบนโฮสต์แยกต่างหากโดยมีส่วนประกอบต่อไปนี้:
- prometheus, alertmanager, blackbox_exporter - ทั้งหมดใน docker
- การแจ้งเตือนจะถูกส่งไปยังช่องโทรเลขโดยใช้บอท metalmatze/alertmanager-bot - ยังอยู่ในนักเทียบท่า
- tor สำหรับบอท เพื่อให้บอทสามารถแจ้งเตือนสถานการณ์เมื่อมีอินเทอร์เน็ต แต่โทรเลขยังไม่ทำงาน และบอทเองก็ไม่สามารถเชื่อมต่อได้
- สมัครแล้ว
การแจ้งเตือน : NodeVPNTroubles (ไม่มี ping ไปยัง VPS), BirdVPNTroubles (ไม่มี Bird session), AntifilterDownloadTroubles (ไม่สามารถโหลดที่อยู่ IP ที่ถูกบล็อก), SiteTroubles (โชคไม่ดีที่โทรเลขไม่พร้อมใช้งาน) - การแจ้งเตือนระบบเช่น HostGrowingDiskReadLatency (การ์ด SD ราคาถูกหยุดอ่าน)
ตัวอย่างการตั้งค่าการตรวจสอบ:
ansible-playbook ./monitoring.py -l monitoring-preprod
การค้นหาอัตโนมัติสำหรับ prometheus ถูกตั้งค่าเป็นโฟลเดอร์ /etc/prometheus/auto_http ตัวอย่างของการเพิ่มโฮสต์ในการมอนิเตอร์ (โฮสต์จะไม่ถูกมอนิเตอร์ตามค่าดีฟอลต์):
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
EOF
สิ่งที่ต้องทำ: ผู้ให้บริการ 2 ราย, 2 BPI, เฟลโอเวอร์แบบ anycast
นอกเหนือจากทุกอย่างแล้ว ฉันวางแผนที่จะเชื่อมต่อกับผู้ให้บริการสองรายเพื่อให้อินเทอร์เน็ตทำงานต่อไปได้ แม้ว่าผู้ให้บริการรายหนึ่งจะมีปัญหากับเครือข่าย หรือพวกเขาลืมจ่ายค่าอินเทอร์เน็ต ฯลฯ และปัจจัยอื่นๆ จากมนุษย์
มีการอธิบายประสบการณ์ผู้ใช้ขั้นสูงที่สุดในหัวข้อ multi-wan
จากประสบการณ์นี้ ฉันตัดสินใจว่าการทำงานแบบหลายบ้านยังไม่มีความสำคัญ แม้ว่าดูเหมือนว่าใน linux เวอร์ชันล่าสุดทุกอย่างควรทำงานด้วยคำสั่งเดียวเช่น:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5
ดังนั้น เพื่อหลีกเลี่ยงความล้มเหลวเพียงจุดเดียว เราจึงใช้ BPI 2 รายการ โดยแต่ละรายการเชื่อมต่อกับผู้ให้บริการรายเดียว เชื่อมต่อเข้าด้วยกันและสื่อสารระหว่างกันโดยกำหนดเส้นทางผ่านนก / OSPF แบบไดนามิก
นอกจากนี้ เราจะประกาศที่อยู่ IP เดียวกันในแต่ละรายการหากมีบริการ (อินเทอร์เน็ต, DNS) นั่นคือเราจะไม่วางเส้นทางเริ่มต้นเอง แต่ผ่านนก การแก้ปัญหาสอดแนม
ฟังก์ชั่นนี้ยังไม่ได้ใช้งาน coronavirus ที่ร้ายกาจทำให้ยุ่งเหยิง (ไม่ใช่ทุกอย่างที่มาจาก aliexpress; Layta ร้านค้าออนไลน์อีกแห่งสัญญาว่าจะจัดส่งในหนึ่งสัปดาห์และผ่านไปนานกว่าหนึ่งเดือนผู้ให้บริการรายที่สองไม่สามารถยืดเวลา สายเคเบิลก่อนกักกันทำได้เพียงเจาะรูที่ผนังเพื่อเจาะสายเคเบิล)
วิธีการสั่งซื้อ R64
บอร์ดอยู่ในร้านค้าอย่างเป็นทางการ
นอกจากนี้ยังเป็นการดีกว่าที่จะสั่งซื้อทันที:
อาหาร + แจ้งมาตรฐานปลั๊ก EU หรือ US- แผงระบายความร้อน: หม้อน้ำ/พัดลม; เนื่องจากทั้ง CPU ถูกทำให้ร้อนและชิปสวิตช์
- เสาอากาศไวไฟ,
เช่น
มีความแตกต่างกันนิดหน่อย - ราคาของการจัดส่งในร้านค้าอย่างเป็นทางการในบางครั้งสูงไม่เพียงพอ ผู้จัดการ Judy Huang ยืนยันกับฉันว่าไม่มีข้อผิดพลาด และคุณสามารถเลือก ePacket ได้ในราคา $5 แต่ฉันเห็นว่าสำหรับรัสเซียมีเพียง EMS ในราคา >33$ ไม่เป็นที่พอใจ แต่ไม่สำคัญ ยิ่งไปกว่านั้น หากคุณเลือกประเทศอื่นสำหรับการจัดส่ง (ฉันไปมาแล้วทุกทวีป) การจัดส่งจะมีค่าใช้จ่าย ~5$ Russophobes?.. แต่แล้วฉันก็พบว่าราคาจัดส่งสำหรับฝรั่งเศสก็อยู่ที่ ~$30 เช่นกัน และสงบลง
เป็นผลให้จูดี้เสนอที่จะสั่งซื้อ แต่ไม่จ่ายเงิน (เปรย: ใส่บัตรน้อยลงเพื่อให้การชำระเงินไม่ผ่านโดยอัตโนมัติ); เขียนถึงเธอและเธอจะลดราคาค่าขนส่งให้เป็นปกติ ความสำเร็จ.
ประเด็น
ทุกอย่างยังทำงานได้ไม่สมบูรณ์
การปฏิบัติ
Ansible=คำสั่งของ Python จะถูกดำเนินการอย่างช้าๆ แม้จะไม่ได้ใช้งานก็ตาม เป็นเวลา 20-30 วินาที; ลำดับความสำคัญที่ยาวกว่าแล็ปท็อป x86 ยิ่งไปกว่านั้น ในตอนแรกจะดำเนินการค่อนข้างเร็ว ~ 3 วินาที จากนั้นจะช้าลงอย่างรวดเร็ว อาจเป็นเพราะความร้อนของ CPU (การควบคุมปริมาณ) รหัส Go ยังใช้งานได้นาน:
# запрос метрик для прометея из 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
51700
WIFI
Wifi ใช้งานได้ แต่หยุดที่ Armbian หลังจากผ่านไปประมาณหนึ่งวัน เขียนว่า:
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
...
การรีสตาร์ทเท่านั้นที่ช่วยได้ เราต้องไปต่อ
อีเธอร์เน็ต
อีเธอร์เน็ตใช้งานได้ แต่หลังจาก ~ หนึ่งวันแพ็กเก็ต (DHCP) จาก R64 หยุดมา
การรีสตาร์ทอินเทอร์เฟซช่วย:
ifdown br0; sleep 30; ifup br0
ไดรเวอร์เป็นของใหม่ เคอร์เนลยังไม่ได้รับการยอมรับ ฉันหวังว่า Landen Chao ของจีน
ที่มา: will.com