Bagaimana saya bisa memulai usb_modeswitch sebelum konfigurasi jaringan?

1

Saya menggunakan Huawei E3531 untuk menghubungkan Raspberry Zero yang berjalan pada vanilla Raspbian 8.0 (jessie) ke internet. Karena ini untuk aplikasi mandiri jarak jauh, ia harus dapat secara otomatis kembali online setelah pemadaman listrik.

Saya telah mengkonfigurasi usb_modeswitch untuk mengalihkan mode-USB ke cdc_ether, yang secara andal menampilkan eth0 setelah modewitch. Sayangnya usb_modeswitch dimulai setelah perangkat jaringan dikonfigurasikan, oleh karena itu jaringan-tautan tidak dibawa pada boot dingin (Ini berfungsi dengan baik pada reboot, di mana mode sudah diatur dengan benar).

Menurut https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ , dimungkinkan untuk menambahkan network-pre.target -directives ke layanan untuk menjalankannya sebelum jaringan dikonfigurasi:

network-pre.target adalah target yang dapat digunakan untuk memesan layanan sebelum antarmuka jaringan dikonfigurasi. Tujuan utamanya adalah untuk penggunaan dengan layanan firewall yang ingin membuat firewall sebelum antarmuka jaringan apa pun diaktifkan.

Ini adalah unit pasif: Anda tidak dapat memulainya secara langsung dan tidak ditarik oleh layanan manajemen jaringan, tetapi oleh layanan yang ingin dijalankan sebelumnya. [..] Layanan yang ingin dijalankan sebelum jaringan dikonfigurasikan harus menempatkan Before = network-pre.target dan atur Wants = network-pre.target untuk menariknya. Dengan cara ini, kecuali jika sebenarnya ada layanan yang perlu dipesan sebelum jaringan naik target tidak ditarik, maka menghindari titik sinkronisasi yang tidak perlu.

Saya telah memodifikasi /var/lib/systemd/system/[email protected] dan menambahkan Before- / Wants -directives sesuai:

[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"

Yang sekarang mengarah ke kesalahan "Siklus pemesanan" saat boot:

[..]
[  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.
[..]

Inilah output dari 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 [email protected]
Failed to get properties: Unit name [email protected] is not valid.
root@raspberrypi:/lib/systemd/system#

Saya juga bertanya-tanya mengapa acara systemctl bekerja dengan usb_modeswitch @. tetapi tidak dengan usb_modeswitch @ .service

Menghapus dua baris dalam file layanan mengembalikan perilaku lama tanpa kesalahan-SKIP.

Apakah ada cara lain untuk membuka antarmuka jaringan setelah usb_modeswitch? Apakah saya perlu mengadaptasi hal lain dalam konfigurasi systemd untuk membuat ini berfungsi?

Christian Benke
sumber

Jawaban:

1

Saya dapat memperbaiki masalah menggunakan konfigurasi berikut:

[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"

Saya menemukan solusinya melalui komentar ini di Ubuntu-bugreport, yang merujuk pada masalah yang sama dengan shorewall, bukan usb_modeswitch.

DefaultDependencies didefinisikan sebagai :

akan secara implisit melengkapi semua dependensi yang dikonfigurasi dari tipe Wants = atau Membutuhkan = dengan dependensi tipe After =

Saya belum menguji apakah pengaturan ini merupakan bagian penting dari konfigurasi atau jika dapat diabaikan.

-

Inilah penjelasan lengkap dari laporan bug yang disebutkan di atas (Untuk shorewall alih-alih usb_modeswitch):

Shorewall tidak datang dengan deskripsi unit layanan asli systemd. Deskripsi tersebut sedang dihasilkan saat boot oleh / lib / systemd / system-generator / systemd-sysv-generator berdasarkan /etc/init.d/shorewall. Saya telah memperhatikan, bagaimanapun, bahwa header LSB dari /etc/init.d/shorewall ingin agar layanan dimulai dari /etc/rcS.d, yang cukup awal, dan pada saat yang sama ia harus-Mulai: $ $ network_fs, yang merupakan persyaratan yang cukup kuat. Sebenarnya, ini adalah satu-satunya skrip di /etc/rcS.d yang membutuhkan $ network (well, kecuali shorewall6, yang menunjukkan masalah yang persis sama). Melihat ke unit yang dibuat secara otomatis di /run/systemd/generator.late/shorewall.service menunjukkan:

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

Ini terlihat bermasalah: sysinit.target adalah target yang sangat awal, sebagian besar layanan tingkat tinggi dimulai setelah itu, dan pada banyak sistem (termasuk tambang) berbagai dependensi akan membuat network-online.target tersedia hanya setelah sysinit.target.

Apa pun penyebab pastinya, konfigurasi ini berfungsi untuk saya dan sepertinya tidak memiliki efek yang tidak diinginkan.

Christian Benke
sumber