좋아요, 저는 일부 임베디드 sbc에 다른 Linux 이미지를 플래싱하고 설치하는 과정을 자동화하려고 합니다. 현재 pxe 이미지를 사용하여 임베디드 장치를 부팅하고 있습니다. 일반적으로 pxe 이미지가 부팅될 때까지 기다린 다음 pxe 서버에 있는 이미지를 사용하여 nfs를 통해 온보드 하드 드라이브를 플래시하는 dd 명령을 실행합니다. 따라서 이 부분은 잘 작동하지만 시작 서비스로 실행하려고 하면 실패합니다. 운이 좋아서 한 번 작동했는데, 이상하고 일종의 시간 초과나 경쟁 조건이 있을 수 있다고 생각하게 되었습니다. 그래서 운이 좋았고 동일한 설정으로 다시는 작동하지 않았습니다. 나는 rc-local.service와 내 실제 시스템 서비스를 통해 이를 처리합니다. 내 스크립트와 서비스 파일은 다음과 같습니다. 또한 이를 활성화하고 multi-user.target 아래에 링크가 있는지 확인했습니다.
#script at /usr/local/sbin/sysInstall
----------------------------------------------------------------------------
#!/bin/bash
dd if=/mnt/nfs/RTE.img of=/dev/sda status=progress &>> /mnt/nfs/dd_out.txt
shutdown -r now
----------------------------------------------------------------------------
#service file at /etc/systemd/system/sysInstall.service
[Unit]
Description=Load the image onto the harddrive from nfs
[Service]
ExecStart=/usr/local/sbin/sysInstall
[Install]
WantedBy=multi-user.target
아 예, /usr/local/sbin의 파일 스크립트를 chmod +x했지만 아무것도 변경되지 않았습니다. 또한 scipt를 /bin에 넣고 부팅 후 실행할 수 있으며 정상적으로 실행되므로 스크립트 자체는 괜찮아 보이지만 서비스는 항상 실패합니다.
[root@station1 ~]# systemctl -l status sysInstall.service
● sysInstall.service - This service auto flashes the local harddrive
Loaded: loaded (/etc/systemd/system/sysInstall.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Thu 2018-10-04 20:37:35 CDT; 34s ago
Process: 3573 ExecStart=/usr/local/sbin/sysINSTALL.sh (code=exited, status=1/FAILURE)
Main PID: 3573 (code=exited, status=1/FAILURE)
Oct 04 20:37:35 station1 systemd[1]: Started This service auto flashes the local harddrive.
Oct 04 20:37:35 station1 systemd[1]: Starting This service auto flashes the local harddrive...
Oct 04 20:37:35 station1 systemd[1]: sysInstall.service: main process exited, code=exited, status=1/FAILURE
Oct 04 20:37:35 station1 systemd[1]: Unit sysInstall.service entered failed state.
Oct 04 20:37:35 station1 systemd[1]: sysInstall.service failed.
마지막으로 흥미로운 점은 시스템이 이 스크립트를 사용하여 재부팅하므로 해당 스크립트에 들어가지만 dd가 실패하고 재부팅으로 점프한다는 것입니다. 아니요, 저에게는 bash가 차례대로 진행되기 때문에 dd가 실패하면 왜 계속 진행되겠습니까? 그래서 문제를 진단하고 위의 결과를 얻을 수 있도록 다시 시작을 주석 처리했습니다. 누구든지 내가 뭘 잘못하고 있거나 시도해야 할 점을 지적할 수 있다면 좋을 것입니다. 감사합니다.
제안된 대로 서비스 파일을 편집한 후 이를 출력으로 얻었습니다. 또한 부팅 로그인 전과 같이 부팅이 끝날 때 nfs /mnt/nfs가 마운트되는 것을 확인했습니다. 따라서 장치가 해당 조건을 true로 수신한 다음 시작될 때까지 기다리도록 해야 합니까?
[root@station1 ~]# systemctl -l status sysInstall.service
● sysInstall.service - This service auto flashes the local harddrive
Loaded: loaded (/etc/systemd/system/sysInstall.service; enabled; vendor preset: disabled)
Active: inactive (dead)
Condition: start condition failed at Thu 2018-10-04 20:18:32 CDT; 5min ago
ConditionPathIsMountPoint=/mnt/nfs was not met
Oct 04 20:18:32 station1 systemd[1]: Started This service auto flashes the local harddrive.
조건을 반복적으로 시도하기 위한 해결 방법으로 OnBootSec=을 사용하기 위해 시스템 타이머를 조사하고 있습니다.