-
Notifications
You must be signed in to change notification settings - Fork 192
/
mender-ubimg.bbclass
116 lines (92 loc) · 3.53 KB
/
mender-ubimg.bbclass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# Class that creates an UBI image with an Mender layout
# The UBI volume scheme is:
# ubi0: first rootfs, active
# ubi1: second rootfs, inactive, mirror of first,
# available as failsafe for when some update fails
# ubi2: persistent data partition
inherit image
inherit image_types
do_image_ubimg[depends] += "mtd-utils-native:do_populate_sysroot rsync-native:do_populate_sysroot"
IMAGE_CMD_ubimg () {
set -e -x
# For some reason, logging is not working correctly inside IMAGE_CMD bodies,
# so wrap all logging in these functions that also have an echo. This won't
# prevent warnings from being hidden deep in log files, but there is nothing
# we can do about that.
ubimg_warning() {
echo "$@"
bbwarn "$@"
}
ubimg_fatal() {
echo "$@"
bbfatal "$@"
}
mkdir -p "${WORKDIR}"
# Workaround for the fact that the image builder requires this directory,
# despite not using it. If "rm_work" is enabled, this directory won't always
# exist.
mkdir -p "${IMAGE_ROOTFS}"
if [ "${MENDER_BOOT_PART_SIZE_MB}" != "0" ]; then
ubimg_fatal "Boot partition is not supported for ubimg. MENDER_BOOT_PART_SIZE_MB should be set to 0."
fi
if ${@bb.utils.contains("MENDER_FEATURES", "mender-uboot", "true", "false", d)}; then
# U-Boot doesn't allow putting both of the redundant environments on the
# same volume, so we must split it and put each half on a separate volume.
local uboot_env_vol_size=$(expr $(stat -c %s ${DEPLOY_DIR_IMAGE}/uboot.env) / 2)
# Make sure it is divisible by the erase block.
local alignment=${MENDER_PARTITION_ALIGNMENT}
if [ $(expr $uboot_env_vol_size % $alignment || true) -ne 0 ]; then
bbfatal "U-Boot environment size is not an even multiple of MENDER_PARTITION_ALIGNMENT ($alignment)."
fi
dd if=${DEPLOY_DIR_IMAGE}/uboot.env of=${WORKDIR}/ubimg-uboot-env-1 bs=$uboot_env_vol_size count=1
dd if=${DEPLOY_DIR_IMAGE}/uboot.env of=${WORKDIR}/ubimg-uboot-env-2 bs=$uboot_env_vol_size skip=1 count=1
fi
cat > ${WORKDIR}/ubimg-${IMAGE_NAME}.cfg <<EOF
[rootfsA]
mode=ubi
image=${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.ubifs
vol_id=0
vol_size=${MENDER_CALC_ROOTFS_SIZE}KiB
vol_type=dynamic
vol_name=rootfsa
[rootfsB]
mode=ubi
image=${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.ubifs
vol_id=1
vol_size=${MENDER_CALC_ROOTFS_SIZE}KiB
vol_type=dynamic
vol_name=rootfsb
[data]
mode=ubi
image=${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.dataimg
vol_id=2
vol_size=${MENDER_DATA_PART_SIZE_MB}MiB
vol_type=dynamic
vol_name=data
EOF
if ${@bb.utils.contains("MENDER_FEATURES", "mender-uboot", "true", "false", d)}; then
cat >> ${WORKDIR}/ubimg-${IMAGE_NAME}.cfg <<EOF
[u-boot-env-1]
mode=ubi
image=${WORKDIR}/ubimg-uboot-env-1
vol_id=${MENDER_UBOOT_ENV_UBIVOL_NUMBER_1}
vol_size=$uboot_env_vol_size
vol_type=dynamic
vol_name=u-boot-env-1
[u-boot-env-2]
mode=ubi
image=${WORKDIR}/ubimg-uboot-env-2
vol_id=${MENDER_UBOOT_ENV_UBIVOL_NUMBER_2}
vol_size=$uboot_env_vol_size
vol_type=dynamic
vol_name=u-boot-env-2
EOF
fi
cat ${WORKDIR}/ubimg-${IMAGE_NAME}.cfg
ubinize -o ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.ubimg ${UBINIZE_ARGS} ${WORKDIR}/ubimg-${IMAGE_NAME}.cfg
# Cleanup cfg file
mv ${WORKDIR}/ubimg-${IMAGE_NAME}.cfg ${IMGDEPLOYDIR}/
}
IMAGE_TYPEDEP_ubimg_append = " ubifs dataimg ${@bb.utils.contains('MENDER_BOOT_PART_SIZE_MB', '0', '', 'bootimg', d)}"
# So that we can use the files from excluded paths in the full images.
do_image_ubimg[respect_exclude_path] = "0"