처음 시작할 때 network.service 앞에 호스트 이름을 설정하십시오.

처음 시작할 때 network.service 앞에 호스트 이름을 설정하십시오.

재고 OS 이미지에서 기본 이더넷 어댑터의 MAC을 기반으로 고유한 호스트 이름을 생성하는 firstboot.service가 있습니다. 부팅하는 동안 예상대로 실행되지만 DHCP를 사용하여 등록된 호스트 이름은 여전히 ​​커널에서 설정된 기본 호스트 이름입니다. 따라서 장치가 부팅된 후 핑을 보낼 수 있지만 defaultname.mynet.lan로그인하여 호출하면 hostname예상대로 표시됩니다.foo-XXXX

아래와 같이 서비스가 이전에 실행되도록 등록되었습니다 network.target. 추측할 수 있듯이 저는 네트워킹을 위해 systemd-networkd및 를 사용하고 있습니다 systemd-resolved.

  • 실행 중인 프로세스에 호스트 이름을 전파하려면 다른 작업을 수행해야 합니까?
  • 부팅 프로세스 초기에 호스트 이름을 설정할 수 있습니까? 그렇다면 어떤 타겟을 사용해야 할까요?

처음으로 서비스 시작

[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

첫 번째 시작 파일

HOST_PREFIX=${HOST_PREFIX:-"foo"}
NET_DEVICE=${NET_DEVICE:="eth0"}
LAST_MAC4=$(sed -rn "s/^.*([0-9A-F:]{5})$/\1/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

답변1

firstboot.service이전 실행이 시작되었는지 확인할 수 있는 방법은 없습니다 systemd-networkd. 당신은 사용해야합니다

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

Before=network.target이것을 달성하기 보다는 . 설명은 다음과 같습니다 man systemd.special.

네트워크 사전 목표: 이 수동 대상 장치는 예를 들어 방화벽 설정 목적으로 네트워크를 설정하기 전에 실행하려는 서비스에 의해 끌어올 수 있습니다. 모든 네트워크 관리 소프트웨어는 이 대상을 기준으로 자체적으로 정렬하지만 가져오지는 않습니다.

또한 (참조) 에 대한 DefaultDependencies=false암시적 종속성을 피해야 합니다.basic.targetman systemd.service

관련 정보