diff --git a/packages/sysutils/busybox/scripts/init b/packages/sysutils/busybox/scripts/init index 4f72249796..c6e8657ef2 100755 --- a/packages/sysutils/busybox/scripts/init +++ b/packages/sysutils/busybox/scripts/init @@ -53,6 +53,7 @@ RUN_FSCK="yes" RUN_FSCK_DISKS="" SYSLINUX_DEFAULT="" + GRUB_DEFAULT="" NBD_DEVS="0" FLASH_FREE_MIN="5" @@ -153,6 +154,13 @@ portable) SYSLINUX_DEFAULT="run" ;; + grub_live) + LIVE=yes + GRUB_DEFAULT="Live" + ;; + grub_portable) + GRUB_DEFAULT="Run" + ;; overlay) OVERLAY=yes ;; @@ -700,7 +708,7 @@ } # Make last bootloader label (installer, live, run etc.) as the new default - update_syslinux() { + update_bootmenu() { local crnt_default if [ -n "$SYSLINUX_DEFAULT" -a -f /flash/syslinux.cfg ]; then @@ -716,6 +724,20 @@ fi fi fi + + if [ -n "\"$GRUB_DEFAULT\"" -a -f /flash/grub.cfg ]; then + if grep -q "^menuentry \"$GRUB_DEFAULT\"" /flash/grub.cfg; then + crnt_default="$(awk '/^set default/ {print substr($2,9,19)}' /flash/grub.cfg)" + if [ ! "$crnt_default" = "\"$GRUB_DEFAULT\"" ]; then + progress "Updating /flash/grub.cfg [$crnt_default -> \"$GRUB_DEFAULT\"]" + + mount -o remount,rw /flash + sed -i "s/^set default=.*/set default=\"$GRUB_DEFAULT\"/" /flash/grub.cfg + [ -f /flash/EFI/BOOT/grub.cfg ] && cp /flash/grub.cfg /flash/EFI/BOOT/grub.cfg + mount -o remount,ro /flash + fi + fi + fi } check_out_of_space() { @@ -1038,7 +1060,7 @@ load_modules \ check_disks \ mount_flash \ - update_syslinux \ + update_bootmenu \ load_splash \ mount_storage \ check_update \ diff --git a/packages/tools/grub/package.mk b/packages/tools/grub/package.mk new file mode 100755 index 0000000000..44bfaab16d --- /dev/null +++ b/packages/tools/grub/package.mk @@ -0,0 +1,69 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2016-present Team LibreELEC +# +# LibreELEC 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. +# +# LibreELEC 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 LibreELEC. If not, see . +################################################################################ + +PKG_NAME="grub" +PKG_VERSION="2.02" +PKG_ARCH="x86_64" +PKG_LICENSE="GPLv3" +PKG_SITE="https://www.gnu.org/software/grub/index.html" +PKG_URL="http://git.savannah.gnu.org/cgit/grub.git/snapshot/$PKG_NAME-$PKG_VERSION.tar.gz" +PKG_DEPENDS_TARGET="toolchain flex freetype:host" +PKG_SECTION="tools" +PKG_SHORTDESC="GNU GRUB is a Multiboot boot loader." +PKG_LONGDESC="GNU GRUB is a Multiboot boot loader that was derived from GRUB, the GRand Unified Bootloader, which was originally designed and implemented by Erich Stefan Boleyn" + +PKG_IS_ADDON="no" +PKG_AUTORECONF="no" + +PKG_CONFIGURE_OPTS_TARGET="--target=i386-pc-linux \ + --disable-nls \ + --with-platform=efi" + + unset CFLAGS + unset CPPFLAGS + unset CXXFLAGS + unset LDFLAGS + +pre_configure_target() { + unset CPP + strip_lto + cd $PKG_BUILD + ./autogen.sh +} + +make_target() { + make CC=$CC \ + AR=$AR \ + RANLIB=$RANLIB \ + CFLAGS="-I$SYSROOT_PREFIX/usr/include -fomit-frame-pointer -D_FILE_OFFSET_BITS=64" \ + LDFLAGS="-L$SYSROOT_PREFIX/usr/lib" +} + +makeinstall_target() { + cd $PKG_BUILD/grub-core + $PKG_BUILD/grub-mkimage -d . -o bootia32.efi -O i386-efi -p /EFI/BOOT \ + boot chain configfile ext2 fat linux search \ + efi_gop efi_uga part_gpt gzio \ + gettext loadenv loadbios memrw + + mkdir -p $INSTALL/usr/share/grub + cp -P $PKG_BUILD/grub-core/bootia32.efi $INSTALL/usr/share/grub + + mkdir -p $TOOLCHAIN/share/grub + cp -P $PKG_BUILD/grub-core/bootia32.efi $TOOLCHAIN/share/grub +} diff --git a/packages/tools/installer/package.mk b/packages/tools/installer/package.mk index 0e7d54116f..5b7242afe0 100644 --- a/packages/tools/installer/package.mk +++ b/packages/tools/installer/package.mk @@ -22,7 +22,7 @@ PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://libreelec.tv/" PKG_URL="" -PKG_DEPENDS_TARGET="toolchain busybox newt parted e2fsprogs syslinux" +PKG_DEPENDS_TARGET="toolchain busybox newt parted e2fsprogs syslinux grub" PKG_SECTION="tools" PKG_SHORTDESC="installer: LibreELEC.tv Install manager" PKG_LONGDESC="LibreELEC.tv Install manager to install the system on any disk" diff --git a/packages/tools/installer/scripts/installer b/packages/tools/installer/scripts/installer index 4858d4bd9c..86485f0983 100755 --- a/packages/tools/installer/scripts/installer +++ b/packages/tools/installer/scripts/installer @@ -268,6 +268,13 @@ do_install_quick() { echo "LABEL linux" >> $TMPDIR/part1/extlinux.conf echo " KERNEL /KERNEL" >> $TMPDIR/part1/extlinux.conf echo " APPEND boot=LABEL=$DISKLABEL_SYSTEM disk=LABEL=$DISKLABEL_STORAGE $EXTLINUX_PARAMETERS quiet" >> $TMPDIR/part1/extlinux.conf + echo "set timeout=\"0\"" > $TMPDIR/part1/grub.cfg + echo "set default=\"LibreELEC\"" >> $TMPDIR/part1/grub.cfg + echo "" >> $TMPDIR/part1/grub.cfg + echo "menuentry \"LibreELEC\" {" >> $TMPDIR/part1/grub.cfg + echo " search --set -f /KERNEL" >> $TMPDIR/part1/grub.cfg + echo " linux /KERNEL boot=LABEL=$DISKLABEL_SYSTEM disk=LABEL=$DISKLABEL_STORAGE quiet" >> $TMPDIR/part1/grub.cfg + echo "}" >> $TMPDIR/part1/grub.cfg # uefi boot / hybrid mode if [ "$UEFI" = "1" ]; then mv $TMPDIR/part1/extlinux.conf $TMPDIR/part1/syslinux.cfg @@ -275,6 +282,8 @@ do_install_quick() { cp $TMPDIR/part1/syslinux.cfg $TMPDIR/part1/EFI/BOOT cp /usr/share/syslinux/bootx64.efi $TMPDIR/part1/EFI/BOOT cp /usr/share/syslinux/ldlinux.e64 $TMPDIR/part1/EFI/BOOT + cp $TMPDIR/part1/grub.cfg $TMPDIR/part1/EFI/BOOT + cp /usr/share/grub/bootia32.efi $TMPDIR/part1/EFI/BOOT fi sync diff --git a/scripts/mkimage b/scripts/mkimage index c40f4ca4f7..6ce2d9951c 100755 --- a/scripts/mkimage +++ b/scripts/mkimage @@ -152,7 +152,25 @@ LABEL run APPEND boot=UUID=$UUID_SYSTEM disk=UUID=$UUID_STORAGE portable quiet EOF + cat << EOF > "$LE_TMP"/grub.cfg +set timeout="25" +set default="Installer" +menuentry "Installer" { + search --set -f /KERNEL + linux /KERNEL boot=UUID=$UUID_SYSTEM installer quiet tty vga=current +} +menuentry "Live" { + search --set -f /KERNEL + linux /KERNEL boot=UUID=$UUID_SYSTEM grub_live quiet tty vga=current +} +menuentry "Run" { + search --set -f /KERNEL + linux /KERNEL boot=UUID=$UUID_SYSTEM disk=UUID=$UUID_STORAGE grub_portable quiet +} +EOF + mcopy "$LE_TMP/syslinux.cfg" :: + mcopy "$LE_TMP/grub.cfg" :: # install extlinux echo "image: installing extlinux to part1..." @@ -168,7 +186,9 @@ EOF mmd EFI EFI/BOOT mcopy $TOOLCHAIN/share/syslinux/bootx64.efi ::/EFI/BOOT mcopy $TOOLCHAIN/share/syslinux/ldlinux.e64 ::/EFI/BOOT + mcopy $TOOLCHAIN/share/grub/bootia32.efi ::/EFI/BOOT mcopy "$LE_TMP"/syslinux.cfg ::/EFI/BOOT + mcopy "$LE_TMP"/grub.cfg ::/EFI/BOOT elif [ "$BOOTLOADER" = "bcm2835-bootloader" ]; then # create bootloader configuration echo "image: creating bootloader configuration..." @@ -304,9 +324,12 @@ fi # bootloader # change syslinux default to 'run' echo "image: modifying fs on part1 for open virtual appliance..." sed -i "/DEFAULT/ s/installer/run/" "$LE_TMP"/syslinux.cfg + sed -i "/set default=/s/\"Installer\"/\"Run\"/" "$LE_TMP"/grub.cfg # FIXME: an unalias should work here, but it does not; call mcopy directly $TOOLCHAIN/bin/mcopy -i $LE_TMP/part1.fat -o "$LE_TMP"/syslinux.cfg ::/EFI/BOOT $TOOLCHAIN/bin/mcopy -i $LE_TMP/part1.fat -o "$LE_TMP"/syslinux.cfg :: + $TOOLCHAIN/bin/mcopy -i $LE_TMP/part1.fat -o "$LE_TMP"/grub.cfg ::/EFI/BOOT + $TOOLCHAIN/bin/mcopy -i $LE_TMP/part1.fat -o "$LE_TMP"/grub.cfg :: sync # merge modified part1 back to tmp disk image echo "image: merging part1 back to open virtual appliance..."