Defina o nome do host na primeira inicialização antes de network.service

3

Eu tenho um firstboot.service que, a partir de uma imagem do sistema operacional de estoque, cria um nome de host exclusivo com base no MAC do adaptador Ethernet principal. Ele é executado como esperado durante a inicialização, mas o nome do host que é registrado com o DHCP ainda é o nome do host padrão, conforme definido no kernel. Então, depois que o dispositivo inicializar, posso fazer ping em defaultname.mynet.lan , mas quando eu fizer login e chamar hostname , ele exibirá foo-XXXX conforme o esperado.

Como você pode ver abaixo, o serviço está registrado para ser executado antes de network.target . Como você pode imaginar, estou usando systemd-networkd e systemd-resolved para redes.

  • Preciso fazer outra coisa para propagar o nome do host para os processos em execução?
  • Posso definir o nome do host anteriormente no processo de inicialização? Em caso afirmativo, qual destino devo usar?

firstboot.service

[Unit]
ConditionPathExists=|!/etc/hostname
Before=network.target
After=local-fs.target
After=sys-subsystem-net-devices-eth0.device

[Service]
Type=oneshot
ExecStart=/bin/bash -c "/usr/local/sbin/firstboot.sh"
RemainAfterExit=yes

[Install]
WantedBy=network.target

firstboot.sh

HOST_PREFIX=${HOST_PREFIX:-"foo"}
NET_DEVICE=${NET_DEVICE:="eth0"}
LAST_MAC4=$(sed -rn "s/^.*([0-9A-F:]{5})$//gi;s/://p" /sys/class/net/${NET_DEVICE}/address)
NEW_HOSTNAME=${HOST_PREFIX}-${LAST_MAC4:-0000}

echo $NEW_HOSTNAME > /etc/hostname
/bin/hostname -F /etc/hostname
    
por thom_nic 24.03.2017 / 15:12

1 resposta

4

Nada garante que seu firstboot.service seja executado antes de systemd-networkd ser iniciado. Você tem que usar

Wants=network-pre.target
Before=network-pre.target

em vez de Before=network.target para conseguir isso. Como man systemd.special explica:

network-pre.target: This passive target unit may be pulled in by services that want to run before any network is set up, for example for the purpose of setting up a firewall. All network management software orders itself after this target, but does not pull it in.

Você também precisará de DefaultDependencies=false para evitar a dependência implícita em basic.target (consulte man systemd.service ).

    
por 25.03.2017 / 20:03