Como posso iniciar um serviço systemd quando um determinado dispositivo USB (dongle ethernet) está conectado?

0

Eu tenho um dongle ethernet USB que eu uso para acesso ethernet, mas eu gostaria de iniciar automaticamente netctl-ifplugd@... ao plugá-lo. (não confundir com a conexão do cabo ethernet - que é tratado por netctl-ifplugd .) Como posso fazer isso acontecer?

Eu vi Como escrever um serviço systemd que depende de um dispositivo estar presente? mas isso não parece ser sobre conectá-lo, apenas sobre ele estar presente.

    
por SoniEx2 07.10.2018 / 03:17

2 respostas

1

I've seen "How to write a systemd service that depends on a device being present?" but that doesn't seem to be about plugging it in, just about it being present.

É muito parecido, só você precisa da dependência oposta: em vez de (ou talvez além do) serviço dependendo do dispositivo, você quer que a unidade virtual dispositivo dependa do seu serviço.

De fato, apesar do título da pergunta vinculada aparentemente fazer o oposto, a resposta aceita o encadeamento já documenta um dos métodos exatos que faria o dispositivo iniciar um serviço (o método de regra do udev).

Mas se você tiver um nome de unidade exato .dispositivo, é mais simples usar as dependências do systemd diretamente:

Se o caminho exato do sysfs for conhecido:

Por exemplo, você determinou que o dispositivo é sys-subsystem-net-devices-usb0.device . Você pode usar várias maneiras de expandir essa unidade (apesar de ser virtual), como foo.device.d/*.conf drop-ins ou foo.device.wants/ symlinks (que funcionam da mesma forma como, por exemplo, multi-user.target.wants / ).

  • Você pode adicionar uma configuração [Install] ao seu serviço e, em seguida, ativar systemctl :

    [Install]
    WantedBy=sys-subsystem-net-devices-%i.device
    
  • Ou você pode obter o mesmo resultado diretamente com systemctl add-wants :

    # systemctl add-wants sys-subsystem-net-devices-usb0.device [email protected]
    
  • Ambos os métodos resultam em um link simbólico que pode ser feito manualmente via ln -s .

Isso geralmente funciona da mesma forma para as unidades do usuário.

Se apenas o nome parcial (ou alguma combinação de outras propriedades) for conhecido:

Escreva uma regra do udev que corresponda ao seu dispositivo (a sintaxe exata da regra do udev está fora do escopo aqui) e defina a propriedade SYSTEMD_WANTS udev (também conhecida como "variável de ambiente do dispositivo") indicando sua unidade:

ACTION=="add", SUBSYSTEM=="net", KERNEL=="usb*", ENV{SYSTEMD_WANTS}+="netctl-ifplugd@%k.service"

Como todos os arquivos *.rules são processados em ordem alfabética, certifique-se de que sua regra seja colocada depois das regras de "interfaces de rede persistentes" do próprio systemd.

Isso funciona com as unidades do usuário, se você usar ENV{SYSTEMD_USER_WANTS} .

Você pode se sentir tentado a usar RUN+="/bin/systemctl start foo" via udev. Não faça isso. Mas se você fizer isso, use pelo menos a opção systemctl --no-block para não criar um possível impasse entre os dois componentes.

    
por 07.10.2018 / 15:34
1

udev é o que você quer ver. Ele permitirá que você faça coisas como executar comandos quando o hardware estiver conectado, desconectado, alterações de estado acontecerem etc. Você também pode especificar uma ampla variedade de critérios para controlar o acionamento (ou seja, quando qualquer dispositivo de armazenamento estiver conectado ou apenas um modelo específico) um determinado fabricante, etc.) Você deve ver as regras existentes em seu sistema em /etc/udev/rules.d /

    
por 07.10.2018 / 08:27