start_vm.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #!/usr/bin/env python3
  2. #
  3. # Helper script to start QEMU with Isar image
  4. # Copyright (c) 2019, ilbers GmbH
  5. import argparse
  6. import os
  7. import subprocess
  8. import sys
  9. import time
  10. def get_bitbake_env(arch, distro):
  11. multiconfig = 'mc:qemu' + arch + '-' + distro + ':isar-image-base'
  12. output = subprocess.check_output(['bitbake', '-e', str(multiconfig)])
  13. return output
  14. def get_bitbake_var(output, var):
  15. ret = ''
  16. for line in output.splitlines():
  17. if line.startswith(var):
  18. ret = line.split('"')[1]
  19. return ret
  20. def format_qemu_cmdline(arch, build, distro):
  21. bb_output = get_bitbake_env(arch, distro).decode()
  22. rootfs_image = ''
  23. extra_args = ''
  24. cpu = ['']
  25. image_type = get_bitbake_var(bb_output, 'IMAGE_TYPE')
  26. deploy_dir_image = get_bitbake_var(bb_output, 'DEPLOY_DIR_IMAGE')
  27. if image_type == 'ext4-img':
  28. rootfs_image = 'isar-image-base-debian-' + distro + '-qemu' + arch + '.ext4.img'
  29. kernel_image = deploy_dir_image + '/' + get_bitbake_var(bb_output, 'KERNEL_IMAGE')
  30. initrd_image = get_bitbake_var(bb_output, 'INITRD_IMAGE')
  31. if not initrd_image:
  32. initrd_image = '/dev/null'
  33. else:
  34. initrd_image = deploy_dir_image + '/' + initrd_image
  35. serial = get_bitbake_var(bb_output, 'MACHINE_SERIAL')
  36. root_dev = get_bitbake_var(bb_output, 'QEMU_ROOTFS_DEV')
  37. kargs = ['-append', '"console=' + serial + ' root=/dev/' + root_dev + ' rw"']
  38. extra_args = ['-kernel', kernel_image, '-initrd', initrd_image]
  39. extra_args.extend(kargs)
  40. elif image_type == 'wic-img':
  41. rootfs_image = 'isar-image-base-debian-' + distro + '-qemu' + arch + '.wic.img'
  42. extra_args = ['-snapshot']
  43. else:
  44. raise ValueError('Invalid image type: ' + str(image_type))
  45. qemu_arch = get_bitbake_var(bb_output, 'QEMU_ARCH')
  46. qemu_machine = get_bitbake_var(bb_output, 'QEMU_MACHINE')
  47. qemu_cpu = get_bitbake_var(bb_output, 'QEMU_CPU')
  48. qemu_disk_args = get_bitbake_var(bb_output, 'QEMU_DISK_ARGS')
  49. qemu_disk_args = qemu_disk_args.replace('##ROOTFS_IMAGE##', deploy_dir_image + '/' + rootfs_image).split()
  50. cmd = ['qemu-system-' + qemu_arch, '-m', '1024M']
  51. if qemu_machine:
  52. cmd.extend(['-M', qemu_machine])
  53. if qemu_cpu:
  54. cmd.extend(['-cpu', qemu_cpu])
  55. cmd.extend(extra_args)
  56. cmd.extend(qemu_disk_args)
  57. return cmd
  58. def start_qemu(arch, build, distro):
  59. cmdline = format_qemu_cmdline(arch, build, distro)
  60. cmdline.insert(1, '-nographic')
  61. p1 = subprocess.call(cmdline)
  62. if __name__ == "__main__":
  63. parser = argparse.ArgumentParser()
  64. parser.add_argument('-a', '--arch', choices=['arm', 'arm64', 'amd64', 'i386'], help='set isar machine architecture.', default='arm')
  65. parser.add_argument('-b', '--build', help='set path to build directory.', default=os.getcwd())
  66. parser.add_argument('-d', '--distro', choices=['jessie', 'stretch'], help='set isar Debian distribution.', default='stretch')
  67. args = parser.parse_args()
  68. start_qemu(args.arch, args.build, args.distro)