Tôi đang sử dụng Huawei E3531 để kết nối Raspberry Zero chạy trên vanilla Raspbian 8.0 (jessie) với internet. Vì đây là một ứng dụng độc lập từ xa, nó cần có khả năng tự động quay trở lại trực tuyến sau khi mất điện.
Tôi đã cấu hình usb_modeswitch để chuyển chế độ USB sang cdc_ether, điều này đáng tin cậy sẽ đưa ra một eth0 sau khi chuyển đổi chế độ. Thật không may, usb_modeswitch được khởi động sau khi các thiết bị mạng được định cấu hình, do đó liên kết mạng không được khởi động khi khởi động nguội (Nó hoạt động độc đáo khi khởi động lại, trong đó chế độ đã được đặt chính xác).
Theo https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ chúng ta có thể để thêm network-pre.target -directives đến một dịch vụ để làm cho nó chạy trước khi mạng được cấu hình:
network-pre.target là mục tiêu có thể được sử dụng để đặt hàng dịch vụ trước khi bất kỳ giao diện mạng nào được định cấu hình. Mục đích chính của nó là để sử dụng với các dịch vụ tường lửa muốn thiết lập tường lửa trước khi bất kỳ giao diện mạng nào hoạt động.
Đây là một đơn vị thụ động: bạn không thể khởi động trực tiếp và dịch vụ này không bị dịch vụ quản lý mạng lôi kéo, mà bởi dịch vụ muốn chạy trước nó. [..] Các dịch vụ muốn được chạy trước khi được định cấu hình mạng nên đặt Before = network-pre.target và cũng đặt Wants = network-pre.target để kéo nó vào. Cách này, trừ khi thực sự có một dịch vụ cần phải được đặt hàng trước khi mạng lên, mục tiêu không được kéo vào, do đó tránh mọi điểm đồng bộ hóa không cần thiết.
Tôi đã sửa đổi /var/lib/systemd/system/usb_modeswitch@.service và thêm Before- / Wants -directives tương ứng:
[Unit]
Description=USB_ModeSwitch
Before=network-pre.target
Wants=network-pre.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/usb_modeswitch_dispatcher --switch-systemd %I
Environment="TMPDIR=/run"
Bây giờ dẫn đến lỗi "Chu kỳ đặt hàng" khi khởi động:
[..]
[ OK ] Started Trigger Flushing of Journal to Persistent Storage.
[ SKIP ] Ordering cycle found, skipping LSB: Raise network interfaces.
[ SKIP ] Ordering cycle found, skipping Network (Pre)
[ OK ] Created slice system-usb_modeswitch.slice.
[..]
Đây là đầu ra của systemctl show .. :
root@raspberrypi:/lib/systemd/system# systemctl show -p Requires,Wants,Requisite,BindsTo,PartOf,Before,After usb_modeswitch@.
Requires=basic.target
Requisite=
Wants=network-pre.target system-usb_modeswitch.slice
BindsTo=
PartOf=
Before=network-pre.target shutdown.target
After=systemd-journald.socket basic.target system-usb_modeswitch.slice
root@raspberrypi:/lib/systemd/system# systemctl show -p Requires,Wants,Requisite,BindsTo,PartOf,Before,After usb_modeswitch@.service
Failed to get properties: Unit name usb_modeswitch@.service is not valid.
root@raspberrypi:/lib/systemd/system#
Tôi cũng tự hỏi tại sao chương trình systemctl hoạt động với usb_modeswitch @. nhưng không phải với usb_modeswitch @ .service
Xóa hai dòng trong tệp dịch vụ sẽ khôi phục hành vi cũ mà không có lỗi SKIP.
Có cách nào khác để hiển thị các giao diện mạng sau usb_modeswitch không? Tôi có cần điều chỉnh bất cứ thứ gì khác trong cấu hình systemd để làm cho nó hoạt động không?