Created
July 19, 2016 01:18
-
-
Save danieloSD/84a7432ffda25a6289c88c0e8d8f4215 to your computer and use it in GitHub Desktop.
grub problem
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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" | |
grub_lang=`echo $LANG | cut -d . -f 1` | |
grubdir="`echo "/boot/grub" | sed 's,//*,/,g'`" | |
quick_boot="1" | |
export TEXTDOMAIN=grub | |
export TEXTDOMAINDIR="${datarootdir}/locale" | |
. "${datarootdir}/grub/grub-mkconfig_lib" | |
# Do this as early as possible, since other commands might depend on it. | |
# (e.g. the `loadfont' command might need lvm or raid modules) | |
for i in ${GRUB_PRELOAD_MODULES} ; do | |
echo "insmod $i" | |
done | |
if [ "x${GRUB_DEFAULT}" = "x" ] ; then GRUB_DEFAULT=0 ; fi | |
if [ "x${GRUB_DEFAULT}" = "xsaved" ] ; then GRUB_DEFAULT='${saved_entry}' ; fi | |
if [ "x${GRUB_TIMEOUT}" = "x" ] ; then GRUB_TIMEOUT=5 ; fi | |
if [ "x${GRUB_GFXMODE}" = "x" ] ; then GRUB_GFXMODE=auto ; fi | |
if [ "x${GRUB_DEFAULT_BUTTON}" = "x" ] ; then GRUB_DEFAULT_BUTTON="$GRUB_DEFAULT" ; fi | |
if [ "x${GRUB_DEFAULT_BUTTON}" = "xsaved" ] ; then GRUB_DEFAULT_BUTTON='${saved_entry}' ; fi | |
if [ "x${GRUB_TIMEOUT_BUTTON}" = "x" ] ; then GRUB_TIMEOUT_BUTTON="$GRUB_TIMEOUT" ; fi | |
cat << EOF | |
if [ -s \$prefix/grubenv ]; then | |
set have_grubenv=true | |
load_env | |
fi | |
EOF | |
if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then | |
cat <<EOF | |
if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then | |
set default="${GRUB_DEFAULT_BUTTON}" | |
elif [ "\${next_entry}" ] ; then | |
set default="\${next_entry}" | |
set next_entry= | |
save_env next_entry | |
set boot_once=true | |
else | |
set default="${GRUB_DEFAULT}" | |
fi | |
EOF | |
else | |
cat <<EOF | |
if [ "\${next_entry}" ] ; then | |
set default="\${next_entry}" | |
set next_entry= | |
save_env next_entry | |
set boot_once=true | |
else | |
set default="${GRUB_DEFAULT}" | |
fi | |
EOF | |
fi | |
cat <<EOF | |
if [ x"\${feature_menuentry_id}" = xy ]; then | |
menuentry_id_option="--id" | |
else | |
menuentry_id_option="" | |
fi | |
export menuentry_id_option | |
if [ "\${prev_saved_entry}" ]; then | |
set saved_entry="\${prev_saved_entry}" | |
save_env saved_entry | |
set prev_saved_entry= | |
save_env prev_saved_entry | |
set boot_once=true | |
fi | |
function savedefault { | |
if [ -z "\${boot_once}" ]; then | |
saved_entry="\${chosen}" | |
save_env saved_entry | |
fi | |
} | |
EOF | |
if [ "$quick_boot" = 1 ]; then | |
cat <<EOF | |
function recordfail { | |
set recordfail=1 | |
EOF | |
check_writable () { | |
abstractions="$(grub-probe --target=abstraction "${grubdir}")" | |
for abstraction in $abstractions; do | |
case "$abstraction" in | |
diskfilter | lvm) | |
cat <<EOF | |
# GRUB lacks write support for $abstraction, so recordfail support is disabled. | |
EOF | |
return | |
;; | |
esac | |
done | |
FS="$(grub-probe --target=fs "${grubdir}")" | |
case "$FS" in | |
btrfs | cpiofs | newc | odc | romfs | squash4 | tarfs | zfs) | |
cat <<EOF | |
# GRUB lacks write support for $FS, so recordfail support is disabled. | |
EOF | |
return | |
;; | |
esac | |
cat <<EOF | |
if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi | |
EOF | |
} | |
check_writable | |
cat <<EOF | |
} | |
EOF | |
fi | |
cat <<EOF | |
function load_video { | |
EOF | |
if [ -n "${GRUB_VIDEO_BACKEND}" ]; then | |
cat <<EOF | |
insmod ${GRUB_VIDEO_BACKEND} | |
EOF | |
else | |
# If all_video.mod isn't available load all modules available | |
# with versions prior to introduction of all_video.mod | |
cat <<EOF | |
if [ x\$feature_all_video_module = xy ]; then | |
insmod all_video | |
else | |
insmod efi_gop | |
insmod efi_uga | |
insmod ieee1275_fb | |
insmod vbe | |
insmod vga | |
insmod video_bochs | |
insmod video_cirrus | |
fi | |
EOF | |
fi | |
cat <<EOF | |
} | |
EOF | |
serial=0; | |
gfxterm=0; | |
for x in ${GRUB_TERMINAL_INPUT} ${GRUB_TERMINAL_OUTPUT}; do | |
if [ xserial = "x$x" ]; then | |
serial=1; | |
fi | |
if [ xgfxterm = "x$x" ]; then | |
gfxterm=1; | |
fi | |
done | |
if [ "x$serial" = x1 ]; then | |
if [ "x${GRUB_SERIAL_COMMAND}" = "x" ] ; then | |
grub_warn "$(gettext "Requested serial terminal but GRUB_SERIAL_COMMAND is unspecified. Default parameters will be used.")" | |
GRUB_SERIAL_COMMAND=serial | |
fi | |
echo "${GRUB_SERIAL_COMMAND}" | |
fi | |
if [ "x$gfxterm" = x1 ]; then | |
if [ -n "$GRUB_FONT" ] ; then | |
# Make the font accessible | |
prepare_grub_to_access_device `${grub_probe} --target=device "${GRUB_FONT}"` | |
cat << EOF | |
if loadfont `make_system_path_relative_to_its_root "${GRUB_FONT}"` ; then | |
EOF | |
else | |
for dir in "${pkgdatadir}" "`echo '/boot/grub' | sed "s,//*,/,g"`" /usr/share/grub ; do | |
for basename in unicode unifont ascii; do | |
path="${dir}/${basename}.pf2" | |
if is_path_readable_by_grub "${path}" > /dev/null ; then | |
font_path="${path}" | |
else | |
continue | |
fi | |
break 2 | |
done | |
done | |
if [ -n "${font_path}" ] ; then | |
cat << EOF | |
if [ x\$feature_default_font_path = xy ] ; then | |
font=unicode | |
else | |
EOF | |
# Make the font accessible | |
prepare_grub_to_access_device `${grub_probe} --target=device "${font_path}"` | |
cat << EOF | |
font="`make_system_path_relative_to_its_root "${font_path}"`" | |
fi | |
if loadfont \$font ; then | |
EOF | |
else | |
cat << EOF | |
if loadfont unicode ; then | |
EOF | |
fi | |
fi | |
cat << EOF | |
set gfxmode=${GRUB_GFXMODE} | |
load_video | |
insmod gfxterm | |
EOF | |
# Gettext variables and module | |
if [ "x${LANG}" != "xC" ] && [ "x${LANG}" != "x" ]; then | |
cat << EOF | |
set locale_dir=\$prefix/locale | |
set lang=${grub_lang} | |
insmod gettext | |
EOF | |
fi | |
cat <<EOF | |
fi | |
EOF | |
fi | |
case x${GRUB_TERMINAL_INPUT} in | |
x) | |
# Just use the native terminal | |
;; | |
x*) | |
cat << EOF | |
terminal_input ${GRUB_TERMINAL_INPUT} | |
EOF | |
;; | |
esac | |
case x${GRUB_TERMINAL_OUTPUT} in | |
x) | |
# Just use the native terminal | |
;; | |
x*) | |
cat << EOF | |
terminal_output ${GRUB_TERMINAL_OUTPUT} | |
EOF | |
;; | |
esac | |
if [ "x$gfxterm" = x1 ]; then | |
if [ "x$GRUB_THEME" != x ] && [ -f "$GRUB_THEME" ] \ | |
&& is_path_readable_by_grub "$GRUB_THEME"; then | |
gettext_printf "Found theme: %s\n" "$GRUB_THEME" >&2 | |
prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_THEME"` | |
cat << EOF | |
insmod gfxmenu | |
EOF | |
themedir="`dirname "$GRUB_THEME"`" | |
for x in "$themedir"/*.pf2 "$themedir"/f/*.pf2; do | |
if [ -f "$x" ]; then | |
cat << EOF | |
loadfont (\$root)`make_system_path_relative_to_its_root $x` | |
EOF | |
fi | |
done | |
if [ x"`echo "$themedir"/*.jpg`" != x"$themedir/*.jpg" ] || [ x"`echo "$themedir"/*.jpeg`" != x"$themedir/*.jpeg" ]; then | |
cat << EOF | |
insmod jpeg | |
EOF | |
fi | |
if [ x"`echo "$themedir"/*.png`" != x"$themedir/*.png" ]; then | |
cat << EOF | |
insmod png | |
EOF | |
fi | |
if [ x"`echo "$themedir"/*.tga`" != x"$themedir/*.tga" ]; then | |
cat << EOF | |
insmod tga | |
EOF | |
fi | |
cat << EOF | |
set theme=(\$root)`make_system_path_relative_to_its_root $GRUB_THEME` | |
export theme | |
EOF | |
elif [ "x$GRUB_BACKGROUND" != x ] && [ -f "$GRUB_BACKGROUND" ] \ | |
&& is_path_readable_by_grub "$GRUB_BACKGROUND"; then | |
gettext_printf "Found background: %s\n" "$GRUB_BACKGROUND" >&2 | |
case "$GRUB_BACKGROUND" in | |
*.png) reader=png ;; | |
*.tga) reader=tga ;; | |
*.jpg|*.jpeg) reader=jpeg ;; | |
*) gettext "Unsupported image format" >&2; echo >&2; exit 1 ;; | |
esac | |
prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_BACKGROUND"` | |
cat << EOF | |
insmod $reader | |
background_image -m stretch `make_system_path_relative_to_its_root "$GRUB_BACKGROUND"` | |
EOF | |
fi | |
fi | |
make_timeout () | |
{ | |
cat << EOF | |
if [ "\${recordfail}" = 1 ] ; then | |
set timeout=${GRUB_RECORDFAIL_TIMEOUT:-30} | |
else | |
EOF | |
if [ "x${3}" != "x" ] ; then | |
timeout="${2}" | |
style="${3}" | |
elif [ "x${1}" != "x" ] && \ | |
([ "$quick_boot" = 1 ] || [ "x${1}" != "x0" ]) ; then | |
# Handle the deprecated GRUB_HIDDEN_TIMEOUT scheme. | |
timeout="${1}" | |
if [ "x${2}" != "x0" ] ; then | |
grub_warn "$(gettext "Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.")" | |
fi | |
if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then | |
style="hidden" | |
verbose= | |
else | |
style="countdown" | |
verbose=" --verbose" | |
fi | |
else | |
# No hidden timeout, so treat as GRUB_TIMEOUT_STYLE=menu | |
timeout="${2}" | |
style="menu" | |
fi | |
cat << EOF | |
if [ x\$feature_timeout_style = xy ] ; then | |
set timeout_style=${style} | |
set timeout=${timeout} | |
EOF | |
if [ "x${style}" = "xmenu" ] ; then | |
cat << EOF | |
# Fallback normal timeout code in case the timeout_style feature is | |
# unavailable. | |
else | |
set timeout=${timeout} | |
EOF | |
else | |
cat << EOF | |
# Fallback hidden-timeout code in case the timeout_style feature is | |
# unavailable. | |
elif sleep${verbose} --interruptible ${timeout} ; then | |
set timeout=0 | |
EOF | |
fi | |
cat << EOF | |
fi | |
fi | |
EOF | |
} | |
if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then | |
cat <<EOF | |
if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then | |
EOF | |
make_timeout "${GRUB_HIDDEN_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_STYLE_BUTTON}" | |
echo else | |
make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}" "${GRUB_TIMEOUT_STYLE}" | |
echo fi | |
else | |
make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}" "${GRUB_TIMEOUT_STYLE}" | |
fi | |
if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ] && [ "x$GRUB_BUTTON_CMOS_CLEAN" = "xyes" ]; then | |
cat <<EOF | |
cmosclean $GRUB_BUTTON_CMOS_ADDRESS | |
EOF | |
fi | |
# Play an initial tune | |
if [ "x${GRUB_INIT_TUNE}" != "x" ] ; then | |
echo "play ${GRUB_INIT_TUNE}" | |
fi | |
if [ "x${GRUB_BADRAM}" != "x" ] ; then | |
echo "badram ${GRUB_BADRAM}" | |
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
set -e | |
# grub-mkconfig helper script. | |
# Copyright (C) 2010 Alexander Kurtz <kurtz.alex@googlemail.com> | |
# | |
# 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/>. | |
# Include the GRUB helper library for grub-mkconfig. | |
. /usr/share/grub/grub-mkconfig_lib | |
# We want to work in /boot/grub/ only. | |
test -d /boot/grub; cd /boot/grub | |
# Set the location of a possibly necessary cache file for the background image. | |
# NOTE: This MUST BE A DOTFILE to avoid confusing it with user-defined images. | |
BACKGROUND_CACHE=".background_cache" | |
set_default_theme(){ | |
case $GRUB_DISTRIBUTOR in | |
Tanglu|Ubuntu|Kubuntu) | |
# Set a monochromatic theme for Tanglu/Ubuntu. | |
echo "${1}set menu_color_normal=white/black" | |
echo "${1}set menu_color_highlight=black/light-gray" | |
if [ -e /usr/share/plymouth/themes/default.grub ]; then | |
sed "s/^/${1}/" /usr/share/plymouth/themes/default.grub | |
fi | |
# For plymouth backward compatiblity. Can be removed | |
# after xenial. | |
if [ -e /lib/plymouth/themes/default.grub ]; then | |
sed "s/^/${1}/" /lib/plymouth/themes/default.grub | |
fi | |
;; | |
*) | |
# Set the traditional Debian blue theme. | |
echo "${1}set menu_color_normal=cyan/blue" | |
echo "${1}set menu_color_highlight=white/blue" | |
;; | |
esac | |
} | |
module_available(){ | |
local module | |
for module in "${1}.mod" */"${1}.mod"; do | |
if [ -f "${module}" ]; then | |
return 0 | |
fi | |
done | |
return 1 | |
} | |
set_background_image(){ | |
# Step #1: Search all available output modes ... | |
local output | |
for output in ${GRUB_TERMINAL_OUTPUT}; do | |
if [ "x$output" = "xgfxterm" ]; then | |
break | |
fi | |
done | |
# ... and check if we are able to display a background image at all. | |
if ! [ "x${output}" = "xgfxterm" ]; then | |
return 1 | |
fi | |
# Step #2: Check if the specified background image exists. | |
if ! [ -f "${1}" ]; then | |
return 2 | |
fi | |
# Step #3: Search the correct GRUB module for our background image. | |
local reader | |
case "${1}" in | |
*.jpg|*.JPG|*.jpeg|*.JPEG) reader="jpeg";; | |
*.png|*.PNG) reader="png";; | |
*.tga|*.TGA) reader="tga";; | |
*) return 3;; # Unknown image type. | |
esac | |
# Step #4: Check if the necessary GRUB module is available. | |
if ! module_available "${reader}"; then | |
return 4 | |
fi | |
# Step #5: Check if GRUB can read the background image directly. | |
# If so, we can remove the cache file (if any). Otherwise the backgound | |
# image needs to be cached under /boot/grub/. | |
if is_path_readable_by_grub "${1}"; then | |
rm --force "${BACKGROUND_CACHE}.jpeg" \ | |
"${BACKGROUND_CACHE}.png" "${BACKGROUND_CACHE}.tga" | |
elif cp "${1}" "${BACKGROUND_CACHE}.${reader}"; then | |
set -- "${BACKGROUND_CACHE}.${reader}" "${2}" "${3}" | |
else | |
return 5 | |
fi | |
# Step #6: Prepare GRUB to read the background image. | |
if ! prepare_grub_to_access_device "`${grub_probe} --target=device "${1}"`"; then | |
return 6 | |
fi | |
# Step #7: Everything went fine, print out a message to stderr ... | |
echo "Found background image: ${1}" >&2 | |
# ... and write our configuration snippet to stdout. Use the colors | |
# desktop-base specified. If we're using a user-defined background, use | |
# the default colors since we've got no idea how the image looks like. | |
# If loading the background image fails, use the default theme. | |
echo "insmod ${reader}" | |
echo "if background_image `make_system_path_relative_to_its_root "${1}"`; then" | |
if [ -n "${2}" ]; then | |
echo " set color_normal=${2}" | |
fi | |
if [ -n "${3}" ]; then | |
echo " set color_highlight=${3}" | |
fi | |
if [ -z "${2}" ] && [ -z "${3}" ]; then | |
echo " true" | |
fi | |
echo "else" | |
set_default_theme " " | |
echo "fi" | |
} | |
# Earlier versions of grub-pc copied the default background image to /boot/grub | |
# during postinst. Remove those obsolete images if they haven't been touched by | |
# the user. They are still available under /usr/share/images/desktop-base/ if | |
# desktop-base is installed. | |
while read checksum background; do | |
if [ -f "${background}" ] && [ "x`sha1sum "${background}"`" = "x${checksum} ${background}" ]; then | |
echo "Removing old background image: ${background}" >&2 | |
rm "${background}" | |
fi | |
done <<EOF | |
648ee65dd0c157a69b019a5372cbcfea4fc754a5 debian-blueish-wallpaper-640x480.png | |
0431e97a6c661084c59676c4baeeb8c2f602edb8 debian-blueish-wallpaper-640x480.png | |
968ecf6696c5638cfe80e8e70aba239526270864 debian-blueish-wallpaper-640x480.tga | |
11143e8c92a073401de0b0fd42d0c052af4ccd9b moreblue-orbit-grub.png | |
d00d5e505ab63f2d53fa880bfac447e2d3bb197c moreblue-orbit-grub.png | |
f5b12c1009ec0a3b029185f6b66cd0d7e5611019 moreblue-orbit-grub.png | |
EOF | |
# Include the configuration of desktop-base if available. | |
if [ -f "/usr/share/desktop-base/grub_background.sh" ]; then | |
. "/usr/share/desktop-base/grub_background.sh" | |
fi | |
# First check whether the user has specified a background image explicitly. | |
# If so, try to use it. Don't try the other possibilities in that case | |
# (#608263). | |
if [ -n "${GRUB_BACKGROUND+x}" ]; then | |
set_background_image "${GRUB_BACKGROUND}" || set_default_theme | |
exit 0 | |
fi | |
# Next search for pictures the user put into /boot/grub/ and use the first one. | |
for background in *.jpg *.JPG *.jpeg *.JPEG *.png *.PNG *.tga *.TGA; do | |
if set_background_image "${background}"; then | |
exit 0 | |
fi | |
done | |
# Next try to use the background image and colors specified by desktop-base. | |
if set_background_image "${WALLPAPER}" "${COLOR_NORMAL}" "${COLOR_HIGHLIGHT}"; then | |
exit 0 | |
fi | |
# If we haven't found a background image yet, use the default from desktop-base. | |
case $GRUB_DISTRIBUTOR in | |
Ubuntu|Kubuntu) | |
;; | |
Tanglu) | |
if set_background_image "/usr/share/images/grub/grub.png"; then | |
exit 0 | |
fi | |
;; | |
*) | |
if set_background_image "/usr/share/images/desktop-base/desktop-grub.png"; then | |
exit 0 | |
fi | |
;; | |
esac | |
# Finally, if all of the above fails, use the default theme. | |
set_default_theme |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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" | |
. "${datarootdir}/grub/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 | |
if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ | |
|| ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ | |
|| uses_abstraction "${GRUB_DEVICE}" lvm; then | |
LINUX_ROOT_DEVICE=${GRUB_DEVICE} | |
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= | |
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 | |
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 | |
sed "s/^/$submenu_indentation/" << EOF | |
linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args} | |
EOF | |
fi | |
if test -n "${initrd}" ; then | |
# TRANSLATORS: ramdisk isn't identifier. Should be translated. | |
if [ x"$quiet_boot" = x0 ] || [ x"$type" != xsimple ]; then | |
message="$(gettext_printf "Loading initial ramdisk ...")" | |
sed "s/^/$submenu_indentation/" << EOF | |
echo '$(echo "$message" | grub_quote)' | |
EOF | |
fi | |
sed "s/^/$submenu_indentation/" << EOF | |
initrd ${rel_dirname}/${initrd} | |
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 echo -n "$i " ; fi | |
done` ;; | |
*) | |
list=`for i in /boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* /boot/kernel-* ; do | |
if grub_file_is_not_garbage "$i" ; then echo -n "$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= | |
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 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= | |
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="$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 -n "${initrd}" ; then | |
gettext_printf "Found initrd image: %s\n" "${dirname}/${initrd}" >&2 | |
elif test -z "${initramfs}" ; then | |
# "UUID=" and "ZFS=" magic is parsed by initrd or initramfs. Since there's | |
# no initrd or builtin initramfs, it can't work here. | |
linux_root_device_thisversion=${GRUB_DEVICE} | |
fi | |
if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; 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 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 | |
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" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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" | |
. "${datarootdir}/grub/grub-mkconfig_lib" | |
export TEXTDOMAIN=grub | |
export TEXTDOMAINDIR="${datarootdir}/locale" | |
CLASS="--class gnu-linux --class gnu --class os --class xen" | |
SUPPORTED_INITS="sysvinit:/lib/sysvinit/init systemd:/lib/systemd/systemd upstart:/sbin/upstart" | |
if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then | |
OS=GNU/Linux | |
else | |
OS="${GRUB_DISTRIBUTOR} GNU/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/"` | |
# We can't cope with devices loop-mounted from files here. | |
case ${GRUB_DEVICE} in | |
/dev/*) ;; | |
*) exit 0 ;; | |
esac | |
;; | |
esac | |
if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ | |
|| ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ | |
|| uses_abstraction "${GRUB_DEVICE}" lvm; then | |
LINUX_ROOT_DEVICE=${GRUB_DEVICE} | |
else | |
LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} | |
fi | |
# Allow overriding GRUB_CMDLINE_LINUX and GRUB_CMDLINE_LINUX_DEFAULT. | |
if [ "${GRUB_CMDLINE_LINUX_XEN_REPLACE}" ]; then | |
GRUB_CMDLINE_LINUX="${GRUB_CMDLINE_LINUX_XEN_REPLACE}" | |
fi | |
if [ "${GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT}" ]; then | |
GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT}" | |
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" | |
xen_version="$3" | |
type="$4" | |
args="$5" | |
xen_args="$6" | |
if [ -z "$boot_device_id" ]; then | |
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")" | |
fi | |
if [ x$type != xsimple ] ; then | |
if [ x$type = xrecovery ] ; then | |
title="$(gettext_printf "%s, with Xen %s and Linux %s (%s)" "${os}" "${xen_version}" "${version}" "$(gettext "${GRUB_RECOVERY_TITLE}")")" | |
elif [ "${type#init-}" != "$type" ] ; then | |
title="$(gettext_printf "%s, with Xen %s and Linux %s (%s)" "${os}" "${xen_version}" "${version}" "${type#init-}")" | |
else | |
title="$(gettext_printf "%s, with Xen %s and Linux %s" "${os}" "${xen_version}" "${version}")" | |
fi | |
replacement_title="$(echo "Advanced options for ${OS}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')" | |
if [ x"Xen ${xen_version}>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then | |
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 'xen-gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/" | |
else | |
title="$(gettext_printf "%s, with Xen hypervisor" "${os}")" | |
echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'xen-gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/" | |
fi | |
if [ x$type != xrecovery ] ; then | |
save_default_entry | grub_add_tab | sed "s/^/$submenu_indentation/" | |
fi | |
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/" | |
xmessage="$(gettext_printf "Loading Xen %s ..." ${xen_version})" | |
lmessage="$(gettext_printf "Loading Linux %s ..." ${version})" | |
sed "s/^/$submenu_indentation/" << EOF | |
echo '$(echo "$xmessage" | grub_quote)' | |
if [ "\$grub_platform" = "pc" -o "\$grub_platform" = "" ]; then | |
xen_rm_opts= | |
else | |
xen_rm_opts="no-real-mode edd=off" | |
fi | |
multiboot ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts} | |
echo '$(echo "$lmessage" | grub_quote)' | |
module ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ro ${args} | |
EOF | |
if test -n "${initrd}" ; then | |
# TRANSLATORS: ramdisk isn't identifier. Should be translated. | |
message="$(gettext_printf "Loading initial ramdisk ...")" | |
sed "s/^/$submenu_indentation/" << EOF | |
echo '$(echo "$message" | grub_quote)' | |
module --nounzip ${rel_dirname}/${initrd} | |
EOF | |
fi | |
sed "s/^/$submenu_indentation/" << EOF | |
} | |
EOF | |
} | |
linux_list=`for i in /boot/vmlinu[xz]-* /vmlinu[xz]-* /boot/kernel-*; do | |
if grub_file_is_not_garbage "$i"; then | |
basename=$(basename $i) | |
version=$(echo $basename | sed -e "s,^[^0-9]*-,,g") | |
dirname=$(dirname $i) | |
config= | |
for j in "${dirname}/config-${version}" "${dirname}/config-${alt_version}" "/etc/kernels/kernel-config-${version}" ; do | |
if test -e "${j}" ; then | |
config="${j}" | |
break | |
fi | |
done | |
if (grep -qx "CONFIG_XEN_DOM0=y" "${config}" 2> /dev/null || grep -qx "CONFIG_XEN_PRIVILEGED_GUEST=y" "${config}" 2> /dev/null); then echo -n "$i " ; fi | |
fi | |
done` | |
if [ "x${linux_list}" = "x" ] ; then | |
exit 0 | |
fi | |
file_is_not_sym () { | |
case "$1" in | |
*/xen-syms-*) | |
return 1;; | |
*) | |
return 0;; | |
esac | |
} | |
xen_list=`for i in /boot/xen*; do | |
if grub_file_is_not_garbage "$i" && file_is_not_sym "$i" ; then echo -n "$i " ; fi | |
done` | |
prepare_boot_cache= | |
boot_device_id= | |
title_correction_code= | |
machine=`uname -m` | |
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 | |
# 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${xen_list}" != "x" ] ; do | |
list="${linux_list}" | |
current_xen=`version_find_latest $xen_list` | |
xen_basename=`basename ${current_xen}` | |
xen_dirname=`dirname ${current_xen}` | |
rel_xen_dirname=`make_system_path_relative_to_its_root $xen_dirname` | |
xen_version=`echo $xen_basename | sed -e "s,.gz$,,g;s,^xen-,,g"` | |
if [ -z "$boot_device_id" ]; then | |
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")" | |
fi | |
if [ "x$is_top_level" != xtrue ]; then | |
echo " submenu '$(gettext_printf "Xen hypervisor, version %s" "${xen_version}" | grub_quote)' \$menuentry_id_option 'xen-hypervisor-$xen_version-$boot_device_id' {" | |
fi | |
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}" | |
initrd= | |
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="$i" | |
break | |
fi | |
done | |
if test -n "${initrd}" ; then | |
gettext_printf "Found initrd image: %s\n" "${dirname}/${initrd}" >&2 | |
else | |
# "UUID=" magic is parsed by initrds. Since there's no initrd, it can't work here. | |
linux_root_device_thisversion=${GRUB_DEVICE} | |
fi | |
if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; then | |
linux_entry "${OS}" "${version}" "${xen_version}" simple \ | |
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" "${GRUB_CMDLINE_XEN} ${GRUB_CMDLINE_XEN_DEFAULT}" | |
submenu_indentation="$grub_tab$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 (with Xen hypervisor)" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {" | |
echo " submenu '$(gettext_printf "Xen hypervisor, version %s" "${xen_version}" | grub_quote)' \$menuentry_id_option 'xen-hypervisor-$xen_version-$boot_device_id' {" | |
is_top_level=false | |
fi | |
linux_entry "${OS}" "${version}" "${xen_version}" advanced \ | |
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" "${GRUB_CMDLINE_XEN} ${GRUB_CMDLINE_XEN_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}" "${xen_version}" "init-${supported_init%%:*}" \ | |
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} init=${init_path}" "${GRUB_CMDLINE_XEN} ${GRUB_CMDLINE_XEN_DEFAULT}" | |
fi | |
done | |
if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then | |
linux_entry "${OS}" "${version}" "${xen_version}" recovery \ | |
"single ${GRUB_CMDLINE_LINUX}" "${GRUB_CMDLINE_XEN}" | |
fi | |
list=`echo $list | tr ' ' '\n' | fgrep -vx "$linux" | tr '\n' ' '` | |
done | |
if [ x"$is_top_level" != xtrue ]; then | |
echo ' }' | |
fi | |
xen_list=`echo $xen_list | tr ' ' '\n' | fgrep -vx "$current_xen" | 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" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /bin/sh | |
set -e | |
# grub-mkconfig helper script. | |
# Copyright (C) 2006,2007,2008,2009 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" | |
quick_boot="1" | |
export TEXTDOMAIN=grub | |
export TEXTDOMAINDIR="${datarootdir}/locale" | |
. "${datarootdir}/grub/grub-mkconfig_lib" | |
found_other_os= | |
adjust_timeout () { | |
if [ "$quick_boot" = 1 ] && [ "x${found_other_os}" != "x" ]; then | |
cat << EOF | |
set timeout_style=menu | |
if [ "\${timeout}" = 0 ]; then | |
set timeout=10 | |
fi | |
EOF | |
fi | |
} | |
if [ "x${GRUB_DISABLE_OS_PROBER}" = "xtrue" ]; then | |
exit 0 | |
fi | |
if [ -z "`which os-prober 2> /dev/null`" -o -z "`which linux-boot-prober 2> /dev/null`" ] ; then | |
# missing os-prober and/or linux-boot-prober | |
exit 0 | |
fi | |
OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`" | |
if [ -z "${OSPROBED}" ] ; then | |
# empty os-prober output, nothing doing | |
exit 0 | |
fi | |
osx_entry() { | |
found_other_os=1 | |
if [ x$2 = x32 ]; then | |
# TRANSLATORS: it refers to kernel architecture (32-bit) | |
bitstr="$(gettext "(32-bit)")" | |
else | |
# TRANSLATORS: it refers to kernel architecture (64-bit) | |
bitstr="$(gettext "(64-bit)")" | |
fi | |
# TRANSLATORS: it refers on the OS residing on device %s | |
onstr="$(gettext_printf "(on %s)" "${DEVICE}")" | |
cat << EOF | |
menuentry '$(echo "${LONGNAME} $bitstr $onstr" | grub_quote)' --class osx --class darwin --class os \$menuentry_id_option 'osprober-xnu-$2-$(grub_get_device_id "${DEVICE}")' { | |
EOF | |
save_default_entry | grub_add_tab | |
prepare_grub_to_access_device ${DEVICE} | grub_add_tab | |
cat << EOF | |
load_video | |
set do_resume=0 | |
if [ /var/vm/sleepimage -nt10 / ]; then | |
if xnu_resume /var/vm/sleepimage; then | |
set do_resume=1 | |
fi | |
fi | |
if [ \$do_resume = 0 ]; then | |
xnu_uuid ${OSXUUID} uuid | |
if [ -f /Extra/DSDT.aml ]; then | |
acpi -e /Extra/DSDT.aml | |
fi | |
if [ /kernelcache -nt /System/Library/Extensions ]; then | |
$1 /kernelcache boot-uuid=\${uuid} rd=*uuid | |
else | |
$1 /mach_kernel boot-uuid=\${uuid} rd=*uuid | |
if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then | |
xnu_mkext /System/Library/Extensions.mkext | |
else | |
xnu_kextdir /System/Library/Extensions | |
fi | |
fi | |
if [ -f /Extra/Extensions.mkext ]; then | |
xnu_mkext /Extra/Extensions.mkext | |
fi | |
if [ -d /Extra/Extensions ]; then | |
xnu_kextdir /Extra/Extensions | |
fi | |
if [ -f /Extra/devprop.bin ]; then | |
xnu_devprop_load /Extra/devprop.bin | |
fi | |
if [ -f /Extra/splash.jpg ]; then | |
insmod jpeg | |
xnu_splash /Extra/splash.jpg | |
fi | |
if [ -f /Extra/splash.png ]; then | |
insmod png | |
xnu_splash /Extra/splash.png | |
fi | |
if [ -f /Extra/splash.tga ]; then | |
insmod tga | |
xnu_splash /Extra/splash.tga | |
fi | |
fi | |
} | |
EOF | |
} | |
used_osprober_linux_ids= | |
wubi= | |
for OS in ${OSPROBED} ; do | |
DEVICE="`echo ${OS} | cut -d ':' -f 1`" | |
LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`" | |
LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`" | |
BOOT="`echo ${OS} | cut -d ':' -f 4`" | |
if UUID="`${grub_probe} --target=fs_uuid --device ${DEVICE%@*}`"; then | |
EXPUUID="$UUID" | |
if [ x"${DEVICE#*@}" != x ] ; then | |
EXPUUID="${EXPUUID}@${DEVICE#*@}" | |
fi | |
if [ "x${GRUB_OS_PROBER_SKIP_LIST}" != "x" -a "x`echo ${GRUB_OS_PROBER_SKIP_LIST} | grep -i -e '\b'${EXPUUID}'\b'`" != "x" ] ; then | |
echo "Skipped ${LONGNAME} on ${DEVICE} by user request." >&2 | |
continue | |
fi | |
fi | |
BTRFS="`echo ${OS} | cut -d ':' -f 5`" | |
if [ "x$BTRFS" = "xbtrfs" ]; then | |
BTRFSuuid="`echo ${OS} | cut -d ':' -f 6`" | |
BTRFSsubvol="`echo ${OS} | cut -d ':' -f 7`" | |
fi | |
if [ -z "${LONGNAME}" ] ; then | |
LONGNAME="${LABEL}" | |
fi | |
gettext_printf "Found %s on %s\n" "${LONGNAME}" "${DEVICE}" >&2 | |
case ${BOOT} in | |
chain) | |
case ${LONGNAME} in | |
Windows*) | |
if [ -z "$wubi" ]; then | |
if [ -x /usr/share/lupin-support/grub-mkimage ] && \ | |
/usr/share/lupin-support/grub-mkimage --test; then | |
wubi=yes | |
else | |
wubi=no | |
fi | |
fi | |
if [ "$wubi" = yes ]; then | |
echo "Skipping ${LONGNAME} on Wubi system" >&2 | |
continue | |
fi | |
;; | |
esac | |
found_other_os=1 | |
onstr="$(gettext_printf "(on %s)" "${DEVICE}")" | |
cat << EOF | |
menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class windows --class os \$menuentry_id_option 'osprober-chain-$(grub_get_device_id "${DEVICE}")' { | |
EOF | |
save_default_entry | grub_add_tab | |
prepare_grub_to_access_device ${DEVICE} | grub_add_tab | |
if [ x"`${grub_probe} --device ${DEVICE} --target=partmap`" = xmsdos ]; then | |
cat << EOF | |
parttool \${root} hidden- | |
EOF | |
fi | |
case ${LONGNAME} in | |
Windows\ Vista*|Windows\ 7*|Windows\ Server\ 2008*) | |
;; | |
*) | |
cat << EOF | |
drivemap -s (hd0) \${root} | |
EOF | |
;; | |
esac | |
cat <<EOF | |
chainloader +1 | |
} | |
EOF | |
;; | |
efi) | |
found_other_os=1 | |
EFIPATH=${DEVICE#*@} | |
DEVICE=${DEVICE%@*} | |
onstr="$(gettext_printf "(on %s)" "${DEVICE}")" | |
cat << EOF | |
menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class windows --class os \$menuentry_id_option 'osprober-efi-$(grub_get_device_id "${DEVICE}")' { | |
EOF | |
save_default_entry | sed -e "s/^/\t/" | |
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/" | |
cat <<EOF | |
chainloader ${EFIPATH} | |
} | |
EOF | |
;; | |
linux) | |
if [ "x$BTRFS" = "xbtrfs" ]; then | |
LINUXPROBED="`linux-boot-prober btrfs ${BTRFSuuid} ${BTRFSsubvol} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`" | |
else | |
LINUXPROBED="`linux-boot-prober ${DEVICE} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`" | |
fi | |
prepare_boot_cache= | |
boot_device_id= | |
is_top_level=true | |
title_correction_code= | |
OS="${LONGNAME}" | |
for LINUX in ${LINUXPROBED} ; do | |
LROOT="`echo ${LINUX} | cut -d ':' -f 1`" | |
LBOOT="`echo ${LINUX} | cut -d ':' -f 2`" | |
LLABEL="`echo ${LINUX} | cut -d ':' -f 3 | tr '^' ' '`" | |
LKERNEL="`echo ${LINUX} | cut -d ':' -f 4`" | |
LINITRD="`echo ${LINUX} | cut -d ':' -f 5`" | |
LPARAMS="`echo ${LINUX} | cut -d ':' -f 6- | tr '^' ' '`" | |
if [ -z "${LLABEL}" ] ; then | |
LLABEL="${LONGNAME}" | |
fi | |
if [ "${LROOT}" != "${LBOOT}" ]; then | |
LKERNEL="${LKERNEL#/boot}" | |
LINITRD="${LINITRD#/boot}" | |
fi | |
if [ -z "${prepare_boot_cache}" ]; then | |
prepare_boot_cache="$(prepare_grub_to_access_device ${LBOOT} | grub_add_tab)" | |
[ "${prepare_boot_cache}" ] || continue | |
fi | |
found_other_os=1 | |
onstr="$(gettext_printf "(on %s)" "${DEVICE}")" | |
recovery_params="$(echo "${LPARAMS}" | grep 'single\|recovery')" || true | |
counter=1 | |
while echo "$used_osprober_linux_ids" | grep 'osprober-gnulinux-$LKERNEL-${recovery_params}-$counter-$boot_device_id' > /dev/null; do | |
counter=$((counter+1)); | |
done | |
if [ -z "$boot_device_id" ]; then | |
boot_device_id="$(grub_get_device_id "${DEVICE}")" | |
fi | |
used_osprober_linux_ids="$used_osprober_linux_ids 'osprober-gnulinux-$LKERNEL-${recovery_params}-$counter-$boot_device_id'" | |
if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; then | |
cat << EOF | |
menuentry '$(echo "$OS $onstr" | grub_quote)' --class gnu-linux --class gnu --class os \$menuentry_id_option 'osprober-gnulinux-simple-$boot_device_id' { | |
EOF | |
save_default_entry | grub_add_tab | |
printf '%s\n' "${prepare_boot_cache}" | |
cat << EOF | |
linux ${LKERNEL} ${LPARAMS} | |
EOF | |
if [ -n "${LINITRD}" ] ; then | |
cat << EOF | |
initrd ${LINITRD} | |
EOF | |
fi | |
cat << EOF | |
} | |
EOF | |
echo "submenu '$(gettext_printf "Advanced options for %s" "${OS} $onstr" | grub_quote)' \$menuentry_id_option 'osprober-gnulinux-advanced-$boot_device_id' {" | |
is_top_level=false | |
fi | |
title="${LLABEL} $onstr" | |
cat << EOF | |
menuentry '$(echo "$title" | grub_quote)' --class gnu-linux --class gnu --class os \$menuentry_id_option 'osprober-gnulinux-$LKERNEL-${recovery_params}-$boot_device_id' { | |
EOF | |
save_default_entry | sed -e "s/^/$grub_tab$grub_tab/" | |
printf '%s\n' "${prepare_boot_cache}" | grub_add_tab | |
cat << EOF | |
linux ${LKERNEL} ${LPARAMS} | |
EOF | |
if [ -n "${LINITRD}" ] ; then | |
cat << EOF | |
initrd ${LINITRD} | |
EOF | |
fi | |
cat << EOF | |
} | |
EOF | |
if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then | |
replacement_title="$(echo "Advanced options for ${OS} $onstr" | 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 | |
done | |
if [ x"$is_top_level" != xtrue ]; then | |
echo '}' | |
fi | |
echo "$title_correction_code" | |
;; | |
macosx) | |
if [ "${UUID}" ]; then | |
OSXUUID="${UUID}" | |
osx_entry xnu_kernel 32 | |
osx_entry xnu_kernel64 64 | |
fi | |
;; | |
hurd) | |
found_other_os=1 | |
onstr="$(gettext_printf "(on %s)" "${DEVICE}")" | |
cat << EOF | |
menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class hurd --class gnu --class os \$menuentry_id_option 'osprober-gnuhurd-/boot/gnumach.gz-false-$(grub_get_device_id "${DEVICE}")' { | |
EOF | |
save_default_entry | grub_add_tab | |
prepare_grub_to_access_device ${DEVICE} | grub_add_tab | |
grub_device="`${grub_probe} --device ${DEVICE} --target=drive`" | |
mach_device="`echo "${grub_device}" | sed -e 's/(\(hd.*\),msdos\(.*\))/\1s\2/'`" | |
grub_fs="`${grub_probe} --device ${DEVICE} --target=fs`" | |
case "${grub_fs}" in | |
*fs) hurd_fs="${grub_fs}" ;; | |
*) hurd_fs="${grub_fs}fs" ;; | |
esac | |
cat << EOF | |
multiboot /boot/gnumach.gz root=device:${mach_device} | |
module /hurd/${hurd_fs}.static ${hurd_fs} --readonly \\ | |
--multiboot-command-line='\${kernel-command-line}' \\ | |
--host-priv-port='\${host-port}' \\ | |
--device-master-port='\${device-port}' \\ | |
--exec-server-task='\${exec-task}' -T typed '\${root}' \\ | |
'\$(task-create)' '\$(task-resume)' | |
module /lib/ld.so.1 exec /hurd/exec '\$(exec-task=task-create)' | |
} | |
EOF | |
;; | |
minix) | |
cat << EOF | |
menuentry "${LONGNAME} (on ${DEVICE}, Multiboot)" { | |
EOF | |
save_default_entry | sed -e "s/^/\t/" | |
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/" | |
cat << EOF | |
multiboot /boot/image_latest | |
} | |
EOF | |
;; | |
*) | |
echo -n " " | |
# TRANSLATORS: %s is replaced by OS name. | |
gettext_printf "%s is not yet supported by grub-mkconfig.\n" "${LONGNAME}" >&2 | |
;; | |
esac | |
done | |
adjust_timeout |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# If you change this file, run 'update-grub' afterwards to update | |
# /boot/grub/grub.cfg. | |
# For full documentation of the options in this file, see: | |
# info -f grub -n 'Simple configuration' | |
GRUB_DEFAULT="0" | |
#GRUB_HIDDEN_TIMEOUT="0" | |
GRUB_HIDDEN_TIMEOUT_QUIET="true" | |
GRUB_TIMEOUT="10" | |
GRUB_DISTRIBUTOR="`lsb_release -i -s 2> /dev/null || echo Debian`" | |
GRUB_CMDLINE_LINUX_DEFAULT="splash quiet" | |
GRUB_CMDLINE_LINUX="" | |
# Uncomment to enable BadRAM filtering, modify to suit your needs | |
# This works with Linux (no patch required) and with any kernel that obtains | |
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...) | |
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef" | |
# Uncomment to disable graphical terminal (grub-pc only) | |
#GRUB_TERMINAL="console" | |
# The resolution used on graphical terminal | |
# note that you can use only modes which your graphic card supports via VBE | |
# you can see them in real GRUB with the command `vbeinfo' | |
#GRUB_GFXMODE="640x480" | |
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux | |
#GRUB_DISABLE_LINUX_UUID="true" | |
# Uncomment to disable generation of recovery mode menu entries | |
#GRUB_DISABLE_RECOVERY="true" | |
# Uncomment to get a beep at grub start | |
#GRUB_INIT_TUNE="480 440 1" | |
export GRUB_COLOR_NORMAL="light-green/black" | |
export GRUB_COLOR_HIGHLIGHT="magenta/black" | |
GRUB_FONT="/boot/grub/unicode.pf2"GRUB_GFXPAYLOAD_LINUX=None | |
GRUB_GFXPAYLOAD_LINUX=None |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment