systemd.run 커널 매개변수(예: systemd 장치의 요구/원함)에서 네트워크를 기다립니다.

systemd.run 커널 매개변수(예: systemd 장치의 요구/원함)에서 네트워크를 기다립니다.

나는 그것을 사용하고 있다커널 매개 systemd.run변수Manjaro ARM을 처음 시작할 때 호스트 이름 설정, 기본 사용자 추가 등 일부 자동 구성 작업을 적용하고 패키지 설치를 제외하고는 모든 것이 잘 작동합니다 pacman. pacman예를 들어, 모든 패키지를 업데이트하고 vim을 설치하려고 합니다.

pacman -Syu --noconfirm
pacman -S --noconfirm vim

예를 들어 이렇게 하면 각 이미지에 대해 여러 가지 오류가 발생합니다.

+ pacman -Syu --noconfirm
:: Synchronizing package databases...
 core downloading...
 extra downloading...
 community downloading...
error: failed retrieving file 'core.db' from manjaro.mirrors.lavatech.top : Could not resolve host: manjaro.mirrors.lavatech.top
warning: too many errors from manjaro.mirrors.lavatech.top, skipping for the remainder of this transaction
error: failed retrieving file 'extra.db' from manjaro.mirrors.lavatech.top : Could not resolve host: manjaro.mirrors.lavatech.top
error: failed retrieving file 'community.db' from manjaro.mirrors.lavatech.top : Could not resolve host: manjaro.mirrors.lavatech.top
error: failed retrieving file 'core.db' from ftp.nluug.nl : Could not resolve host: ftp.nluug.nl

로컬 서버와 인터넷 도메인에 대해 ping을 시도했습니다.

+ ping -c1 192.168.0.19
ping: connect: Network is unreachable

따라서 스크립트가 실행 중일 때 네트워크 연결이 설정되지 않은 것 같습니다. 나는 노력했다systemd.wants하지만 여전히 작동하지 않습니다. 네트워크를 사용할 수 없습니다. 또한 다음 systemd.wants과 같은 다른 단위를 사용해 보았습니다 cmdline.txt.

systemd.wants=systemd-networkd.service
systemd.wants=systemd-networkd-wait-online.service
systemd.wants=network-online.target
systemd.wants=dhcpcd.service

systemd 지시문 /boot/cmdline.txt:

systemd.run=/boot/my_init_wrapper.sh systemd.run_success_action=reboot systemd.unit=kernel-command-line.target systemd.wants=systemd-networkd.service

~부터systemd-run-generatorrun세 가지 옵션( , run_success_action및 ) 만 언급했는데 run_failture_action첫 번째 문서를 잘못 이해한 것 같아서 이를 알아낼 수 없는 것 같습니다 systemd.run.generator. systemd 단위 자체가 다양한 유형의 종속성을 지정할 수 있기 때문에 이 점을 알고 싶습니다. 커널에서 이를 지정하는 다른 방법이 있습니까 cmdline.txt?

라즈베리 파이 4에서 시도해 보고 있습니다. 하지만 이 질문은 systemd에만 관련되어 있으므로 pi에서 실행 중인지 systemd가 있는 다른 시스템에서 실행 중인지는 중요하지 않습니다. 그래서 저는 이것을 RPI 플랫폼이 아닌 일반적인 Linux 질문으로 여기에 게시합니다.

답변1

이 경우에는 전달하지 않고 최소한 부품에 대해서는 systemd.run일반 서비스로 사용하는 것이 더 낫다고 생각합니다 .ConditionFirstBoot=yespacman

~에 따르면수동, 그러한 단위를 참조하는 것이 더 좋습니다first-boot-complete.target

[Unit]
Description="Update packages & install vim"
ConditionFirstBoot=yes
Wants=first-boot-complete.target
Before=first-boot-complete.target
Wants=network-online.target
After=network-online.target

[Service]
#optional ping test
#ExecCondition=/usr/bin/ping -c 2 -w 2 manjaro.org
#not running arch - adapt pacman path if need be:
ExecStart=/usr/bin/pacman -Syu --noconfirm
ExecStart=/usr/bin/pacman -S --noconfirm vim

[Install]
WantedBy=default.target

핑 테스트는 흥미로울 수 있습니다.'온라인'의 의미에 대한 불확실성.


첫 번째 시작 조건은 매뉴얼에서 인용됩니다.

첫 번째 시작 조건 =

부울 매개변수를 사용합니다. 이 조건은 시스템이 처음으로 시작되는지 여부에 따라 장치의 상태를 결정하는 데 사용할 수 있습니다. 이는 대략 /etc/채워지지 않음을 의미합니다(자세한 내용은 참고자료의 "첫 번째 부팅 의미" 참조 machine-id(5)). 이는 /etc/공장 재설정 후 첫 번째 부팅 시 또는 새 시스템 인스턴스의 첫 번째 부팅 시 채우는 데 사용할 수 있습니다 .

견고성을 위해 유닛은 ConditionFirstBoot=yes먼저 스스로 명령을 내리고 first-boot-complete.target이 수동 목표를 끌어당겨야 합니다 Wants=. 이렇게 하면 첫 번째 부팅이 중단된 경우 다음 시스템 부팅 중에 해당 장치가 다시 실행됩니다.

이 옵션이 커널 명령줄에 지정 되면 systemd.condition-first-boot=(부울 값 사용) 이 조건부 확인 결과를 무시하고 /etc/machine-id존재 확인보다 우선합니다.

관련 정보