Машина с ISO после установки перезагружается сама: создаётся без отдельной фазы установки (no_install), диск первым в порядке загрузки

Этот коммит содержится в:
2026-09-27 17:45:03 +09:00
родитель daeec06ec6
Коммит 2474ad3dc2
5 изменённых файлов: 15 добавлений и 9 удалений
+1 -1
Просмотреть файл
@@ -60,7 +60,7 @@
1. На странице машины нажмите **Открыть экран**. Сразу после запуска Windows показывает «Press any key to boot from CD or DVD» — нажмите любую клавишу в окне экрана, иначе загрузка с диска пропустится. Если пропустили — **Перезагрузить** на странице машины и попробовать снова. 1. На странице машины нажмите **Открыть экран**. Сразу после запуска Windows показывает «Press any key to boot from CD or DVD» — нажмите любую клавишу в окне экрана, иначе загрузка с диска пропустится. Если пропустили — **Перезагрузить** на странице машины и попробовать снова.
2. Дальше установка идёт как на обычном компьютере. Диск в установщике будет пустым — выберите его целиком. 2. Дальше установка идёт как на обычном компьютере. Диск в установщике будет пустым — выберите его целиком.
3. После установки на странице машины откройте вкладку **Диски и загрузка** → **Привод CD/DVD** и извлеките установочный образ, чтобы машина больше не предлагала загрузку с него. 3. После установки машина перезагрузится уже с диска: для машин из ISO панель ставит диск первым в порядке загрузки, пока он пустой, машина загружается с образа. Сам образ можно извлечь во вкладке **Диски и загрузка** → **Привод CD/DVD**.
Для других систем выбирайте тип **Linux** (Ubuntu, Debian, Fedora и другие), **Windows 10 / Server 2019–2022** (классическая загрузка) или **Другая система**. Для других систем выбирайте тип **Linux** (Ubuntu, Debian, Fedora и другие), **Windows 10 / Server 2019–2022** (классическая загрузка) или **Другая система**.
+4 -1
Просмотреть файл
@@ -142,7 +142,10 @@ def test_vm_create_iso_builds_virt_install(logged_in, data_dirs, monkeypatch):
assert cmd[0] == "virt-install" assert cmd[0] == "virt-install"
assert "--cdrom" in cmd and str(iso) in cmd assert "--cdrom" in cmd and str(iso) in cmd
assert any(part.startswith("network=virtuality-nat,model=virtio,mac=52:54:00:") for part in cmd) assert any(part.startswith("network=virtuality-nat,model=virtio,mac=52:54:00:") for part in cmd)
assert captured["operation"]["boot_order"] == "cdrom_disk" assert captured["operation"]["boot_order"] == "disk_cdrom"
# После установки гость перезагружается с диска: без особого режима установки и с диском первым в очереди.
assert cmd[cmd.index("--boot") + 1] == "hd,cdrom"
assert cmd[cmd.index("--install") + 1] == "no_install=yes"
def test_vm_create_validation_error(logged_in): def test_vm_create_validation_error(logged_in):
+2 -2
Просмотреть файл
@@ -118,7 +118,7 @@ def test_windows11_gets_uefi_tpm_sata_and_e1000e(logged_in, data_dirs, monkeypat
assert response.status_code == 303 assert response.status_code == 303
cmd = captured["cmd"] cmd = captured["cmd"]
assert "--osinfo" in cmd and cmd[cmd.index("--osinfo") + 1] == "win11" assert "--osinfo" in cmd and cmd[cmd.index("--osinfo") + 1] == "win11"
assert cmd[cmd.index("--boot") + 1] == "uefi,cdrom,hd" assert cmd[cmd.index("--boot") + 1] == "uefi,hd,cdrom"
assert "--tpm" in cmd and "backend.version=2.0" in cmd[cmd.index("--tpm") + 1] assert "--tpm" in cmd and "backend.version=2.0" in cmd[cmd.index("--tpm") + 1]
assert "bus=sata" in cmd[cmd.index("--disk") + 1] and "model=e1000e" in cmd[cmd.index("--network") + 1] assert "bus=sata" in cmd[cmd.index("--disk") + 1] and "model=e1000e" in cmd[cmd.index("--network") + 1]
assert "--channel" not in cmd # Windows has no guest agent without extra drivers assert "--channel" not in cmd # Windows has no guest agent without extra drivers
@@ -129,7 +129,7 @@ def test_linux_installer_detects_os_and_uses_virtio(logged_in, data_dirs, monkey
iso.write_bytes(b"iso") iso.write_bytes(b"iso")
response, captured = create(logged_in, monkeypatch, iso_form(iso)) response, captured = create(logged_in, monkeypatch, iso_form(iso))
cmd = captured["cmd"] cmd = captured["cmd"]
assert cmd[cmd.index("--osinfo") + 1] == "detect=on,require=off" and cmd[cmd.index("--boot") + 1] == "cdrom,hd" assert cmd[cmd.index("--osinfo") + 1] == "detect=on,require=off" and cmd[cmd.index("--boot") + 1] == "hd,cdrom"
assert "bus=virtio" in cmd[cmd.index("--disk") + 1] and "model=virtio" in cmd[cmd.index("--network") + 1] and "--tpm" not in cmd assert "bus=virtio" in cmd[cmd.index("--disk") + 1] and "model=virtio" in cmd[cmd.index("--network") + 1] and "--tpm" not in cmd
assert cmd[cmd.index("--channel") + 1] == "unix,target.type=virtio,target.name=org.qemu.guest_agent.0" assert cmd[cmd.index("--channel") + 1] == "unix,target.type=virtio,target.name=org.qemu.guest_agent.0"
assert create(logged_in, monkeypatch, iso_form(iso, os_type="bsd"))[0].status_code == 400 assert create(logged_in, monkeypatch, iso_form(iso, os_type="bsd"))[0].status_code == 400
+7 -4
Просмотреть файл
@@ -1272,12 +1272,12 @@ def vm_boot_order_options() -> list[dict[str, str]]:
def normalize_boot_order(value: str, source_type: str) -> str: def normalize_boot_order(value: str, source_type: str) -> str:
"""auto для ISO — сначала диск, потом CD, как в Proxmox: пустой диск не загрузочный, и машина стартует
с установщика, а после установки — уже с диска, и повторно в установщик не попадает."""
value = (value or "auto").strip() value = (value or "auto").strip()
if value == "auto":
return "cdrom_disk" if source_type == "iso" else "disk"
if value in ("disk", "cdrom_disk", "disk_cdrom"): if value in ("disk", "cdrom_disk", "disk_cdrom"):
return value return value
return "cdrom_disk" if source_type == "iso" else "disk" return "disk_cdrom" if source_type == "iso" else "disk"
def virt_boot_arg(boot_order: str, is_arm: bool) -> str: def virt_boot_arg(boot_order: str, is_arm: bool) -> str:
@@ -1948,7 +1948,10 @@ def vm_create_submit(request: Request, name: str = Form(...), memory: int = Form
steps.append(" ".join(shlex.quote(part) for part in virt)) steps.append(" ".join(shlex.quote(part) for part in virt))
cmd = ["bash", "-lc", "set -euo pipefail; " + "; ".join(steps)] cmd = ["bash", "-lc", "set -euo pipefail; " + "; ".join(steps)]
else: else:
cmd += ["--disk", f"path={disk_path},size={disk_size},format=qcow2,bus={disk_bus}", "--cdrom", iso_path, "--osinfo", os_info["osinfo"], "--network", network_arg, *graphics] # no_install: машина сразу создаётся в рабочем виде, с образом в приводе. Без этого virt-install ставит
# на время установки «перезагрузка = выключение» и сам должен перезапустить машину, а он не ждёт
# (--noautoconsole) — после установки машина просто выключалась.
cmd += ["--disk", f"path={disk_path},size={disk_size},format=qcow2,bus={disk_bus}", "--cdrom", iso_path, "--install", "no_install=yes", "--osinfo", os_info["osinfo"], "--network", network_arg, *graphics]
if too_big: if too_big:
cmd += ["--check", "disk_size=off"] # подтверждено пользователем: virt-install иначе откажется cmd += ["--check", "disk_size=off"] # подтверждено пользователем: virt-install иначе откажется
+1 -1
Просмотреть файл
@@ -38,7 +38,7 @@
<ul> <ul>
<li>Экран открывается в новой вкладке браузера — это как монитор, подключённый к машине.</li> <li>Экран открывается в новой вкладке браузера — это как монитор, подключённый к машине.</li>
<li>Если курсор «застрял» внутри экрана, нажмите <code>Ctrl + Alt</code>.</li> <li>Если курсор «застрял» внутри экрана, нажмите <code>Ctrl + Alt</code>.</li>
<li>После установки системы извлеките установочный диск на странице машины → «Диски и загрузка».</li> <li>После установки машина перезагрузится уже с диска: он стоит первым в порядке загрузки. Установочный образ можно извлечь на странице машины → «Диски и загрузка».</li>
</ul> </ul>
</div></article> </div></article>