3 # Copyright 2013-2014 Intel Corporation
4 # Author: Artem Bityutskiy
7 PROG="setup-scripts-bootloader-conf"
10 srcdir="$(readlink -ev -- ${0%/*})"
11 PATH="/usr/share/setup-scripts:$srcdir:$PATH"
13 if [ -f "$srcdir/setup-scripts-sh-functions" ]; then
14 . "$srcdir/setup-scripts-sh-functions"
15 . "$srcdir/installerfw-sh-functions"
17 . /usr/share/setup-scripts/setup-scripts-sh-functions
18 . /usr/share/setup-scripts/installerfw-sh-functions
21 # This is a small trick which I use to make sure my scripts are portable -
22 # check if 'dash' is present, and if yes - use it.
23 if can_switch_to_dash; then
24 exec dash -euf -- "$srcdir/$PROG" "$@"
28 # Preparation stuff common for all subcommands
31 # Get the installer framework environment
32 installerfw_restore_env
34 rootdir="$(installerfw_mnt_prefix "/")"
35 bootdir="$(installerfw_mnt_prefix "/boot")"
37 if installerfw_is_efi_boot_system; then
45 # -----------------------------------------------------------------------------
46 # The "add" subcommand
47 # -----------------------------------------------------------------------------
53 Usage: $PROG add [options] <kernel>
55 Add bootloader entries for kernel <kernel>.
58 -f, --force if bootloader entries for <kernel> already exist in bootloader's
59 config file(s) - re-write them, if <kernel> does not exist - do
61 -h, --help show this text and exit
67 IFS= printf "%s\n\n" "$PROG: error: $*" >&2
74 if [ "$#" -eq 0 ]; then
80 tmp=`getopt -n $PROG -o f,h --long force,help -- "$@"` ||
81 show_add_usage_fail "cannot parse command-line options"
96 *) show_add_usage_fail "unrecognized option \"$1\""
102 if [ "$#" -lt 1 ]; then
103 show_add_usage_fail "please, specify the kernel"
105 if [ "$#" -gt 1 ]; then
106 show_add_usage_fail "too many arguments: \"$1\""
112 local kernel_path="$bootdir/$kernel"
114 if ! [ -f "$kernel_path" ] && [ -z "$force" ]; then
115 fatal "cannot find kernel \"$kernel_path\"" \
116 "(use -f to ignore this error)"
119 # Get root partition PARTUUID
120 installerfw_get_part_info "/" "PARTUUID" "root_partuuid"
121 [ -n "$root_partuuid" ] || \
122 fatal "cannot find PARTUUID of the root partition"
125 local options="${INSTALLERFW_KERNEL_OPTS:-} root=PARTUUID=$root_partuuid"
129 get_os_name "os_name"
131 # Add the default bootloader entry
132 setup-$boot-conf $verbose --bootdir "$bootdir" add $force \
133 "$kernel" "$os_name" "$kernel" "$options"
135 # Add the debug bootloader entry. If there is the "quiet" option,
136 # create a non-quiet configuration.
137 local verbose_opts="$(printf "%s" "$options" | LC_ALL=C \
138 sed -e "s/[[:blank:]]\+quiet[[:blank:]]\+/ /
139 s/^quiet[[:blank:]]\+//
140 s/[[:blank:]]\+quiet$//
143 local debug_opts="$verbose_opts ignore_loglevel log_buf_len=2M"
144 local debug_opts="$debug_opts initcall_debug"
147 setup-$boot-conf $verbose --bootdir "$bootdir" add \
148 $force "$kernel-debug" "Debug $os_name" \
149 "$kernel" "$verbose_opts"
151 # Add the clone bootloader entry, but only if the cloning tool is
153 if [ -f "$rootdir/usr/sbin/setup-scripts-clone" ]; then
154 clone_opts="$options systemd.unit=scripts-clone.service"
155 clone_opts="$clone_opts scripts-clone-target=autodetect"
156 setup-$boot-conf $verbose --bootdir "$bootdir" add \
157 $force "$kernel-clone" "Clone $os_name" \
158 "$kernel" "$clone_opts"
161 # Use default gummiboot-splash file
162 local splash_path="$rootdir/usr/share/gummiboot/splash.bmp"
164 # Add a splash entry for fastboot testing and disable fbcon
165 if [ "$boot" = "gummiboot" ] && [ -f "$splash_path" ]; then
166 local splash_opts="$options i915.fastboot=1 fbcon=map:9"
167 setup-$boot-conf $verbose --bootdir "$bootdir" add \
168 $force --splash "$splash_path" "$kernel-splash" \
169 "Splash $os_name" "$kernel" "$splash_opts"
170 splash_opts_dp="$splash_opts video=HDMI-A-1:d"
171 setup-$boot-conf $verbose --bootdir "$bootdir" add \
172 $force --splash "$splash_path" "$kernel-splash-dp" \
173 "Splash DP $os_name" "$kernel" "$splash_opts_dp"
174 splash_opts_hdmi="$splash_opts video=DP-1:d video=VGA-1:d"
175 setup-$boot-conf $verbose --bootdir "$bootdir" add \
176 $force --splash "$splash_path" "$kernel-splash-hdmi" \
177 "Splash HDMI $os_name" "$kernel" "$splash_opts_hdmi"
182 # -----------------------------------------------------------------------------
183 # The "remove" subcommand
184 # -----------------------------------------------------------------------------
190 Usage: $PROG remove [options] <kernel>
192 Delete bootloader entries for kernel <kernel> (only those which were previously
193 created with "$PROG add").
196 -f, --force do not fail if <kernel> does not have corresponding bootloader
198 -h, --help show this text and exit
202 show_remove_usage_fail()
204 IFS= printf "%s\n\n" "$PROG: error: $*" >&2
205 show_remove_usage >&2
211 if [ "$#" -eq 0 ]; then
217 tmp=`getopt -n $PROG -o f,h --long force,help -- "$@"` ||
218 show_remove_usage_fail "cannot parse command-line options"
233 *) show_remove_usage_fail "unrecognized option \"$1\""
239 if [ "$#" -lt 1 ]; then
240 show_add_usage_fail "please, specify the kernel"
242 if [ "$#" -gt 1 ]; then
243 show_remove_usage_fail "too many arguments: \"$1\""
250 # Get the current default entry
251 local default="$(setup-$boot-conf $verbose --bootdir "$bootdir" \
254 fatal "cannot get the default kernel, setup-$boot-conf failed"
256 local default_kernel="$(printf "%s" "$default" | LC_ALL=C \
257 sed -n -e 's/^kernel: \(.\+\)$/\1/p')"
259 if [ -n "$default_kernel" ]; then
260 verbose "current default boot kernel is " \
261 "\"$default_kernel\""
263 verbose "did not find the default kernel," \
264 "setup-$boot-conf returned: $default"
268 setup-$boot-conf $verbose --bootdir "$bootdir" \
269 remove $force "$kernel" || \
270 fatal "setup-$boot-conf failed to remove" \
272 setup-$boot-conf $verbose --bootdir "$bootdir" \
273 remove $force "$kernel-debug" || \
274 fatal "setup-$boot-conf failed to remove" \
275 "entry \"$kernel-verbose\""
276 # The "clone" entry does not necessary exist, so use --force
277 setup-$boot-conf $verbose --bootdir "$bootdir" \
278 remove --force "$kernel-clone" || \
279 fatal "setup-$boot-conf failed to remove" \
280 "entry \"$kernel-clone\""
282 setup-$boot-conf $verbose --bootdir "$bootdir" \
283 remove --force "$kernel-splash" || \
284 fatal "setup-$boot-conf failed to remove" \
285 "entry \"$kernel-splash\""
287 # If this is not the default kernel, we are done
288 [ "$kernel" = "$default_kernel" ] || return 0
290 # We've just removed the default kernel, find the kernel with the
291 # latest version and make it to be the default
293 verbose "removed the default kernel, find the newest available"
295 local newest_kernel="$(get_newest_kernel "$bootdir" "$kernel")"
297 if [ -z "$newest_kernel" ]; then
298 verbose "no more kernels, set the kernel to none"
299 setup-$boot-conf $verbose --bootdir "$bootdir" \
300 default --force "<none>"
302 verbose "new default kernel is \"$newest_kernel\""
303 setup-$boot-conf $verbose --bootdir "$bootdir" \
304 default "$newest_kernel"
307 if [ "$?" -ne 0 ]; then
308 fatal "cannot set default kernel, \"setup-$boot-conf\" failed"
313 # -----------------------------------------------------------------------------
314 # The "default" subcommand
315 # -----------------------------------------------------------------------------
321 Usage: $PROG default [options] <kernel>
323 Set the default boot kernel to <kernel>. If <kernel> is omited, print the
324 current default boot kernel name.
327 -f, --force do not fail if <kernel> doesn't exist
328 -h, --help show this text and exit
332 show_default_usage_fail()
334 IFS= printf "%s\n\n" "$PROG: error: $*" >&2
335 show_default_usage >&2
342 tmp=`getopt -n $PROG -o f,h --long force,help -- "$@"` ||
343 show_default_usage_fail "cannot parse command-line options"
358 *) show_default_usage_fail "unrecognized option \"$1\""
364 if [ "$#" -gt 1 ]; then
365 show_default_usage_fail "too many arguments: \"$1\""
370 local kernel="${1:-}"
371 local kernel_path="$bootdir/$kernel"
373 if [ -n "$kernel" ] && ! [ -f "$kernel_path" ] && [ -z "$force" ]; then
374 fatal "cannot find kernel \"$kernel_path\"" \
375 "(use -f to ignore this error)"
378 setup-$boot-conf $verbose --bootdir "$bootdir" default $force "$kernel"
382 # -----------------------------------------------------------------------------
388 Usage: $PROG [options] <subcommand> [options] <arguments>
390 This program adds or removes a kernel to/from the bootloader configuration
391 file(s). This is a Tizen specific program and it currently supports only 2
392 bootloader types - extlinux and gummiboot. Each new kernel gets 2 boot menu
393 entries - the default and verbose, and both of these are removed by the
396 The supported subcommands are:
397 add - add bootloader entries for a kernel
398 remove - remove bootloader entries for a kernel
399 default - get or set the default boot kernel
401 Run "$PROG <subcommand>" to see subcommand-specific help.
404 --version show the program version and exit
405 -v, --verbose be verbose
406 -h, --help show this text and exit
412 IFS= printf "%s\n\n" "$PROG: error: $*" >&2
418 while [ -n "${1:-""}" ] && [ -z "${1##-*}" ]; do
433 *) show_usage_fail "unrecognized option \"$1\""
439 if [ "$#" -eq 0 ]; then
446 subcommand="$1"; shift
448 case "$subcommand" in
454 remove_subcommand "$@"
458 default_subcommand "$@"
461 *) show_usage_fail "unrecognized subcommand \"$subcommand\""