systemd-networkd
สามารถใช้Systemd เพื่อแทนที่ระบบเครือข่ายที่มีอยู่บน Raspbian
มันทำงานอย่างไรกับ Raspbian บน Raspberry Pi ที่มีอินเตอร์เฟสสองตัวสำหรับ ethernet และ wlan ฉันสามารถรับรู้การล้มเหลวแบบไดนามิกสำหรับพวกเขาได้หรือไม่?
systemd-networkd
สามารถใช้Systemd เพื่อแทนที่ระบบเครือข่ายที่มีอยู่บน Raspbian
มันทำงานอย่างไรกับ Raspbian บน Raspberry Pi ที่มีอินเตอร์เฟสสองตัวสำหรับ ethernet และ wlan ฉันสามารถรับรู้การล้มเหลวแบบไดนามิกสำหรับพวกเขาได้หรือไม่?
คำตอบ:
ทดสอบกับ Raspberry Pi 4B ด้วย
Raspbian Buster Lite 2020-02-13อัปเดตเมื่อ 2020-04-11 อัพเดททำได้ด้วย
sudo apt update && sudo apt full-upgrade && sudo reboot
มันจะไม่ทำงานกับ Raspbian Stretch !
ที่นี่คุณจะได้พบกับการแก้ไขการทดสอบสุดท้ายสำหรับ Raspbian ยืด Lite
ใช้systemd-networkd
แทนค่าเริ่มต้นdhcpcd
เป็นไปได้แน่นอน แต่มันไม่มีความหมายในทุกกรณี
networkd เป็นบริการขนาดเล็กและแบบลีนเพื่อกำหนดค่าอินเทอร์เฟซเครือข่ายซึ่งออกแบบมาสำหรับกรณีการใช้เซิร์ฟเวอร์ในโลกที่มีเครือข่าย hotplugged และ virtualized การกำหนดค่าจะคล้ายกันในระดับจิตวิญญาณและนามธรรมถึง ifupdown แต่คุณไม่จำเป็นต้องมีแพ็คเกจเพิ่มเติมเพื่อกำหนดค่าบริดจ์พันธบัตร vlan ฯลฯ มันยังไม่เหมาะสำหรับการจัดการ WLAN NetworkManager ยังคงเหมาะสมกว่าสำหรับกรณีการใช้งานเดสก์ทอป [1]
แต่สำหรับ raspi ที่อยู่ใกล้กับทีวีหรือเครื่องขยายเสียงและทำงานได้ตลอด 24/7 สำหรับการสตรีมเสียงหรือวิดีโอหรือสำหรับกล้อง ฯลฯsystemd-networkd
เป็นตัวเลือกที่ดี แต่คุณต้องทำสลับที่สมบูรณ์ ไม่มีทางที่จะผสมขึ้นโดยไม่เป็นและnetworking
/ หรือ dhcpcd
โปรดทราบว่า NetworkManager ไม่ได้รับการสนับสนุนโดย Raspbian นอกกรอบ
สำหรับการอ้างอิงผมใช้สดประกาย SD Card จากRaspbian Buster Lite
ฉันจะให้ความสนใจกับการติดตั้งหัวขาดเฉพาะกับ ssh หากคุณกำลังใช้สิ่งนี้อยู่ให้ตรวจสอบตัวสะกดซ้ำ ๆ มิฉะนั้นคุณจะสูญเสียการเชื่อมต่อที่ขาด ถ้าคุณต้องการติดตั้งหัวขาดแล้วมองไปที่SSH (Secure Shell)และปฏิบัติตามส่วน3. เปิดใช้งาน SSH บนหัวขาดราสเบอร์รี่ Pi (ไฟล์เพิ่มไปยังการ์ด SD บนเครื่องอื่น)
ปิดการใช้งานสิ่งเก่า อย่าหยุดบริการใด ๆ เพียงปิดใช้งานพวกเขา! ดังนั้นมันจะมีผลเฉพาะในการบูตครั้งต่อไป วิธีทำก็แค่ติดตาม
สร้างไฟล์นี้ด้วยการตั้งค่าของคุณ คุณสามารถคัดลอกและวางสิ่งนี้ในหนึ่งบล็อกไปยังบรรทัดคำสั่งของคุณเริ่มต้นด้วยcat
และรวมทั้ง EOF (ตัวคั่น EOF จะไม่ได้รับส่วนของไฟล์):
pi@raspberrypi: ~$ sudo -Es # if not already done
root@raspberrypi: ~# cat >/etc/systemd/network/04-eth.network <<EOF
[Match]
Name=e*
[Network]
# to use static IP (with your settings) toggle commenting the next 8 lines.
#Address=192.168.50.60/24
#DNS=84.200.69.80 1.1.1.1
#[Route]
#Gateway=192.168.50.1
#Metric=10
DHCP=yes
[DHCP]
RouteMetric=10
EOF
สร้างไฟล์นี้ด้วยการตั้งค่าของคุณ:
root@raspberrypi:~ # cat >/etc/systemd/network/08-wifi.network <<EOF
[Match]
Name=wl*
[Network]
# to use static IP (with your settings) toggle commenting the next 8 lines.
#Address=192.168.50.61/24
#DNS=84.200.69.80 1.1.1.1
#[Route]
#Gateway=192.168.50.1
#Metric=20
DHCP=yes
[DHCP]
RouteMetric=20
EOF
ติดตั้ง wpa_supplicant กับแฟ้มนี้และการตั้งค่าของคุณสำหรับcountry=
, ssid=
และpsk=
และเปิดใช้งาน:
root@raspberrypi:~ # cat >/etc/wpa_supplicant/wpa_supplicant-wlan0.conf <<EOF
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=DE
network={
ssid="TestNet"
psk="realyNotMyPassword"
key_mgmt=WPA-PSK
proto=RSN WPA
}
EOF
root@raspberrypi:~ # chmod 600 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
root@raspberrypi:~ # systemctl disable wpa_supplicant.service
root@raspberrypi:~ # systemctl enable wpa_supplicant@wlan0.service
root@raspberrypi:~ # rfkill unblock 0
root@raspberrypi:~ # exit
root@raspberrypi:~ $
รีบูตและขอให้โชคดี ;-)
มันเป็นไปได้ว่า RasPi ได้รับที่อยู่ IP ใหม่เพื่อให้คุณอาจจะต้องมองไปที่มันสำหรับการเชื่อมต่อต่อไปด้วยSSH
คุณควรมีทั้งการตั้งค่าอินเทอร์เฟซและการทำงานตามที่อธิบายไว้ข้างต้น ไม่มีปัญหาเมื่ออินเตอร์เฟสทั้งสองหมด เคอร์เนลจะใช้ส่วนต่อประสานที่มีเมตริกต่ำสุดก่อน ที่นี่อินเตอร์เฟสอีเธอร์เน็ตจะถูกใช้ก่อน แต่นี่มีข้อเสียอย่างมาก อย่างที่คุณเห็นip -4 -brief addr
ในแต่ละอินเตอร์เฟสมีที่อยู่ IP ของตัวเอง หากเคอร์เนลสลับอินเตอร์เฟสเนื่องจากไม่มีการเชื่อมต่อจะใช้แหล่งที่อยู่ IP ใหม่ของมันด้วย สิ่งนี้จะทำให้การสื่อสาร TCP สถานะผิดปกติใด ๆ ที่จัดตั้งขึ้นเช่น ssh, การสตรีม, เซสชันการเข้าสู่ระบบและอื่น ๆ คุณสามารถใช้การเชื่อมต่อใหม่จากที่อยู่ IP ของแหล่งข้อมูลที่เปลี่ยนแปลง แต่การเชื่อมต่อเดิมยังค้างอยู่ นั่นไม่ใช่สิ่งที่เราต้องการจริงๆ
ทางออกของปัญหานี้คือพันธะ เราสร้างส่วนต่อประสานชั่วคราวbond0
ที่ไม่เปลี่ยนแปลงการตั้งค่า แบบมีสายและ WiFi bond0
อินเตอร์เฟซที่จะเปลี่ยนไป
ก่อนอื่นให้ปิดใช้งานไฟล์เครือข่ายอีเธอร์เน็ตและไร้สายเดี่ยว:
pi@raspberrypi:~ $ sudo -Es
root@raspberrypi:~ # cd /etc/systemd/network/
root@raspberrypi:~ # mv 04-eth.network 04-eth.network~
root@raspberrypi:~ # mv 08-wifi.network 08-wifi.network~
จากนั้นตั้งค่าการเชื่อมต่อกับไฟล์ทั้งสี่นี้:
root@raspberrypi:~ # cat >/etc/systemd/network/02-bond0.netdev <<EOF
[NetDev]
# status: cat /proc/net/bonding/bond0
Name=bond
Kind=bond
[Bond]
Mode=active-backup
# primary slave is defined in *eth.network
MIIMonitorSec=500ms
MinLinks=1
EOF
root@raspberrypi:~ # cat >/etc/systemd/network/12-bond0-add-eth.network <<EOF
[Match]
Name=e*
[Network]
Bond=bond0
PrimarySlave=yes
EOF
root@raspberrypi:~ # cat >/etc/systemd/network/16-bond0-add-wifi.network <<EOF
[Match]
Name=wl*
[Network]
Bond=bond0
EOF
root@raspberrypi:~ # cat >/etc/systemd/network/20-bond0-up.network <<EOF
[Match]
Name=bond0
[Network]
# to use static IP (with your settings) toggle commenting the next 4 lines.
DHCP=yes
#Address=192.168.50.60/24
#Gateway=192.168.50.1
#DNS=84.200.69.80 1.1.1.1
EOF
แต่นี่ไม่ใช่เรื่องราวทั้งหมด systemd-networkdตรวจสอบว่าอินเทอร์เฟซทั้งหมดขึ้นก่อนที่จะดำเนินการกับการเริ่มต้นขึ้นอยู่กับบริการ ด้วยการเชื่อมเรามีทาสอินเทอร์เฟซ (eth0, wlan0) ที่ไม่เคยส่งสัญญาณว่ากำลังทำงานอยู่ มันเป็นเพียงส่วนต่อประสานที่เกิดขึ้นหากมีทาสอย่างน้อยหนึ่งตัวเชื่อมต่ออยู่ ดังนั้นการตรวจสอบจะล้มเหลวพร้อมข้อผิดพลาดและรอการบู๊ตเป็นเวลานาน ในการจัดการสิ่งนี้คุณต้องsystemd-networkd-wait-online.service
แก้ไข วิธีการทำโปรดปฏิบัติตามคำแนะนำที่
หากเสร็จแล้วก็ถึงเวลารีบูต
เป็นไปได้ว่า RasPi จะได้รับที่อยู่ IP ใหม่ดังนั้นคุณอาจต้องดูที่การเชื่อมต่อครั้งต่อไปด้วย ssh
จากนั้นคุณสามารถตรวจสอบสถานะการเชื่อม:
pi@raspberrypi:~ $ cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: eth0 (primary_reselect always)
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 500
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: dc:a6:32:4c:08:1b
Slave queue ID: 0
Slave Interface: wlan0
MII Status: up
Speed: Unknown
Duplex: Unknown
Link Failure Count: 1
Permanent HW addr: dc:a6:32:4c:08:1c
Slave queue ID: 0
ทดสอบการเชื่อม: ด้วยสถานะการเชื่อมต่อด้านบนคุณจะเห็นว่าCurrently Active Slave:
จะเปลี่ยนและMII Status:
จะลง
หากคุณเป็นคนหัวขาดอย่าทำdown
ทั้งสองอย่างเข้าด้วยกัน
pi@raspberrypi:~ $ ip addr
pi@raspberrypi:~ $ sudo ip link set eth0 down
pi@raspberrypi:~ $ sudo ip link set eth0 up
pi@raspberrypi:~ $ sudo ip link set wlan0 down
pi@raspberrypi:~ $ sudo ip link set wlan0 up
อดทนหลังจากตั้ง wlan0 ขึ้น ฉันอาจใช้เวลาสักครู่ในการเชื่อมต่อกับเราเตอร์และจัดการการเชื่อมต่อ เวลานี้ssh
จะไม่ตอบสนอง
สำหรับการตรวจสอบเพิ่มเติมในเชิงลึกของพันธะคุณอาจมีลักษณะที่เครือข่ายแบบไดนามิก failover จัดลำดับความสำคัญ WiFi over Ethernet
การอ้างอิง:
[1]
/usr/share/doc/systemd/README.Debian.gz [2] man systemd.netdev
[3] man systemd.network
[4] https://wiki.debian.org/Bonding
[5] https://www.kernel.org/doc/Documentation/networking/bonding.txt
DNS=192.168.1.1
/etc/systemd/network/04-eth.network
(ฉันกำลังใช้การตั้งค่าด้วย IP แบบคงที่) ...
หากต้องการคำตอบอย่างละเอียดจาก @Ingo: โปรดพิจารณาใช้ลิงก์
ln -s /run/systemd/resolve/stub-resolv.conf resolv.conf
/run/systemd/resolve/resolv.conf
แทนการเชื่อมโยงไปยัง สิ่งนี้จะเปิดใช้งาน stub DNS แบบ "รวม" และเปิดใช้งานสิ่งต่างๆเช่นเซิร์ฟเวอร์ DNS ต่ออินเทอร์เฟซซึ่งอาจสำคัญถ้าคุณใช้ VPN ที่ให้เซิร์ฟเวอร์ DNS ของตัวเองมีรายการที่ไม่ใช่แบบสาธารณะ