내 Fedora Linux 시스템(현재 30개)은 호스트 시스템이 부팅될 때 시작되도록 구성된 여러 가상 머신(VM)을 호스팅합니다. 이는 인터넷에서 볼 수 있고 중요하거나 중요한 데이터를 포함하지 않는 고아 서버이므로 해킹되더라도 문제가 되지 않습니다(그런 다음 삭제되고 다시 로드됩니다).
이를 표시하려면 가상 브리지의 대상 IP에 대한 방화벽을 통과 모드로 설정해야 합니다. 이러한 명령은 bash 스크립트로 그룹화됩니다.
명령이 성공하고 작동하려면 가상 머신이 실행 중이어야 합니다. 즉, 가상 머신이 부팅을 마칠 때까지 기다려야 합니다. 이는 아마도 가상 머신이 도착할 때일 것입니다 multi-user.target
.
내 문제는 가상 머신 상태가 게스트 시스템에서 테스트될 수 있는 반면, 내 bash 스크립트는 호스트 시스템에서 실행되어야 한다는 것입니다.
bash 스크립트를 고정된 시간(초)만큼 지연해 보았지만 이것이 항상 올바른 것 같지는 않습니다. 가상 머신에는 다양한 시작 시간이 필요하며(예: n번째 부팅 시 fsck를 실행할 때) 모든 것이 언제 준비되어 실행될지 확실하게 예측할 수 없습니다.
내 목표는 서버를 연중무휴 24시간 운영하여 호스트가 자동으로 재부팅되는 경우(정전 또는 기타 이벤트 발생 후) 자동으로 인터넷에 연결하는 것입니다.
현재 저는 이 스크립트를 수동으로 시작합니다(때때로 이 작업을 수행하는 것을 잊어버립니다).
질문:가상 머신이 다중 사용자 모드로 전환된 후 스크립트를 시작할 수 있는 방법(systemd, cron, at,...?)이 있습니까?
편집하다
@Michael D.의 의견에 따르면 내 설명이 불분명하거나 부정확했습니다.
firewall-cmd
명령에 구문 오류가 없는 한 항상 "성공적으로" 종료됩니다. 장치의 구성이 존재하지 않더라도 방화벽에 의해 거부되어 수락됩니다. 따라서 $?
명령이 효과가 있는지 여부를 감지하기 위해 bash에 의존할 수 없습니다 . 여기서는 반환 코드 모니터링이 도움이 되지 않습니다.
답변1
시행착오 끝에 이것이 제가 구현한 솔루션입니다.
systemd
서비스 에 스크립트를 첨부합니다 .
[Unit]
Description=Make VMs reachable from the internet
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/home/…/virbr0-enable.sh
[Install]
Alias=makeVMvisible.service
WantedBy=multi-user.target
네트워크가 실행될 때까지 기다리도록 합니다.네트워크 온라인.대상), 내 생각엔 상황에 따라 다를 것 같아방화벽 서비스, 그리고 그 이후다중 사용자 대상달성. 후자는 아마도 중복될 수 있지만(대상과 서비스 간의 정확한 종속성을 모르기 때문에) 문제가 되지는 않습니다.
그럼에도 불구하고 여전히 작동하지 않았습니다. systemctl start makeVMvisible.service
가상 브리지를 수동으로 통과 모드로 전환하므로 시스템 서비스에는 결함이 없습니다 . 지연이 필요한 것 같습니다. sleep
스크립트 시작 부분에 명령을 추가했습니다.
실험에 따르면 지연 임계값은 1~2초입니다. 나는 sleep 5
이것이 경과 시간에 큰 영향을 미치지 않을 것이라고 결정했고 꽤 보수적이었습니다.
그러나 내 솔루션이 만족스럽지 못한 것 같습니다. 아는 사람 있나요네트워크 온라인.대상?
답변2
외부 IP 주소가 가상 머신에 전달되기 전에 호스트에서 가상 머신에 액세스할 수 있나요? 그렇다면 원격 기능을 사용하여 systemctl
가상 머신 시작 상태를 확인할 수 있습니다.
이를 위해서는 호스트의 SSH 키를 사용하여 VM에 액세스할 수 있어야 합니다.
호스트 시스템에서 다음을 실행합니다.
systemctl -H <vm name or ip> --quiet is-active multi-user.target
지정된 장치가 활성 상태이면 종료가 성공합니다.
따라서 Bash에서는 다음을 수행할 수 있습니다.
until systemctl -H <vm name or ip> --quiet is-active multi-user.target; do
sleep 5
done
이제 해당 호스트에서 지정된 장치가 시작될 때까지 이 작업이 계속되지 않습니다.