Compare commits

...

76 Commits
0.6.2 ... 1.7.2

Author SHA1 Message Date
Antynea
52ab9dbe95 Merge pull request #14 from Antynea/v1.xx
fix: incorrect detection "$boot_dir_real_path" for initramfs
2016-02-15 03:44:10 +01:00
Antynea
28e9524ca5 fix: incorrect detection "$boot_dir_real_path" for initramfs 2016-02-08 00:01:42 +01:00
Antynea
8fffc13c2f Merge pull request #12 from Antynea/v1.xx
enhanced description
2016-01-15 18:31:18 +01:00
Antynea
a4db6a8870 enhanced description 2016-01-15 18:29:52 +01:00
Antynea
4388c334a3 Merge branch 'v1.xx' 2015-09-25 10:33:04 +02:00
Antynea
a2acaefa9c Merge branch 'master' into v1.xx 2015-09-25 10:32:33 +02:00
Antynea
3db73de479 fixme : choise of method 2015-09-25 10:24:20 +02:00
Antynea
39b2d09015 Add Show full path or only name of snapshots in grub-menu 2015-09-24 08:49:59 +02:00
Antynea
b511210646 Update README.md 2015-09-23 02:39:26 +02:00
Antynea
63d653746b Update README.md 2015-09-23 02:36:04 +02:00
Antynea
2df311179e Update README.md 2015-09-23 02:33:44 +02:00
Antynea
58b8f5d3ec Update README.md 2015-09-23 02:32:10 +02:00
Antynea
4081cbd27a update how to use it & to do:
add :

* GRUB_BTRFS_TITLE_FORMAT="p/d/n"
	(Custom title, shows/hides p"prefix" d"date" n"name" in grub-menu, separator "/", custom order available)

* Show full path or only name of snapshots in grub-menu
2015-09-23 02:29:01 +02:00
Antynea
9d3aa6d8a3 Update :
translation update

New option in /etc/default/grub

* GRUB_BTRFS_TITLE_FORMAT="p/d/n"
   (Custom title, shows/hides p"prefix" d"date" n"name" in grub-menu, separator "/", custom order available)
2015-09-23 02:14:46 +02:00
Antynea
25e2c16828 in progress
custom title menu
2015-09-19 04:48:45 +02:00
Antynea
14cbf60c5a in progress :
custom title menu
2015-09-19 04:31:17 +02:00
Antynea
2cf01a874f in progress
add custom title
2015-09-18 14:52:17 +02:00
Antynea
93b8ac07f5 new ideas 2015-09-11 22:46:26 +02:00
Antynea
252a6372dd Merge branch 'v1.xx' 2015-08-31 04:57:11 +02:00
Antynea
297f539f0a fixme: boot with microcode 2015-08-31 04:55:34 +02:00
Antynea
1c6c8c6051 Merge branch 'v1.xx'
Fix: redundancy parameter
2015-08-31 04:29:41 +02:00
Antynea
f0fb4b8e25 redundancy parameter 2015-08-31 04:20:33 +02:00
Antynea
650ac69552 Merge branch 'v1.xx' 2015-08-30 16:18:45 +02:00
Antynea
3ebc5b494a Update description
Add few comments
2015-08-30 16:14:59 +02:00
Antynea
615cbe9f3a Merge branch 'v1.xx' 2015-08-30 03:43:08 +02:00
Antynea
2e58a2b74d enhanced detect microcode 2015-08-30 03:39:15 +02:00
Antynea
4f725a8431 Merge branch 'master' into v1.xx 2015-08-30 02:38:23 +02:00
Antynea
d598529001 fixme : detect kernesl and initramfs with spaces
fixme : detect kernel and initramfs with spaces
2015-08-30 02:23:18 +02:00
Antynea
b925f639cd fixme : detect snapshot name with spaces
fixme : detect snapshot name with spaces
2015-08-30 01:19:25 +02:00
Antynea
31a0baa2b1 redundancy test
redundancy test
2015-08-30 00:15:15 +02:00
Antynea
3a7c6abece fixme : detect microcode
fixme : detect microcode
2015-08-29 23:45:32 +02:00
Antynea
5e0951d8cb Fixme : broken $boot_dir_real_path
Fixme : broken $boot_dir_real_path
2015-08-29 23:17:03 +02:00
Antynea
c9f5938e04 Merge branch 'v1.xx' 2015-08-29 18:22:16 +02:00
Antynea
128cbe28f3 Merge branch 'master' into v1.xx
Conflicts:
	41_snapshots-btrfs
2015-08-29 18:17:42 +02:00
Antynea
8102850627 Update README.md 2015-08-17 23:51:50 +02:00
Antynea
05fea226f9 don't create menu if snapshot is not bootable with /boot partition separate 2015-08-17 23:49:49 +02:00
Antynea
619686990e Update README.md 2015-08-12 06:02:45 +02:00
Antynea
1f3575efd1 Update README.md
To do : 
don't create menu if snapshot is not bootable with /boot partition separate
2015-08-12 06:01:49 +02:00
Antynea
2b33b88bea don't create menu if snapshot is not bootable with /boot partition separate 2015-08-11 02:57:09 +02:00
Antynea
aae6892218 Update README.md 2015-08-10 06:29:19 +02:00
Antynea
84ecc2a5a7 Update README.md 2015-08-10 06:27:31 +02:00
Antynea
7c1178b17c Update README.md 2015-08-10 06:26:49 +02:00
Antynea
2773382eb5 error if /grub is in /boot/EFI 2015-08-09 17:42:56 +02:00
Antynea
34c8fbd9cb error if /grub is in /boot/EFI 2015-08-09 16:43:56 +02:00
Antynea
9d04b96f3d Merge remote-tracking branch 'origin/v1.xx' into v1.xx 2015-08-09 16:41:11 +02:00
Antynea
c9d47b7854 error when /grub is not in /boot 2015-08-09 16:36:48 +02:00
Antynea
7d07503f07 Update README.md 2015-08-09 04:21:52 +02:00
Antynea
f646dfd900 Update README.md 2015-08-09 04:20:25 +02:00
Antynea
b4d4bc0aac Update README.md 2015-08-09 04:19:38 +02:00
Antynea
f379832df3 Update README.md 2015-08-08 03:50:00 +02:00
Antynea
00b8f4106d Update README.md
To do
Uefi compatibility
2015-08-08 03:45:08 +02:00
Antynea
26d8e83c8c structuring 2015-08-07 14:16:03 +02:00
Antynea
178cdb163c correct menuentry when /boot is separate partition 2015-08-07 13:01:00 +02:00
Antynea
f46c38d141 typo 2015-08-07 12:55:02 +02:00
Antynea
0ab7aa02bb Correct menuentry
add /boot separate partition
2015-08-07 12:54:03 +02:00
Antynea
be28f3657e * correct menuentry when /boot in separate partition 2015-08-07 01:45:11 +02:00
Antynea
81bb76fbc3 translation for grub-btrfs-git version 1.xx 2015-08-07 01:12:11 +02:00
Antynea
9d21a629d8 Update README.md 2015-08-07 00:40:56 +02:00
Antynea
bc650f2caf Update README.md
enhanced readme
2015-08-07 00:14:48 +02:00
Antynea
52dd376047 enhanced readme 2015-08-07 00:12:23 +02:00
Antynea
87bc0f6358 detect partition boot separate
check, ok
2015-08-06 23:57:29 +02:00
Antynea
94c9fedef3 detect partition boot separate
check, ok
2015-08-06 23:56:38 +02:00
Antynea
adc4fd6687 improve layout for entries in grub 2015-08-06 04:35:46 +02:00
Antynea
3a7ea84dda oops :) 2015-08-06 00:56:50 +02:00
Antynea
b199e29262 GRUB_BTRFS_NINIT=("initramfs-linux.img" "initramfs-linux-fallback.img")
(Use only if you have custom initramfs name or auto-detect failed.)

check , ok
2015-08-06 00:53:39 +02:00
Antynea
6afa8f03cd GRUB_BTRFS_NINIT=("initramfs-linux.img" "initramfs-linux-fallback.img")
(Use only if you have custom initramfs name or auto-detect failed.)

check, ok
2015-08-06 00:50:55 +02:00
Antynea
7cf432f359 auto-detect kernel and custom kernel
check , ok
2015-08-05 15:32:05 +02:00
Antynea
79f0ac6b0d GRUB_BTRFS_NKERNEL=("vmlinuz-linux")
(Use only if you have custom kernel name or auto-detect failed.)

check , ok
2015-08-05 15:30:42 +02:00
Antynea
63a96dfcfb GRUB_BTRFS_INTEL_UCODE=("intel-ucode.img")
(Use only if you have custom intel-ucode or auto-detect failed.)

check , ok
2015-08-02 17:29:35 +02:00
Antynea
6b3cf842b0 GRUB_BTRFS_INTEL_UCODE=("intel-ucode.img")
(Use only if you have custom intel-ucode or auto-detect failed.)

check , ok
2015-08-02 17:28:39 +02:00
Antynea
974b798f53 in progress 2015-07-26 18:13:24 +02:00
Antynea
cbe547de77 in progress 2015-07-26 18:11:33 +02:00
Antynea
422d46cc84 in progress 2015-07-26 18:06:37 +02:00
Antynea
fcdc5dea87 in progress
in progress
2015-07-22 02:00:22 +02:00
Antynea
91f0a98a60 Update README.md 2015-07-22 01:30:37 +02:00
Antynea
205f7edf00 Update README.md 2015-07-22 01:28:59 +02:00
3 changed files with 314 additions and 141 deletions

View File

@@ -1,53 +1,77 @@
#! /usr/bin/bash #! /usr/bin/env bash
# #
# #
######################################################################################################################################### #################################################################################################################################################
# Written by: Antynea # # Written by: Antynea #
# # # #
# Purpose: Include btrfs snapshots at boot options. # # Purpose: Include btrfs snapshots at boot options (grub-menu). #
# # # #
# What this script does: # # What this script does: #
# - List snapshots existing on root partition (btrfs). # # - Automatically List snapshots existing on root partition (btrfs). #
# - Create corresponding menuentry in grub.cfg , which ensures a very easy rollback. # # - Automatically Detect if "/boot" is in separate partition. #
# # # - Automatically Detect kernel, initramfs and intel microcode in "/boot" directory on snapshots. (For custon name, see below.) #
# How to use it: # # - Automatically Create corresponding "menuentry" in grub.cfg , which ensures a very easy rollback. #
# - Add this lines to /etc/default/grub: # # #
# # # How to use it: #
# * GRUB_BTRFS_SUBMENUNAME="ArchLinux Snapshots" (Name menu appearing in grub.) # # - Add this lines to /etc/default/grub: #
# * GRUB_BTRFS_PREFIXENTRY="Snapshot" (Add a name ahead your snapshots entries.) # # #
# * GRUB_BTRFS_NKERNEL=("vmlinuz-linux") (Custom Name kernel you use it.) # # * GRUB_BTRFS_SUBMENUNAME="ArchLinux Snapshots" #
# * GRUB_BTRFS_NINIT=("initramfs-linux.img" "initramfs-linux-fallback.img") (Custom Name initramfs (ramdisk) you use it.) # # (Name menu appearing in grub.) #
# * GRUB_BTRFS_INTEL_UCODE=("intel-ucode.img") (Custom Name intel microcode you use it.) # # * GRUB_BTRFS_PREFIXENTRY="Snapshot:" #
# # # (Add a name ahead your snapshots entries.) #
# - Generate grub.cfg (on Archlinux use grub-mkconfig -o /boot/grub/grub.cfg ) # # * GRUB_BTRFS_DISPLAY_PATH_SNAPSHOT="true" #
# # # (Show full path snapshot or only name) #
# - grub-btrfs automatically generates snapshots entries. # # * GRUB_BTRFS_TITLE_FORMAT="p/d/n" #
# - You will see it appear different entries, e.g : Prefixentry name of snapshot [2013-02-11 04:00:00] # # (Custom title, shows/hides p"prefix" d"date" n"name" in grub-menu, separator "/", custom order available) #
# # # * GRUB_BTRFS_NKERNEL=("vmlinuz-linux") #
# Warning: # # (Use only if you have custom kernel name or auto-detect failed.) #
# This version detect kernels,initramfs,intel microcode only in boot partition, not in snapshot. # # * GRUB_BTRFS_NINIT=("initramfs-linux.img" "initramfs-linux-fallback.img") #
# If those that are present in boot partition but not in snapshot, # # (Use only if you have custom initramfs name or auto-detect failed.) #
# entry will be created but not fonctional, you don't boot it. # # * GRUB_BTRFS_INTEL_UCODE=("intel-ucode.img") #
# # # (Use only if you have custom intel-ucode or auto-detect failed.) #
######################################################################################################################################### # #
# - Generate grub.cfg (on Archlinux use grub-mkconfig -o /boot/grub/grub.cfg) #
# #
# - grub-btrfs automatically generates snapshots entries. #
# - You will see it appear different entries (e.g : Snapshot: [2014-02-12 11:24:37] my snapshot name overkill) #
# #
# #
# To do: #
# # #
# * Display name of microcode in menuentry when available #
# #
#################################################################################################################################################
set -e set -e
. /usr/share/grub/grub-mkconfig_lib #prefix="/usr"
. /etc/default/grub #exec_prefix="${prefix}"
datarootdir="/usr/share"
#datadir="${datarootdir}"
sysconfdir="/etc"
. "${datarootdir}/grub/grub-mkconfig_lib"
. "${sysconfdir}/default/grub"
###################################### ######################################
### variables in /etc/default/grub ### ### Variables in /etc/default/grub ###
###################################### ######################################
## Choice of method
choise_of_method=${GRUB_BTRFS_METHOD:-"1"}
## Submenu name ## Submenu name
submenuname=${GRUB_BTRFS_SUBMENUNAME:-"ArchLinux Snapshots"} submenuname=${GRUB_BTRFS_SUBMENUNAME:-"ArchLinux Snapshots"}
## Prefix entry ## Prefix entry
prefixentry=${GRUB_BTRFS_PREFIXENTRY:-"Snapshot"} prefixentry=${GRUB_BTRFS_PREFIXENTRY:-"Snapshot:"}
## Show full path snapshot or only name
path_snapshot=${GRUB_BTRFS_DISPLAY_PATH_SNAPSHOT:-"true"}
## Title format
title_format=${GRUB_BTRFS_TITLE_FORMAT:-"p/d/n"}
## Kernel(s) name(s) ## Kernel(s) name(s)
nkernel=("${GRUB_BTRFS_NKERNEL[@]:-vmlinuz-linux}") nkernel=("${GRUB_BTRFS_NKERNEL[@]}")
## Initramfs name(s) ## Initramfs name(s)
ninit=("${GRUB_BTRFS_NINIT[@]:-initramfs-linux.img initramfs-linux-fallback.img}") ninit=("${GRUB_BTRFS_NINIT[@]}")
## Intel-ucode name(s) ## Microcode(s) name(s)
intel_ucode=("${GRUB_BTRFS_INTEL_UCODE[@]:-intel-ucode.img}") microcode=("${GRUB_BTRFS_INTEL_UCODE[@]}")
######################## ########################
### variables script ### ### variables script ###
@@ -56,99 +80,216 @@ intel_ucode=("${GRUB_BTRFS_INTEL_UCODE[@]:-intel-ucode.img}")
export TEXTDOMAIN=grub-btrfs-git export TEXTDOMAIN=grub-btrfs-git
export TEXTDOMAINDIR="/usr/share/locale" export TEXTDOMAINDIR="/usr/share/locale"
## hints string ## hints string
pboot=$(${grub_probe} --target="hints_string" "/boot" 2>/dev/null) hs_boot=$(${grub_probe} --target="hints_string" "/boot" 2>/dev/null)
## UUID of the root partition
uuid=$(${grub_probe} "/" --target="fs_uuid" 2>/dev/null)
## UUID of the boot partition ## UUID of the boot partition
buuid=$(${grub_probe} --target="fs_uuid" "/boot" 2>/dev/null) boot_uuid=$(${grub_probe} --target="fs_uuid" "/boot" 2>/dev/null)
## Type filesystem of boot partition
boot_fs=$(${grub_probe} --target="fs" "/boot" 2>/dev/null)
## UUID of the root partition
root_uuid=$(${grub_probe} "/" --target="fs_uuid" 2>/dev/null)
## Parameters passed to the kernel ## Parameters passed to the kernel
params="$GRUB_CMDLINE_LINUX $GRUB_CMDLINE_LINUX_DEFAULT" kernel_parameters="$GRUB_CMDLINE_LINUX $GRUB_CMDLINE_LINUX_DEFAULT"
## Mount point location
gbgmp="/tmp/gbgmp"
## Class for theme
CLASS="--class snapshots --class gnu-linux --class gnu --class os"
## save IFS
oldIFS=$IFS
## boot_dir (auto-detect if /boot is separate partition or not)
boot_dir()
{
boot_dir="$gbgmp/$snap_dir_name/boot"
[[ "$root_uuid" != "$boot_uuid" ]] && boot_dir="/boot"
echo "$boot_dir"
}
############## ##############
### Script ### ### Script ###
############## ##############
typeset -A date_time ### BEGIN auto detect ###
unset snapshots
# Create list of filesystem snapshots ## menu entries
oldIFS=$IFS snapshots_entry()
IFS=$'\n' {
## \" required for snap,kernels,init,microcode with space in their name
for snap in $($bindir/btrfs subvolume list -sa / --sort=-ogen | $bindir/awk '{gsub(/^.*<FS_TREE>\//,"",$NF);print $11" "$12"?"$NF}'); do echo " submenu '"${title_menu[*]}"' {
snap_name="${snap#*"?"}" submenu '---> "${title_menu[*]}" <---' { echo }
# Discard deleted snapshots "
if [ $snap_name = "DELETED" ]; then continue; fi for k in "${name_kernel[@]}"; do
snapshots+=("$snap_name") for i in "${name_initramfs[@]}"; do
date_time[$snap_name]="${snap%"?"*}" for u in "${name_microcode[@]}"; do
done
IFS=$oldIFS
# Display the menu
echo "submenu '$submenuname' {"
# Treat the kernel variables (Translation unclear)
for kernel in ${nkernel[@]}; do
# Check the specified kernel(s) exist, if it/they don't, display an error and exit
if [ ! -f /boot/$kernel ]; then gettext_printf $"Error: /boot/$kernel, kernel does not exist" >&2; exit 1; fi
# If there are >1 kernels, create a menu
if [ ${#nkernel[*]} != 1 ]; then echo " submenu '$kernel' {
submenu '---> Kernel: $kernel <---' { echo }"; fi
# Treat the snapshots variable
for item in ${snapshots[@]}; do
# Output name of snapshot
gettext_printf $"Found Snapshot: %s\n" "$item ${date_time[$item]}" >&2
# Create a menu for remaining snapshots (name + creation date)
echo " submenu '$prefixentry $item [${date_time[$item]}]' {"
# if more than one kernel is found, create a menu
if [ ${#nkernel[*]} != 1 ]; then echo " submenu '---> Kernel: $kernel <---' { echo }"; fi
# Treat the initramfs variable
for init in ${ninit[@]}; do
# Check the specified initramfs(es) exist, if it/they don't, display an error and exit
if [ ! -f /boot/$init ]; then gettext_printf $"Error: /boot/$init, initramfs does not exist" >&2; exit 1; fi
# Specify a kernel and initramfs for every snapshot
echo "\ echo "\
menuentry '$item $init' --class arch --class gnu-linux --class gnu --class os "\$menuentry_id_option" 'gnulinux-snapshots-$uuid'{ menuentry '"${k}" & "${i}"' ${CLASS} "\$menuentry_id_option" 'gnulinux-snapshots-$boot_uuid'{
load_video $(save_default_entry)
set gfxpayload=$GRUB_GFXPAYLOAD_LINUX if [ x\$feature_all_video_module = xy ]; then
if [ x"\$feature_platform_search_hint" = xy ]; then insmod all_video
search --no-floppy --fs-uuid --set=root $pboot $buuid fi
else set gfxpayload=keep
search --no-floppy --fs-uuid --set=root $buuid insmod ${boot_fs}
fi if [ x\$feature_platform_search_hint = xy ]; then
echo 'Loading Linux snapshot ...'" search --no-floppy --fs-uuid --set=root ${hs_boot} ${boot_uuid}
# Check the location of the /boot partition else
if [ $uuid = $buuid ]; then search --no-floppy --fs-uuid --set=root ${boot_uuid}
echo "\ fi
linux /$item/boot/$kernel root=UUID=$uuid rw rootflags=subvol=$item $params echo 'Loading Snapshot: "${snap_date_time}" "${snap_dir_name}"'
echo 'Loading initial ramdisk ...'" echo 'Loading Kernel: "${k}" ...'
# Check intel microcode exist linux \"${boot_dir_real_path}/"${k}"\" root=UUID=${root_uuid} rw rootflags=subvol=\""${snap_dir_name}"\" ${kernel_parameters}\
if [ -f /boot/$intel_ucode ]; then "
echo "\ if [ -f "$(boot_dir)"/"${u}" ] ; then
initrd /$item/boot/$intel_ucode /$item/boot/$init"
else
echo "\
initrd /$item/boot/$init"
fi
else
echo "\
linux /$kernel root=UUID=$uuid rw rootflags=subvol=$item $params
echo 'Loading initial ramdisk ...'"
# Check intel microcode exist
if [ -f /boot/$intel_ucode ]; then
echo "\
initrd /$intel_ucode /$init"
else
echo "\
initrd /$init"
fi
fi
echo "\ echo "\
}" echo 'Loading Microcode & Initramfs: "${u}" "${i}" ...'
done initrd \"${boot_dir_real_path}/"${u}"\" \"${boot_dir_real_path}/"${i}"\""
else
echo "\
echo 'Loading Initramfs: "${i}" ...'
initrd \"${boot_dir_real_path}/"${i}"\""
fi
echo " }" echo " }"
done
done
done done
# Don't forget to close menus if more than one kernel is found echo " }"
if [ ${#nkernel[*]} != 1 ]; then echo " }"; fi }
done
echo "}" ## List of snapshots on filesystem
snapshot_list()
{
for snap in $(btrfs subvolume list -sa /); do
IFS=$oldIFS
snap=($snap)
local snap_path_name=${snap[@]:13:${#snap[@]}}
# Discard deleted snapshots
if [ "$snap_path_name" = "DELETED" ]; then continue; fi
[[ ${snap_path_name%%"/"*} == "<FS_TREE>" ]] && snap_path_name=${snap_path_name#*"/"}
echo ${snap[@]:10:2} ${snap_path_name}
done
}
## Detect kernels in "/boot"
detect_kernel()
{
## Arch original kernel (auto-detect)
for akernel in "$(boot_dir)"/vmlinuz-* ; do
list_kernel+=("$akernel")
done
## Custom name kernel in GRUB_BTRFS_NKERNEL
if [ ! -z "${nkernel}" ] ; then
for ckernel in "${nkernel[@]}" ; do
[[ ! -f /"$(boot_dir)"/"${ckernel}" ]] && continue;
list_kernel+=("$ckernel")
done
fi
}
## Detect initramfs in "/boot"
detect_initramfs()
{
## Arch original initramfs (auto-detect)
for ainitramfs in "$(boot_dir)"/initramfs-* ; do
list_initramfs+=("$ainitramfs")
done
## Custom name initramfs in GRUB_BTRFS_NINIT
if [ ! -z "$ninit" ] ; then
for cinitramfs in "${ninit[@]}" ; do
[[ ! -f /"$(boot_dir)"/"${cinitramfs}" ]] && continue;
list_initramfs+=("$cinitramfs")
done
fi
}
## Detect microcode in "/boot"
detect_microcode()
{
## Arch original intel microcode
for aucode in "$(boot_dir)"/intel-ucode.img ; do
list_ucode+=("$aucode")
done
## Custom name microcode in GRUB_BTRFS_INTEL_UCODE
if [ ! -z "$microcode" ] ; then
for cucode in "${microcode[@]}" ; do
[[ ! -f /"$(boot_dir)"/"${cucode}" ]] && continue
list_ucode+=("$cucode")
done
fi
}
## Show full path snapshot or only name
path_snapshot()
{
case "${path_snapshot}" in
true) name_snapshot=("${snap_dir_name}");;
*) name_snapshot=("${snap_dir_name#*"/"}")
esac
}
## Title format in grub-menu
title_format()
{
case "${title_format}" in
p/d/n) title_menu=("${prefixentry}" "${snap_date_time}" "${name_snapshot}");;
p/n/d) title_menu=("${prefixentry}" "${snap_dir_name}" "${snap_date_time}");;
p/d) title_menu=("${prefixentry}" "${snap_date_time}");;
p/n) title_menu=("${prefixentry}" "${snap_dir_name}");;
d/n) title_menu=("${snap_date_time}" "${snap_dir_name}");;
n/d) title_menu=("${snap_dir_name}" "${snap_date_time}");;
p) title_menu=("${prefixentry}");;
d) title_menu=("${snap_date_time}");;
n) title_menu=("${snap_dir_name}");;
*) gettext_printf $"# Warning: GRUB_BTRFS_TITLE_FORMAT=${title_format}, syntax error \n" >&2
esac
}
## List of kernels, initramfs and microcode in snapshots
list_kernels_initramfs()
{
IFS=$'\n'
for item in $(snapshot_list); do
IFS=$oldIFS
item=($item)
snap_dir_name=${item[@]:2:${#item[@]}}
[[ ! -d "$gbgmp/$snap_dir_name/boot" ]] && continue;
snap_date_time=${item[@]:0:2}
gettext_printf $"# Found Snapshot: %s\n" "${snap_date_time} ${snap_dir_name}" >&2 ;
unset list_kernel
detect_kernel
name_kernel=("${list_kernel[@]##*"/"}")
# echo "kernel = ${name_kernel[*]}"
unset list_initramfs
detect_initramfs
name_initramfs=("${list_initramfs[@]##*"/"}")
# echo "initramfs = ${name_initramfs[*]}"
unset list_ucode
detect_microcode
name_microcode=("${list_ucode[@]##*"/"}")
# echo "ucode = ${name_microcode[*]}"
boot_dir_real_path="$(make_system_path_relative_to_its_root "$(boot_dir)")"
## Create menu entries
# name snpashot
path_snapshot
# title menu custom
title_format
# echo "${title_menu[*]}"
snapshots_entry
done
IFS=$oldIFS
}
### END auto detect ###
### Choice of method ###
if [ ${choise_of_method} = "1" ] ; then
gettext_printf "###### - Grub-btrfs: Auto-detect - ######\n" >&2 ;
[[ ! -d $gbgmp ]] && mkdir -p $gbgmp
mount -o subvolid=0 /dev/disk/by-uuid/$root_uuid $gbgmp/
echo "submenu '${submenuname}' {"
list_kernels_initramfs ;
echo "}"
umount $gbgmp
gettext_printf "###### - Grub-btrfs: Auto-detect - ######\n" >&2 ;
fi
### End choice of method ###

View File

@@ -1,41 +1,73 @@
[![GitHub release](https://img.shields.io/github/release/Antynea/grub-btrfs.svg)](https://github.com/Antynea/grub-btrfs)
### grub-btrfs ### grub-btrfs
This is a version 0.xx of grub-btrfs This is a version 1.xx of grub-btrfs
#### Description #### Description
grub-btrfs, add support for btrfs snapshots into grub menu grub-btrfs, Include btrfs snapshots at boot options. (grub menu)
#### What does grub-btrfs v0.xx do : #### What does grub-btrfs v1.xx do :
Simple rollback using snapshots you made previous. Simple rollback using snapshots you made previously.
Makes a list of all snapshots, kernels, initramfs present on the filesystem and then creates a corresponding entered with name and date of snapshots in grub.cfg, which ensures a very easy rollback. * Automatically List snapshots existing on root partition (btrfs).
#### How to use it : * Automatically Detect if "/boot" is in separate partition.
1. Add lines to /etc/default/grub as needed, defaults listed as examples: * Automatically Detect kernel, initramfs and intel microcode in "/boot" directory on snapshots. (For custon name, see below.)
2.
* submenuname = name menu appear in grub ( e.g: GRUB_BTRFS_SUBMENUNAME="ArchLinux Snapshots" )
* prefixentry = add a name ahead your snapshots entries ( e.g: GRUB_BTRFS_PREFIXENTRY="Snapshot" ) * Automatically Create corresponding "menuentry" in grub.cfg , which ensures a very easy rollback.
* nkernel= name kernel you use it ( e.g: GRUB_BTRFS_NKERNEL=("vmlinuz-linux") )
* ninit= name initramfs (ramdisk) you use it ( e.g: GRUB_BTRFS_NINIT=("initramfs-linux.img" "initramfs-linux-fallback.img") ) #### How to use it:
* intel_ucode= name intel microcode you use it ( e.g: GRUB_BTRFS_INTEL_UCODE=("intel-ucode.img") ) Add this lines to /etc/default/grub:
2. Generate grub.cfg (on Archlinux is grub-mkconfig -o /boot/grub/grub.cfg ) * GRUB_BTRFS_SUBMENUNAME="ArchLinux Snapshots"
(Name menu appearing in grub.)
* GRUB_BTRFS_PREFIXENTRY="Snapshot:"
(Add a name ahead your snapshots entries.)
* GRUB_BTRFS_DISPLAY_PATH_SNAPSHOT="true"
(Show full path snapshot or only name)
* GRUB_BTRFS_TITLE_FORMAT="p/d/n"
(Custom title, shows/hides p"prefix" d"date" n"name" in grub-menu, separator "/", custom order available)
* GRUB_BTRFS_NKERNEL=("vmlinuz-linux")
(Use only if you have custom kernel name or auto-detect failed.)
* GRUB_BTRFS_NINIT=("initramfs-linux.img" "initramfs-linux-fallback.img")
(Use only if you have custom initramfs name or auto-detect failed.)
* GRUB_BTRFS_INTEL_UCODE=("intel-ucode.img")
(Use only if you have custom intel-ucode or auto-detect failed.)
Generate grub.cfg (on Archlinux use grub-mkconfig -o /boot/grub/grub.cfg )
grub-btrfs automatically generates snapshots entries. grub-btrfs automatically generates snapshots entries.
You will see it appear different entries, e.g : Prefixentry name of snapshot [2013-02-11 04:00:00] You will see it appear differents entries (e.g : Snapshot: [2014-02-12 11:24:37] my snapshot name overkill )
#### Warning
Version 0.xx detect kernels,initramfs,intel microcode only in boot partition, not in snapshot. #### TO DO
If kernels,initramfs,intel microcode, are present in boot partition but not in snapshot, entry will be created but not fonctional, you don't boot it.
Version 1.xx will do it, release soon. * Display name of microcode in menuentry when available
## discussion
Pour les francophones : https://forums.archlinux.fr/viewtopic.php?f=18&t=17177

Binary file not shown.