Удаление машины больше не стирает вставленный установочный ISO: вместо --remove-all-storage удаляются только диски машины из папки машин

Этот коммит содержится в:
2026-09-27 21:08:17 +09:00
родитель ca5d49266c
Коммит 2bf4ef35c2
6 изменённых файлов: 93 добавлений и 34 удалений
+37
Просмотреть файл
@@ -227,6 +227,43 @@ def vm_is_running(name: str) -> bool:
return vm_state(name) in ("running", "idle", "blocked", "paused", "pmsuspended", "in shutdown")
def vm_disk_files(name: str) -> tuple[list[Path], list[Path]]:
"""Файлы дисков машины: (свои — в IMAGES_DIR, чужие — где-то ещё). Приводы CD/DVD сюда не входят."""
own: list[Path] = []
foreign: list[Path] = []
result = run_cmd(["virsh", "domblklist", name, "--details"], timeout=10)
for disk in presenters.parse_domblklist(result.get("stdout") or ""):
if disk["device"] == "disk" and disk["source"]:
path = Path(disk["source"])
(own if IMAGES_DIR.resolve() in path.resolve().parents else foreign).append(path)
return own, foreign
def undefine_vm(name: str) -> tuple[bool, str, list[Path], list[Path]]:
"""Удалить машину и файлы её дисков из IMAGES_DIR. Возвращает (ok, ошибка, удалённые, оставленные).
Без `--remove-all-storage`: он удаляет все тома libvirt, подключённые к машине, в том числе
вставленный установочный ISO из пула virtuality-iso. Диски вне IMAGES_DIR не трогаем."""
own, foreign = vm_disk_files(name) # после undefine libvirt о дисках машины уже не расскажет
# --nvram: UEFI machines keep firmware variables that block a plain undefine.
result = run_cmd(["virsh", "undefine", name, "--nvram", "--managed-save", "--snapshots-metadata", "--checkpoints-metadata"], timeout=120)
if not result["ok"]:
return False, cmd_error(result, "virsh undefine"), [], []
removed = []
for disk in own:
try:
disk.unlink()
except FileNotFoundError:
continue
except OSError:
foreign.append(disk)
continue
removed.append(disk)
if removed:
run_cmd(["virsh", "pool-refresh", "virtuality-images"], timeout=20)
return True, "", removed, foreign
# ---------------------------------------------------------------- operations
def operation_meta_path(operation_id: str) -> Path:
return OPERATIONS_DIR / f"{operation_id}.json"