Compare commits

..

14 Commits
0.5 ... 0.6.2

Author SHA1 Message Date
Antynea
6f7fb178fb Merge pull request #9 from Antynea/Development
enhanced
2015-07-22 02:05:05 +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
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
e61d0409ac Merge pull request #6 from penetal/patch-3
How to use /etc/default/grub config
2015-05-15 11:45:22 +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

View File

@@ -1,90 +1,112 @@
#! /bin/sh #! /usr/bin/bash
#
#
#########################################################################################################################################
# Written by: Antynea #
# #
# Purpose: Include btrfs snapshots at boot options. #
# #
# What this script does: #
# - List snapshots existing on root partition (btrfs). #
# - 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") (Custom Name kernel you use it.) #
# * GRUB_BTRFS_NINIT=("initramfs-linux.img" "initramfs-linux-fallback.img") (Custom Name initramfs (ramdisk) you use it.) #
# * GRUB_BTRFS_INTEL_UCODE=("intel-ucode.img") (Custom Name intel microcode you use it.) #
# #
# - 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 : Prefixentry name of snapshot [2013-02-11 04:00:00] #
# #
# Warning: #
# This version detect kernels,initramfs,intel microcode only in boot partition, not in snapshot. #
# If those that are present in boot partition but not in snapshot, #
# entry will be created but not fonctional, you don't boot it. #
# #
#########################################################################################################################################
set -e set -e
. /usr/share/grub/grub-mkconfig_lib . /usr/share/grub/grub-mkconfig_lib
. /etc/default/grub . /etc/default/grub
### variables modifiable ### ######################################
## fr: nom du sous-menu ### variables in /etc/default/grub ###
## en: Name of the submenu ######################################
## Submenu name
submenuname=${GRUB_BTRFS_SUBMENUNAME:-"ArchLinux Snapshots"} submenuname=${GRUB_BTRFS_SUBMENUNAME:-"ArchLinux Snapshots"}
## fr: préfixe de l'entrée ## Prefix entry
## en: Prefix entry
prefixentry=${GRUB_BTRFS_PREFIXENTRY:-"Snapshot"} prefixentry=${GRUB_BTRFS_PREFIXENTRY:-"Snapshot"}
## fr: nom(s) du ou des kernel(s) ## Kernel(s) name(s)
## en: Name(s) of the kernel(s)
nkernel=("${GRUB_BTRFS_NKERNEL[@]:-vmlinuz-linux}") nkernel=("${GRUB_BTRFS_NKERNEL[@]:-vmlinuz-linux}")
## fr: nom(s) de(s) l'init ## Initramfs name(s)
## en: Name(s) of the init(s)
ninit=("${GRUB_BTRFS_NINIT[@]:-initramfs-linux.img initramfs-linux-fallback.img}") ninit=("${GRUB_BTRFS_NINIT[@]:-initramfs-linux.img initramfs-linux-fallback.img}")
## fr: nom du microcode intel ## Intel-ucode name(s)
## en: Name intel-ucode
intel_ucode=("${GRUB_BTRFS_INTEL_UCODE[@]:-intel-ucode.img}") intel_ucode=("${GRUB_BTRFS_INTEL_UCODE[@]:-intel-ucode.img}")
########################
########################### ### variables script ###
### fr: DÉBUT DU SCRIPT ### ########################
### en: NAME OF SCRIPT ### ## Internationalization (default : english)
### fr: NE PAS TOUCHER ###
### en: DO NOT TOUCH ###
###########################
## fr: internationalisation
## en: Internationalization
export TEXTDOMAIN=grub-btrfs-git export TEXTDOMAIN=grub-btrfs-git
export TEXTDOMAINDIR="/usr/share/locale" export TEXTDOMAINDIR="/usr/share/locale"
## fr: paramêtre des chaînes --hint ## hints string
## en: Parameter of the chains --hint (Translation unclear)
pboot=$(${grub_probe} --target="hints_string" "/boot" 2>/dev/null) pboot=$(${grub_probe} --target="hints_string" "/boot" 2>/dev/null)
## fr: uuid de la partition root ## UUID of the root partition
## en: UUID of the root partition
uuid=$(${grub_probe} "/" --target="fs_uuid" 2>/dev/null) uuid=$(${grub_probe} "/" --target="fs_uuid" 2>/dev/null)
## fr: uuid de la partition boot ## UUID of the boot partition
## en: UUID of the boot partition
buuid=$(${grub_probe} --target="fs_uuid" "/boot" 2>/dev/null) buuid=$(${grub_probe} --target="fs_uuid" "/boot" 2>/dev/null)
## fr: paramêtre passé au kernel ## Parameters passed to the kernel
## en: Parameters passed to the kernel
params="$GRUB_CMDLINE_LINUX $GRUB_CMDLINE_LINUX_DEFAULT" params="$GRUB_CMDLINE_LINUX $GRUB_CMDLINE_LINUX_DEFAULT"
##############
### Script ###
##############
# fr: on affiche le menu typeset -A date_time
# en: Display the menu unset snapshots
# Create list of filesystem snapshots
oldIFS=$IFS
IFS=$'\n'
for snap in $($bindir/btrfs subvolume list -sa / --sort=-ogen | $bindir/awk '{gsub(/^.*<FS_TREE>\//,"",$NF);print $11" "$12"?"$NF}'); do
snap_name="${snap#*"?"}"
# Discard deleted snapshots
if [ $snap_name = "DELETED" ]; then continue; fi
snapshots+=("$snap_name")
date_time[$snap_name]="${snap%"?"*}"
done
IFS=$oldIFS
# Display the menu
echo "submenu '$submenuname' {" echo "submenu '$submenuname' {"
# fr: on traite la variable kernel # Treat the kernel variables (Translation unclear)
# en: Treat the kernel variables (Translation unclear)
for kernel in ${nkernel[@]}; do 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 # Check the specified kernel(s) exist, if it/they don't, display an error and exit
# en: 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 [ ! -f /boot/$kernel ]; then gettext_printf $"Error: /boot/$kernel, kernel does not exist" >&2; exit 1; fi
# fr: on vérifie le nombre de kernel présent, si >1 on crée un menu # If there are >1 kernels, create a menu
# en: If there are >1 kernels, create a menu
if [ ${#nkernel[*]} != 1 ]; then echo " submenu '$kernel' { if [ ${#nkernel[*]} != 1 ]; then echo " submenu '$kernel' {
submenu '---> Kernel: $kernel <---' { echo }"; fi submenu '---> Kernel: $kernel <---' { echo }"; fi
# Treat the snapshots variable
# fr: On liste les snapshots présent sur le système de fichier for item in ${snapshots[@]}; do
# en: List filesystem snapshots # Output name of snapshot
for item in $($bindir/btrfs subvolume list -s / --sort=-ogen | $bindir/awk '{print $NF}'); do gettext_printf $"Found Snapshot: %s\n" "$item ${date_time[$item]}" >&2
# fr: On écarte les snapshots avec un statut de suppression # Create a menu for remaining snapshots (name + creation date)
# en: Discard deleted snapshots echo " submenu '$prefixentry $item [${date_time[$item]}]' {"
if [ $item = "DELETED" ]; then continue; fi # if more than one kernel is found, create a menu
# 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: if more than one kernel is found, create a menu
if [ ${#nkernel[*]} != 1 ]; then echo " submenu '---> Kernel: $kernel <---' { echo }"; fi if [ ${#nkernel[*]} != 1 ]; then echo " submenu '---> Kernel: $kernel <---' { echo }"; fi
# fr: on traite la variable de l'initramfs # Treat the initramfs variable
# en: Treat the initramfs variables (Translation unclear)
for init in ${ninit[@]}; do 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 # Check the specified initramfs(es) exist, if it/they don't, display an error and exit
# en: 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 if [ ! -f /boot/$init ]; then gettext_printf $"Error: /boot/$init, initramfs does not exist" >&2; exit 1; fi
# fr: on traite chaque entrée des snapshots avec leurs kernel et initramfs respectifs # Specify a kernel and initramfs for every snapshot
# en: 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 '$item $init' --class arch --class gnu-linux --class gnu --class os "\$menuentry_id_option" 'gnulinux-snapshots-$uuid'{
load_video load_video
@@ -95,14 +117,12 @@ for kernel in ${nkernel[@]}; do
search --no-floppy --fs-uuid --set=root $buuid search --no-floppy --fs-uuid --set=root $buuid
fi fi
echo 'Loading Linux snapshot ...'" echo 'Loading Linux snapshot ...'"
# fr: on vérifie l'emplacement de la partition /boot # Check the location of the /boot partition
# en: Check the location of the /boot partition
if [ $uuid = $buuid ]; then if [ $uuid = $buuid ]; then
echo "\ echo "\
linux /$item/boot/$kernel root=UUID=$uuid rw rootflags=subvol=$item $params linux /$item/boot/$kernel root=UUID=$uuid rw rootflags=subvol=$item $params
echo 'Loading initial ramdisk ...'" echo 'Loading initial ramdisk ...'"
# fr: on vérifie la présence du microcode intel # Check intel microcode exist
# en: Check intel microcode exist
if [ -f /boot/$intel_ucode ]; then if [ -f /boot/$intel_ucode ]; then
echo "\ echo "\
initrd /$item/boot/$intel_ucode /$item/boot/$init" initrd /$item/boot/$intel_ucode /$item/boot/$init"
@@ -114,8 +134,7 @@ for kernel in ${nkernel[@]}; do
echo "\ echo "\
linux /$kernel root=UUID=$uuid rw rootflags=subvol=$item $params linux /$kernel root=UUID=$uuid rw rootflags=subvol=$item $params
echo 'Loading initial ramdisk ...'" echo 'Loading initial ramdisk ...'"
# fr: on vérifie la présence du microcode intel # Check intel microcode exist
# en: Check intel microcode exist
if [ -f /boot/$intel_ucode ]; then if [ -f /boot/$intel_ucode ]; then
echo "\ echo "\
initrd /$intel_ucode /$init" initrd /$intel_ucode /$init"
@@ -129,8 +148,7 @@ for kernel in ${nkernel[@]}; do
done done
echo " }" echo " }"
done done
# fr: on oubli pas de fermer le menu si plusieurs kernels ont été trouvé # Don't forget to close menus if more than one kernel is found
# en: Don't forget to close menus if more than one kernel is found
if [ ${#nkernel[*]} != 1 ]; then echo " }"; fi if [ ${#nkernel[*]} != 1 ]; then echo " }"; fi
done done
echo "}" echo "}"