Làm cách nào tôi có thể khởi động usb_modeswitch trước khi cấu hình mạng?


1

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?

Câu trả lời:


1

Tôi đã có thể khắc phục sự cố bằng cấu hình sau:

[Unit]
Description=USB_ModeSwitch
DefaultDependencies=no
After=local-fs.target systemd-sysctl.service
Before=network-pre.target shutdown.target
Wants=network-pre.target
Conflicts=shutdown.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/usb_modeswitch_dispatcher --switch-systemd %I
Environment="TMPDIR=/run"

Tôi đã tìm thấy giải pháp thông qua nhận xét này trên Ubuntu-bugreport, đề cập đến một vấn đề tương tự với shorewall thay vì usb_modeswitch.

Mặc định phụ thuộc được định nghĩa là :

sẽ hoàn toàn bổ sung cho tất cả các phụ thuộc được cấu hình của loại Wants = hoặc Yêu cầu = với các phụ thuộc của loại After =

Tôi chưa kiểm tra nếu cài đặt này là một phần quan trọng của cấu hình hoặc nếu nó có thể bị bỏ qua.

-

Dưới đây là lời giải thích đầy đủ từ báo cáo lỗi đã nói ở trên (Dành cho Shorewall thay vì usb_modeswitch):

Shorewall không đi kèm với mô tả đơn vị dịch vụ gốc systemd. Mô tả như vậy đang được tạo khi khởi động bởi / lib / systemd / system-Generator / systemd-sysv-Generator dựa trên /etc/init.d/oorwall. Tuy nhiên, tôi đã nhận thấy rằng tiêu đề LSB của /etc/init.d/oorwall muốn dịch vụ được bắt đầu từ /etc/rcS.d, khá sớm và đồng thời, nó có Bắt buộc-Bắt đầu: $ mạng $ remote_fs, đây là một yêu cầu khá mạnh. Trên thực tế, đây là tập lệnh duy nhất trong /etc/rcS.d yêu cầu mạng $ (tốt, ngoại trừ shorewall6, trình bày chính xác cùng một vấn đề). Nhìn vào đơn vị được tạo tự động trong /run/systemd/generator.late/shorewall.service hiển thị:

DefaultDependencies=no
Before=sysinit.target shutdown.target
After=network-online.target remote-fs.target
Wants=network-online.target
Conflicts=shutdown.target

Điều này có vẻ có vấn đề: sysinit.target là một mục tiêu rất sớm, hầu hết các dịch vụ cấp cao hơn được bắt đầu sau nó và trên nhiều hệ thống (bao gồm cả tôi), các phụ thuộc khác nhau sẽ làm cho mạng-online.target chỉ khả dụng sau sysinit.target.

Dù nguyên nhân chính xác là gì, cấu hình này hoạt động với tôi và dường như không có bất kỳ tác dụng không mong muốn nào.

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.