วิธีการโยกย้ายจากระบบเครือข่ายไปยัง systemd-networkd ด้วยไดนามิก failover


14

systemd-networkdสามารถใช้Systemd เพื่อแทนที่ระบบเครือข่ายที่มีอยู่บน Raspbian

มันทำงานอย่างไรกับ Raspbian บน Raspberry Pi ที่มีอินเตอร์เฟสสองตัวสำหรับ ethernet และ wlan ฉันสามารถรับรู้การล้มเหลวแบบไดนามิกสำหรับพวกเขาได้หรือไม่?

คำตอบ:


28

ทดสอบกับ 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 นอกกรอบ


♦ขั้นตอนที่ 1: การเตรียมการ

สำหรับการอ้างอิงผมใช้สดประกาย SD Card จากRaspbian Buster Lite

ฉันจะให้ความสนใจกับการติดตั้งหัวขาดเฉพาะกับ ssh หากคุณกำลังใช้สิ่งนี้อยู่ให้ตรวจสอบตัวสะกดซ้ำ ๆ มิฉะนั้นคุณจะสูญเสียการเชื่อมต่อที่ขาด ถ้าคุณต้องการติดตั้งหัวขาดแล้วมองไปที่SSH (Secure Shell)และปฏิบัติตามส่วน3. เปิดใช้งาน SSH บนหัวขาดราสเบอร์รี่ Pi (ไฟล์เพิ่มไปยังการ์ด SD บนเครื่องอื่น)

ปิดการใช้งานสิ่งเก่า อย่าหยุดบริการใด ๆ เพียงปิดใช้งานพวกเขา! ดังนั้นมันจะมีผลเฉพาะในการบูตครั้งต่อไป วิธีทำก็แค่ติดตาม


♦ขั้นตอนที่ 2: ตั้งค่าอินเตอร์เฟสอีเธอร์เน็ตแบบใช้สาย (eth0)

สร้างไฟล์นี้ด้วยการตั้งค่าของคุณ คุณสามารถคัดลอกและวางสิ่งนี้ในหนึ่งบล็อกไปยังบรรทัดคำสั่งของคุณเริ่มต้นด้วย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

♦ขั้นตอนที่ 3: ตั้งค่าอินเทอร์เฟซ wlan (wlan0)

สร้างไฟล์นี้ด้วยการตั้งค่าของคุณ:

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


♦ขั้นตอนที่ 4: เชื่อมต่อสายและอินเตอร์เฟซไร้สายสำหรับการเฟลโอเวอร์

คุณควรมีทั้งการตั้งค่าอินเทอร์เฟซและการทำงานตามที่อธิบายไว้ข้างต้น ไม่มีปัญหาเมื่ออินเตอร์เฟสทั้งสองหมด เคอร์เนลจะใช้ส่วนต่อประสานที่มีเมตริกต่ำสุดก่อน ที่นี่อินเตอร์เฟสอีเธอร์เน็ตจะถูกใช้ก่อน แต่นี่มีข้อเสียอย่างมาก อย่างที่คุณเห็น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


หมายเหตุสำหรับการอ้างอิงราคาแรกสุด: Raspbian ไม่เคยใช้ NetworkManager มันเป็นสิ่งประดิษฐ์เพิ่มเติมของ Fedora และระบบที่ได้รับมา (ซึ่งเป็นที่แรกที่ systemd ซึ่งเป็นโครงการที่สนับสนุน Redhat ถูกนำไปใช้)
goldilocks

ใช้ได้กับระบบที่ใช้ Debian อื่น ๆ ซึ่งไม่จำเป็นต้องทำงานบน ARM :) ขอบคุณสำหรับคำอธิบายที่กระชับ
TCB13

สิ่งนี้ใช้ได้กับการยืดเวลาของฉัน แต่บนบัสเตอร์ฉันพบปัญหาว่าอุปกรณ์ของฉันไม่สามารถแก้ไขโดเมนใด ๆ ได้ ความคิดใดที่อาจเป็นสาเหตุได้
user5950

@ user5950 อาจจะมีบางอย่างเปลี่ยนไปไหมกับมือปราบ? ฉันจะดูมัน กรุณารอสักครู่.
Ingo

@Ingo ขอบคุณสำหรับการเล่นซ้ำอย่างรวดเร็ว ฉันสามารถแก้ไขปัญหาโดยการเพิ่มสายการDNS=192.168.1.1 /etc/systemd/network/04-eth.network(ฉันกำลังใช้การตั้งค่าด้วย IP แบบคงที่) ...
user5950

4

หากต้องการคำตอบอย่างละเอียดจาก @Ingo: โปรดพิจารณาใช้ลิงก์

ln -s /run/systemd/resolve/stub-resolv.conf resolv.conf

/run/systemd/resolve/resolv.confแทนการเชื่อมโยงไปยัง สิ่งนี้จะเปิดใช้งาน stub DNS แบบ "รวม" และเปิดใช้งานสิ่งต่างๆเช่นเซิร์ฟเวอร์ DNS ต่ออินเทอร์เฟซซึ่งอาจสำคัญถ้าคุณใช้ VPN ที่ให้เซิร์ฟเวอร์ DNS ของตัวเองมีรายการที่ไม่ใช่แบบสาธารณะ


น่าสนใจมากขอบคุณสำหรับคำติชม มีเอกสารและ / หรือแหล่งที่มาของสิ่งนี้หรือไม่? ถ้าเป็นเช่นนั้นโปรดแก้ไขคำตอบของคุณ (ใช้ลิงค์ด้านล่าง) และเพิ่มที่นั่น
Ingo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.