Compare commits

...

82 Commits
v0.2 ... v1.5

Author SHA1 Message Date
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
6f7fb178fb Merge pull request #9 from Antynea/Development
enhanced
2015-07-22 02:05:05 +02:00
Antynea
fcdc5dea87 in progress
in progress
2015-07-22 02:00:22 +02:00
Antynea
d561206775 enhanced
enhanced
2015-07-22 01:59:28 +02:00
Antynea
563151507d enhanced
enhanced
2015-07-22 01:52:48 +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
Antynea
fda6eb8c00 Merge pull request #8 from Antynea/Development
fix bug with underscore in subvolume name
2015-06-03 20:41:23 +02:00
Antynea
2385312345 fix bug with underscore in subvolume name 2015-06-03 11:05:05 +02:00
Antynea
5fe28d39be Merge remote-tracking branch 'origin/Development' 2015-06-02 15:59:34 +02:00
Antynea
5e8c722c6a v0.6 2015-06-02 15:58:46 +02:00
Antynea
91e72f60f8 Improve perfomance 2015-05-31 22:26:02 +02:00
Antynea
5bff1c80a7 Merge remote-tracking branch 'origin/Development' 2015-05-24 15:57:50 +02:00
Antynea
ed5e7ee6eb Improve snapshot detection 2015-05-23 16:06:05 +02:00
Antynea
1c4cac2397 Merge remote-tracking branch 'origin/Development' 2015-05-19 00:43:36 +02:00
Antynea
c4b9b3df95 Update README.md
Oops rollback last commit
2015-05-15 22:13:15 +02:00
Antynea
9fb9146e5b Update README.md
reflects change
2015-05-15 22:12:26 +02:00
Antynea
e61d0409ac Merge pull request #6 from penetal/patch-3
How to use /etc/default/grub config
2015-05-15 11:45:22 +02:00
Antynea
3f56de34ec Merge pull request #5 from penetal/patch-2
Pull config from /etc/default/grub
2015-05-15 11:44:14 +02:00
penetal
e0ef9c82e9 How to use /etc/default/grub config
How to change from default config via /etc/default/grub
2015-05-15 11:23:46 +02:00
penetal
788390cc93 Pull config from /etc/default/grub
Added parameter substitution so variables can be changed in /etc/default/grub.
This will let the script stay untouched, for easier updating.
2015-05-15 11:17:46 +02:00
Antynea
97dcaeae58 add warning 2015-05-14 00:38:10 +02:00
Antynea
8602220b98 Add warning 2015-05-13 23:59:07 +02:00
Antynea
7441e573f3 Ooops 2015-05-13 10:30:58 +02:00
Antynea
e06a8e1dd8 enhanced 2015-05-13 10:27:56 +02:00
Antynea
aeff81e861 enhanced 2015-05-13 10:22:36 +02:00
Antynea
876d1c5e98 enhanced 2015-05-13 10:20:00 +02:00
Antynea
4fb1f71b17 enhanced 2015-05-13 10:18:32 +02:00
Antynea
b80c04a751 enhanced 2015-05-13 10:15:13 +02:00
Antynea
11af1f69ba enhanced 2015-05-13 10:13:11 +02:00
Antynea
5ca00a1aa2 enhanced 2015-05-13 10:11:53 +02:00
Antynea
a1b876188c test 2015-05-13 10:10:59 +02:00
Antynea
50f63a9bec enhanced 2015-05-13 10:09:36 +02:00
Antynea
a10f775b8d enhanced 2015-05-13 10:06:57 +02:00
Antynea
7ebfbe05f9 enhanced 2015-05-13 10:03:24 +02:00
Antynea
eeae1d3084 Add intel microcode 2015-05-13 06:23:27 +02:00
Antynea
6a76ec8837 Internationalisation
by default, message en
add translate message fr
2015-05-12 07:40:18 +02:00
3 changed files with 257 additions and 106 deletions

View File

@@ -1,113 +1,223 @@
#! /bin/sh
#! /usr/bin/bash
#
#
#########################################################################################################################################################
# Written by: Antynea #
# #
# Purpose: Include btrfs snapshots at boot options. #
# #
# What this script does: #
# - Automatically List snapshots existing on root partition (btrfs). #
# - Automatically Detect kernel, initramfs and intel microcode in "/boot" directory on snapshots. (For custon name, see below.) #
# - Automatically Create corresponding "menuentry" in grub.cfg , which ensures a very easy rollback. #
# #
# How to use it: #
# - Add this lines to /etc/default/grub: #
# #
# * GRUB_BTRFS_SUBMENUNAME="ArchLinux Snapshots" (Name menu appearing in grub.) #
# * GRUB_BTRFS_PREFIXENTRY="Snapshot:" (Add a name ahead your snapshots entries.) #
# * 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. #
# - You will see it appear different entries (e.g : Snapshot: my snapshot name overkill [2014-02-12 11:24:37]) #
# #
# Warning: #
# #
# Script in progress #
# to do : #
# # #
# * verify compatibility with manjaro and snapper (but I don't use them, so it will take some time) #
# #
# #
#########################################################################################################################################################
set -e
. /usr/share/grub/grub-mkconfig_lib
. /etc/default/grub
#prefix="/usr"
#exec_prefix="${prefix}"
datarootdir="/usr/share"
#datadir="${datarootdir}"
sysconfdir="/etc"
### variables modifiable ###
## fr: nom du sous-menu
## en: Name of the submenu
submenuname="ArchLinux Snapshots"
## fr: préfixe de l'entrée
## en: Prefix entry
prefixentry="Snapshot"
## fr: nom(s) du ou des kernel(s)
## en: Name(s) of the kernel(s)
nkernel=("vmlinuz-linux")
## fr: nom(s) de(s) l'init
## en: Name(s) of the init(s)
ninit=("initramfs-linux.img" "initramfs-linux-fallback.img")
. "${datarootdir}/grub/grub-mkconfig_lib"
. "${sysconfdir}/default/grub"
######################################
### Variables in /etc/default/grub ###
######################################
## Choice of method
choise_of_method=${GRUB_BTRFS_SUBMENUNAME:-"1"}
## Submenu name
submenuname=${GRUB_BTRFS_SUBMENUNAME:-"ArchLinux Snapshots"}
## Prefix entry
prefixentry=${GRUB_BTRFS_PREFIXENTRY:-"Snapshot:"}
## Kernel(s) name(s)
nkernel=("${GRUB_BTRFS_NKERNEL[@]}")
## Initramfs name(s)
ninit=("${GRUB_BTRFS_NINIT[@]}")
## Microcode(s) name(s)
microcode=("${GRUB_BTRFS_INTEL_UCODE[@]:-intel-ucode.img}")
########################
### variables script ###
########################
## Internationalization (default : english)
export TEXTDOMAIN=grub-btrfs-git
export TEXTDOMAINDIR="/usr/share/locale"
## hints string
hs_boot=$(${grub_probe} --target="hints_string" "/boot" 2>/dev/null)
## UUID of the boot partition
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
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"
}
###########################
### fr: DÉBUT DU SCRIPT ###
### en: NAME OF SCRIPT ###
### fr: NE PAS TOUCHER ###
### en: DO NOT TOUCH ###
###########################
## fr: paramêtre des chaînes --hint
## en: Parameter of the chains --hint (Translation unclear)
pboot=$(${grub_probe} --target="hints_string" "/boot" 2>/dev/null)
## fr: uuid de la partition root
## en: UUID of the root partition
uuid=$(${grub_probe} "/" --target="fs_uuid" 2>/dev/null)
## fr: uuid de la partition boot
## en: UUID of the boot partition
buuid=$(${grub_probe} --target="fs_uuid" "/boot" 2>/dev/null)
## fr: paramêtre passé au kernel
## en: Parameters passed to the kernel
params="$GRUB_CMDLINE_LINUX $GRUB_CMDLINE_LINUX_DEFAULT"
##############
### Script ###
##############
### BEGIN auto detect ###
# fr: on affiche le menu
# en: Display the menu
echo "submenu '$submenuname' {"
# fr: on traite la variable kernel
# en: Treat the kernel variables (Translation unclear)
for kernel in ${nkernel[@]}; do
# fr: on test si le(s) nom(s) du(des) kernel existe(nt), autrement on affiche une erreur et on sort
# en: Check the specified kernel(s) exist, if it/they don't, display an error and exit
if [ ! -f /boot/$kernel ]; then echo "/boot/$kernel: fr: Fichier inexistant en: File does not exist" >&2; exit 1; fi
# fr: on vérifie le nombre de kernel présent, si >1 on crée un menu
# en: If there are >1 kernels, create a menu
if [ ${#nkernel[*]} != 1 ]; then echo " submenu '$kernel' {
submenu '---> Kernel: $kernel <---' { echo }"; fi
# fr: On liste les snapshots présent sur le système de fichier
# en: List filesystem snapshots
for item in $($bindir/btrfs subvolume list -s / --sort=-ogen | $bindir/awk '{print $NF}'); do
# fr: On écarte les snapshots avec un statut de suppression
# en: Discard deleted snapshots
if [ $item = "DELETED" ]; then continue; fi
# fr: affiche la liste des snapshots trouvés
# en: Output name of snapshot
gettext_printf "Found Snapshot: %s\n" "$item" >&2
# fr: on crée un menu pour chaque snapshot présent (nom + date de création)
# en: Create a menu for remaining snapshots (name + creation date)
date_time=$($bindir/btrfs subvolume list -s / | $bindir/grep $item | $bindir/cut -d" " -f 11-12)
echo " submenu '$prefixentry $item [$date_time]' {"
# fr: si plusieurs kernel on été trouvé, on affiche un titre indicatif
# en: Display message if more than one kernel is found
if [ ${#nkernel[*]} != 1 ]; then echo " submenu '---> Kernel: $kernel <---' { echo }"; fi
# fr: on traite la variable de l'initramfs
# en: Treat the initramfs variables (Translation unclear)
for init in ${ninit[@]}; do
# fr: on test si le(s) nom(s) du(des) initramfs existe(nt), autrement on affiche une erreur et on sort
# en: Check the specified initramfs(es) exist, if it/they don't, display an error and exit
if [ ! -f /boot/$init ]; then echo "/boot/$init: Fichier inexistant" >&2; exit 1; fi
# fr: on traite chaque entrée des snapshots avec leurs kernel et initramfs respectifs
# en: Specify a kernel and initramfs for every snapshot
echo "\
menuentry '$item $init' --class arch --class gnu-linux --class gnu --class os "\$menuentry_id_option" 'gnulinux-snapshots-$uuid'{
load_video
set gfxpayload=$GRUB_GFXPAYLOAD_LINUX
if [ x"\$feature_platform_search_hint" = xy ]; then
search --no-floppy --fs-uuid --set=root $pboot $buuid
else
search --no-floppy --fs-uuid --set=root $buuid
fi
echo 'Loading Linux snapshot ...'"
# fr: on vérifie l'emplacement de la partition /boot
# en: Check the location of the /boot partition
if [ $uuid = $buuid ]; then
echo "\
linux /$item/boot/$kernel root=UUID=$uuid rw rootflags=subvol=$item $params
echo 'Loading initial ramdisk ...'
initrd /$item/boot/$init"
else
echo "\
linux /$kernel root=UUID=$uuid rw rootflags=subvol=$item $params
echo 'Loading initial ramdisk ...'
initrd /$init"
fi
## menu entries
snapshots_entry()
{
## \" required for snap,kernels,init,microcode with space in their name
echo " submenu '${1} ${2} ${3}' {"
for k in "${name_kernel[@]}"; do
for i in "${name_initramfs[@]}"; do
echo "\
}"
done
menuentry '${2} with "${k}" & "${i}"' ${CLASS} "\$menuentry_id_option" 'gnulinux-snapshots-$boot_uuid'{
$(save_default_entry)
if [ x\$feature_all_video_module = xy ]; then
insmod all_video
fi
set gfxpayload=keep
insmod ${boot_fs}
if [ x\$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root ${hs_boot} ${boot_uuid}
else
search --no-floppy --fs-uuid --set=root ${boot_uuid}
fi
echo 'Loading Snapshot: "${2}" "${3}"'
echo 'Loading Kernel: "${k}" ...'
linux \"${boot_dir_real_path}/"${k}"\" root=UUID=${root_uuid} rw rootflags=subvol=\""${snap_dir_name}"\" ${kernel_parameters}
echo 'Loading Initramfs: "${i}" ...'"
if [ -f "$(boot_dir)/${microcode}" ] ; then
echo "\
initrd \"${boot_dir_real_path}/"${microcode}"\" initrd \"/"${snap_dir_name}"/boot/"${i}"\""
else
echo "\
initrd \"${boot_dir_real_path}/"${i}"\""
fi
echo " }"
done
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
# fr: on oubli pas de fermer le menu si plusieurs kernels ont été trouvé
# en: Don't forget to close menus if more than one kernel is found
if [ ${#nkernel[*]} != 1 ]; then echo " }"; fi
done
echo "}"
}
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()
{
## 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
}
## List of kernels and initramfs 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_dir_name $snap_date_time" >&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[*]}"
boot_dir_real_path="$(make_system_path_relative_to_its_root "$(boot_dir)")"
# Create menu entries
snapshots_entry "${prefixentry}" "${snap_dir_name}" "${snap_date_time}"
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,4 +1,45 @@
grub-btrfs
==========
[![GitHub release](https://img.shields.io/github/release/Antynea/grub-btrfs.svg)](https://github.com/Antynea/grub-btrfs)
### grub-btrfs
grub-btrfs, add support for btrfs snapshots into grub menu
This is a version 1.xx of grub-btrfs
#### Description
grub-btrfs, Include btrfs snapshots at boot options. (grub menu)
#### What does grub-btrfs v1.xx do :
Simple rollback using snapshots you made previously.
- Automatically List snapshots existing on root partition (btrfs).
- Automatically Detect kernel, initramfs and intel microcode in "/boot" directory on snapshots. (For custon name, see below.)
- Automatically Create corresponding menuentry in grub.cfg , which ensures a very easy rollback.
#### How to use it:
Add this lines to /etc/default/grub:
* GRUB_BTRFS_SUBMENUNAME="ArchLinux Snapshots" (Name menu appearing in grub.)
* GRUB_BTRFS_PREFIXENTRY="Snapshot:" (Add a name ahead your snapshots entries.)
* 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.
You will see it appear differents entries (e.g : Snapshot: my snapshot name overkill [2014-02-12 11:24:37])
#### TO DO
* verify compatibility with manjaro and snapper (but I don't use them, so it will take some time)
## discussion
Pour les francophones : https://forums.archlinux.fr/viewtopic.php?f=18&t=17177

Binary file not shown.