mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-04-20 12:37:19 +00:00

Change the prompt to instruct the end user to wait for the installer instead of just "Press TAB for boot options". Hopefully more intuitive now. Rebrand to LE in the code also. :)
326 lines
12 KiB
Bash
Executable File
326 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
################################################################################
|
|
# This file is part of OpenELEC - http://www.openelec.tv
|
|
# Copyright (C) 2009-2016 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
|
|
LE_TMP=$(mktemp -d)
|
|
SAVE_ERROR="$LE_TMP/save_error"
|
|
|
|
if [ -z "$SYSTEM_SIZE" -o -z "$SYSTEM_PART_START" ]; then
|
|
echo "mkimage: SYSTEM_SIZE and SYSTEM_PART_START must be configured!"
|
|
exit 1
|
|
fi
|
|
|
|
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..."
|
|
rm -rf "$LE_TMP"
|
|
echo
|
|
exit
|
|
}
|
|
|
|
show_error() {
|
|
echo "image: error happen..."
|
|
echo
|
|
cat "$SAVE_ERROR"
|
|
echo
|
|
cleanup
|
|
exit
|
|
}
|
|
|
|
trap cleanup SIGINT
|
|
|
|
# generate volume id for fat partition
|
|
UUID_1=$(date '+%d%m')
|
|
UUID_2=$(date '+%M%S')
|
|
FAT_SERIAL_NUMBER="${UUID_1}${UUID_2}"
|
|
UUID_SYSTEM="${UUID_1}-${UUID_2}"
|
|
FAT_VOLUME_LABEL="LIBREELEC"
|
|
|
|
# create an image
|
|
echo
|
|
echo "image: creating file $(basename $DISK)..."
|
|
dd if=/dev/zero of="$DISK" bs=1M count="$DISK_SIZE" conv=fsync >"$SAVE_ERROR" 2>&1 || show_error
|
|
|
|
# write a disklabel
|
|
echo "image: creating partition table..."
|
|
if [ "$BOOTLOADER" = "syslinux" ]; then
|
|
parted -s "$DISK" mklabel gpt
|
|
else
|
|
parted -s "$DISK" mklabel msdos
|
|
fi
|
|
sync
|
|
|
|
# create part1
|
|
echo "image: creating part1..."
|
|
SYSTEM_PART_END=$(( ($SYSTEM_SIZE * 1024 * 1024 / 512) + $SYSTEM_PART_START ))
|
|
parted -s "$DISK" -a min unit s mkpart primary fat32 $SYSTEM_PART_START $SYSTEM_PART_END
|
|
if [ "$BOOTLOADER" = "syslinux" ]; then
|
|
parted -s "$DISK" set 1 legacy_boot on
|
|
else
|
|
parted -s "$DISK" set 1 boot on
|
|
fi
|
|
sync
|
|
# create part2
|
|
echo "image: creating part2..."
|
|
STORAGE_PART_START=$(( $SYSTEM_PART_END + 2048 ))
|
|
STORAGE_PART_END=$(( $STORAGE_PART_START + (( $STORAGE_SIZE * 1024 * 1024 / 512 )) ))
|
|
parted -s "$DISK" -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=fsync,notrunc if="$MBR" of="$DISK" >"$SAVE_ERROR" 2>&1 || show_error
|
|
fi
|
|
fi
|
|
|
|
# create filesystem on part1
|
|
echo "image: creating filesystem on part1..."
|
|
OFFSET=$(( $SYSTEM_PART_START * 512 ))
|
|
HEADS=4
|
|
TRACKS=32
|
|
SECTORS=$(( $SYSTEM_SIZE * 1024 * 1024 / 512 / $HEADS / $TRACKS ))
|
|
|
|
shopt -s expand_aliases # enables alias expansion in script
|
|
alias mformat="mformat -i $DISK@@$OFFSET -h $HEADS -t $TRACKS -s $SECTORS"
|
|
alias mcopy="mcopy -i $DISK@@$OFFSET"
|
|
alias mmd="mmd -i $DISK@@$OFFSET"
|
|
|
|
if [ "$BOOTLOADER" = "syslinux" ]; then
|
|
mformat -v "$FAT_VOLUME_LABEL" -N "$FAT_SERIAL_NUMBER" ::
|
|
elif [ "$BOOTLOADER" = "bcm2835-bootloader" -o "$BOOTLOADER" = "u-boot" ]; then
|
|
mformat -v "$FAT_VOLUME_LABEL" ::
|
|
fi
|
|
sync
|
|
|
|
if [ "$BOOTLOADER" = "syslinux" ]; then
|
|
# create bootloader configuration
|
|
echo "image: creating bootloader configuration..."
|
|
cat << EOF > "$LE_TMP"/syslinux.cfg
|
|
SAY Wait for installer to start or press <TAB> for more options (live, run)
|
|
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
|
|
|
|
LABEL run
|
|
KERNEL /$KERNEL_NAME
|
|
APPEND boot=UUID=$UUID_SYSTEM disk=UUID=$UUID_STORAGE portable quiet
|
|
EOF
|
|
|
|
if [ "$PROJECT" = Virtual ]; then
|
|
cat << EOF > "$LE_TMP"/syslinux.cfg
|
|
DEFAULT virtual
|
|
TIMEOUT 50
|
|
PROMPT 0
|
|
|
|
LABEL virtual
|
|
KERNEL /$KERNEL_NAME
|
|
APPEND boot=UUID=$UUID_SYSTEM disk=UUID=$UUID_STORAGE quiet tty vga=current
|
|
EOF
|
|
fi
|
|
|
|
mcopy "$LE_TMP/syslinux.cfg" ::
|
|
|
|
# install extlinux
|
|
echo "image: installing extlinux to part1..."
|
|
syslinux.mtools --offset "$OFFSET" -i "$DISK"
|
|
|
|
# copy files
|
|
echo "image: copying files to part1..."
|
|
mcopy $TARGET_IMG/$IMAGE_NAME.kernel "::/$KERNEL_NAME"
|
|
mcopy $TARGET_IMG/$IMAGE_NAME.system ::/SYSTEM
|
|
mcopy $RELEASE_DIR/target/KERNEL.md5 "::/$KERNEL_NAME.md5"
|
|
mcopy $RELEASE_DIR/target/SYSTEM.md5 ::/SYSTEM.md5
|
|
|
|
mmd EFI EFI/BOOT
|
|
mcopy $ROOT/$TOOLCHAIN/share/syslinux/bootx64.efi ::/EFI/BOOT
|
|
mcopy $ROOT/$TOOLCHAIN/share/syslinux/ldlinux.e64 ::/EFI/BOOT
|
|
mcopy "$LE_TMP"/syslinux.cfg ::/EFI/BOOT
|
|
elif [ "$BOOTLOADER" = "bcm2835-bootloader" ]; then
|
|
# create bootloader configuration
|
|
echo "image: creating bootloader configuration..."
|
|
cat << EOF > "$LE_TMP"/cmdline.txt
|
|
boot=/dev/mmcblk0p1 disk=/dev/mmcblk0p2 quiet $EXTRA_CMDLINE
|
|
EOF
|
|
|
|
mcopy "$LE_TMP/cmdline.txt" ::
|
|
|
|
# copy files
|
|
echo "image: copying files to part1..."
|
|
mcopy $TARGET_IMG/$IMAGE_NAME.kernel "::/$KERNEL_NAME"
|
|
mcopy $TARGET_IMG/$IMAGE_NAME.system ::/SYSTEM
|
|
mcopy $RELEASE_DIR/target/KERNEL.md5 "::/$KERNEL_NAME.md5"
|
|
mcopy $RELEASE_DIR/target/SYSTEM.md5 ::/SYSTEM.md5
|
|
|
|
mcopy $RELEASE_DIR/3rdparty/bootloader/bootcode.bin ::
|
|
mcopy $RELEASE_DIR/3rdparty/bootloader/fixup.dat ::
|
|
mcopy $RELEASE_DIR/3rdparty/bootloader/start.elf ::
|
|
mcopy $RELEASE_DIR/3rdparty/bootloader/config.txt ::
|
|
mcopy $RELEASE_DIR/3rdparty/bootloader/distroconfig.txt ::
|
|
|
|
if [ -f $RELEASE_DIR/3rdparty/bootloader/dt-blob.bin ]; then
|
|
mcopy $RELEASE_DIR/3rdparty/bootloader/dt-blob.bin ::
|
|
fi
|
|
|
|
for dtb in $RELEASE_DIR/3rdparty/bootloader/*.dtb ; do
|
|
if [ -f $dtb ] ; then
|
|
mcopy "$dtb" ::/$(basename "$dtb")
|
|
fi
|
|
done
|
|
|
|
if [ -d $RELEASE_DIR/3rdparty/bootloader/overlays ]; then
|
|
mcopy -s $RELEASE_DIR/3rdparty/bootloader/overlays ::
|
|
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
|
|
mcopy "$RELEASE_DIR/3rdparty/bootloader/uEnv-$UBOOT_SYSTEM.txt" ::/uEnv.txt
|
|
elif [ -f "$RELEASE_DIR/3rdparty/bootloader/uEnv.txt" ]; then
|
|
mcopy $RELEASE_DIR/3rdparty/bootloader/uEnv.txt ::
|
|
elif [ -f "$RELEASE_DIR/3rdparty/bootloader/boot.scr" ]; then
|
|
mcopy $RELEASE_DIR/3rdparty/bootloader/boot.scr ::
|
|
elif [ -f "$RELEASE_DIR/3rdparty/bootloader/boot.ini" ]; then
|
|
mcopy $RELEASE_DIR/3rdparty/bootloader/boot.ini ::
|
|
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=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error
|
|
elif [ -f "$RELEASE_DIR/3rdparty/bootloader/SPL" ]; then
|
|
dd if="$RELEASE_DIR/3rdparty/bootloader/SPL" of="$DISK" bs=512 seek=2 conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error
|
|
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=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error
|
|
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=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error
|
|
elif [ -f "$RELEASE_DIR/3rdparty/bootloader/u-boot-fuse" ]; then
|
|
# allow custom dd script for vendor specific fusing
|
|
. $RELEASE_DIR/3rdparty/bootloader/u-boot-fuse
|
|
elif [ -f "$RELEASE_DIR/3rdparty/bootloader/u-boot" ]; then
|
|
dd if="$RELEASE_DIR/3rdparty/bootloader/u-boot" of="$DISK" conv=fsync,notrunc bs=1 count=112 >"$SAVE_ERROR" 2>&1 || show_error
|
|
dd if="$RELEASE_DIR/3rdparty/bootloader/u-boot" of="$DISK" conv=fsync,notrunc bs=512 skip=1 seek=1 >"$SAVE_ERROR" 2>&1 || show_error
|
|
fi
|
|
|
|
echo "image: copying files to part1..."
|
|
mcopy $TARGET_IMG/$IMAGE_NAME.kernel "::/$KERNEL_NAME"
|
|
mcopy $TARGET_IMG/$IMAGE_NAME.system ::/SYSTEM
|
|
mcopy $RELEASE_DIR/target/KERNEL.md5 "::/$KERNEL_NAME.md5"
|
|
mcopy $RELEASE_DIR/target/SYSTEM.md5 ::/SYSTEM.md5
|
|
|
|
if [ -n "$UBOOT_SYSTEM" -a -f "$RELEASE_DIR/3rdparty/bootloader/u-boot-$UBOOT_SYSTEM.img" ]; then
|
|
mcopy "$RELEASE_DIR/3rdparty/bootloader/u-boot-$UBOOT_SYSTEM.img" ::/u-boot.img
|
|
elif [ -f $RELEASE_DIR/3rdparty/bootloader/u-boot.img ]; then
|
|
mcopy $RELEASE_DIR/3rdparty/bootloader/u-boot.img ::
|
|
fi
|
|
|
|
if [ -f $RELEASE_DIR/3rdparty/bootloader/boot-logo.bmp.gz ]; then
|
|
mcopy $RELEASE_DIR/3rdparty/bootloader/boot-logo.bmp.gz ::
|
|
fi
|
|
|
|
for dtb in $RELEASE_DIR/3rdparty/bootloader/*.dtb ; do
|
|
if [ -f $dtb ] ; then
|
|
mcopy "$dtb" ::/$(basename "$dtb")
|
|
fi
|
|
done
|
|
|
|
# copy Amlogic device tree image
|
|
if [ -f "$RELEASE_DIR/3rdparty/bootloader/dtb.img" ]; then
|
|
mcopy $RELEASE_DIR/3rdparty/bootloader/dtb.img ::
|
|
fi
|
|
fi # bootloader
|
|
|
|
# extract part2 from image to format and copy files
|
|
echo "image: extracting part2 from image..."
|
|
STORAGE_PART_COUNT=$(( $STORAGE_PART_END - $STORAGE_PART_START + 1 ))
|
|
sync
|
|
dd if="$DISK" of="$LE_TMP/part2.ext4" bs=512 skip="$STORAGE_PART_START" count="$STORAGE_PART_COUNT" conv=fsync >"$SAVE_ERROR" 2>&1 || show_error
|
|
|
|
# create filesystem on part2
|
|
echo "image: creating filesystem on part2..."
|
|
mke2fs -F -q -t ext4 -m 0 "$LE_TMP/part2.ext4"
|
|
tune2fs -U $UUID_STORAGE "$LE_TMP/part2.ext4" >"$SAVE_ERROR" 2>&1 || show_error
|
|
e2fsck -n "$LE_TMP/part2.ext4" >"$SAVE_ERROR" 2>&1 || show_error
|
|
sync
|
|
|
|
# add resize mark
|
|
mkdir "$LE_TMP/part2.fs"
|
|
touch "$LE_TMP/part2.fs/.please_resize_me"
|
|
echo "image: populating filesystem on part2..."
|
|
populatefs -U -d "$LE_TMP/part2.fs" "$LE_TMP/part2.ext4" >"$SAVE_ERROR" 2>&1 || show_error
|
|
sync
|
|
e2fsck -n "$LE_TMP/part2.ext4" >"$SAVE_ERROR" 2>&1 || show_error
|
|
|
|
# merge part2 back to disk image
|
|
echo "image: merging part2 back to image..."
|
|
dd if="$LE_TMP/part2.ext4" of="$DISK" bs=512 seek="$STORAGE_PART_START" conv=fsync,notrunc >"$SAVE_ERROR" 2>&1 || show_error
|
|
|
|
|
|
# extract part1 from image to run fsck
|
|
echo "image: extracting part1 from image..."
|
|
SYSTEM_PART_COUNT=$(( $SYSTEM_PART_END - $SYSTEM_PART_START + 1 ))
|
|
sync
|
|
dd if="$DISK" of="$LE_TMP/part1.fat" bs=512 skip="$SYSTEM_PART_START" count="$SYSTEM_PART_COUNT" conv=fsync >"$SAVE_ERROR" 2>&1 || show_error
|
|
echo "image: checking filesystem on part1..."
|
|
fsck -n $LE_TMP/part1.fat >"$SAVE_ERROR" 2>&1 || show_error
|
|
|
|
# create virtual images
|
|
if [ "$PROJECT" = Virtual ]; then
|
|
echo "image: creating open virtual appliance..."
|
|
qemu-img convert -O vmdk -o subformat=streamOptimized "$DISK" "$DISK.vmdk"
|
|
sed -e "s,@DISTRO@,$DISTRO,g" -e "s,@DISK@,$(basename $DISK),g" -e "s,@DISK_SIZE@,$(ls -l $DISK.vmdk | awk '{print $5}'),g" $PROJECT_DIR/$PROJECT/config/ovf.template > $DISK.ovf
|
|
tar -C $TARGET_IMG -cf $DISK.ova $(basename $DISK).ovf $(basename $DISK).vmdk
|
|
echo "image: cleaning up..."
|
|
rm $DISK.vmdk $DISK.ovf
|
|
[ -n "$SUDO_USER" ] && chown $SUDO_USER: $DISK.ova
|
|
fi
|
|
|
|
# gzip
|
|
echo "image: compressing..."
|
|
gzip $DISK
|
|
|
|
# set owner
|
|
if [ -n "$SUDO_USER" ] ; then
|
|
chown $SUDO_USER: $DISK.gz
|
|
fi
|
|
|
|
# cleanup
|
|
cleanup
|