-
Notifications
You must be signed in to change notification settings - Fork 108
Expand file tree
/
Copy pathgrubonce2
More file actions
executable file
·147 lines (131 loc) · 4.25 KB
/
grubonce2
File metadata and controls
executable file
·147 lines (131 loc) · 4.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#!/bin/bash
#
# For grub2
# ---------
# Script for selecting which kernel to boot on:
# but only once (single boot),
# useful if kernel will not boot (next power cycle, boot default kernel)
#
# Grub2 is a little more tricky than grub1
# ----------------------------------------
# [1] https://fedoraproject.org/wiki/GRUB_2?rd=Grub2#Setting_default_entry
#
# Due to grub2-mkconfig (and os-prober) we cannot predict the order of
# the entries in /boot/grub2/grub.cfg, so we set the default by
# name/title instead.
#
# Authors: Jesper Dangaard Brouer <brouer@redhat.com>
# sudo trick
function root_check_run_with_sudo() {
# Trick so, program can be run as normal user, will just use "sudo"
# call as root_check_run_as_sudo "$@"
if [ "$EUID" -ne 0 ]; then
if [ -x $0 ]; then # Directly executable use sudo
echo "(Not root, running with sudo)"
sudo "$0" "$@"
exit $?
fi
echo "cannot perform sudo run of $0"
exit 1
fi
}
root_check_run_with_sudo "$@"
# Source the default grub config
source /etc/default/grub
# Verify "saved" mode is enabled
if [[ "$GRUB_DEFAULT" != "saved" ]]; then
echo "***ERROR***: Please enable grub2 \"saved\" mode, by adding:"
echo " GRUB_DEFAULT=saved to /etc/default/grub"
echo "and regenerate grub2 config via cmd:"
echo " grub2-mkconfig -o /boot/grub2/grub.cfg"
exit 1
fi
# Verify submenu have been disabled
if [[ "$GRUB_DISABLE_SUBMENU" != "true" ]]; then
echo "***ERROR***: Please disable grub2 \"submenu\" mode, by adding:"
echo " GRUB_DISABLE_SUBMENU=true to /etc/default/grub"
echo "and regenerate grub2 config via cmd:"
echo " grub2-mkconfig -o /boot/grub2/grub.cfg"
echo "(This script does not support grub2 submenus)"
exit 2
fi
# Unfortunately output from grubenv or $(grub2-editenv list) cannot
# directly be sourced as shell variables due to missing quoting.
# It would have been as easy as:
# export $(grub2-editenv list)
# Instead extract each variable seperately
function get_grubenv()
{
local key=$1
value=$(grub2-editenv list | grep $key | cut -d "=" -f2)
echo "$value"
}
# Get current saved grub env variables
# export $(grub2-editenv list) #cannot be used due to missing quoting
# export $(grub2-editenv list | awk -F= '{print $1"=\""$2"\""}')
# export $(grub2-editenv list | sed -n 's/\(.*\)=\(.*\)/\1=\x27\2\x27/p')
saved_entry=$(get_grubenv saved_entry)
next_entry=$(get_grubenv next_entry)
echo "Select kernel to boot once (on next reboot):"
# Extract the avail kernels from grub.cfg
IFS=$'\n' KERNELS=( $(grep "^\menuentry" /boot/grub2/grub.cfg | cut -d "'" -f2) )
function select_kernel()
{
local sel
cnt=${#KERNELS[@]}
if [[ -n $1 ]]; then
sel=$1
else
for ((i = 0; i < cnt; i++)); do
flag=' '
[[ "${KERNELS[i]}" == "$saved_entry" ]] && flag='*'
[[ "${KERNELS[i]}" == "$next_entry" ]] && flag='+'
# todo: saved entry could be a number
# (( i == $saved_entry )) && flag='*'
echo "$flag$i: ${KERNELS[i]}" >&2
done
read -p 'Select a kernel: ' sel
fi
if (( sel == 0 || sel >= cnt )) && [[ $sel != 0 ]]; then
echo "Invalid input" >&2
exit 1
fi
echo "$sel"
}
# Make sure a default fallback kernel have been selected
if [[ -z "$saved_entry" ]]; then
echo "***WARNING***: You don't have a fallback saved entry"
read -p "Do you want to select a fallback now (y/[n])?"
if [ "$REPLY" == "y" ]; then
fallback=$(select_kernel)
if [[ $? -gt 0 ]]; then
echo "***ERROR*** selecting kernel, bailout"
exit 2;
fi
echo " - Selected fallback kernel: ${KERNELS[fallback]}"
grub2-set-default "${KERNELS[fallback]}"
saved_entry=$(get_grubenv saved_entry)
fi
echo "Now: Select kernel to boot once (on next reboot):"
else
echo " - Current fallback saved_entry: $saved_entry"
fi
if [[ -n "$next_entry" ]]; then
echo " - Currently already choose boot next: $next_entry"
fi
# Allow cmdline selecting kernel by index
if [[ -n $1 ]]; then
cmdline_select=$1
fi
# Choose kernel
index=$(select_kernel $cmdline_select)
if [[ $? -gt 0 ]]; then
echo "***ERROR*** selecting kernel, bailout"
exit 1;
fi
echo " - Selected boot once kernel: $index: \"${KERNELS[index]}\""
grub2-reboot "${KERNELS[index]}"
read -p "Do you want to reboot now (y/[n])?"
if [[ "$REPLY" == "y" ]]; then
reboot
fi