From d54f3d7366d188f32863c2800773b82a98657b07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pascal=20J=C3=A4ger?= Date: Sat, 20 Aug 2022 00:59:57 +0200 Subject: [PATCH] grub-btrfsd: Fix #211 for OpenRC-Daemon --- Makefile | 1 + README.md | 23 ++++++++++++++++------- grub-btrfs-openrc | 42 +++++++++++++++++++++++++++++++++++++++--- grub-btrfsd.confd | 13 ++++++++++--- grub-btrfsd.initd | 8 +++----- 5 files changed, 69 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 04b1575..2807af2 100644 --- a/Makefile +++ b/Makefile @@ -69,6 +69,7 @@ uninstall: help: @echo @echo "Usage: $(MAKE) [ = ... ] [ ]" + @echo "Example: $(MAKE) OPENRC=true SYSTEMD=false install" @echo @echo " actions: install" @echo " uninstall" diff --git a/README.md b/README.md index 9550a5d..bf96dd4 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,11 @@ ## grub-btrfs -This is a version 4.xx of grub-btrfs +[![GitHub release](https://img.shields.io/github/release/Antynea/grub-btrfs.svg)](https://github.com/Antynea/grub-btrfs/releases) +![](https://img.shields.io/github/license/Antynea/grub-btrfs.svg) + +## grub-btrfs + ##### BTC donation address: `1Lbvz244WA8xbpHek9W2Y12cakM6rDe5Rt` - - - ### Description: @@ -22,7 +26,7 @@ This project includes its own solution. Refer to the [documentation](https://github.com/Antynea/grub-btrfs/blob/master/initramfs/readme.md). - - - -### What features does grub-btrfs v4.xx have? +### What features does grub-btrfs have? * Automatically list snapshots existing on root partition (btrfs). * Automatically detect if `/boot` is in separate partition. * Automatically detect kernel, initramfs and intel/amd microcode in `/boot` directory on snapshots. @@ -47,9 +51,13 @@ eselect repository enable guru emerge --sync ``` + Now merge grub-btrfs via `emerge app-backup/grub-btrfs` +If you are using SystemD on Gentoo, make sure the USE-Flag `systemD` is set. (Either globally in make.conf or in package.use for the package app-backup/grub-btrfs) +Without systemD USE-Flag the OpenRC-Daemon of grub-btrfs will be installed. + #### Kali Linux [grub-btrfs](http://pkg.kali.org/pkg/grub-btrfs) is available in the Kali Linux repository and can be installed with: ``` @@ -64,7 +72,7 @@ Booting into read-only snapshots is fully supported when choosing "btrfs" as fil * [btrfs-progs](https://archlinux.org/packages/core/x86_64/btrfs-progs/) * [grub](https://archlinux.org/packages/core/x86_64/grub/) * [bash >4](https://archlinux.org/packages/core/x86_64/bash/) - * [gawk ](https://archlinux.org/packages/core/x86_64/gawk/) + * [gawk](https://archlinux.org/packages/core/x86_64/gawk/) #### NOTE: All distros Generate your grub menu after installation for the changes to take effect. @@ -128,11 +136,12 @@ Currently not implemented ## #### OpenRC 1. If you would like grub-btrfs menu to automatically update when a snapshot is created or deleted: +* If you are using Timeshift, newer versions of it mount their snapshots to `/run/timeshift/$pidofthecurrentlyrunnigtimeshift/backup/timeshift-btrfs`. The OpenRC-Daemon can automatically take care of the detection of the correct PID and directory if you set the variable `timeshift_auto` to `true` in `etc/conf.d/grub-btrfsd`. In this case the variable `snapshots` has no influence. +* If you don't want to use `timeshift_auto`, set the variable `snapshots` in the file `/etc/conf.d/grub-btrfsd` to the path of your snapshot directory. By default this is set to snappers default directory, `./snapper`. +For Timeshift keep in mind, that newer versions of Timeshift will not work with the `/run/timeshift/backup/timeshift-btrfs/snapshots` path. However there is a [workaround](https://www.lorenzobettini.it/2022/07/timeshift-and-grub-btrfs-in-linux-arch/) that works for now. * Use `rc-config add grub-btrfsd default`, to start the grub-btrfsd daemon the next time the system boots. * To start `grub-btrfsd` right now, run `rc-service grub-btrfsd start` - * `grub-btrfsd` automatically watches the snapshot directory of timeshift (/run/timeshift/backup/timeshift-btrfs/snapshots) - and updates the grub-menu when a change occurs. -* Currently untested for snapper + * `grub-btrfsd` automatically watches the snapshot directory and updates the grub-menu when a change occurs 2. If you would like grub-btrfs menu to automatically update on system restart/ shutdown: Just add the following script as `/etc/local.d/grub-btrfs-update.stop` @@ -150,7 +159,7 @@ Just add the following script as `/etc/local.d/grub-btrfs-update.stop` bash -c 'if [ -s "${GRUB_BTRFS_GRUB_DIRNAME:-/boot/grub}/grub-btrfs.cfg" ]; then /etc/grub.d/41_snapshots-btrfs; else {GRUB_BTRFS_MKCONFIG:-grub-mkconfig} -o {GRUB_BTRFS_GRUB_DIRNAME:-/boot/grub}/grub.cfg; fi' ``` - Make your script executeable with `chmod a+x /etc/local.d/grub-btrfs-update.stop`. + Make your script executable with `chmod a+x /etc/local.d/grub-btrfs-update.stop`. * The extension ".stop" at the end of the filename indicates to locald that this script should be run at shutdown. If you want to run the menu update on startup instead, rename the file to `grub-btrfs-update.start` diff --git a/grub-btrfs-openrc b/grub-btrfs-openrc index 988be81..738d590 100755 --- a/grub-btrfs-openrc +++ b/grub-btrfs-openrc @@ -1,7 +1,43 @@ #!/bin/sh -echo $$ > /run/grub-btrfsd.pid -snapshots="${1:-/run/timeshift/backup/timeshift-btrfs/snapshots}" +# Copyright 2022 Pascal Jaeger +# Distributed under the terms of the GNU General Public License v3 +# Update GRUB when new BTRFS snapshots are created. -while true; do sleep 1 && inotifywait -e create -e delete "$snapshots" && sleep 5 && if [ -s "${GRUB_BTRFS_GRUB_DIRNAME:-/boot/grub}/grub-btrfs.cfg" ]; then /etc/grub.d/41_snapshots-btrfs; else ${GRUB_BTRFS_MKCONFIG:-grub-mkconfig} -o ${GRUB_BTRFS_GRUB_DIRNAME:-/boot/grub}/grub.cfg; fi ; done +timeshift_pid +watchtime=0 +snapshots="${1}" +timeshift_auto="${2}" +if ! [ "${#snapshots}" -gt 0 ] && ! [ ${timeshift_auto} ]; then + echo "Please specify the snapshots directory" >&2 + exit 1 +fi +if [ ${timeshift_auto} ]; then + watchtime=15 +else + watchtime=0 +fi + +while true; do + if [ ${timeshift_auto} == "true" ] && ! [ "${#timeshift_pid}" -gt 0 ] ; then + inotifywait -e create -e delete /run/timeshift && { + sleep 1 + timeshift_pid=$(ps ax | awk '{sub(/.*\//, "", $5)} $5 ~ /timeshift/ {print $1}') + snapshots="/run/timeshift/${timeshift_pid}/backup/timeshift-btrfs/snapshots" + } + else + while [ -d "$snapshots" ]; do + sleep 1 + inotifywait -e create -e delete -e unmount -t "$watchtime" "$snapshots" && { + sleep 5 + if [ -s "${GRUB_BTRFS_GRUB_DIRNAME:-/boot/grub}/grub-btrfs.cfg" ]; then + /etc/grub.d/41_snapshots-btrfs + else + ${GRUB_BTRFS_MKCONFIG:-grub-mkconfig} -o ${GRUB_BTRFS_GRUB_DIRNAME:-/boot/grub}/grub.cfg + fi + } + done + timeshift_pid="" + fi +done diff --git a/grub-btrfsd.confd b/grub-btrfsd.confd index 9033c82..adeff11 100644 --- a/grub-btrfsd.confd +++ b/grub-btrfsd.confd @@ -1,3 +1,10 @@ -# Where to locate the root snapshots -#snapshots="/.snapshots" # Snapper in the root directory -snapshots="/run/timeshift/backup/timeshift-btrfs/snapshots" # Timeshift +# Copyright 2022 Pascal Jaeger +# Distributed under the terms of the GNU General Public License v3 + +## Where to locate the root snapshots +snapshots="/.snapshots" # Snapper in the root directory +#snapshots="/run/timeshift/backup/timeshift-btrfs/snapshots" # Timeshift < v22.06 + +## Autodetect timeshift snapshot directory. If this it set to true, variable snapshots is not taken into account. Use this for Timeshift >= v22.06 +timeshift_auto=true # Timeshift >= v22.06 +#timeshift_auto=false # snapper diff --git a/grub-btrfsd.initd b/grub-btrfsd.initd index 3782782..29e4e39 100755 --- a/grub-btrfsd.initd +++ b/grub-btrfsd.initd @@ -1,15 +1,13 @@ #!/sbin/openrc-run -# Copyright 1999-2021 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 +# Copyright 2021 Pascal Jaeger +# Distributed under the terms of the GNU General Public License v3 name="grub-btrfs daemon" command="/usr/bin/grub-btrfs-openrc" -command_args="${snapshots}" +command_args="${snapshots} ${timeshift_auto}" pidfile="/run/{RC_SVCNAME}.pid" command_background=true depend() { use localmount } - -