138b341b8SYJwu2023#!/bin/bash 2d2b28acbS栗子 3d2b28acbS栗子if test -n "$ZSH_VERSION"; then 4d2b28acbS栗子 CURRENT_SHELL=zsh 5d2b28acbS栗子elif test -n "$BASH_VERSION"; then 6d2b28acbS栗子 CURRENT_SHELL=bash 7d2b28acbS栗子elif test -n "$KSH_VERSION"; then 8d2b28acbS栗子 CURRENT_SHELL=ksh 9d2b28acbS栗子elif test -n "$FCEDIT"; then 10d2b28acbS栗子 CURRENT_SHELL=ksh 11d2b28acbS栗子elif test -n "$PS3"; then 12d2b28acbS栗子 CURRENT_SHELL=unknown 13d2b28acbS栗子else 14d2b28acbS栗子 CURRENT_SHELL=sh 15d2b28acbS栗子fi 16d2b28acbS栗子 17c89d0c12SLoGinsource "$HOME/.$CURRENT_SHELL"rc 18c89d0c12SLoGin 195ed4cd46SguanjinquanABS_PREFIX=/opt/dragonos-grub 205ed4cd46Sguanjinquangrub_dir_i386_efi=${ABS_PREFIX}/arch/i386/efi/grub 215ed4cd46Sguanjinquangrub_dir_i386_legacy=${ABS_PREFIX}/arch/i386/legacy/grub 225ed4cd46Sguanjinquangrub_dir_x86_64_efi=${ABS_PREFIX}/arch/x86_64/efi/grub 2348a3baa9SLoGingrub_dir_riscv64_efi=${ABS_PREFIX}/arch/riscv64/efi/grub 24d02e6ea4Slogin 25882f0b7eSYJwu2023sudo mkdir -p ${grub_dir_i386_efi} 26882f0b7eSYJwu2023sudo mkdir -p ${grub_dir_i386_legacy} 27882f0b7eSYJwu2023sudo mkdir -p ${grub_dir_x86_64_efi} 28d02e6ea4Slogin 295ed4cd46Sguanjinquan# 防止外层声明了环境变量,影响到grub的编译 305ed4cd46Sguanjinquanexport CC=gcc 315ed4cd46Sguanjinquanexport LD=ld 325ed4cd46Sguanjinquanexport AS=as 335ed4cd46Sguanjinquanexport NM=nm 345ed4cd46Sguanjinquanexport OBJCOPY=objcopy 355ed4cd46Sguanjinquan 3638b341b8SYJwu2023 3738b341b8SYJwu2023#检测grub是否已经安装 3801090de7SLoGinif [ -d ${grub_dir_i386_efi}/bin ] && [ -d ${grub_dir_i386_legacy}/bin ] && [ -d ${grub_dir_x86_64_efi}/bin ] ; then 3938b341b8SYJwu2023 exit 0 4038b341b8SYJwu2023fi 41*6cf1947dSdonjuanplatinum#仅支持Ubuntu/Debain, Arch, Centos/RHEL8/Fedora gentoo下的自动安装 42*6cf1947dSdonjuanplatinumsupported_package_manager="apt-get pacman dnf yum emerge" 4348a3baa9SLoGinpackages=("make binutils bison gcc gettext flex bison automake autoconf wget gawk" \ 44*6cf1947dSdonjuanplatinum "make binutils bison gcc gettext flex bison automake autoconf wget gawk" \ 45*6cf1947dSdonjuanplatinum "make binutils bison gcc gettext flex bison automake autoconf wget gawk" \ 46*6cf1947dSdonjuanplatinum "make binutils bison gcc gettext flex bison automake autoconf wget gawk" \ 47*6cf1947dSdonjuanplatinum "dev-build/make sys-devel/binutils sys-devel/bison sys-devel/gcc sys-devel/gettext sys-devel/flex dev-build/automake dev-build/autoconf net-misc/wget sys-apps/gawk") 48285de542Szhaoyao73update_options=("update" \ 49*6cf1947dSdonjuanplatinum "-Sy" \ 50*6cf1947dSdonjuanplatinum "update" \ 51*6cf1947dSdonjuanplatinum "update" \ 52*6cf1947dSdonjuanplatinum "--sync" 53*6cf1947dSdonjuanplatinum ) 54285de542Szhaoyao73install_options=("install -y" \ 55*6cf1947dSdonjuanplatinum "-S --needed --noconfirm" \ 56*6cf1947dSdonjuanplatinum "install -y" \ 57*6cf1947dSdonjuanplatinum "install -y" \ 58*6cf1947dSdonjuanplatinum "" 59*6cf1947dSdonjuanplatinum ) 60285de542Szhaoyao73found_pm=0 61285de542Szhaoyao73pm_index=0 62285de542Szhaoyao73for pm in ${supported_package_manager}; do 63285de542Szhaoyao73 if hash 2>/dev/null ${pm}; then 64285de542Szhaoyao73 found_pm=1 65285de542Szhaoyao73 break 66285de542Szhaoyao73 fi 67285de542Szhaoyao73 let pm_index=$pm_index+1 68285de542Szhaoyao73done 69285de542Szhaoyao73if [ ${found_pm} = "1" ]; then 70285de542Szhaoyao73 echo "found package manager: ${pm}" 71285de542Szhaoyao73else 72285de542Szhaoyao73 echo "找不到任何支持的包管理器: ${supported_package_manager}" 7338b341b8SYJwu2023 echo "脚本暂不支持对该系统下grub的安装,请手动完成" 7438b341b8SYJwu2023 exit 0 7538b341b8SYJwu2023fi 76a7f5ca7bSYJwu2023 7738b341b8SYJwu2023#下载grub2.06 78d02e6ea4Sloginif [ ! -f "grub-2.06.tar.xz" ]; then 79a7f5ca7bSYJwu2023 echo "开始下载grub2.06" 805ed4cd46Sguanjinquan wget https://mirrors.ustc.edu.cn/gnu/grub/grub-2.06.tar.xz || exit 1 81a7f5ca7bSYJwu2023 echo "下载完成" 82d02e6ea4Sloginfi 83d02e6ea4Slogin 84d02e6ea4Slogintar xvf grub-2.06.tar.xz 8538b341b8SYJwu2023#安装对应依赖 86285de542Szhaoyao73sudo ${pm} ${update_options[$pm_index]} 87285de542Szhaoyao73sudo ${pm} ${install_options[$pm_index]} ${packages[$pm_index]} 8838b341b8SYJwu2023 8938b341b8SYJwu2023cd grub-2.06 9038b341b8SYJwu2023echo "开始安装grub2.06" 9138b341b8SYJwu2023#编译安装三个版本的grub 9248a3baa9SLoGin 9348a3baa9SLoGin# 如果不存在i386_legacy的grub,就编译安装 9448a3baa9SLoGinif [ ! -d ${grub_dir_i386_legacy}/bin ]; then 9548a3baa9SLoGin echo "开始编译安装i386_legacy版本的grub" 96b66beefdSlogin ./configure --target=i386 --prefix=${grub_dir_i386_legacy} --disable-werror || exit 1 97d02e6ea4Slogin make -j $(nproc) || exit 1 985ed4cd46Sguanjinquan sudo make install || exit 1 99d02e6ea4Slogin make clean || exit 1 10048a3baa9SLoGin sudo chmod -R 777 ${grub_dir_i386_legacy} 10148a3baa9SLoGinfi 10238b341b8SYJwu2023 10348a3baa9SLoGin# 如果不存在i386_efi的grub,就编译安装 10448a3baa9SLoGinif [ ! -d ${grub_dir_i386_efi}/bin ]; then 10548a3baa9SLoGin echo "开始编译安装i386_efi版本的grub" 106b66beefdSlogin ./configure --target=i386 --with-platform=efi --prefix=${grub_dir_i386_efi} --disable-werror || exit 1 107d02e6ea4Slogin make -j $(nproc) || exit 1 1085ed4cd46Sguanjinquan sudo make install || exit 1 109d02e6ea4Slogin make clean || exit 1 11048a3baa9SLoGin sudo chmod -R 777 ${grub_dir_i386_efi} 11148a3baa9SLoGinfi 11238b341b8SYJwu2023 11348a3baa9SLoGin# 如果不存在x86_64_efi的grub,就编译安装 11448a3baa9SLoGinif [ ! -d ${grub_dir_x86_64_efi}/bin ]; then 11548a3baa9SLoGin echo "开始编译安装x86_64_efi版本的grub" 116b66beefdSlogin ./configure --target=x86_64 --with-platform=efi --prefix=${grub_dir_x86_64_efi} --disable-werror || exit 1 117d02e6ea4Slogin make -j $(nproc) || exit 1 1185ed4cd46Sguanjinquan sudo make install || exit 1 11948a3baa9SLoGin make clean || exit 1 12048a3baa9SLoGin sudo chmod -R 777 ${grub_dir_x86_64_efi} 12148a3baa9SLoGinfi 12248a3baa9SLoGin 12348a3baa9SLoGin# 如果不存在riscv64_efi的grub,就编译安装 12401090de7SLoGin# riscv64目前使用DragonStub进行启动,不需要grub 12501090de7SLoGin# if [ ! -d ${grub_dir_riscv64_efi}/bin ]; then 12601090de7SLoGin# echo "开始编译安装riscv64_efi版本的grub" 12701090de7SLoGin# # 使用which命令判断,如果不存在riscv64-linux-musl交叉编译工具链,则报错 12801090de7SLoGin# if [ ! -n "$(which riscv64-linux-musl-gcc)" ]; then 12901090de7SLoGin# echo "riscv64-linux-musl-gcc不存在,请先安装riscv64-linux-musl交叉编译工具链" 13001090de7SLoGin# exit 1 13101090de7SLoGin# fi 13248a3baa9SLoGin 13301090de7SLoGin# ./configure --target=riscv64 --with-platform=efi --prefix=${grub_dir_riscv64_efi} --host=x86_64-linux-gnu --disable-werror BUILD_CC=gcc HOST_CC=x86_64-linux-gnu-gcc TARGET_CC=riscv64-linux-musl-gcc TARGET_OBJCOPY=riscv64-linux-musl-objcopy TARGET_STRIP=riscv64-linux-musl-strip TARGET_RANLIB=riscv64-linux-musl-ranlib TARGET_NM=riscv64-linux-musl-nm TARGET_LD=riscv64-linux-musl-ld 13401090de7SLoGin# make -j $(nproc) || exit 1 13501090de7SLoGin# sudo make install || exit 1 13601090de7SLoGin# make clean || exit 1 13701090de7SLoGin# sudo chmod -R 777 ${grub_dir_riscv64_efi} 13801090de7SLoGin# fi 13948a3baa9SLoGin 14038b341b8SYJwu2023 14138b341b8SYJwu2023cd .. 14248a3baa9SLoGin 14338b341b8SYJwu2023rm -rf grub-2.06 144d02e6ea4Sloginrm grub-2.06.tar.xz* 14538b341b8SYJwu2023echo "grub2.06安装完成" 146