diff options
author | Andrei Gherzan <andrei@gherzan.ro> | 2012-10-24 21:28:49 +0300 |
---|---|---|
committer | Otavio Salvador <otavio@ossystems.com.br> | 2012-10-29 16:13:38 -0200 |
commit | e6b33c90f2a89931be927e6d956bfc1099d5561a (patch) | |
tree | e74ca718d1775678cf8094f2e8616faeb270298a /classes | |
parent | 7d4828e8a2e7504f23ce2de1146ac60b3ec60ff9 (diff) | |
download | meta-fsl-arm-e6b33c90f2a89931be927e6d956bfc1099d5561a.tar.gz |
image_types_fsl: Align SD partition and optimize final SD image
SD image file was 4G in size but actually the rootfs partition was only
60MB (in some images).
The image file size is not fixed anymore but calculated inside this
class. In this way we will setup the partition for rootfs to fit the
ext file used as SDIMG_ROOTFS. By default the free space is calculated
with IMAGE_OVERHEAD_FACTOR which is by default 1.3. If more free space
is needed this can be overwritten.
IMAGE_ROOTFS_ALIGNMENT set at 4096. This should be the best value for a
SD card.
Signed-off-by: Andrei Gherzan <andrei@gherzan.ro>
Diffstat (limited to 'classes')
-rw-r--r-- | classes/image_types_fsl.bbclass | 95 |
1 files changed, 72 insertions, 23 deletions
diff --git a/classes/image_types_fsl.bbclass b/classes/image_types_fsl.bbclass index 1b58df8..1144bff 100644 --- a/classes/image_types_fsl.bbclass +++ b/classes/image_types_fsl.bbclass | |||
@@ -43,14 +43,14 @@ IMAGE_DEPENDS_uboot.mxsboot-sdcard = "u-boot-mxsboot-native u-boot" | |||
43 | IMAGE_CMD_uboot.mxsboot-sdcard = "mxsboot sd ${DEPLOY_DIR_IMAGE}/u-boot-${MACHINE}.${UBOOT_SUFFIX} \ | 43 | IMAGE_CMD_uboot.mxsboot-sdcard = "mxsboot sd ${DEPLOY_DIR_IMAGE}/u-boot-${MACHINE}.${UBOOT_SUFFIX} \ |
44 | ${DEPLOY_DIR_IMAGE}/u-boot-${MACHINE}.${UBOOT_SUFFIX_SDCARD}" | 44 | ${DEPLOY_DIR_IMAGE}/u-boot-${MACHINE}.${UBOOT_SUFFIX_SDCARD}" |
45 | 45 | ||
46 | # Default to 3.4GiB images | ||
47 | SDCARD_SIZE ?= "3400" | ||
48 | |||
49 | # Boot partition volume id | 46 | # Boot partition volume id |
50 | BOOTDD_VOLUME_ID ?= "Boot ${MACHINE}" | 47 | BOOTDD_VOLUME_ID ?= "Boot ${MACHINE}" |
51 | 48 | ||
52 | # Addional space for boot partition | 49 | # Boot partition size [in KiB] |
53 | BOOT_SPACE ?= "5MiB" | 50 | BOOT_SPACE ?= "8192" |
51 | |||
52 | # Set alignment to 4MB [in KiB] | ||
53 | IMAGE_ROOTFS_ALIGNMENT = "4096" | ||
54 | 54 | ||
55 | IMAGE_DEPENDS_sdcard = "parted-native dosfstools-native mtools-native \ | 55 | IMAGE_DEPENDS_sdcard = "parted-native dosfstools-native mtools-native \ |
56 | virtual/kernel ${IMAGE_BOOTLOADER}" | 56 | virtual/kernel ${IMAGE_BOOTLOADER}" |
@@ -71,17 +71,29 @@ SDCARD_GENERATION_COMMAND_mx6 = "generate_imx_sdcard" | |||
71 | # | 71 | # |
72 | # The disk layout used is: | 72 | # The disk layout used is: |
73 | # | 73 | # |
74 | # 0 - 1M - reserved to bootloader (not partitioned) | 74 | # 0 -> IMAGE_ROOTFS_ALIGNMENT - reserved to bootloader (not partitioned) |
75 | # 1M - BOOT_SPACE - kernel | 75 | # IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - kernel and other data |
76 | # BOOT_SPACE - SDCARD_SIZE - rootfs | 76 | # BOOT_SPACE -> SDIMG_SIZE - rootfs |
77 | # | 77 | # |
78 | # Default Free space = 1.3x | ||
79 | # Use IMAGE_OVERHEAD_FACTOR to add more space | ||
80 | # <---------> | ||
81 | # 4MiB 8MiB SDIMG_ROOTFS 4MiB | ||
82 | # <-----------------------> <----------> <----------------------> <------------------------------> | ||
83 | # ------------------------ ------------ ------------------------ ------------------------------- | ||
84 | # | IMAGE_ROOTFS_ALIGNMENT | BOOT_SPACE | ROOTFS_SIZE | IMAGE_ROOTFS_ALIGNMENT | | ||
85 | # ------------------------ ------------ ------------------------ ------------------------------- | ||
86 | # ^ ^ ^ ^ ^ | ||
87 | # | | | | | | ||
88 | # 0 4096 4MiB + 8MiB 4MiB + 8Mib + SDIMG_ROOTFS 4MiB + 8MiB + SDIMG_ROOTFS + 4MiB | ||
78 | generate_imx_sdcard () { | 89 | generate_imx_sdcard () { |
79 | # Create partition table | 90 | # Create partition table |
80 | parted -s ${SDCARD} mklabel msdos | 91 | parted -s ${SDCARD} mklabel msdos |
81 | parted -s ${SDCARD} mkpart primary 1MiB ${BOOT_SPACE} | 92 | parted -s ${SDCARD} unit KiB mkpart primary ${IMAGE_ROOTFS_ALIGNMENT} $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) |
82 | parted -s ${SDCARD} mkpart primary ${BOOT_SPACE} 100% | 93 | parted -s ${SDCARD} unit KiB mkpart primary $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED} \+ $ROOTFS_SIZE) |
83 | parted ${SDCARD} print | 94 | parted ${SDCARD} print |
84 | 95 | ||
96 | # Burn bootloader | ||
85 | case "${IMAGE_BOOTLOADER}" in | 97 | case "${IMAGE_BOOTLOADER}" in |
86 | imx-bootlets) | 98 | imx-bootlets) |
87 | bberror "The imx-bootlets is not supported for i.MX based machines" | 99 | bberror "The imx-bootlets is not supported for i.MX based machines" |
@@ -100,6 +112,7 @@ generate_imx_sdcard () { | |||
100 | ;; | 112 | ;; |
101 | esac | 113 | esac |
102 | 114 | ||
115 | # Create boot partition image | ||
103 | BOOT_BLOCKS=$(LC_ALL=C parted -s ${SDCARD} unit b print \ | 116 | BOOT_BLOCKS=$(LC_ALL=C parted -s ${SDCARD} unit b print \ |
104 | | awk '/ 1 / { print substr($4, 1, length($4 -1)) / 1024 }') | 117 | | awk '/ 1 / { print substr($4, 1, length($4 -1)) / 1024 }') |
105 | mkfs.vfat -n "${BOOTDD_VOLUME_ID}" -S 512 -C ${WORKDIR}/boot.img $BOOT_BLOCKS | 118 | mkfs.vfat -n "${BOOTDD_VOLUME_ID}" -S 512 -C ${WORKDIR}/boot.img $BOOT_BLOCKS |
@@ -112,8 +125,9 @@ generate_imx_sdcard () { | |||
112 | fi | 125 | fi |
113 | fi | 126 | fi |
114 | 127 | ||
115 | dd if=${WORKDIR}/boot.img of=${SDCARD} conv=notrunc seek=1 bs=1M | 128 | # Burn Partition |
116 | dd if=${SDCARD_ROOTFS} of=${SDCARD} conv=notrunc seek=1 bs=${BOOT_SPACE} | 129 | dd if=${WORKDIR}/boot.img of=${SDCARD} conv=notrunc seek=1 bs=$(expr ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync |
130 | dd if=${SDCARD_ROOTFS} of=${SDCARD} conv=notrunc seek=1 bs=$(expr ${BOOT_SPACE_ALIGNED} \* 1024 + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync | ||
117 | } | 131 | } |
118 | 132 | ||
119 | # | 133 | # |
@@ -132,11 +146,23 @@ generate_mxs_sdcard () { | |||
132 | imx-bootlets) | 146 | imx-bootlets) |
133 | # The disk layout used is: | 147 | # The disk layout used is: |
134 | # | 148 | # |
135 | # 1M - BOOT_SPACE - kernel | 149 | # 0 -> IMAGE_ROOTFS_ALIGNMENT - reserved for bootstream (not partitioned) |
136 | # BOOT_SPACE - SDCARD_SIZE - rootfs | 150 | # IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - kernel and other data |
151 | # BOOT_SPACE -> SDIMG_SIZE - rootfs | ||
137 | # | 152 | # |
138 | parted -s ${SDCARD} mkpart primary 1MiB ${BOOT_SPACE} | 153 | # Default Free space = 1.3x |
139 | parted -s ${SDCARD} mkpart primary ${BOOT_SPACE} 100% | 154 | # Use IMAGE_OVERHEAD_FACTOR to add more space |
155 | # <---------> | ||
156 | # 4MiB 8MiB SDIMG_ROOTFS 4KiB | ||
157 | # <-----------------------> <----------> <----------------------> <------------------------------> | ||
158 | # ------------------------ ------------ ------------------------ ------------------------------- | ||
159 | # | IMAGE_ROOTFS_ALIGNMENT | BOOT_SPACE | ROOTFS_SIZE | IMAGE_ROOTFS_ALIGNMENT | | ||
160 | # ------------------------ ------------ ------------------------ ------------------------------- | ||
161 | # ^ ^ ^ ^ ^ | ||
162 | # | | | | | | ||
163 | # 0 4096 4MiB + 8MiB 4MiB + 8Mib + SDIMG_ROOTFS 4MiB + 8MiB + SDIMG_ROOTFS + 4MiB | ||
164 | parted -s ${SDCARD} unit KiB mkpart primary ${IMAGE_ROOTFS_ALIGNMENT} $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) | ||
165 | parted -s ${SDCARD} unit KiB mkpart primary $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED} \+ $ROOTFS_SIZE) | ||
140 | 166 | ||
141 | # Empty 4 bytes from boot partition | 167 | # Empty 4 bytes from boot partition |
142 | dd if=/dev/zero of=${SDCARD} conv=notrunc seek=2048 count=4 | 168 | dd if=/dev/zero of=${SDCARD} conv=notrunc seek=2048 count=4 |
@@ -151,11 +177,29 @@ generate_mxs_sdcard () { | |||
151 | # 2M - BOOT_SPACE - kernel | 177 | # 2M - BOOT_SPACE - kernel |
152 | # BOOT_SPACE - SDCARD_SIZE - rootfs | 178 | # BOOT_SPACE - SDCARD_SIZE - rootfs |
153 | # | 179 | # |
154 | parted -s ${SDCARD} mkpart primary 1MiB 2MiB | 180 | # The disk layout used is: |
155 | parted -s ${SDCARD} mkpart primary 2MiB ${BOOT_SPACE} | 181 | # |
156 | parted -s ${SDCARD} mkpart primary ${BOOT_SPACE} 100% | 182 | # 1M -> 2M - reserved to bootloader and other data |
183 | # 2M -> BOOT_SPACE - kernel and other data | ||
184 | # BOOT_SPACE -> SDIMG_SIZE - rootfs | ||
185 | # | ||
186 | # Default Free space = 1.3x | ||
187 | # Use IMAGE_OVERHEAD_FACTOR to add more space | ||
188 | # <---------> | ||
189 | # 4MiB 8MiB SDIMG_ROOTFS 4MiB | ||
190 | # <-----------------------> <-------------> <----------------------> <------------------------------> | ||
191 | # ---------------------------------------- ------------------------ ------------------------------- | ||
192 | # | | | |ROOTFS_SIZE | IMAGE_ROOTFS_ALIGNMENT | | ||
193 | # ---------------------------------------- ------------------------ ------------------------------- | ||
194 | # ^ ^ ^ ^ ^ ^ ^ | ||
195 | # | | | | | | | | ||
196 | # 0 1M 2M 4M 4MiB + BOOTSPACE 4MiB + BOOTSPACE + SDIMG_ROOTFS 4MiB + BOOTSPACE + SDIMG_ROOTFS + 4MiB | ||
197 | # | ||
198 | parted -s ${SDCARD} unit KiB mkpart primary 1024 2048 | ||
199 | parted -s ${SDCARD} unit KiB mkpart primary 2048 $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) | ||
200 | parted -s ${SDCARD} unit KiB mkpart primary $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED} \+ $ROOTFS_SIZE) | ||
157 | 201 | ||
158 | dd if=${DEPLOY_DIR_IMAGE}/u-boot-${MACHINE}.${UBOOT_SUFFIX_SDCARD} of=${SDCARD} conv=notrunc seek=1 skip=${UBOOT_PADDING} bs=1MiB | 202 | dd if=${DEPLOY_DIR_IMAGE}/u-boot-${MACHINE}.${UBOOT_SUFFIX_SDCARD} of=${SDCARD} conv=notrunc seek=1 skip=${UBOOT_PADDING} bs=$(expr 1024 \* 1024) |
159 | BOOT_BLOCKS=$(LC_ALL=C parted -s ${SDCARD} unit b print \ | 203 | BOOT_BLOCKS=$(LC_ALL=C parted -s ${SDCARD} unit b print \ |
160 | | awk '/ 2 / { print substr($4, 1, length($4 -1)) / 1024 }') | 204 | | awk '/ 2 / { print substr($4, 1, length($4 -1)) / 1024 }') |
161 | 205 | ||
@@ -169,7 +213,7 @@ generate_mxs_sdcard () { | |||
169 | fi | 213 | fi |
170 | fi | 214 | fi |
171 | 215 | ||
172 | dd if=${WORKDIR}/boot.img of=${SDCARD} conv=notrunc seek=2 bs=1MiB | 216 | dd if=${WORKDIR}/boot.img of=${SDCARD} conv=notrunc seek=2 bs=$(expr 1024 \* 1024) |
173 | ;; | 217 | ;; |
174 | *) | 218 | *) |
175 | bberror "Unkown IMAGE_BOOTLOADER value" | 219 | bberror "Unkown IMAGE_BOOTLOADER value" |
@@ -183,7 +227,7 @@ generate_mxs_sdcard () { | |||
183 | 227 | ||
184 | parted ${SDCARD} print | 228 | parted ${SDCARD} print |
185 | 229 | ||
186 | dd if=${SDCARD_ROOTFS} of=${SDCARD} conv=notrunc seek=1 bs=${BOOT_SPACE} | 230 | dd if=${SDCARD_ROOTFS} of=${SDCARD} conv=notrunc seek=1 bs=$(expr ${BOOT_SPACE_ALIGNED} \* 1024 + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync |
187 | } | 231 | } |
188 | 232 | ||
189 | IMAGE_CMD_sdcard () { | 233 | IMAGE_CMD_sdcard () { |
@@ -192,8 +236,13 @@ IMAGE_CMD_sdcard () { | |||
192 | exit 1 | 236 | exit 1 |
193 | fi | 237 | fi |
194 | 238 | ||
239 | # Align boot partition and calculate total SD card image size | ||
240 | BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE} + ${IMAGE_ROOTFS_ALIGNMENT} - 1) | ||
241 | BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE_ALIGNED} - ${BOOT_SPACE_ALIGNED} % ${IMAGE_ROOTFS_ALIGNMENT}) | ||
242 | SDCARD_SIZE=$(expr ${IMAGE_ROOTFS_ALIGNMENT} + ${BOOT_SPACE_ALIGNED} + $ROOTFS_SIZE + ${IMAGE_ROOTFS_ALIGNMENT}) | ||
243 | |||
195 | # Initialize a sparse file | 244 | # Initialize a sparse file |
196 | dd if=/dev/zero of=${SDCARD} bs=1 count=0 seek=$(expr 1000 \* 1000 \* ${SDCARD_SIZE}) | 245 | dd if=/dev/zero of=${SDCARD} bs=1 count=0 seek=$(expr 1024 \* ${SDCARD_SIZE}) |
197 | 246 | ||
198 | ${SDCARD_GENERATION_COMMAND} | 247 | ${SDCARD_GENERATION_COMMAND} |
199 | } | 248 | } |