forked from OpenELEC/OpenELEC.tv
/
mkimage
executable file
·253 lines (217 loc) · 8.32 KB
/
mkimage
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
#!/bin/bash
################################################################################
# This file is part of OpenELEC - http://www.openelec.tv
# Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv)
#
# OpenELEC is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# OpenELEC is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenELEC. If not, see <http://www.gnu.org/licenses/>.
################################################################################
################################################################################
# variables such as $ROOT $PATH etc... that are required for this
# script to work must be passed via env ... in scripts/image
################################################################################
# set variables
OE_TMP=$(mktemp -d)
LOOP=$(losetup -f)
SYSTEM_SIZE=256
STORAGE_SIZE=32 # STORAGE_SIZE must be >= 32 !
DISK_SIZE=$(( $SYSTEM_SIZE + $STORAGE_SIZE + 4 ))
DISK="$TARGET_IMG/$IMAGE_NAME.img"
# functions
cleanup() {
echo "image: cleanup..."
umount "$OE_TMP" &>/dev/null || :
losetup -d "$LOOP"
[ -f "$OE_TMP/ldlinux.sys" ] && chattr -i "$OE_TMP/ldlinux.sys" || :
rm -rf "$OE_TMP"
exit
}
trap cleanup SIGINT
# generate volume id for fat partition
UUID_1=$(date '+%d%m')
UUID_2=$(date '+%M%S')
FAT_VOL_ID="${UUID_1}${UUID_2}"
UUID_SYSTEM="${UUID_1}-${UUID_2}"
# ensure loopX not in use
umount "$OE_TMP" &>/dev/null || :
umount "$LOOP" &>/dev/null >/dev/null || :
losetup -d "$LOOP" &>/dev/null >/dev/null || :
# create an image
echo "image: creating image: $DISK..."
dd if=/dev/zero of="$DISK" bs=1M count="$DISK_SIZE"
sync
# write a disklabel
echo "image: creating partition table on $DISK..."
losetup "$LOOP" "$DISK"
if [ "$BOOTLOADER" = "syslinux" ]; then
parted -s "$LOOP" mklabel gpt
else
parted -s "$LOOP" mklabel msdos
fi
sync
# create part1
echo "image: creating part1 on $DISK..."
SYSTEM_PART_END=$(( $SYSTEM_SIZE * 1024 * 1024 / 512 + 2048 ))
parted -s "$LOOP" -a min unit s mkpart primary fat32 2048 $SYSTEM_PART_END
if [ "$BOOTLOADER" = "syslinux" ]; then
parted -s "$LOOP" set 1 legacy_boot on
else
parted -s "$LOOP" set 1 boot on
fi
# create part2
echo "image: creating part2 on $DISK..."
STORAGE_PART_START=$(( $SYSTEM_PART_END + 2048 ))
STORAGE_PART_END=$(( $STORAGE_PART_START + (( $STORAGE_SIZE * 1024 * 1024 / 512 )) ))
parted -s "$LOOP" -a min unit s mkpart primary ext4 $STORAGE_PART_START $STORAGE_PART_END
sync
if [ "$BOOTLOADER" = "syslinux" ]; then
# write mbr
echo "image: writing mbr..."
MBR="$ROOT/$TOOLCHAIN/share/syslinux/gptmbr.bin"
if [ -n "$MBR" ]; then
dd bs=440 count=1 conv=notrunc if="$MBR" of="$LOOP"
fi
sync
fi
# create filesystem on part1
losetup -d "$LOOP"
echo "image: creating filesystem on part1..."
OFFSET=$(( 2048 * 512 ))
SIZELIMIT=$(( $SYSTEM_SIZE * 1024 * 1024 ))
losetup -o $OFFSET --sizelimit $SIZELIMIT "$LOOP" "$DISK"
if [ "$BOOTLOADER" = "syslinux" ]; then
mkfs.vfat -i "$FAT_VOL_ID" "$LOOP"
elif [ "$BOOTLOADER" = "bcm2835-bootloader" -o "$BOOTLOADER" = "u-boot" ]; then
mkfs.vfat "$LOOP"
fi
sync
# mount partition
echo "image: mounting part1 on $OE_TMP..."
mount "$LOOP" "$OE_TMP"
if [ "$BOOTLOADER" = "syslinux" ]; then
# create bootloader configuration
echo "image: creating bootloader configuration..."
cat << EOF > "$OE_TMP"/syslinux.cfg
SAY Press <TAB> to edit options
DEFAULT installer
TIMEOUT 50
PROMPT 1
LABEL installer
KERNEL /$KERNEL_NAME
APPEND boot=UUID=$UUID_SYSTEM installer quiet tty vga=current
LABEL live
KERNEL /$KERNEL_NAME
APPEND boot=UUID=$UUID_SYSTEM live quiet tty vga=current
EOF
# install extlinux
echo "image: installing extlinux to part1..."
syslinux --heads=4 --sector=32 -i "$LOOP"
# copy files
echo "image: copying files to part1..."
cp $TARGET_IMG/$IMAGE_NAME.kernel "$OE_TMP/$KERNEL_NAME"
cp $TARGET_IMG/$IMAGE_NAME.system "$OE_TMP/SYSTEM"
mkdir -p "$OE_TMP/EFI/BOOT"
cp $ROOT/$TOOLCHAIN/share/syslinux/bootx64.efi "$OE_TMP/EFI/BOOT"
cp $ROOT/$TOOLCHAIN/share/syslinux/ldlinux.e64 "$OE_TMP/EFI/BOOT"
cp "$OE_TMP"/syslinux.cfg "$OE_TMP"/EFI/BOOT/syslinux.cfg
elif [ "$BOOTLOADER" = "bcm2835-bootloader" ]; then
# create bootloader configuration
echo "image: creating bootloader configuration..."
cat << EOF > "$OE_TMP"/cmdline.txt
boot=/dev/mmcblk0p1 disk=/dev/mmcblk0p2 quiet $EXTRA_CMDLINE
EOF
# copy files
echo "image: copying files to part1..."
cp $TARGET_IMG/$IMAGE_NAME.kernel "$OE_TMP/$KERNEL_NAME"
cp $TARGET_IMG/$IMAGE_NAME.system "$OE_TMP/SYSTEM"
cp $RELEASE_DIR/3rdparty/bootloader/bootcode.bin "$OE_TMP"
cp $RELEASE_DIR/3rdparty/bootloader/fixup.dat "$OE_TMP"
cp $RELEASE_DIR/3rdparty/bootloader/start.elf "$OE_TMP"
cp $RELEASE_DIR/3rdparty/bootloader/config.txt "$OE_TMP"
for dtb in $RELEASE_DIR/3rdparty/bootloader/*.dtb ; do
if [ -f $dtb ] ; then
cp "$dtb" "$OE_TMP"
fi
done
if [ -d $RELEASE_DIR/3rdparty/bootloader/overlays ]; then
cp -r $RELEASE_DIR/3rdparty/bootloader/overlays "$OE_TMP"
fi
elif [ "$BOOTLOADER" = "u-boot" ]; then
# create bootloader configuration
echo "image: creating bootloader configuration..."
if [ -n "$UBOOT_SYSTEM" -a -f "$RELEASE_DIR/3rdparty/bootloader/uEnv-$UBOOT_SYSTEM.txt" ]; then
cp "$RELEASE_DIR/3rdparty/bootloader/uEnv-$UBOOT_SYSTEM.txt" "$OE_TMP/uEnv.txt"
elif [ -f "$RELEASE_DIR/3rdparty/bootloader/uEnv.txt" ]; then
cp $RELEASE_DIR/3rdparty/bootloader/uEnv.txt "$OE_TMP"
elif [ -f "$RELEASE_DIR/3rdparty/bootloader/boot.scr" ]; then
cp $RELEASE_DIR/3rdparty/bootloader/boot.scr "$OE_TMP"
fi
echo "image: installing u-boot bootloader..."
if [ -n "$UBOOT_SYSTEM" -a -f "$RELEASE_DIR/3rdparty/bootloader/SPL-$UBOOT_SYSTEM" ]; then
dd if="$RELEASE_DIR/3rdparty/bootloader/SPL-$UBOOT_SYSTEM" of="$DISK" bs=512 seek=2 conv=notrunc
elif [ -f "$RELEASE_DIR/3rdparty/bootloader/SPL" ]; then
dd if="$RELEASE_DIR/3rdparty/bootloader/SPL" of="$DISK" bs=512 seek=2 conv=notrunc
elif [ -n "$UBOOT_SYSTEM" -a -f "$RELEASE_DIR/3rdparty/bootloader/u-boot-$UBOOT_SYSTEM.imx" ]; then
dd if="$RELEASE_DIR/3rdparty/bootloader/u-boot-$UBOOT_SYSTEM.imx" of="$DISK" bs=512 seek=2 conv=notrunc
elif [ -f "$RELEASE_DIR/3rdparty/bootloader/u-boot.imx" ]; then
dd if="$RELEASE_DIR/3rdparty/bootloader/u-boot.imx" of="$DISK" bs=512 seek=2 conv=notrunc
fi
echo "image: copying files to part1..."
cp $TARGET_IMG/$IMAGE_NAME.kernel "$OE_TMP/$KERNEL_NAME"
cp $TARGET_IMG/$IMAGE_NAME.system "$OE_TMP/SYSTEM"
if [ -n "$UBOOT_SYSTEM" -a -f "$RELEASE_DIR/3rdparty/bootloader/u-boot-$UBOOT_SYSTEM.img" ]; then
cp "$RELEASE_DIR/3rdparty/bootloader/u-boot-$UBOOT_SYSTEM.img" "$OE_TMP/u-boot.img"
elif [ -f $RELEASE_DIR/3rdparty/bootloader/u-boot.img ]; then
cp $RELEASE_DIR/3rdparty/bootloader/u-boot.img "$OE_TMP"
fi
for dtb in $RELEASE_DIR/3rdparty/bootloader/*.dtb ; do
if [ -f $dtb ] ; then
cp "$dtb" "$OE_TMP"
fi
done
fi # bootloader
# unmount part1
echo "image: unmounting part1..."
sync
umount "$LOOP"
# create filesystem on part2
losetup -d "$LOOP"
echo "image: creating filesystem on part2..."
OFFSET=$(( $STORAGE_PART_START * 512 ))
SIZELIMIT=$(( $STORAGE_SIZE * 1024 * 1024 ))
losetup -o $OFFSET --sizelimit $SIZELIMIT "$LOOP" "$DISK"
mke2fs -q -t ext4 -m 0 "$LOOP"
tune2fs -U $UUID_STORAGE "$LOOP"
e2fsck -n "$LOOP"
sync
# mount part2
echo "image: mounting part2 on $OE_TMP..."
mount "$LOOP" "$OE_TMP"
# add resize mark
if [ "$BOOTLOADER" != "syslinux" ]; then
touch "$OE_TMP/.please_resize_me"
sync
fi
# unmount part2
echo "image: unmounting part2..."
umount "$LOOP"
sync
# gzip
echo "image: compressing..."
gzip $DISK
# set owner
if [ -n "$SUDO_USER" ] ; then
chown $SUDO_USER: $DISK.gz
fi
# cleanup
cleanup