diff options
| -rw-r--r-- | meta/classes/bootimg.bbclass | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/meta/classes/bootimg.bbclass b/meta/classes/bootimg.bbclass index b50202f68f..df3ee7315a 100644 --- a/meta/classes/bootimg.bbclass +++ b/meta/classes/bootimg.bbclass | |||
| @@ -103,19 +103,46 @@ build_hddimg() { | |||
| 103 | grubefi_hddimg_populate | 103 | grubefi_hddimg_populate |
| 104 | fi | 104 | fi |
| 105 | 105 | ||
| 106 | # Determine the 1024 byte block count for the final image. | 106 | # Calculate the size required for the final image including the |
| 107 | BLOCKS=`du --apparent-size -ks ${HDDDIR} | cut -f 1` | 107 | # data and filesystem overhead. |
| 108 | SIZE=`expr $BLOCKS + ${BOOTIMG_EXTRA_SPACE}` | 108 | # Sectors: 512 bytes |
| 109 | # Blocks: 1024 bytes | ||
| 110 | |||
| 111 | # Determine the sector count just for the data | ||
| 112 | SECTORS=$(expr $(du --apparent-size -ks ${HDDDIR} | cut -f 1) \* 2) | ||
| 113 | |||
| 114 | # Account for the filesystem overhead. This includes directory | ||
| 115 | # entries in the clusters as well as the FAT itself. | ||
| 116 | # Assumptions: | ||
| 117 | # < 16 entries per directory | ||
| 118 | # 8.3 filenames only | ||
| 119 | |||
| 120 | # 32 bytes per dir entry | ||
| 121 | DIR_BYTES=$(expr $(find ${HDDDIR} | tail -n +2 | wc -l) \* 32) | ||
| 122 | # 32 bytes for every end-of-directory dir entry | ||
| 123 | DIR_BYTES=$(expr $DIR_BYTES + $(expr $(find ${HDDDIR} -type d | tail -n +2 | wc -l) \* 32)) | ||
| 124 | # 4 bytes per FAT entry per sector of data | ||
| 125 | FAT_BYTES=$(expr $SECTORS \* 4) | ||
| 126 | # 4 bytes per FAT entry per end-of-cluster list | ||
| 127 | FAT_BYTES=$(expr $FAT_BYTES + $(expr $(find ${HDDDIR} -type d | tail -n +2 | wc -l) \* 4)) | ||
| 128 | |||
| 129 | # Use a ceiling function to determine FS overhead in sectors | ||
| 130 | DIR_SECTORS=$(expr $(expr $DIR_BYTES + 511) / 512) | ||
| 131 | # There are two FATs on the image | ||
| 132 | FAT_SECTORS=$(expr $(expr $(expr $FAT_BYTES + 511) / 512) \* 2) | ||
| 133 | SECTORS=$(expr $SECTORS + $(expr $DIR_SECTORS + $FAT_SECTORS)) | ||
| 134 | |||
| 135 | # Determine the final size in blocks accounting for some padding | ||
| 136 | BLOCKS=$(expr $(expr $SECTORS \* 2) + ${BOOTIMG_EXTRA_SPACE}) | ||
| 109 | 137 | ||
| 110 | # Ensure total sectors is an integral number of sectors per | 138 | # Ensure total sectors is an integral number of sectors per |
| 111 | # track or mcopy will complain. Sectors are 512 bytes, and and | 139 | # track or mcopy will complain. Sectors are 512 bytes, and we |
| 112 | # we generate images with 32 sectors per track. This calculation | 140 | # generate images with 32 sectors per track. This calculation is |
| 113 | # is done in blocks, which are twice the size of sectors, thus | 141 | # done in blocks, thus the mod by 16 instead of 32. |
| 114 | # the 16 instead of 32. | 142 | BLOCKS=$(expr $BLOCKS + $(expr 16 - $(expr $BLOCKS % 16))) |
| 115 | SIZE=$(expr $SIZE + $(expr 16 - $(expr $SIZE % 16))) | ||
| 116 | 143 | ||
| 117 | IMG=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.hddimg | 144 | IMG=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.hddimg |
| 118 | mkdosfs -n ${BOOTIMG_VOLUME_ID} -S 512 -C ${IMG} ${SIZE} | 145 | mkdosfs -F 32 -n ${BOOTIMG_VOLUME_ID} -S 512 -C ${IMG} ${BLOCKS} |
| 119 | # Copy HDDDIR recursively into the image file directly | 146 | # Copy HDDDIR recursively into the image file directly |
| 120 | mcopy -i ${IMG} -s ${HDDDIR}/* ::/ | 147 | mcopy -i ${IMG} -s ${HDDDIR}/* ::/ |
| 121 | 148 | ||
