Compare commits

...

19 Commits

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
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
2 changed files with 107 additions and 82 deletions

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
. /usr/share/grub/grub-mkconfig_lib
. /etc/default/grub
### 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")
## fr: nom du microcode intel
## en: Name intel-ucode
intel_ucode=("intel-ucode.img")
######################################
### variables in /etc/default/grub ###
######################################
## Submenu name
submenuname=${GRUB_BTRFS_SUBMENUNAME:-"ArchLinux Snapshots"}
## Prefix entry
prefixentry=${GRUB_BTRFS_PREFIXENTRY:-"Snapshot"}
## Kernel(s) name(s)
nkernel=("${GRUB_BTRFS_NKERNEL[@]:-vmlinuz-linux}")
## Initramfs name(s)
ninit=("${GRUB_BTRFS_NINIT[@]:-initramfs-linux.img initramfs-linux-fallback.img}")
## Intel-ucode name(s)
intel_ucode=("${GRUB_BTRFS_INTEL_UCODE[@]:-intel-ucode.img}")
###########################
### fr: DÉBUT DU SCRIPT ###
### en: NAME OF SCRIPT ###
### fr: NE PAS TOUCHER ###
### en: DO NOT TOUCH ###
###########################
## fr: internationalisation
## en: Internationalization
########################
### variables script ###
########################
## Internationalization (default : english)
export TEXTDOMAIN=grub-btrfs-git
export TEXTDOMAINDIR="/usr/share/locale"
## fr: paramêtre des chaînes --hint
## en: Parameter of the chains --hint (Translation unclear)
## hints string
pboot=$(${grub_probe} --target="hints_string" "/boot" 2>/dev/null)
## fr: uuid de la partition root
## en: UUID of the root partition
## 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
## 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
## Parameters passed to the kernel
params="$GRUB_CMDLINE_LINUX $GRUB_CMDLINE_LINUX_DEFAULT"
##############
### Script ###
##############
# fr: on affiche le menu
# en: Display the menu
typeset -A date_time
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' {"
# fr: on traite la variable kernel
# en: Treat the kernel variables (Translation unclear)
# 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
# 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
# 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 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: if more than one kernel is found, create a menu
# 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
# fr: on traite la variable de l'initramfs
# en: Treat the initramfs variables (Translation unclear)
# Treat the initramfs variable
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
# 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
# fr: on traite chaque entrée des snapshots avec leurs kernel et initramfs respectifs
# en: Specify a kernel and initramfs for every snapshot
# 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
@@ -95,14 +117,12 @@ for kernel in ${nkernel[@]}; do
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
# 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 ...'"
# fr: on vérifie la présence du microcode intel
# en: Check intel microcode exist
# Check intel microcode exist
if [ -f /boot/$intel_ucode ]; then
echo "\
initrd /$item/boot/$intel_ucode /$item/boot/$init"
@@ -114,8 +134,7 @@ for kernel in ${nkernel[@]}; do
echo "\
linux /$kernel root=UUID=$uuid rw rootflags=subvol=$item $params
echo 'Loading initial ramdisk ...'"
# fr: on vérifie la présence du microcode intel
# en: Check intel microcode exist
# Check intel microcode exist
if [ -f /boot/$intel_ucode ]; then
echo "\
initrd /$intel_ucode /$init"
@@ -129,8 +148,7 @@ for kernel in ${nkernel[@]}; do
done
echo " }"
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
# Don't forget to close menus if more than one kernel is found
if [ ${#nkernel[*]} != 1 ]; then echo " }"; fi
done
echo "}"

View File

@@ -1,9 +1,9 @@
### grub-btrfs
This is a version 0.xx of grub-btrfs :
This is a version 0.xx of grub-btrfs
#### Desciption
#### Description
grub-btrfs, add support for btrfs snapshots into grub menu
@@ -15,20 +15,27 @@ Makes a list of all snapshots, kernels, initramfs present on the filesystem and
#### How to use it :
1. Edit 41_snapshots-btrfs file :
1. Add lines to /etc/default/grub as needed, defaults listed as examples:
2.
* submenuname = name menu appear in grub ( e.g: GRUB_BTRFS_SUBMENUNAME="ArchLinux Snapshots" )
* submenuname = name menu appear in grub ( e.g: submenuname="ArchLinux Snapshots" )
* prefixentry = add a name ahead your snapshots entries ( e.g: GRUB_BTRFS_PREFIXENTRY="Snapshot" )
* prefixentry = add a name ahead your snapshots entries ( e.g: prefixentry="Snapshot" )
* nkernel= name kernel you use it ( e.g: GRUB_BTRFS_NKERNEL=("vmlinuz-linux") )
* nkernel= name kernel you use it ( e.g: nkernel=("vmlinuz-linux") )
* ninit= name initramfs (ramdisk) you use it ( e.g: GRUB_BTRFS_NINIT=("initramfs-linux.img" "initramfs-linux-fallback.img") )
* ninit= name initramfs (ramdisk) you use it ( e.g: ninit=("initramfs-linux.img" "initramfs-linux-fallback.img") )
* intel_ucode= name intel microcode you use it ( e.g: intel_ucode=("intel-ucode.img") )
* intel_ucode= name intel microcode you use it ( e.g: GRUB_BTRFS_INTEL_UCODE=("intel-ucode.img") )
2. Generate grub.cfg (on Archlinux is 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]
You will see it appear different entries, e.g : Prefixentry name of snapshot [2013-02-11 04:00:00]
#### Warning
Version 0.xx detect kernels,initramfs,intel microcode only in boot partition, not in snapshot.
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.