start_vm.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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, out, pid):
  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_FSTYPES').split()[0]
  26. deploy_dir_image = get_bitbake_var(bb_output, 'DEPLOY_DIR_IMAGE')
  27. base = 'ubuntu' if distro in ['focal', 'bionic'] else 'debian'
  28. if image_type == 'ext4-img':
  29. rootfs_image = 'isar-image-base-' + base + '-' + distro + '-qemu' + arch + '.ext4.img'
  30. kernel_image = deploy_dir_image + '/' + get_bitbake_var(bb_output, 'KERNEL_IMAGE')
  31. initrd_image = get_bitbake_var(bb_output, 'INITRD_IMAGE')
  32. if not initrd_image:
  33. initrd_image = '/dev/null'
  34. else:
  35. initrd_image = deploy_dir_image + '/' + initrd_image
  36. serial = get_bitbake_var(bb_output, 'MACHINE_SERIAL')
  37. root_dev = get_bitbake_var(bb_output, 'QEMU_ROOTFS_DEV')
  38. kargs = ['-append', '"console=' + serial + ' root=/dev/' + root_dev + ' rw"']
  39. extra_args = ['-kernel', kernel_image, '-initrd', initrd_image]
  40. extra_args.extend(kargs)
  41. elif image_type == 'wic-img':
  42. rootfs_image = 'isar-image-base-' + base + '-' + distro + '-qemu' + arch + '.wic.img'
  43. extra_args = ['-snapshot']
  44. else:
  45. raise ValueError('Invalid image type: ' + str(image_type))
  46. qemu_arch = get_bitbake_var(bb_output, 'QEMU_ARCH')
  47. qemu_machine = get_bitbake_var(bb_output, 'QEMU_MACHINE')
  48. qemu_cpu = get_bitbake_var(bb_output, 'QEMU_CPU')
  49. qemu_disk_args = get_bitbake_var(bb_output, 'QEMU_DISK_ARGS')
  50. if out:
  51. extra_args.extend(['-chardev','stdio,id=ch0,logfile=' + out])
  52. extra_args.extend(['-serial','chardev:ch0'])
  53. extra_args.extend(['-monitor','none'])
  54. if pid:
  55. extra_args.extend(['-pidfile', pid])
  56. qemu_disk_args = qemu_disk_args.replace('##ROOTFS_IMAGE##', deploy_dir_image + '/' + rootfs_image).split()
  57. cmd = ['qemu-system-' + qemu_arch, '-m', '1024M']
  58. if qemu_machine:
  59. cmd.extend(['-M', qemu_machine])
  60. if qemu_cpu:
  61. cmd.extend(['-cpu', qemu_cpu])
  62. cmd.extend(extra_args)
  63. cmd.extend(qemu_disk_args)
  64. return cmd
  65. def start_qemu(arch, build, distro, out, pid):
  66. cmdline = format_qemu_cmdline(arch, build, distro, out, pid)
  67. cmdline.insert(1, '-nographic')
  68. print(cmdline)
  69. p1 = subprocess.call(cmdline)
  70. if __name__ == "__main__":
  71. parser = argparse.ArgumentParser()
  72. parser.add_argument('-a', '--arch', choices=['arm', 'arm64', 'amd64', 'i386', 'mipsel'], help='set isar machine architecture.', default='arm')
  73. parser.add_argument('-b', '--build', help='set path to build directory.', default=os.getcwd())
  74. parser.add_argument('-d', '--distro', choices=['jessie', 'stretch'], help='set isar Debian distribution.', default='stretch')
  75. parser.add_argument('-o', '--out', help='Route QEMU console output to specified file.')
  76. parser.add_argument('-p', '--pid', help='Store QEMU pid to specified file.')
  77. args = parser.parse_args()
  78. start_qemu(args.arch, args.build, args.distro, args.out, args.pid)