Cách di chuyển từ mạng sang systemd-networkd với chuyển đổi dự phòng động


13

Systemd's systemd-networkdcó thể được sử dụng để thay thế hệ thống mạng hiện có trên Raspbian.

Làm thế nào để nó hoạt động với Raspbian trên Raspberry Pi với hai giao diện cho ethernet và wlan? Tôi cũng có thể nhận ra chuyển đổi dự phòng động cho họ?

Câu trả lời:


26

Đã thử nghiệm trên Raspberry Pi 4B với
Raspbian Buster Lite 2020 / 02-05 được cập nhật vào ngày 2020/02/13.
Raspbian Buster Lite 2019-07-10 được cập nhật vào 2019-08-15.
Cập nhật được thực hiện với sudo apt update && sudo apt full-upgrade && sudo reboot.

Nó sẽ không hoạt động với Raspbian Stretch !
Ở đây bạn sẽ tìm thấy bản sửa đổi được thử nghiệm cuối cùng cho Raspbian Stretch Lite .


Sử dụng systemd-networkdthay vì mặc định dhcpcdlà tất nhiên có thể. Nhưng nó không có ý nghĩa trong mọi trường hợp.

networkd là một dịch vụ nhỏ và gọn để cấu hình các giao diện mạng, được thiết kế chủ yếu cho các trường hợp sử dụng máy chủ trong một thế giới với mạng được cắm và ảo hóa. Cấu hình của nó tương tự về mức độ tinh thần và mức độ trừu tượng so với ifupdown, nhưng bạn không cần bất kỳ gói bổ sung nào để định cấu hình cầu, trái phiếu, vlan, v.v. Nó không phù hợp lắm để quản lý mạng WLAN; NetworkManager vẫn thích hợp hơn nhiều cho các trường hợp sử dụng Desktop như vậy. [1]

Nhưng đối với một raspi đặt gần TV hoặc bộ khuếch đại và thực hiện công việc 24/7 để phát trực tiếp âm thanh hoặc video hoặc cho máy ảnh, v.v., systemd-networkdlà một lựa chọn tốt. Nhưng bạn phải làm một chuyển đổi hoàn chỉnh. Không có cách nào để trộn lẫn với networkingvà / hoặc dhcpcd.


♦ Bước 1: Chuẩn bị

Để tham khảo, tôi sử dụng Thẻ SD mới được flash từ Raspbian Buster Lite 2019-07-10 .

Tôi sẽ chú ý đến một cài đặt không đầu chỉ với ssh. Nếu bạn đang sử dụng điều này, hãy kiểm tra lại lỗi chính tả hoặc nếu không bạn sẽ bị mất kết nối bị hỏng. Nếu bạn muốn cài đặt không đầu thì hãy xem SSH (Secure Shell) và làm theo phần 3. Kích hoạt SSH trên Raspberry Pi không đầu (thêm tệp vào thẻ SD trên máy khác) .

Để khắc phục sự cố khi tắt máy hoặc để kiểm tra tin nhắn từ các lần khởi động trước, bạn có thể cho phép đăng nhập liên tục vào tạp chí cho các tin nhắn từ systemd [1]. Bởi vì nó tạo ra các tệp nhật ký lớn và nơi lưu trữ có thể là một vấn đề tôi đề nghị chỉ kích hoạt nó nếu cần. systemd-networkd không cần nó và đăng nhập phiên hiện tại luôn có sẵn.

pi@raspberrypi: ~$ sudo mkdir -p /var/log/journal
pi@raspberrypi: ~$ sudo systemd-tmpfiles --create --prefix /var/log/journal

Vô hiệu hóa những thứ cũ. Đừng dừng bất kỳ dịch vụ nào, chỉ vô hiệu hóa chúng! Vì vậy, nó sẽ chỉ có hiệu lực trong lần khởi động tiếp theo.

pi@raspberrypi: ~$ sudo -Es

Trong /etc/resolvconf.confchèn những dòng này.

# Set to NO to disable resolvconf from running any subscribers. Defaults to YES.
resolvconf=NO

Sau đó vô hiệu hóa mạng Debian cổ điển được quản lý bằng tệp /etc/network/interfacesvà tắt dhcpcdquản lý mạng Raspbian mặc định . Chúng tôi che giấu nó để chúng bị vô hiệu hóa hoàn toàn và không thể được bắt đầu bởi các dịch vụ khác.

root@raspberrypi: ~# systemctl mask networking.service
root@raspberrypi: ~# mv /etc/network/interfaces /etc/network/interfaces~
root@raspberrypi: ~# systemctl mask dhcpcd.service

Và kích hoạt systemd-networkd:

root@raspberrypi: ~# systemctl enable systemd-networkd.service
root@raspberrypi: ~# systemctl enable systemd-resolved.service
root@raspberrypi: ~# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

♦ Bước 2: Thiết lập giao diện ethernet có dây (eth0)

Tạo tập tin này với các cài đặt của bạn. Bạn chỉ có thể sao chép và dán khối này trong một khối vào dòng lệnh của bạn bắt đầu bằng catvà bao gồm cả EOF (dấu phân cách EOF sẽ không nhận được một phần của tệp):

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: ~# exit
pi@raspberrypi: ~$

Khởi động lại, nhưng chỉ khi bạn có dây ethernet kèm theo ;-)

Có thể là RasPi có một địa chỉ IP mới để bạn có thể phải xem nó cho kết nối tiếp theo với ssh .


♦ Bước 3: Thiết lập giao diện wlan (wlan0)

Tạo tập tin này với các cài đặt của bạn:

pi@raspberrypi:~ $ sudo -Es
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

root@raspberrypi:~ #

Thiết lập wpa_supplicant với tập tin này và cài đặt cho ssid=psk=và kích hoạt nó:

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:~ $

Khởi động lại nếu bạn có kết nối wifi. Hầu hết các bạn sẽ có. Chúc may mắn ...

Có thể là RasPi có một địa chỉ IP mới để bạn có thể phải xem nó cho kết nối tiếp theo với ssh .


♦ Bước 4: Liên kết giao diện có dây và wifi để chuyển đổi dự phòng

Bạn nên thiết lập cả hai giao diện và chạy như mô tả ở trên. Không có vấn đề gì khi cả hai giao diện đều hoạt động. Nhân sẽ sử dụng giao diện với số liệu thấp nhất trước tiên. Ở đây giao diện ethernet sẽ được sử dụng đầu tiên. Nhưng điều này có một bất lợi lớn. Như bạn có thể thấy với ~$ ip addrmỗi giao diện có địa chỉ IP riêng. Nếu kernel chuyển giao diện vì nó bị hỏng thì nó cũng sử dụng địa chỉ IP nguồn mới của nó. Điều này sẽ phá vỡ mọi giao tiếp TCP được thiết lập đầy đủ, ví dụ như ssh, phát trực tuyến, phiên đăng nhập, v.v. Bạn có thể sử dụng một kết nối mới từ địa chỉ IP nguồn đã thay đổi nhưng các kết nối cũ bị kẹt. Đó không thực sự là những gì chúng ta muốn.

Giải pháp của vấn đề này là liên kết . Chúng tôi tạo một giao diện tạm thời bond0không thay đổi cài đặt của nó. Giao diện có dây và wifi sẽ chuyển sang bond0.

Đầu tiên vô hiệu hóa các tập tin mạng ethernet và wifi:

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~

Sau đó thiết lập liên kết với bốn tệp này:

root@raspberrypi:~ # cat >/etc/systemd/network/02-bond0.netdev <<EOF
[NetDev]
# status: cat /proc/net/bonding/bond0
Name=bond0
Kind=bond
[Bond]
Mode=active-backup
# primary slave is defined in *eth.network
MIIMonitorSec=500ms
UpDelaySec=1000ms
DownDelaySec=1000ms
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

root@raspberrypi:~ # exit
pi@raspberrypi:~ $

Bây giờ là lúc để khởi động lại.

Có thể RasPi có một địa chỉ IP mới để bạn có thể phải xem nó để biết kết nối tiếp theo với ssh.

Sau đó, bạn có thể kiểm tra trạng thái liên kết:

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): 1000
Down Delay (ms): 1000

Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: b8:27:eb:53:bd:de
Slave queue ID: 0

Slave Interface: wlan0
MII Status: up
Speed: Unknown
Duplex: Unknown
Link Failure Count: 0
Permanent HW addr: b8:27:eb:06:e8:8b
Slave queue ID: 0

Kiểm tra liên kết: với trạng thái liên kết ở trên, bạn sẽ thấy rằng Currently Active Slave:sẽ thay đổi và MII Status:xuống.

Nếu bạn không đầu, đừng downcả hai giao diện với nhau ;-)

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

Hãy kiên nhẫn sau khi cài đặt wlan0 lên. Tôi có thể mất một thời gian để kết nối lại với bộ định tuyến và quản lý liên kết. Lần này sshsẽ không hoạt động.

Để đánh giá sâu hơn về liên kết, bạn có thể xem qua chuyển đổi dự phòng mạng động ưu tiên wifi qua ethernet .


♦ Bước 5: Dọn dẹp

Dọn dẹp những thứ cũ:

pi@raspberrypi:~ $ sudo apt --autoremove purge openresolv
pi@raspberrypi:~ $ sudo apt --autoremove purge ifupdown
pi@raspberrypi:~ $ sudo apt --autoremove purge dhcpcd5
pi@raspberrypi:~ $ sudo apt --autoremove purge isc-dhcp-client isc-dhcp-common


tài liệu tham khảo:
[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/boinating.txt


Lưu ý liên quan đến trích dẫn đầu tiên lên hàng đầu: Raspbian không bao giờ sử dụng NetworkManager. Nó giống như một vật phẩm của Fedora và các hệ thống có nguồn gốc (là nơi đầu tiên mà systemd, một dự án hỗ trợ Redhat, được triển khai).
goldilocks

Cũng áp dụng cho các hệ thống dựa trên Debian khác không nhất thiết phải chạy trên ARM :) Cảm ơn bạn đã giải thích ngắn gọn.
TCB13

Điều này làm việc cho tôi trên căng nhưng trên buster tôi gặp phải vấn đề, rằng thiết bị của tôi không thể giải quyết bất kỳ tên miền nào. Bất kỳ ý tưởng những gì có thể là nguyên nhân?
dùng5950

@ user5950 Có lẽ có điều gì đó đã thay đổi với buster? Tôi sẽ xem qua nó. Một lúc thôi.
Ingo

@Ingo Cảm ơn bạn đã phát lại nhanh. Tôi có thể giải quyết vấn đề bằng cách thêm dòng DNS=192.168.1.1vào /etc/systemd/network/04-eth.network. (Tôi đang sử dụng một thiết lập với IP tĩnh),
dùng5950

4

Để giải thích câu trả lời từ @Ingo: vui lòng xem xét sử dụng liên kết

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

thay vì liên kết đến /run/systemd/resolve/resolv.conf. Điều này cho phép sơ khai DNS "tích hợp" và cho phép những thứ như máy chủ DNS trên mỗi giao diện có thể quan trọng nếu bạn sử dụng VPN cung cấp máy chủ DNS của riêng họ với các mục không công khai.


Rất thú vị, cảm ơn bạn đã phản hồi. Có tài liệu và / hoặc nguồn này không? Nếu vậy, vui lòng chỉnh sửa câu trả lời của bạn (sử dụng liên kết bên dưới nó) và thêm nó vào đó.
Ingo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.