102 lines
3.1 KiB
Python
102 lines
3.1 KiB
Python
|
"""Qemu commands to run and handle the image"""
|
||
|
import os
|
||
|
import sys
|
||
|
import argparse
|
||
|
from subprocess import Popen, PIPE
|
||
|
|
||
|
from gentooimgr import LOG
|
||
|
import gentooimgr.config
|
||
|
import gentooimgr.common
|
||
|
def create_image(args, config: dict, overwrite: bool = False) -> str:
|
||
|
"""Creates an image (.img) file using qemu that will be used to create the cloud image
|
||
|
|
||
|
:Parameters:
|
||
|
- config: dictionary/json configuration containing required information
|
||
|
- overwrite: if True, run_image() will call this and re-create.
|
||
|
|
||
|
|
||
|
:Returns:
|
||
|
Full path to image file produced by qemu
|
||
|
"""
|
||
|
|
||
|
image = gentooimgr.common.get_image_name(args, config)
|
||
|
name, ext = os.path.splitext(image)
|
||
|
if os.path.exists(image) and not overwrite:
|
||
|
return os.path.abspath(image)
|
||
|
|
||
|
cmd = ['qemu-img', 'create', '-f', ext[1:], image, str(config.get("imgsize", "12G"))]
|
||
|
proc = Popen(cmd, stderr=PIPE, stdout=PIPE)
|
||
|
stdout, stderr = proc.communicate()
|
||
|
return os.path.abspath(image)
|
||
|
|
||
|
def run_image(
|
||
|
args: argparse.Namespace,
|
||
|
config: dict,
|
||
|
mounts=[]):
|
||
|
"""Handle mounts and run the live cd image
|
||
|
|
||
|
- mount_isos: list of iso paths to mount in qemu as disks.
|
||
|
"""
|
||
|
iso = config.get("iso")
|
||
|
prefix = args.temporary_dir
|
||
|
LOG.info(f"iso from config {iso}")
|
||
|
if iso is None:
|
||
|
iso = gentooimgr.common.find_iso(
|
||
|
os.path.join(
|
||
|
os.path.abspath(os.path.dirname(__file__)),
|
||
|
".."
|
||
|
)
|
||
|
)
|
||
|
LOG.info(f"iso from cwd {iso}")
|
||
|
if not iso:
|
||
|
prefix = config.get('temporary_dir')
|
||
|
iso = gentooimgr.common.find_iso(prefix)
|
||
|
LOG.info(f"iso from {prefix} {iso}")
|
||
|
|
||
|
assert iso, f"iso not found {iso}"
|
||
|
|
||
|
if isinstance(iso, list):
|
||
|
assert len(iso), f"iso list is empty {iso}"
|
||
|
iso = iso[0]
|
||
|
|
||
|
image = gentooimgr.common.get_image_name(args, config)
|
||
|
qmounts = []
|
||
|
mounts.extend(args.mounts)
|
||
|
for i in mounts:
|
||
|
qmounts.append("-drive")
|
||
|
qmounts.append(f"file={i},media=cdrom")
|
||
|
|
||
|
assert image, f"image is empty {image}"
|
||
|
if not os.path.exists(image):
|
||
|
if os.path.exists(os.path.join(prefix, image)):
|
||
|
image = os.path.join(prefix, image)
|
||
|
assert os.path.exists(image), f"image not found {image}"
|
||
|
threads = args.threads
|
||
|
cmd = [
|
||
|
"qemu-system-x86_64",
|
||
|
"-enable-kvm",
|
||
|
"-boot", "d",
|
||
|
"-m", str(config.get("memory", 2048)),
|
||
|
"-smp", str(threads),
|
||
|
"-drive", f"file={image},if=virtio,index=0",
|
||
|
"-cdrom", iso,
|
||
|
"-net", "nic,model=virtio",
|
||
|
"-vga", "virtio",
|
||
|
"-cpu", "kvm64",
|
||
|
"-chardev", "file,id=charserial0,path=gentoo.log",
|
||
|
"-device", "isa-serial,chardev=charserial0,id=serial0",
|
||
|
"-chardev", "pty,id=charserial1",
|
||
|
"-device", "isa-serial,chardev=charserial1,id=serial1"
|
||
|
]
|
||
|
# "-net", "user",
|
||
|
# -net user: network backend 'user' is not compiled into this binary"
|
||
|
|
||
|
cmd += qmounts
|
||
|
LOG.info(cmd)
|
||
|
proc = Popen(cmd, stderr=PIPE, stdout=PIPE)
|
||
|
stdout, stderr = proc.communicate()
|
||
|
if stderr:
|
||
|
LOG.error(str(stderr))
|
||
|
|
||
|
|