![처음 시작할 때 network.service 앞에 호스트 이름을 설정하십시오.](https://linux55.com/image/108204/%EC%B2%98%EC%9D%8C%20%EC%8B%9C%EC%9E%91%ED%95%A0%20%EB%95%8C%20network.service%20%EC%95%9E%EC%97%90%20%ED%98%B8%EC%8A%A4%ED%8A%B8%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EC%84%A4%EC%A0%95%ED%95%98%EC%8B%AD%EC%8B%9C%EC%98%A4..png)
재고 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.target
man systemd.service