From 2b365a069caef3f83d6b100c55491f239a841acdc495011439743b0a2967c057 Mon Sep 17 00:00:00 2001 From: Marcus Meissner Date: Fri, 17 Jan 2014 12:38:35 +0000 Subject: [PATCH] Accepting request 214140 from home:michael-chang:branches:Base:System - refresh 0001-script-provide-overridable-root-by-subvol.patch * Introduce $boot_prefix for setting prefix on seeking other /boot directory. - refresh 0002-script-create-menus-for-btrfs-snapshot.patch * Support existing snapshots by creating their missing slave configs. * Temporarily default to disable this feature until receiving more tests from QA. * Introduce GRUB_ENABLE_CUSTOM_SNAPSHOT_SUBMENU to allow custom submenu for listing snapshots rather than the default one. OBS-URL: https://build.opensuse.org/request/show/214140 OBS-URL: https://build.opensuse.org/package/show/Base:System/grub2?expand=0&rev=67 --- ...t-provide-overridable-root-by-subvol.patch | 18 ++++ ...ript-create-menus-for-btrfs-snapshot.patch | 83 +++++++++++++++++-- grub2.changes | 13 +++ 3 files changed, 108 insertions(+), 6 deletions(-) diff --git a/0001-script-provide-overridable-root-by-subvol.patch b/0001-script-provide-overridable-root-by-subvol.patch index 85dc1d9..e2414dc 100644 --- a/0001-script-provide-overridable-root-by-subvol.patch +++ b/0001-script-provide-overridable-root-by-subvol.patch @@ -7,6 +7,10 @@ Patch-Mainline: no This patch provides a environment variable $subvol that can be used to override path relative to absolute root by specific $subvol. +v1: +Introduce $boot_prefix for setting prefix on seeking other /boot +directory. + Signed-off-by: Michael Chang Index: grub-2.02~beta2/util/grub.d/10_linux.in @@ -94,3 +98,17 @@ Index: grub-2.02~beta2/util/grub.d/10_linux.in fi fi sed "s/^/$submenu_indentation/" << EOF +@@ -161,11 +197,11 @@ EOF + machine=`uname -m` + case "x$machine" in + xi?86 | xx86_64) +- list=`for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* ; do ++ list=`for i in ${boot_prefix}/boot/vmlinuz-* ${boot_prefix}/vmlinuz-* ${boot_prefix}/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 ++ list=`for i in ${boot_prefix}/boot/vmlinuz-* ${boot_prefix}/boot/vmlinux-* ${boot_prefix}/vmlinuz-* ${boot_prefix}/vmlinux-* ${boot_prefix}/boot/kernel-* ; do + if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi + done` ;; + esac diff --git a/0002-script-create-menus-for-btrfs-snapshot.patch b/0002-script-create-menus-for-btrfs-snapshot.patch index 734460d..a789ce2 100644 --- a/0002-script-create-menus-for-btrfs-snapshot.patch +++ b/0002-script-create-menus-for-btrfs-snapshot.patch @@ -7,6 +7,13 @@ Patch-Mainline: no This patch adds a new script that will create the menus used for booting btrfs snapshots. +v1: +* Support existing snapshots by creating their missing slave configs. +* Temporarily default to disable this feature until receiving more + tests from QA. +* Introduce GRUB_ENABLE_CUSTOM_SNAPSHOT_SUBMENU to allow custom + submenu for listing snapshots rather than the default one. + Signed-off-by: Michael Chang Index: grub-2.02~beta2/Makefile.util.def @@ -31,14 +38,15 @@ Index: grub-2.02~beta2/util/grub-mkconfig.in =================================================================== --- grub-2.02~beta2.orig/util/grub-mkconfig.in +++ grub-2.02~beta2/util/grub-mkconfig.in -@@ -250,7 +250,9 @@ export GRUB_DEFAULT \ +@@ -250,7 +250,10 @@ export GRUB_DEFAULT \ GRUB_OS_PROBER_SKIP_LIST \ GRUB_DISABLE_SUBMENU \ GRUB_CMDLINE_LINUX_RECOVERY \ - GRUB_USE_LINUXEFI + GRUB_USE_LINUXEFI \ + GRUB_DISABLE_BOOTING_SNAPSHOT \ -+ GRUB_DISABLE_BOOTING_SNAPSHOT_SUBMENU ++ GRUB_DISABLE_BOOTING_SNAPSHOT_SUBMENU \ ++ GRUB_ENABLE_CUSTOM_SNAPSHOT_SUBMENU if test "x${grub_cfg}" != "x"; then rm -f "${grub_cfg}.new" @@ -46,7 +54,7 @@ Index: grub-2.02~beta2/util/grub.d/80_btrfs_snapshot.in =================================================================== --- /dev/null +++ grub-2.02~beta2/util/grub.d/80_btrfs_snapshot.in -@@ -0,0 +1,111 @@ +@@ -0,0 +1,174 @@ +#! /bin/sh +set -e + @@ -86,7 +94,8 @@ Index: grub-2.02~beta2/util/grub.d/80_btrfs_snapshot.in +# The slave config path in btrfs snapshot that will be sourced by master config +# The menu entries in slave config will have it's root overridable by specified +# subvolume name -+slave_cfg="boot/grub2/snapshot_menuentry.cfg" ++slave_cfg_name="snapshot_menuentry.cfg" ++slave_cfg="boot/grub2/${slave_cfg_name}" + +# The current config which is being outputted by grub-mkconfig +output_cfg=`readlink /proc/$PPID/fd/1 | sed s/.new$//` @@ -94,11 +103,20 @@ Index: grub-2.02~beta2/util/grub.d/80_btrfs_snapshot.in +grub_mkconfig_dir=`dirname $0` +grub_script_check="${bindir}/grub2-script-check" + ++# Stockpile directory for created slave config for snapshots without it ++scanned_snapshot_cfg_dir="/boot/grub2/scanned_snapshot_cfg" ++ +# Remove any slave config if booting snapshot gets disabled, in case it will become +# inconsistent on further updates, note this also removes master_snapshot_cfg -+if [ "x${GRUB_DISABLE_BOOTING_SNAPSHOT}" = "xtrue" ]; then ++ ++# Temporarily we disable this as it is quite new and still in developing ++# It's subjected to be enabled by default in future as the option name ++# GRUB_DISABLE_BOOTING_SNAPSHOT suggests. So for new you'll need to explicit ++# specify GRUB_DISABLE_BOOTING_SNAPSHOT=false the update the config ++if [ "x${GRUB_DISABLE_BOOTING_SNAPSHOT}" != "xfalse" ]; then + rm -f "/${slave_cfg}" + rm -f "${master_snapshot_cfg}" ++ rm -rf "${scanned_snapshot_cfg_dir}" + exit 0 +fi + @@ -112,6 +130,45 @@ Index: grub-2.02~beta2/util/grub.d/80_btrfs_snapshot.in + if ${grub_script_check} "/${slave_cfg}.new"; then + mv -f "/${slave_cfg}.new" "/${slave_cfg}" + fi ++ ++ # Scan existing snapshots to create their missing slave configs ++ # This should only be done once ++ if [ ! -d "$scanned_snapshot_cfg_dir" ]; then ++ ++ mkdir -p "$scanned_snapshot_cfg_dir" ++ ++ for snapshot in /.snapshots/*/snapshot; do ++ config="${snapshot}/etc/default/grub" ++ ++ bootdir="${snapshot}/boot" ++ outdir="${scanned_snapshot_cfg_dir}${snapshot}" ++ ++ # skip if slave config already exists in snapshot ++ if [ -f "${snapshot}/${slave_cfg}" ]; then ++ continue ++ fi ++ ++ ( ++ # source config for kernel command lines .. etc ++ if [ -f "$config" ]; then ++ . "$config" ++ else ++ # skip when no config ++ continue ++ fi ++ ++ overridable_root_by_subvol=true boot_prefix="$bootdir" ${grub_mkconfig_dir}/10_linux > "/${slave_cfg}.new" ++ ) ++ ++ # Check if the config is sane to use ++ if ${grub_script_check} "/${slave_cfg}.new"; then ++ mkdir -p "$outdir" ++ mv -f "/${slave_cfg}.new" "${outdir}/${slave_cfg_name}" ++ fi ++ done ++ ++ fi ++ +fi + +# Create the bootable snapshots submenus in master config, use the ${OS} to indicate @@ -140,7 +197,11 @@ Index: grub-2.02~beta2/util/grub.d/80_btrfs_snapshot.in +# could be source to run as a backup +# Here we search and list snapshots created by snapper by using it's convention on +# naming snapshots -+cat <"${master_snapshot_cfg}" ++ ++if [ "x${GRUB_ENABLE_CUSTOM_SNAPSHOT_SUBMENU}" != "xtrue" ]; then ++ ++# Write default config if custom one not in use ++ cat <"${master_snapshot_cfg}" +insmod regexp +submenu "Bootable snapshots for ${OS}" { + for x in /.snapshots/*; do @@ -151,6 +212,13 @@ Index: grub-2.02~beta2/util/grub.d/80_btrfs_snapshot.in + export subvol + source "\${subvol}/${slave_cfg}" + } ++ elif [ -f "${scanned_snapshot_cfg_dir}\$x/snapshot/${slave_cfg_name}" ]; then ++ snapshot_found=true ++ submenu "\$x" "\$x" { ++ set subvol="\$2/snapshot" ++ export subvol ++ source "${scanned_snapshot_cfg_dir}\${subvol}/${slave_cfg_name}" ++ } + fi + done + if [ x\$snapshot_found != xtrue ]; then @@ -158,3 +226,6 @@ Index: grub-2.02~beta2/util/grub.d/80_btrfs_snapshot.in + fi +} +EOF ++ ++fi ++ diff --git a/grub2.changes b/grub2.changes index 383887c..c6e4dd1 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,16 @@ +------------------------------------------------------------------- +Fri Jan 17 06:23:04 UTC 2014 - mchang@suse.com + +- refresh 0001-script-provide-overridable-root-by-subvol.patch +* Introduce $boot_prefix for setting prefix on seeking other /boot + directory. +- refresh 0002-script-create-menus-for-btrfs-snapshot.patch +* Support existing snapshots by creating their missing slave configs. +* Temporarily default to disable this feature until receiving more + tests from QA. +* Introduce GRUB_ENABLE_CUSTOM_SNAPSHOT_SUBMENU to allow custom + submenu for listing snapshots rather than the default one. + ------------------------------------------------------------------- Wed Jan 15 15:46:31 UTC 2014 - arvidjaar@gmail.com