Grub update broken Grub.d/10

Hello i have a updated my laptop and i got blackscreen then i go to the grub and edited it to output for my macbook pro so it works adding some code i found on youtube, but now when i try to update the grub it says /etc/grub.d/10_linux: line 344: syntax error: unexpected end of file, ive tried adding done at the end but still getting the same syntax error at the end, what can i do? thanks

Welcome at the forum, @Cecwcwc,

please post the file /etc/grub.d/10_linux. Use </> button to format it nicely.

1 Like

prefix="/usr"
exec_prefix="/usr"
datarootdir="/usr/share"
quiet_boot=“1”

. “$pkgdatadir/grub-mkconfig_lib”

export TEXTDOMAIN=grub
export TEXTDOMAINDIR="${datarootdir}/locale"

CLASS="–class gnu-linux --class gnu --class os"

if [ “x${GRUB_DISTRIBUTOR}” = “x” ] ; then
OS=Linux
else
OS="${GRUB_DISTRIBUTOR} Linux"
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/"
;;
esac

Default to disabling partition uuid support to maintian compatibility with

older kernels.

GRUB_DISABLE_LINUX_PARTUUID=${GRUB_DISABLE_LINUX_PARTUUID-true}

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)
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=

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 (Kernel: %s - recovery mode)” “${os}” “${version}”)" ;;
fallback)
title="$(gettext_printf “%s (Kernel: %s - fallback initramfs)” “${os}” “${version}”)" ;;
*)
title="$(gettext_printf “%s (Kernel: %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 [ x$type != xrecovery ] && [ x$type != xfallback ] ; 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/”
if grep -qx “CONFIG_FB_EFI=y” “${config}” 2> /dev/null
&& grep -qx “CONFIG_VT_HW_CONSOLE_BINDING=y” “${config}” 2> /dev/null; then
echo " set gfxpayload=keep" | sed “s/^/$submenu_indentation/”
fi
else
if [ “x$GRUB_GFXPAYLOAD_LINUX” != xtext ]; then
echo " load_video" | sed “s/^/$submenu_indentation/”
fi
echo " set gfxpayload=$GRUB_GFXPAYLOAD_LINUX" | sed “s/^/$submenu_indentation/”
fi

echo " outb 0x728 1" | sed “s/^/$submenu_indentation/”
echo " outb 0x710 2" | sed “s/^/$submenu_indentation/”
echo " outb 0x740 2" | sed “s/^/$submenu_indentation/”
echo " outb 0x750 0" | sed “s/^/$submenu_indentation/”
echo " insmod gzio" | 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 ]; then
message="$(gettext_printf “Loading Linux %s …” “${version}”)"
sed “s/^/$submenu_indentation/” << EOF
echo ‘$(echo “$message” | grub_quote)’

fi
sed “s/^/$submenu_indentation/” << EOF
linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} rw ${args}
EOF
if test -n “${initrd}” ; then
# TRANSLATORS: ramdisk isn’t identifier. Should be translated.
message="$(gettext_printf “Loading initial ramdisk …”)"
initrd_path=
for i in ${initrd}; do
initrd_path="${initrd_path} ${rel_dirname}/${i}"
done
if [ x"$quiet_boot" = x0 ]; then
sed “s/^/$submenu_indentation/” << EOF
echo ‘$(echo “$message” | grub_quote)’
EOF
fi
sed “s/^/$submenu_indentation/” << EOF
initrd $(echo $initrd_path)
EOF
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

prepare_boot_cache=
prepare_root_cache=
boot_device_id=
title_correction_code=

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
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}"

if test -e “/etc/manjaro-release” ; then
kbasename="echo "${basename}" | sed -e 's,vmlinuz-,linux,g'"
if test -e “${dirname}/${kbasename}.kver” ; then
version="$(cat ${dirname}/${kbasename}.kver)"
fi
kbasename2="echo "${basename}" | sed -e 's,vmlinuz-,linux-,g'"
if test -e “${dirname}/${kbasename2}.kver” ; then
version="$(cat ${dirname}/${kbasename2}.kver)"
fi
kbasename3="echo "${basename}" | sed -e 's,vmlinuz-,linux,g' | sed -e 's,\.,,g'"
if test -e “${dirname}/${kbasename3}.kver” ; then
version="$(cat ${dirname}/${kbasename3}.kver)"
fi
kbasename4="echo "${basename}" | sed -e 's,vmlinuz-,linux-,g' | sed -e 's,\.,,g'"
if test -e “${dirname}/${kbasename4}.kver” ; then
version="$(cat ${dirname}/${kbasename4}.kver)"
fi
fi

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=
initramfs_manjaro="echo "${basename}" | sed -e 's,vmlinuz,initramfs,g'"
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}”
“${initramfs_manjaro}.img” ; 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

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.

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
linux_entry “${OS}” “${version}” simple
“${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}”

submenu_indentation="$grub_tab"

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 i in “${initramfs_manjaro}-fallback.img” “initramfs-${version}-fallback.img” ; do
if test -e “${dirname}/${i}” ; then
initrd="${i}"
gettext_printf “Found initrd fallback image: %s\n” “${dirname}/${initrd}” >&2
linux_entry “${OS}” “${version}” fallback
“${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}”
break
fi
done

if [ “x${GRUB_DISABLE_RECOVERY}” != “xtrue” ]; then
linux_entry “${OS}” “${version}” recovery
“single ${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”
done`
indent preformatted text by 4 spaces

echo " outb 0x728 1" | sed “s/^/$submenu_indentation/”
echo " outb 0x710 2" | sed “s/^/$submenu_indentation/”
echo " outb 0x740 2" | sed “s/^/$submenu_indentation/”
echo " outb 0x750 0" | sed “s/^/$submenu_indentation/”
echo " insmod gzio" | sed “s/^/$submenu_indentation/”

The file contents are hardly readable without proper quoting and of no help this way.

$ pacman -Qo /etc/grub.d/10_linux
/etc/grub.d/10_linux is owned by grub 2.04-11.1

That file belongs to grub, so reinstall it:

$ sudo pacman -S grub

If this did not trigger updating, do it yourself:

$ sudo update-grub
2 Likes

thanks you for your reply,

after editing the grub.d/10_linux and trying to update i get this error now:

Generating grub configuration file …
Found linux image: /boot/vmlinuz-5.7-x86_64
Found initrd image: /boot/intel-ucode.img /boot/initramfs-5.7-x86_64.img
sed: -e expression #1, char 1: unknown command: `�’

here is my grub grubd10 - Pastebin.com
keep getting this error:

Generating grub configuration file … [2]
Found linux image: /boot/vmlinuz-5.7-x86_64
Found initrd image: /boot/intel-ucode.img /boot/initramfs-5.7-x86_64.img
Found initrd fallback image: /boot/initramfs-5.7-x86_64-fallback.img
/etc/grub.d/10_linux.save: line 352: syntax error near unexpected token `done’

i deleted done and then get the same error but on line 350

That does look an awful lot like an encoding problem. Did you manually edit the file?
Replace it by the original packaged one.

yes i had a error editing some lines in but i fixed it now the issue is with the ending of the file

on my grub i added:

echo " outb 0x728 1" | sed “s/^/$submenu_indentation/”
echo " outb 0x710 2" | sed “s/^/$submenu_indentation/”
echo " outb 0x740 2" | sed “s/^/$submenu_indentation/”
echo " outb 0x750 0" | sed “s/^/$submenu_indentation/”
echo " insmod gzio" | sed “s/^/$submenu_indentation/”

so i can boot my macbook without this code it doesn’t run i added a pastebin with my grub if that’s of any help

Somehow the encoding must have gotten botched with your edits and that’s why the script failed.

i will update again and try with a fresh packaged one i somehow ended up with 4 copy of the grub.d/10 file i just need it to save to actually boot up without having to edit always