From: Waldemar Kozaczuk <[email protected]> Committer: Waldemar Kozaczuk <[email protected]> Branch: master
scripts: enhance run.py to allow running aarch64 images with KVM enabled This patch also optimizes firecracker.py to use a Python-native mechanism to detect host architecture. Signed-off-by: Waldemar Kozaczuk <[email protected]> --- diff --git a/scripts/firecracker.py b/scripts/firecracker.py --- a/scripts/firecracker.py +++ b/scripts/firecracker.py @@ -20,7 +20,7 @@ devnull = open('/dev/null', 'w') -host_arch = subprocess.check_output(["uname", "-m"]).decode('utf-8').split('\n')[0] +host_arch = os.uname().machine def stty_save(): global stty_params diff --git a/scripts/run.py b/scripts/run.py --- a/scripts/run.py +++ b/scripts/run.py @@ -14,6 +14,8 @@ osv_base = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..') +host_arch = os.uname().machine + def stty_save(): global stty_params p = subprocess.Popen(["stty", "-g"], stdout=subprocess.PIPE, stderr=devnull) @@ -134,8 +136,10 @@ def start_osv_qemu(options): boot_index = ",bootindex=0" if options.arch == 'aarch64': + if options.hypervisor == 'qemu': + args += ["-machine", "gic-version=2", "-cpu", "cortex-a57"] args += [ - "-machine", "virt", "-machine", "gic-version=2", "-cpu", "cortex-a57", + "-machine", "virt", "-device", "virtio-blk-pci,id=blk0,drive=hd0,scsi=off%s%s" % (boot_index, options.virtio_device_suffix), "-drive", "file=%s,if=none,id=hd0,%s" % (options.image_file, aio)] elif options.hypervisor == 'qemu_microvm': @@ -228,7 +232,10 @@ def start_osv_qemu(options): args += ["-device", "virtio-rng-pci%s" % options.virtio_device_suffix] if options.hypervisor == "kvm" or options.hypervisor == 'qemu_microvm': - args += ["-enable-kvm", "-cpu", "host,+x2apic"] + if options.arch == 'aarch64': + args += ["-enable-kvm", "-cpu", "host"] + else: + args += ["-enable-kvm", "-cpu", "host,+x2apic"] elif options.hypervisor == "none" or options.hypervisor == "qemu": pass @@ -267,10 +274,7 @@ def start_osv_qemu(options): qemu_env = os.environ.copy() qemu_env['OSV_BRIDGE'] = options.bridge - if options.arch == 'aarch64': - qemu_path = 'qemu-system-aarch64' - else: - qemu_path = options.qemu_path + qemu_path = options.qemu_path or ('qemu-system-%s' % options.arch) cmdline = [qemu_path] + args if options.dry_run: print(format_args(cmdline)) @@ -282,8 +286,8 @@ def start_osv_qemu(options): if e.errno == errno.ENOENT: print("'%s' binary not found. Please install the qemu-system-x86 package." % qemu_path) else: - print("OS error({0}): \"{1}\" while running qemu-system-x86_64 {2}". - format(e.errno, e.strerror, " ".join(args))) + print("OS error({0}): \"{1}\" while running qemu-system-{2} {3}". + format(e.errno, e.strerror, options.arch, " ".join(args))) finally: cleanups() @@ -468,7 +472,7 @@ def start_osv(options): return def choose_hypervisor(external_networking, arch): - if os.path.exists('/dev/kvm') and arch == 'x86_64': + if os.path.exists('/dev/kvm') and arch == host_arch: return 'kvm' if (os.path.exists('/proc/xen/capabilities') and 'control_d' in file('/proc/xen/capabilities').read() @@ -550,7 +554,6 @@ def main(options): parser.add_argument("--sampler", action="store", nargs='?', const='1000', help="start sampling profiler. optionally specify sampling frequency in Hz") parser.add_argument("--qemu-path", action="store", - default="qemu-system-x86_64", help="specify qemu command path") parser.add_argument("--nics", action="store", default="1", help="number of NICs configured for the VM") @@ -570,26 +573,26 @@ def main(options): help="path to kernel.elf. defaults to build/$mode/kernel.elf") parser.add_argument("--virtio", action="store", choices=["legacy","transitional","modern"], default="transitional", help="specify virtio version: legacy, transitional or modern") - parser.add_argument("--arch", action="store", choices=["x86_64","aarch64"], default="x86_64", + parser.add_argument("--arch", action="store", choices=["x86_64","aarch64"], default=host_arch, help="specify QEMU architecture: x86_64, aarch64") parser.add_argument("--virtio-fs-tag", action="store", help="virtio-fs device tag") parser.add_argument("--virtio-fs-dir", action="store", help="path to the directory exposed via virtio-fs mount") cmdargs = parser.parse_args() + cmdargs.opt_path = "debug" if cmdargs.debug else "release" if cmdargs.release else "last" if cmdargs.arch == 'aarch64': - cmdargs.kernel_file = os.path.join(osv_base, "build/%s/loader.img" % cmdargs.opt_path) + default_kernel_file_name = "loader.img" + default_image_file_name = "disk.img" else: - cmdargs.kernel_file = os.path.abspath(cmdargs.kernel_path or os.path.join(osv_base, "build/%s/kernel.elf" % cmdargs.opt_path)) - if cmdargs.image: - cmdargs.image_file = os.path.abspath(cmdargs.image) - elif cmdargs.arch == 'aarch64': - cmdargs.image_file = os.path.abspath(os.path.join(osv_base, "build/%s/disk.img" % cmdargs.opt_path)) - else: - cmdargs.image_file = os.path.abspath(os.path.join(osv_base, "build/%s/usr.img" % cmdargs.opt_path)) + default_kernel_file_name = "kernel.elf" + default_image_file_name = "usr.img" + cmdargs.kernel_file = os.path.abspath(cmdargs.kernel_path or os.path.join(osv_base, "build/%s/%s" % (cmdargs.opt_path, default_kernel_file_name))) + cmdargs.image_file = os.path.abspath(cmdargs.image or os.path.join(osv_base, "build/%s/%s" % (cmdargs.opt_path, default_image_file_name))) if not os.path.exists(cmdargs.image_file): raise Exception('Image file %s does not exist.' % cmdargs.image_file) + if cmdargs.cloud_init_image: cmdargs.cloud_init_image = os.path.abspath(cmdargs.cloud_init_image) if not os.path.exists(cmdargs.cloud_init_image): -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/osv-dev/0000000000001fdb0905aafa97dd%40google.com.
