私の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
これで、そのホストで指定されたデバイスが起動するまで、この操作は続行されません。