[美化]grub主題與背景及編輯啟動項(從入門到rm -rf /*)

為什么沒有圖呢?因為過程全為實體機操作,沒法截圖,鄙龍也不愿意用手機拍。。。就這樣吧~~
grub安裝后默認(rèn)的菜單別有一般韻味:黑客電影中的純黑背景+白字(可能是小六號吧)——但是鄙龍不太喜歡,于是在用了幾個月后,決定改一下。。。
鄙龍自然是不會開發(fā)主題了(?╥?﹏?╥?)這里選擇gnome-look.org上的Sleek-Bigsur主題

安裝主題
自動安裝:
1. 當(dāng)然,下載Sleek-Bigsur主題。
2. 解壓一下安裝包:
cd ~/下載/ ? ? #對應(yīng)閣下自己設(shè)置的下載路徑
mkdir SleekTheme&&tar -vxf SleekTheme-BigSur.tar.xz -C SleekTheme/ ? ? ?#建立一個名為SleekTheme的文件夾,將壓縮包的文件解壓到SleekTheme文件夾內(nèi)
2.1 如果需要設(shè)置一張背景圖片(選擇的這個主題已經(jīng)有一個背景了),可以在運行安裝腳本之前先替換掉原來的背景圖片。背景圖片位于sleek/background.png。圖片必須是png格式,推薦1920*1080。
這里我選擇了一張自己喜歡的圖片,但是是jpg格式的,可以使用linux的convert工具轉(zhuǎn)換jpg為png
rm -r SleekTheme/sleek/background.png ? ? ? ?#刪除原來的背景
convert SleekTheme/sleek/background.jpg SleekTheme/sleek/background.png ? ? #轉(zhuǎn)換格式
rm -r SleekTheme/sleek/background.jpg ? ? ? ?#做一下清理
3.運行自動安裝腳本:
chmod +x SleekTheme/install.sh
sudo ./SleekTheme/install.sh
rm -r *Sleek* ? ? ?#做一下清理
運行腳本后,有些主題的腳本有進(jìn)一步自定義選項,需要手動選擇;而有些腳本的主題則是一步到尾。
正常來說到這里已經(jīng)安裝完成了,可以重啟看看效果。
未生效?那么閣下可能需要手動安裝

手動安裝:
繼承自動安裝到2.1步:復(fù)制解壓后文件的sleek文件夾到/boot/grub/themes/:
sudo cp -r SleekTheme/sleek /boot/grub/themes/sleek
sudo vim /etc/default/grub ? ? ? ?#使用vim編輯grub文件。如果沒有vim用別的也行
找到GRUB_THEME(如果有注釋則去掉注釋),并添加主題包內(nèi)theme.txt的路徑
如
GRUB_THEME="/boot/grub/themes/sleek/theme.txt"
改完之后保存退出
接著運行
sudo update-grub
重啟系統(tǒng)

額外
1. 需要調(diào)整主題的字體 字體大小 圖片大小及出現(xiàn)的文字,可以修改主題包的theme.txt。內(nèi)容并不難理解。(?????▽?????)

編輯啟動項

需要調(diào)整啟動順序、添加或刪除啟動項,修改/etc/grub.d中的內(nèi)容。(最好不要去修改/boot/grub/grub.cfg)
如果閣下清楚自己在做什么,請?zhí)暨x認(rèn)為有用的部分而不是直接照搬所有配置,因為文中的配置完全沒有通用性;如果閣下不清楚自己在做什么,建議先不要做手動修改的嘗試,轉(zhuǎn)而使用一些自動化的GUI工具。
/etc/grub.d中有許多**_*****這樣命名的文件。比如我的是這樣
ls /etc/grub.d
00_header ? ? ? ?10_linux ? ? ?20_linux_xen ?30_uefi-firmware ?41_custom
05_debian_theme ?10_linux_zfs ?30_os-prober ?40_custom ? ? ? ? README
_前的兩位數(shù)字是這些腳本被執(zhí)行的順序,從00開始
00_header是設(shè)置環(huán)境變量的腳本,一般不需要修改(在這篇文章中不需要);
05_debian_theme是設(shè)置grub的主題
10_linux識別root device中OS的kernel,并創(chuàng)建menuentry。它的位置是10,那么意味著它出現(xiàn)在grub菜單的第一位和第二位(recovery模式)
然后那些不知道是干啥的=w=
30_os-prober用于探測其它的操作系統(tǒng),并將其顯示在grub菜單中。鄙龍使用Windows與linux雙系統(tǒng),那么這個選項將出現(xiàn)在第三位,為Windows Boot Manager
30_uefi-firmware我也不知道為什么會有一個序號重復(fù)的腳本。通過這個腳本的menuentry
menuentry '$LABEL' \$menuentry_id_option 'uefi-firmware' {
? ? ? ?fwsetup
}
可以判斷是進(jìn)入BIOS設(shè)置,這里把它改成31_uefi-firmware 這樣它就是第四位啦~
那么目前的啟動項為
-----------------------
1. Linux Mint 21.3
2. Advanced options for Ubuntu
3. Windows Boot Manager
4. UEFI Firmware Settings
-----------------------
想調(diào)整一下啟動項的位置、啟動項的名字,再添加一個Shutdown選項實現(xiàn)直接關(guān)機
使其成為這樣
-----------------------
1. Linux Mint 21.3
2. Windows 11 Professional
3. Advanced options for Linuxmint 21.3
4. UEFI Firmware Settings
5. Shutdown
-----------------------
先調(diào)整下位置:
1. 執(zhí)行一次sudo update-grub保存更改前grub配置(位置在/boot/grub/grub.cfg),接著建議備份一下所有的腳本文件
2. 去除30_os-prober的執(zhí)行權(quán)限
3. 刪除10_linux中的輸出Advanced Options子菜單的內(nèi)容:{
echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
linux_entry "${OS}" "${version}" advanced \
? ? ? ? ? ? ?"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
?for supported_init in ${SUPPORTED_INITS}; do
? ?init_path="${supported_init#*:}"
? ?if [ -x "${init_path}" ] && [ "$(readlink -f /sbin/init)" != "${init_path}" ]; then
? ? ?linux_entry "${OS}" "${version}" "init-${supported_init%%:*}" \
? ? ? ? "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} init=${init_path}"
? ?fi
?done
if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
? ?linux_entry "${OS}" "${version}" recovery \
? ? ? ? ? ? ? ?"${GRUB_CMDLINE_LINUX_RECOVERY} ${GRUB_CMDLINE_LINUX}"
?fi
if [ x"$is_top_level" != xtrue ]; then ? ? ? ? ? ? ? ? ? ?
?echo '}' ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
fi
}
4. 另建一個腳本文件12_advancedop,寫入腳本程序:
#! /bin/sh
set -e
# grub-mkconfig helper script.
# Copyright (C) 2006,2007,2008,2009,2010 ?Free Software Foundation, Inc.
#
# GRUB 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 3 of the License, or
# (at your option) any later version.
#
# GRUB 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 GRUB. ?If not, see <http://www.gnu.org/licenses/>.
prefix="/usr"
exec_prefix="/usr"
datarootdir="/usr/share"
ubuntu_recovery="1"
quiet_boot="1"
quick_boot="1"
gfxpayload_dynamic="1"
vt_handoff="1"
. "$pkgdatadir/grub-mkconfig_lib"
export TEXTDOMAIN=grub
export TEXTDOMAINDIR="${datarootdir}/locale"
CLASS="--class gnu-linux --class gnu --class os"
SUPPORTED_INITS="sysvinit:/lib/sysvinit/init systemd:/lib/systemd/systemd upstart:/sbin/upstart"
if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
?OS=GNU/Linux
else
?case ${GRUB_DISTRIBUTOR} in
? ?Ubuntu|Kubuntu)
? ? ?OS="${GRUB_DISTRIBUTOR}"
? ? ?;;
? ?*)
? ? ?OS="${GRUB_DISTRIBUTOR} GNU/Linux"
? ? ?;;
?esac
?CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}"
fi
# loop-AES arranges things so that /dev/loop/X can be our root device, but
# the initrds that Linux uses don't like that.
case ${GRUB_DEVICE} in
?/dev/loop/*|/dev/loop[0-9])
? ?GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
? ?# We can't cope with devices loop-mounted from files here.
? ?case ${GRUB_DEVICE} in
? ? ?/dev/*) ;;
? ? ?*) exit 0 ;;
? ?esac
?;;
esac
# Default to disabling partition uuid support to maintian compatibility with
# older kernels.
GRUB_DISABLE_LINUX_PARTUUID=${GRUB_DISABLE_LINUX_PARTUUID-true}
# get_dm_field_for_dev /dev/dm-0 uuid -> get the device mapper UUID for /dev/dm-0
# get_dm_field_for_dev /dev/dm-1 name -> get the device mapper name for /dev/dm-1
# etc
get_dm_field_for_dev () {
? ?dmsetup info -c --noheadings -o $2 $1 2>/dev/null
}
# Is $1 a multipath device?
is_multipath () {
? ?local dmuuid dmtype
? ?dmuuid="$(get_dm_field_for_dev $1 uuid)"
? ?if [ $? -ne 0 ]; then
? ? ? ?# Not a device mapper device -- or dmsetup not installed, and as
? ? ? ?# multipath depends on kpartx which depends on dmsetup, if there is no
? ? ? ?# dmsetup then there are not going to be any multipath devices.
? ? ? ?return 1
? ?fi
? ?# A device mapper "uuid" is always <type>-<uuid>. If <type> is of the form
? ?# part[0-9] then <uuid> is the device the partition is on and we want to
? ?# look at that instead. A multipath node always has <type> of mpath.
? ?dmtype="${dmuuid%%-*}"
? ?if [ "${dmtype#part}" != "$dmtype" ]; then
? ? ? ?dmuuid="${dmuuid#*-}"
? ? ? ?dmtype="${dmuuid%%-*}"
? ?fi
? ?if [ "$dmtype" = "mpath" ]; then
? ? ? ?return 0
? ?else
? ? ? ?return 1
? ?fi
}
if test -e "${GRUB_DEVICE}" && is_multipath "${GRUB_DEVICE}"; then
? ?# If / is multipathed, there will be multiple paths to the partition, so
? ?# using root=UUID= exposes the boot process to udev races. In addition
? ?# GRUB_DEVICE in this case will be /dev/dm-0 or similar -- better to use a
? ?# symlink that depends on the multipath name.
? ?GRUB_DEVICE=/dev/mapper/"$(get_dm_field_for_dev $GRUB_DEVICE name)"
? ?GRUB_DISABLE_LINUX_UUID=true
fi
# btrfs may reside on multiple devices. We cannot pass them as value of root= parameter
# and mounting btrfs requires user space scanning, so force UUID in this case.
if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] && [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] ) \
? ?|| ( [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \
&& [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ] ) \
? ?|| ( ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \
&& ! test -e "/dev/disk/by-partuuid/${GRUB_DEVICE_PARTUUID}" ) \
? ?|| ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then
?LINUX_ROOT_DEVICE=${GRUB_DEVICE}
elif [ "x${GRUB_DEVICE_UUID}" = "x" ] \
? ?|| [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ]; then
?LINUX_ROOT_DEVICE=PARTUUID=${GRUB_DEVICE_PARTUUID}
else
?LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
fi
case x"$GRUB_FS" in
? ?xbtrfs)
rootsubvol="`make_system_path_relative_to_its_root /`"
rootsubvol="${rootsubvol#/}"
if [ "x${rootsubvol}" != x ]; then
? ?GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
fi;;
? ?xzfs)
# We have a more specialized ZFS handler, with multiple system in 10_linux_zfs.
if [ -e "`dirname $(readlink -f $0)`/10_linux_zfs" ]; then
?exit 0
fi
rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true`
bootfs="`make_system_path_relative_to_its_root / | sed -e "s,@$,,"`"
LINUX_ROOT_DEVICE="ZFS=${rpool}${bootfs%/}"
;;
esac
title_correction_code=
if [ -x /lib/recovery-mode/recovery-menu ]; then
? ?GRUB_CMDLINE_LINUX_RECOVERY=recovery
else
? ?GRUB_CMDLINE_LINUX_RECOVERY=single
fi
if [ "$ubuntu_recovery" = 1 ]; then
? ?GRUB_CMDLINE_LINUX_RECOVERY="$GRUB_CMDLINE_LINUX_RECOVERY nomodeset"
fi
if [ "$vt_handoff" = 1 ]; then
?for word in $GRUB_CMDLINE_LINUX_DEFAULT; do
? ?if [ "$word" = splash ]; then
? ? ?GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT \$vt_handoff"
? ?fi
?done
fi
if [ x"$GRUB_FORCE_PARTUUID" != x ]; then
? ?gettext_printf "GRUB_FORCE_PARTUUID is set, will attempt initrdless boot\n" >&2
? ?cat << EOF
#
# GRUB_FORCE_PARTUUID is set, will attempt initrdless boot
# Upon panic fallback to booting with initrd
EOF
? echo "set partuuid=${GRUB_FORCE_PARTUUID}"
fi
linux_entry ()
{
?os="$1"
?version="$2"
?type="$3"
?args="$4"
?if [ -z "$boot_device_id" ]; then
? ? ?boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
?fi
?if [ x$type != xsimple ] ; then
? ? ?case $type in
?recovery)
? ? ?title="$(gettext_printf "%s, with Linux %s (%s)" "${os}" "${version}" "$(gettext "${GRUB_RECOVERY_TITLE}")")" ;;
?init-*)
? ? ?title="$(gettext_printf "%s, with Linux %s (%s)" "${os}" "${version}" "${type#init-}")" ;;
?*)
? ? ?title="$(gettext_printf "%s, with Linux %s" "${os}" "${version}")" ;;
? ? ?esac
? ? ?if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
?replacement_title="$(echo "Advanced options for ${os}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')"
?quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)"
?title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"
?grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "gnulinux-advanced-$boot_device_id>gnulinux-$version-$type-$boot_device_id")"
? ? ?fi
? ? ?echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
?else
? ? ?echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
?fi ? ? ?
?if [ "$quick_boot" = 1 ]; then
? ? ?echo " recordfail" | sed "s/^/$submenu_indentation/"
?fi
?if [ x$type != xrecovery ] ; then
? ? ?save_default_entry | grub_add_tab
?fi
?# Use ELILO's generic "efifb" when it's known to be available.
?# FIXME: We need an interface to select vesafb in case efifb can't be used.
?if [ "x$GRUB_GFXPAYLOAD_LINUX" = x ]; then
? ? ?echo " load_video" | sed "s/^/$submenu_indentation/"
?else
? ? ?if [ "x$GRUB_GFXPAYLOAD_LINUX" != xtext ]; then
?echo " load_video" | sed "s/^/$submenu_indentation/"
? ? ?fi
?fi
?if ([ "$ubuntu_recovery" = 0 ] || [ x$type != xrecovery ]) && \
? ? ([ "x$GRUB_GFXPAYLOAD_LINUX" != x ] || [ "$gfxpayload_dynamic" = 1 ]); then
? ? ?echo " gfxmode \$linux_gfx_mode" | sed "s/^/$submenu_indentation/"
?fi
?echo " insmod gzio" | sed "s/^/$submenu_indentation/"
?echo " if [ x\$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi" | sed "s/^/$submenu_indentation/"
?if [ x$dirname = x/ ]; then
? ?if [ -z "${prepare_root_cache}" ]; then
? ? ?prepare_root_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE} | grub_add_tab)"
? ?fi
? ?printf '%s\n' "${prepare_root_cache}" | sed "s/^/$submenu_indentation/"
?else
? ?if [ -z "${prepare_boot_cache}" ]; then
? ? ?prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | grub_add_tab)"
? ?fi
? ?printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
?fi
?if [ x"$quiet_boot" = x0 ] || [ x"$type" != xsimple ]; then
? ?message="$(gettext_printf "Loading Linux %s ..." ${version})"
? ?sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
EOF
?fi
?if test -d /sys/firmware/efi && test -e "${linux}.efi.signed"; then
? ?sed "s/^/$submenu_indentation/" << EOF
linux ${rel_dirname}/${basename}.efi.signed root=${linux_root_device_thisversion} ro ${args}
EOF
?else
? ?# We have initrd and PARTUUID is set - we try to boot without initrd, and fallback to using it
? ?# if it fails.
? ?# "panic=-1" means "on panic reboot immediately". "panic=0" disables the reboot behavior.
? ?if [ x"$GRUB_FORCE_PARTUUID" != x ]; then
? ? ? ?linux_root_device_thisversion="PARTUUID=${GRUB_FORCE_PARTUUID}"
? ?fi
? ?message="$(gettext_printf "Loading initial ramdisk ...")"
? ?initrdlessfail_msg="$(gettext_printf "GRUB_FORCE_PARTUUID set, initrdless boot failed. Attempting with initrd.")"
? ?initrdlesstry_msg="$(gettext_printf "GRUB_FORCE_PARTUUID set, attempting initrdless boot.")"
? ?initrd_path=
? ?for i in ${initrd}; do
? ? ? ?initrd_path="${initrd_path} ${rel_dirname}/${i}"
? ?done
? ?initrd_path_only_early=
? ?for i in ${initrd_early}; do
? ? ? ?initrd_path_only_early="${initrd_path_only_early} ${rel_dirname}/${i}"
? ?done
? ?if test -n "${initrd}" && [ x"$GRUB_FORCE_PARTUUID" != x ]; then
? ? ? ?sed "s/^/$submenu_indentation/" << EOF
if [ "\${initrdfail}" = 1 ]; then
?echo '$(echo "$initrdlessfail_msg" | grub_quote)'
?linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args}
EOF
? ? ? ?if [ x"$quiet_boot" = x0 ] || [ x"$type" != xsimple ]; then
? ? ? ? ?sed "s/^/$submenu_indentation/" << EOF
?echo '$(echo "$message" | grub_quote)'
EOF
? ? ? ?fi
? ? ? ?sed "s/^/$submenu_indentation/" << EOF
?initrd $(echo $initrd_path)
else
?echo '$(echo "$initrdlesstry_msg" | grub_quote)'
?linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args} panic=-1
EOF
? ? ? ?if [ -n "$initrd_path_only_early" ]; then
? ? ? ? ?sed "s/^/$submenu_indentation/" << EOF
?initrd $(echo $initrd_path_only_early)
EOF
? ? ? ?fi
? ? ? ?sed "s/^/$submenu_indentation/" << EOF
fi
initrdfail
EOF
? ?else
? ?# We don't have initrd or we don't want to set PARTUUID. Don't try initrd-less boot with fallback.
? ? ? ?sed "s/^/$submenu_indentation/" << EOF
linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args}
EOF
? ? ? ?if test -n "${initrd}"; then
? ? ? ? ? ?# We do have initrd - let's use it at boot.
? ? ? ? ? ?# TRANSLATORS: ramdisk isn't identifier. Should be translated.
? ? ? ? ? ?if [ x"$quiet_boot" = x0 ] || [ x"$type" != xsimple ]; then
? ? ? ? ? ? ?sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
EOF
? ? ? ? ? ?fi
? ? ? ? ? ?sed "s/^/$submenu_indentation/" << EOF
initrd $(echo $initrd_path)
EOF
? ? ? ?fi
? ?fi
? ?if test -n "${dtb}" ; then
? ? ?if [ x"$quiet_boot" = x0 ] || [ x"$type" != xsimple ]; then
? ? ? ?message="$(gettext_printf "Loading device tree blob...")"
? ? ? ?sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
EOF
? ? ?fi
? ? ?sed "s/^/$submenu_indentation/" << EOF
devicetree ${rel_dirname}/${dtb}
EOF
? ?fi
?fi
?sed "s/^/$submenu_indentation/" << EOF
}
EOF
}
machine=`uname -m`
case "x$machine" in
? ?xi?86 | xx86_64)
list=
for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* ; do
? ?if grub_file_is_not_garbage "$i" ; then list="$list $i" ; fi
done ;;
? ?*)
list=
for i in /boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* /boot/kernel-* ; do
? ? ? ? ? ? ? ? ?if grub_file_is_not_garbage "$i" ; then list="$list $i" ; fi
done ;;
esac
case "$machine" in
? ?i?86) GENKERNEL_ARCH="x86" ;;
? ?mips|mips64) GENKERNEL_ARCH="mips" ;;
? ?mipsel|mips64el) GENKERNEL_ARCH="mipsel" ;;
? ?arm*) GENKERNEL_ARCH="arm" ;;
? ?*) GENKERNEL_ARCH="$machine" ;;
esac
case "$GENKERNEL_ARCH" in
?x86*) GRUB_CMDLINE_LINUX_RECOVERY="$GRUB_CMDLINE_LINUX_RECOVERY dis_ucode_ldr";;
esac
prepare_boot_cache=
prepare_root_cache=
boot_device_id=
title_correction_code=
cat << 'EOF'
function gfxmode {
set gfxpayload="${1}"
EOF
if [ "$vt_handoff" = 1 ]; then
?cat << 'EOF'
if [ "${1}" = "keep" ]; then
set vt_handoff=vt.handoff=7
else
set vt_handoff=
fi
EOF
fi
cat << EOF
}
EOF
# Use ELILO's generic "efifb" when it's known to be available.
# FIXME: We need an interface to select vesafb in case efifb can't be used.
if [ "x$GRUB_GFXPAYLOAD_LINUX" != x ] || [ "$gfxpayload_dynamic" = 0 ]; then
?echo "set linux_gfx_mode=$GRUB_GFXPAYLOAD_LINUX"
else
?cat << EOF
if [ "\${recordfail}" != 1 ]; then
?if [ -e \${prefix}/gfxblacklist.txt ]; then
? ?if [ \${grub_platform} != pc ]; then
? ? ?set linux_gfx_mode=keep
? ?elif hwmatch \${prefix}/gfxblacklist.txt 3; then
? ? ?if [ \${match} = 0 ]; then
? ? ? ?set linux_gfx_mode=keep
? ? ?else
? ? ? ?set linux_gfx_mode=text
? ? ?fi
? ?else
? ? ?set linux_gfx_mode=text
? ?fi
?else
? ?set linux_gfx_mode=keep
?fi
else
?set linux_gfx_mode=text
fi
EOF
fi
cat << EOF
export linux_gfx_mode
EOF
# Extra indentation to add to menu entries in a submenu. We're not in a submenu
# yet, so it's empty. In a submenu it will be equal to '\t' (one tab).
submenu_indentation=""
is_top_level=true
while [ "x$list" != "x" ] ; do
?linux=`version_find_latest $list`
?case $linux in
? ?*.efi.signed)
? ? ?# We handle these in linux_entry.
? ? ?list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
? ? ?continue
? ? ?;;
?esac
?gettext_printf "Found linux image: %s\n" "$linux" >&2
?basename=`basename $linux`
?dirname=`dirname $linux`
?rel_dirname=`make_system_path_relative_to_its_root $dirname`
?version=`echo $basename | sed -e "s,^[^0-9]*-,,g"`
?alt_version=`echo $version | sed -e "s,\.old$,,g"`
?linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"
?initrd_early=
?for i in ${GRUB_EARLY_INITRD_LINUX_STOCK} \
? ${GRUB_EARLY_INITRD_LINUX_CUSTOM}; do
? ?if test -e "${dirname}/${i}" ; then
? ? ?initrd_early="${initrd_early} ${i}"
? ?fi
?done
?initrd_real=
?for i in "initrd.img-${version}" "initrd-${version}.img" "initrd-${version}.gz" \
? "initrd-${version}" "initramfs-${version}.img" \
? "initrd.img-${alt_version}" "initrd-${alt_version}.img" \
? "initrd-${alt_version}" "initramfs-${alt_version}.img" \
? "initramfs-genkernel-${version}" \
? "initramfs-genkernel-${alt_version}" \
? "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \
? "initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}"; do
? ?if test -e "${dirname}/${i}" ; then
? ? ?initrd_real="${i}"
? ? ?break
? ?fi
?done
?initrd=
?if test -n "${initrd_early}" || test -n "${initrd_real}"; then
? ?initrd="${initrd_early} ${initrd_real}"
? ?initrd_display=
? ?for i in ${initrd}; do
? ? ?initrd_display="${initrd_display} ${dirname}/${i}"
? ?done
? ?gettext_printf "Found initrd image: %s\n" "$(echo $initrd_display)" >&2
?fi
?dtb=
?for i in "dtb-${version}" "dtb-${alt_version}" "dtb"; do
? ?if test -e "${dirname}/${i}" ; then
? ? ?dtb="$i"
? ? ?break
? ?fi
?done
?config=
?for i in "${dirname}/config-${version}" "${dirname}/config-${alt_version}" "/etc/kernels/kernel-config-${version}" ; do
? ?if test -e "${i}" ; then
? ? ?config="${i}"
? ? ?break
? ?fi
?done
?initramfs=
?if test -n "${config}" ; then
? ? ?initramfs=`grep CONFIG_INITRAMFS_SOURCE= "${config}" | cut -f2 -d= | tr -d \"`
?fi
?if test -z "${initramfs}" && test -z "${initrd_real}" ; then
? ?# "UUID=" and "ZFS=" magic is parsed by initrd or initramfs. ?Since there's
? ?# no initrd or builtin initramfs, it can't work here.
? ?if [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] \
|| [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ]; then
linux_root_device_thisversion=${GRUB_DEVICE}
? ?else
linux_root_device_thisversion=PARTUUID=${GRUB_DEVICE_PARTUUID}
? ?fi
?fi
?# The GRUB_DISABLE_SUBMENU option used to be different than others since it was
?# mentioned in the documentation that has to be set to 'y' instead of 'true' to
?# enable it. This caused a lot of confusion to users that set the option to 'y',
?# 'yes' or 'true'. This was fixed but all of these values must be supported now.
?OS="Linux Mint"
?if [ "x${GRUB_DISABLE_SUBMENU}" = xyes ] || [ "x${GRUB_DISABLE_SUBMENU}" = xy ]; then
? ?GRUB_DISABLE_SUBMENU="true"
?fi
?if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xtrue ]; then
?
? ?if [ -z "$boot_device_id" ]; then
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
? ?fi
? ?# TRANSLATORS: %s is replaced with an OS name
? ?echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
? ?is_top_level=false
?fi
?linux_entry "${OS}" "${version}" advanced \
? ? ? ? ? ? ?"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
?for supported_init in ${SUPPORTED_INITS}; do
? ?init_path="${supported_init#*:}"
? ?if [ -x "${init_path}" ] && [ "$(readlink -f /sbin/init)" != "$(readlink -f "${init_path}")" ]; then
? ? ?linux_entry "${OS}" "${version}" "init-${supported_init%%:*}" \
?"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} init=${init_path}"
? ?fi
?done
?if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
? ?linux_entry "${OS}" "${version}" recovery \
? ? ? ? ? ? ? ?"${GRUB_CMDLINE_LINUX_RECOVERY} ${GRUB_CMDLINE_LINUX}"
?fi
?list=`echo $list | tr ' ' '\n' | fgrep -vx "$linux" | tr '\n' ' '`
done
# If at least one kernel was found, then we need to
# add a closing '}' for the submenu command.
if [ x"$is_top_level" != xtrue ]; then
?echo '}'
fi
echo "$title_correction_code"
5. 保存退出,并賦予執(zhí)行權(quán)限
sudo chmod +x /etc/grub.d/12_advancedop

接著改下名:
1. 在/boot/grub/grub.cfg中找到os-prober自動生成的windows引導(dǎo)配置
2. 創(chuàng)建一個腳本程序11_windows11
3. 寫入剛剛找到的windows的引導(dǎo)配置,記得加上文件頭尾。例如這是我的:
#!/bin/sh
cat <<EOF
menuentry 'Windows Boot Manager (on /dev/nvme0n1p1)' --class windows --class os $menuentry_id_option 'osprober-efi-3CB7-D11B' {
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root 3CB7-D11B
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
set timeout_style=menu
if [ "${timeout}" = 0 ]; then
?set timeout=10
fi
EOF
并把Windows Boot Manager (on /dev/nvme0n1p1)改成Windows 11 Professional
4. 保存并賦予執(zhí)行權(quán)限

最后加上一個關(guān)機的選項
1. 建立文件32_halt
2. 寫入腳本:
#!/bin/sh
cat <<EOF
menuentry 'Shutdown' \$menuentry_id_option 'script' {
? ? ? ?halt
}
EOF
3. 保存并賦予執(zhí)行權(quán)限
至此修改完成,運行sudo update-grub如無語法錯誤,重啟生效
有語法錯誤提示就先別重啟了(?;???﹏???)?。?/strong>

文章完結(jié),感謝閱讀。??(???﹏?????)
本文遵循CC0協(xié)議,隨意引用轉(zhuǎn)載和修改發(fā)布。