Como posso iniciar o usb_modeswitch antes da configuração de rede?

1

Estou usando um Huawei E3531 para conectar um Raspberry Zero em execução no Raspbian 8.0 (jessie) à internet. Como isso é para um aplicativo autônomo remoto, ele precisa ser capaz de voltar a ficar on-line automaticamente após um apagão de energia.

Eu configurei usb_modeswitch para alternar o modo USB para cdc_ether, que traz uma eth0 de forma confiável depois do modo de comutação. Infelizmente usb_modeswitch é iniciado após os dispositivos de rede são configurados, portanto, o link de rede não é ativado em uma inicialização a frio (Funciona bem em uma reinicialização, onde o modo já está configurado corretamente).

De acordo com o link , deve ser possível adicionar network-pre.target -direcionais para um serviço para que ele seja executado antes que a rede seja configurada:

network-pre.target is a target that may be used to order services before any network interface is configured. It's primary purpose is for usage with firewall services that want to establish a firewall before any network interface is up.

It's a passive unit: you cannot start it directly and it is not pulled in by the the network management service, but by the service that wants to run before it. [..] Services that want to be run before the network is configured should place Before=network-pre.target and also set Wants=network-pre.target to pull it in. This way, unless there's actually a service that needs to be ordered before the network is up the target is not pulled in, hence avoiding any unnecessary synchronization point.

Eu modifiquei /var/lib/systemd/system/[email protected] e adicionei Antes- / Quer -diretrizes em conformidade:

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

O que agora leva a um erro "Ciclo de pedido" na inicialização:

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

Aqui está a saída de 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#

Também estou me perguntando por que systemctl show funciona com usb_modeswitch @. , mas não com usb_modeswitch @ .service

A remoção das duas linhas no arquivo de serviço restaura o comportamento antigo sem erros de SKIP.

Existe alguma outra maneira de trazer as interfaces de rede após o usb_modeswitch? Preciso adaptar mais alguma coisa na configuração do systemd para fazer isso funcionar?

    
por Christian Benke 18.05.2017 / 15:39

1 resposta

1

Consegui corrigir o problema usando a seguinte configuração:

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

Eu encontrei a solução via este comentário em um Ubuntu- bugreport, que se refere a um problema similar com shorewall em vez de usb_modeswitch.

DefaultDependencies é definido como :

will implicitly complement all configured dependencies of type Wants= or Requires= with dependencies of type After=

Eu não testei se essa configuração é uma parte importante da configuração ou se ela pode ser deixada de fora.

-

Aqui está a explicação completa do relatório de bugs mencionado acima (para shorewall em vez de usb_modeswitch):

Shorewall does not come with a systemd native service unit description. Such description is being generated at boot by /lib/systemd/system-generators/systemd-sysv-generator based on /etc/init.d/shorewall. I have noticed, however, that the LSB header of /etc/init.d/shorewall wants the service to be started from /etc/rcS.d, which is pretty early, and at the same time it has Required-Start: $network $remote_fs, which is a pretty strong requirement. In fact, this is the only script in /etc/rcS.d that requires $network (well, except shorewall6, which exhibits exactly the same problem). Looking into the auto-generated unit in /run/systemd/generator.late/shorewall.service shows:

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

This looks problematic: sysinit.target is a very early target, most higher level services are started after it, and on many systems (including mine) various dependencies will make network-online.target available only after sysinit.target.

Qualquer que seja a causa exata, esta configuração funciona para mim e não parece ter nenhum efeito indesejado.

    
por 18.05.2017 / 22:12