mirror of
https://github.com/Antynea/grub-btrfs.git
synced 2026-03-04 13:05:00 +08:00
139 lines
5.2 KiB
Bash
139 lines
5.2 KiB
Bash
#! /usr/bin/bash
|
|
set -e
|
|
|
|
. /usr/share/grub/grub-mkconfig_lib
|
|
. /etc/default/grub
|
|
|
|
######################################
|
|
### 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}")
|
|
|
|
########################
|
|
### 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)
|
|
pboot=$(${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
|
|
buuid=$(${grub_probe} --target="fs_uuid" "/boot" 2>/dev/null)
|
|
## Parameters passed to the kernel
|
|
params="$GRUB_CMDLINE_LINUX $GRUB_CMDLINE_LINUX_DEFAULT"
|
|
|
|
##############
|
|
### Script ###
|
|
##############
|
|
|
|
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
|
|
|
|
# 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 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 [ ${#nkernel[*]} != 1 ]; then echo " submenu '$kernel' {
|
|
submenu '---> Kernel: $kernel <---' { echo }"; fi
|
|
# fr: On traite la variable snapshots
|
|
# en: Treat the snapshots variable
|
|
for item in ${snapshots[@]}; do
|
|
# fr: affiche la liste des snapshots trouvés
|
|
# en: Output name of snapshot
|
|
gettext_printf $"Found Snapshot: %s\n" "$item ${date_time[$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)
|
|
echo " submenu '$prefixentry $item [${date_time[$item]}]' {"
|
|
# 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
|
|
# 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 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
|
|
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 ...'"
|
|
# fr: on vérifie la présence du microcode intel
|
|
# en: Check intel microcode exist
|
|
if [ -f /boot/$intel_ucode ]; then
|
|
echo "\
|
|
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 ...'"
|
|
# fr: on vérifie la présence du microcode intel
|
|
# en: Check intel microcode exist
|
|
if [ -f /boot/$intel_ucode ]; then
|
|
echo "\
|
|
initrd /$intel_ucode /$init"
|
|
else
|
|
echo "\
|
|
initrd /$init"
|
|
fi
|
|
fi
|
|
echo "\
|
|
}"
|
|
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
|
|
if [ ${#nkernel[*]} != 1 ]; then echo " }"; fi
|
|
done
|
|
echo "}" |