如何在网络配置之前启动 usb_modeswitch?

如何在网络配置之前启动 usb_modeswitch?

我正在使用华为 E3531 将运行 vanilla Raspbian 8.0 (jessie) 的 Raspberry Zero 连接到互联网。由于这是用于远程独立应用程序,因此它需要能够在断电后自动恢复在线。

我已经配置了 usb_modeswitch 来将 USB 模式切换到 cdc_ether,这样在模式切换后就能可靠地启动 eth0。不幸的是,usb_modeswitch 已启动网络设备已配置,因此网络链接不会在冷启动时启动(重新启动时运行良好,模式已正确设置)。

根据https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/应该可以添加网络预目标- 指令服务在网络配置之前运行:

network-pre.target 是一个可用于在配置任何网络接口之前对服务进行排序的目标。它的主要用途是与希望在任何网络接口启动之前建立防火墙的防火墙服务一起使用。

它是一个被动单元:您无法直接启动它,它不会被网络管理服务拉入,而是由想要在它之前运行的服务拉入。[..] 想要在网络配置之前运行的服务应该放置 Before=network-pre.target,并设置 Wants=network-pre.target 以将其拉入。这样,除非在网络启动之前确实有需要订购的服务,否则不会将目标拉入,从而避免任何不必要的同步点。

我已经修改了/var/lib/systemd/系统/[电子邮件保护]并添加之前/想要- 相应的指令:

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

这现在导致启动时出现“订购周期”错误:

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

以下是输出systemctl 显示..

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#

我也想知道为什么systemctl 显示适用于usb_modeswitch@。但不是[电子邮件保护]

删除服务文件中的两行可以恢复旧行为,而不会出现 SKIP 错误。

在 usb_modeswitch 之后还有其他方法可以启动网络接口吗?我需要调整 systemd 配置中的其他内容才能使其正常工作吗?

答案1

我已经能够使用以下配置修复该问题:

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

我通过以下方式找到了解决方案此评论在 Ubuntu-bugreport 上,它指的是 shorewall 而不是 usb_modeswitch 存在的类似问题。

默认依赖项 定义为

将隐式地补充所有已配置的 Wants= 或 Requires= 类型的依赖项以及 After= 类型的依赖项

我还没有测试过这个设置是否是配置的关键部分或者是否可以省略。

--

以下是上述错误报告的完整解释(针对 shorewall 而不是 usb_modeswitch):

Shorewall 不附带 systemd 本机服务单元描述。此类描述由 /lib/systemd/system-generators/systemd-sysv-generator 根据 /etc/init.d/shorewall 在启动时生成。但是,我注意到 /etc/init.d/shorewall 的 LSB 标头希望服务从 /etc/rcS.d 启动,这很早,同时它具有Required-Start:$network $remote_fs,这是一个非常强烈的要求。事实上,这是 /etc/rcS.d 中唯一需要 $network 的脚本(好吧,shorewall6 除外,它表现出完全相同的问题)。查看 /run/systemd/generator.late/shorewall.service 中的自动生成单元显示:

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

这看起来有问题:sysinit.target 是一个非常早期的目标,大多数更高级别的服务都是在它之后启动的,并且在许多系统(包括我的系统)上,各种依赖关系只会在 sysinit.target 之后才使 network-online.target 可用。

无论确切的原因是什么,这种配置对我来说是有效的,并且似乎没有任何不良影响。

相关内容