image-vm.bbclass 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. # image-vm.bbclass
  2. # (loosly based off image-live.bbclass Copyright (C) 2004, Advanced Micro Devices, Inc.)
  3. #
  4. # Create an image which can be placed directly onto a harddisk using dd and then
  5. # booted.
  6. #
  7. # This uses syslinux. extlinux would have been nice but required the ext2/3
  8. # partition to be mounted. grub requires to run itself as part of the install
  9. # process.
  10. #
  11. # The end result is a 512 boot sector populated with an MBR and partition table
  12. # followed by an msdos fat16 partition containing syslinux and a linux kernel
  13. # completed by the ext2/3 rootfs.
  14. #
  15. # We have to push the msdos parition table size > 16MB so fat 16 is used as parted
  16. # won't touch fat12 partitions.
  17. inherit live-vm-common
  18. do_bootdirectdisk[depends] += "dosfstools-native:do_populate_sysroot \
  19. virtual/kernel:do_deploy \
  20. syslinux:do_populate_sysroot \
  21. syslinux-native:do_populate_sysroot \
  22. parted-native:do_populate_sysroot \
  23. mtools-native:do_populate_sysroot \
  24. ${PN}:do_image_${VM_ROOTFS_TYPE} \
  25. "
  26. IMAGE_TYPEDEP_vmdk = "${VM_ROOTFS_TYPE}"
  27. IMAGE_TYPEDEP_vdi = "${VM_ROOTFS_TYPE}"
  28. IMAGE_TYPEDEP_qcow2 = "${VM_ROOTFS_TYPE}"
  29. IMAGE_TYPEDEP_hdddirect = "${VM_ROOTFS_TYPE}"
  30. IMAGE_TYPES_MASKED += "vmdk vdi qcow2 hdddirect"
  31. VM_ROOTFS_TYPE ?= "ext4"
  32. ROOTFS ?= "${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${VM_ROOTFS_TYPE}"
  33. # Used by bootloader
  34. LABELS_VM ?= "boot"
  35. ROOT_VM ?= "root=/dev/sda2"
  36. # Using an initramfs is optional. Enable it by setting INITRD_IMAGE_VM.
  37. INITRD_IMAGE_VM ?= ""
  38. INITRD_VM ?= "${@'${IMGDEPLOYDIR}/${INITRD_IMAGE_VM}-${MACHINE}.cpio.gz' if '${INITRD_IMAGE_VM}' else ''}"
  39. do_bootdirectdisk[depends] += "${@'${INITRD_IMAGE_VM}:do_image_complete' if '${INITRD_IMAGE_VM}' else ''}"
  40. BOOTDD_VOLUME_ID ?= "boot"
  41. BOOTDD_EXTRA_SPACE ?= "16384"
  42. DISK_SIGNATURE ?= "${DISK_SIGNATURE_GENERATED}"
  43. DISK_SIGNATURE[vardepsexclude] = "DISK_SIGNATURE_GENERATED"
  44. build_boot_dd() {
  45. HDDDIR="${S}/hdd/boot"
  46. HDDIMG="${S}/hdd.image"
  47. IMAGE=${IMGDEPLOYDIR}/${IMAGE_NAME}.hdddirect
  48. populate_kernel $HDDDIR
  49. if [ "${PCBIOS}" = "1" ]; then
  50. syslinux_hddimg_populate $HDDDIR
  51. fi
  52. if [ "${EFI}" = "1" ]; then
  53. efi_hddimg_populate $HDDDIR
  54. fi
  55. BLOCKS=`du -bks $HDDDIR | cut -f 1`
  56. BLOCKS=`expr $BLOCKS + ${BOOTDD_EXTRA_SPACE}`
  57. # Remove it since mkdosfs would fail when it exists
  58. rm -f $HDDIMG
  59. mkdosfs -n ${BOOTDD_VOLUME_ID} -S 512 -C $HDDIMG $BLOCKS
  60. mcopy -i $HDDIMG -s $HDDDIR/* ::/
  61. if [ "${PCBIOS}" = "1" ]; then
  62. syslinux_hdddirect_install $HDDIMG
  63. fi
  64. chmod 644 $HDDIMG
  65. ROOTFSBLOCKS=`du -Lbks ${ROOTFS} | cut -f 1`
  66. TOTALSIZE=`expr $BLOCKS + $ROOTFSBLOCKS`
  67. END1=`expr $BLOCKS \* 1024`
  68. END2=`expr $END1 + 512`
  69. END3=`expr \( $ROOTFSBLOCKS \* 1024 \) + $END1`
  70. echo $ROOTFSBLOCKS $TOTALSIZE $END1 $END2 $END3
  71. rm -rf $IMAGE
  72. dd if=/dev/zero of=$IMAGE bs=1024 seek=$TOTALSIZE count=1
  73. parted $IMAGE mklabel msdos
  74. parted $IMAGE mkpart primary fat16 0 ${END1}B
  75. parted $IMAGE unit B mkpart primary ext2 ${END2}B ${END3}B
  76. parted $IMAGE set 1 boot on
  77. parted $IMAGE print
  78. awk "BEGIN { printf \"$(echo ${DISK_SIGNATURE} | fold -w 2 | tac | paste -sd '' | sed 's/\(..\)/\\x&/g')\" }" | \
  79. dd of=$IMAGE bs=1 seek=440 conv=notrunc
  80. OFFSET=`expr $END2 / 512`
  81. if [ "${PCBIOS}" = "1" ]; then
  82. dd if=${STAGING_DATADIR}/syslinux/mbr.bin of=$IMAGE conv=notrunc
  83. fi
  84. dd if=$HDDIMG of=$IMAGE conv=notrunc seek=1 bs=512
  85. dd if=${ROOTFS} of=$IMAGE conv=notrunc seek=$OFFSET bs=512
  86. cd ${IMGDEPLOYDIR}
  87. ln -sf ${IMAGE_NAME}.hdddirect ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.hdddirect
  88. }
  89. python do_bootdirectdisk() {
  90. validate_disk_signature(d)
  91. set_live_vm_vars(d, 'VM')
  92. if d.getVar("PCBIOS", True) == "1":
  93. bb.build.exec_func('build_syslinux_cfg', d)
  94. if d.getVar("EFI", True) == "1":
  95. bb.build.exec_func('build_efi_cfg', d)
  96. bb.build.exec_func('build_boot_dd', d)
  97. }
  98. def generate_disk_signature():
  99. import uuid
  100. signature = str(uuid.uuid4())[:8]
  101. if signature != '00000000':
  102. return signature
  103. else:
  104. return 'ffffffff'
  105. def validate_disk_signature(d):
  106. import re
  107. disk_signature = d.getVar("DISK_SIGNATURE", True)
  108. if not re.match(r'^[0-9a-fA-F]{8}$', disk_signature):
  109. bb.fatal("DISK_SIGNATURE '%s' must be an 8 digit hex string" % disk_signature)
  110. DISK_SIGNATURE_GENERATED := "${@generate_disk_signature()}"
  111. run_qemu_img (){
  112. type="$1"
  113. qemu-img convert -O $type ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.hdddirect ${IMGDEPLOYDIR}/${IMAGE_NAME}.$type
  114. ln -sf ${IMAGE_NAME}.$type ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type
  115. }
  116. create_vmdk_image () {
  117. run_qemu_img vmdk
  118. }
  119. create_vdi_image () {
  120. run_qemu_img vdi
  121. }
  122. create_qcow2_image () {
  123. run_qemu_img qcow2
  124. }
  125. python do_vmimg() {
  126. if 'vmdk' in d.getVar('IMAGE_FSTYPES', True):
  127. bb.build.exec_func('create_vmdk_image', d)
  128. if 'vdi' in d.getVar('IMAGE_FSTYPES', True):
  129. bb.build.exec_func('create_vdi_image', d)
  130. if 'qcow2' in d.getVar('IMAGE_FSTYPES', True):
  131. bb.build.exec_func('create_qcow2_image', d)
  132. }
  133. addtask bootdirectdisk before do_vmimg
  134. addtask vmimg after do_bootdirectdisk before do_image_complete
  135. do_vmimg[depends] += "qemu-native:do_populate_sysroot"