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


Eu estou usando um Huawei E3531 para conectar um Raspberry Zero rodando na vanilla Raspbian 8.0 (jessie) à internet. Como isso é para um aplicativo independente remoto, ele precisa ser capaz de ficar on-line automaticamente após um blecaute de energia.

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

De acordo com https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ deve ser possível adicionar network-pre.target-direcionamentos para um serviço para que ele seja executado antes que a rede seja configurada:

network-pre.target é um alvo que pode ser usado para solicitar serviços       antes que qualquer interface de rede seja configurada.       Seu objetivo principal é o uso com serviços de firewall que desejam       estabelecer um firewall antes que qualquer interface de rede esteja ativa.

É uma unidade passiva: você não pode iniciá-la diretamente e não é puxada       pelo serviço de gerenciamento de rede, mas pelo serviço que       quer correr antes disso.       [..]       Serviços que desejam ser executados antes que a rede seja configurada       deve colocar Antes = network-pre.target e também definir Wants = network-pre.target       para puxar isto.       Desta forma, a menos que haja realmente um serviço que precisa ser solicitado       antes que a rede suba, o alvo não é puxado, evitando assim       qualquer ponto de sincronização desnecessário.

Eu modifiquei /var/lib/systemd/system/usb_modeswitch@.service e acrescentou 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"

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 show 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 usb_modeswitch@.service
Failed to get properties: Unit name usb_modeswitch@.service is not valid.
root@raspberrypi:/lib/systemd/system#

Eu também estou me perguntando por que show systemctl funciona com usb_modeswitch @. mas não com usb_modeswitch @ .serviço

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 alguma coisa na configuração do systemd para fazer isso funcionar?


1


origem




Respostas:


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 relatório de bug do Ubuntu, que se refere a um problema similar com o shorewall em vez de usb_modeswitch.

DefaultDependencies  é definido como:

irá implicitamente complementar todas as dependências configuradas do tipo Wants = ou Requires = com dependências do tipo 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 erros acima mencionado (para shorewall em vez de usb_modeswitch):

O Shorewall não vem com uma descrição da unidade de serviço nativa do systemd. Essa descrição está sendo gerada na inicialização por / lib / systemd / system-generators / systemd-sysv-generator com base em /etc/init.d/shorewall. Eu observei, no entanto, que o cabeçalho LSB do /etc/init.d/shorewall quer que o serviço seja iniciado a partir do /etc/rcS.d, que é bem cedo, e ao mesmo tempo ele tem o Required-Start: $ rede $ remote_fs, que é um requisito muito forte. De fato, este é o único script em /etc/rcS.d que requer $ rede (bem, exceto shorewall6, que exibe exatamente o mesmo problema). Examinar a unidade gerada automaticamente em /run/systemd/generator.late/shorewall.service mostra:

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

Isso parece problemático: sysinit.target é um alvo muito antigo, a maioria dos serviços de nível superior é iniciada após ele e, em muitos sistemas (incluindo o meu), várias dependências disponibilizarão network-online.target somente após sysinit.target.

Seja qual for a causa exata, essa configuração funciona para mim e não parece ter nenhum efeito indesejado.


1