#!/bin/bash # "Press any key to boot from CD or DVD" 를 넘긴다. # # UEFI 부팅 시 Windows ISO 는 매번 이 프롬프트를 띄우고 약 5초 안에 키가 # 없으면 CD 부팅을 포기한다. 무인 설치인데 사람이 눌러줄 수 없으므로 # 리셋 직후부터 키를 계속 밀어 넣는다. # # ⚠️ 설치가 시작된 뒤에는 절대 실행하지 말 것. 남는 Enter 가 설치 화면의 # Cancel 버튼을 눌러 "Are you sure you want to quit?" 가 뜬다 (실제로 겪음). # 설치가 끝난 뒤 재부팅 때는 키를 안 누르는 게 정답이다 - 그래야 CD 를 # 건너뛰고 디스크로 부팅한다. # # 사용법: ./boot-cd.sh [reset] - reset 을 주면 VM 을 먼저 리셋한다 set -euo pipefail MODE="${1:-}" python3 - "$MODE" <<'PY' import json, socket, sys, time mode = sys.argv[1] if len(sys.argv) > 1 else "" s = socket.socket(socket.AF_UNIX); s.settimeout(20) s.connect("/home/claude/win-ci/qmp.sock") f = s.makefile("rwb") f.readline() def cmd(o): f.write((json.dumps(o) + "\n").encode()); f.flush() while True: line = f.readline() if not line: raise SystemExit("qmp closed") m = json.loads(line) if "return" in m or "error" in m: return m cmd({"execute": "qmp_capabilities"}) if mode == "reset": print(cmd({"execute": "system_reset"})) time.sleep(3) # 프롬프트 창은 5초뿐이지만 펌웨어 POST 시간이 들쭉날쭉하다. 25초면 충분하고, # 그 이상 밀면 설치 화면까지 Enter 가 새어 들어간다. deadline = time.time() + 25 n = 0 while time.time() < deadline: cmd({"execute": "send-key", "arguments": {"keys": [{"type": "qcode", "data": "ret"}]}}) n += 1 time.sleep(0.4) print("sent", n, "keys") PY