From 4658fceed8e3fb2b5c8e2d8d6c190196e0da1357 Mon Sep 17 00:00:00 2001 From: Luis Marsano Date: Mon, 19 Dec 2022 16:34:09 -0500 Subject: [PATCH 1/6] define initramfs scripts for ubuntu provide a hook to require overlayfs module so the file system is available define a general script to overlay any readonly root filesystem into a non-persistent, writable filesystem --- initramfs/ubuntu/hooks/grub-btrfs-overlay | 14 +++++++++ .../scripts/local-bottom/grub-btrfs-overlay | 30 +++++++++++++++++++ initramfs/ubuntu/setup | 5 ++++ 3 files changed, 49 insertions(+) create mode 100755 initramfs/ubuntu/hooks/grub-btrfs-overlay create mode 100755 initramfs/ubuntu/scripts/local-bottom/grub-btrfs-overlay create mode 100755 initramfs/ubuntu/setup diff --git a/initramfs/ubuntu/hooks/grub-btrfs-overlay b/initramfs/ubuntu/hooks/grub-btrfs-overlay new file mode 100755 index 0000000..75d4644 --- /dev/null +++ b/initramfs/ubuntu/hooks/grub-btrfs-overlay @@ -0,0 +1,14 @@ +#!/bin/sh -e +PREREQ= +prereqs() { + echo "$PREREQ" +} +case "$1" in + prereqs) + prereqs + exit 0 + ;; +esac + +. /usr/share/initramfs-tools/hook-functions +manual_add_modules overlay diff --git a/initramfs/ubuntu/scripts/local-bottom/grub-btrfs-overlay b/initramfs/ubuntu/scripts/local-bottom/grub-btrfs-overlay new file mode 100755 index 0000000..1481587 --- /dev/null +++ b/initramfs/ubuntu/scripts/local-bottom/grub-btrfs-overlay @@ -0,0 +1,30 @@ +#!/bin/sh -e +PREREQ= +prereqs() { + echo "$PREREQ" +} +case $1 in + prereqs) + prereqs + exit 0 + ;; +esac + +. /scripts/functions +on_err() { + panic 'script error' +} +trap on_err ERR +if [ "$readonly" = y ] +then + log_begin_msg 'remount read-only root as read-only layer in non-persistent, writable overlay' + lower_dir="$(mktemp -d -p /)" + ram_dir="$(mktemp -d -p /)" + upper_dir="$ram_dir"/upper + work_dir="$ram_dir"/work + mount --move "$rootmnt" "$lower_dir" + mount -t tmpfs cowspace "$ram_dir" + mkdir -p "$upper_dir" "$work_dir" + mount -t overlay -o lowerdir="$lower_dir",upperdir="$upper_dir",workdir="$work_dir" rootfs "$rootmnt" + log_end_msg +fi diff --git a/initramfs/ubuntu/setup b/initramfs/ubuntu/setup new file mode 100755 index 0000000..b9c5aff --- /dev/null +++ b/initramfs/ubuntu/setup @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +SCRIPT_DIR="$(cd -P -- "$(dirname -- "$BASH_SOURCE")" && pwd)" +install {"$SCRIPT_DIR",/etc/initramfs-tools}/hooks/grub-btrfs-overlay +install {"$SCRIPT_DIR",/etc/initramfs-tools}/scripts/local-bottom/grub-btrfs-overlay From 4057c34c85b4e3a4ca0ec42b30c47b5fc78d67d5 Mon Sep 17 00:00:00 2001 From: Luis Marsano Date: Mon, 19 Dec 2022 21:48:46 -0500 Subject: [PATCH 2/6] specialize overlay script & refactor kernel parameters normally identify root filesystem as readonly before boot process remounts them writable, so the readonly parameter does not identify readonly filesystems the script reduces scope to btrfs for simplicity as a standard linux util, findmnt is copied & used arrange commands so executables are checked before file system queries and short-circuit evaluation skips unavailable commands for robustness, trap on error & exit events replace panic with failure logging, since panic doesn't appear to break to shell --- initramfs/ubuntu/hooks/grub-btrfs-overlay | 1 + .../scripts/local-bottom/grub-btrfs-overlay | 24 ++++++++++--------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/initramfs/ubuntu/hooks/grub-btrfs-overlay b/initramfs/ubuntu/hooks/grub-btrfs-overlay index 75d4644..f0676c1 100755 --- a/initramfs/ubuntu/hooks/grub-btrfs-overlay +++ b/initramfs/ubuntu/hooks/grub-btrfs-overlay @@ -12,3 +12,4 @@ esac . /usr/share/initramfs-tools/hook-functions manual_add_modules overlay +copy_exec /usr/bin/findmnt /usr/bin diff --git a/initramfs/ubuntu/scripts/local-bottom/grub-btrfs-overlay b/initramfs/ubuntu/scripts/local-bottom/grub-btrfs-overlay index 1481587..3049423 100755 --- a/initramfs/ubuntu/scripts/local-bottom/grub-btrfs-overlay +++ b/initramfs/ubuntu/scripts/local-bottom/grub-btrfs-overlay @@ -1,30 +1,32 @@ #!/bin/sh -e PREREQ= prereqs() { - echo "$PREREQ" + echo "$PREREQ" } case $1 in - prereqs) - prereqs - exit 0 - ;; + prereqs) + prereqs + exit 0 + ;; esac . /scripts/functions on_err() { - panic 'script error' + log_failure_msg 'error setting up overlay' } trap on_err ERR -if [ "$readonly" = y ] +if [ -x /usr/bin/btrfs -a -x /usr/bin/findmnt ] && + [ "$(findmnt -no FSTYPE -M "$rootmnt")" = btrfs ] && + [ "$(btrfs property get $rootmnt ro)" != ro=false ] then - log_begin_msg 'remount read-only root as read-only layer in non-persistent, writable overlay' - lower_dir="$(mktemp -d -p /)" - ram_dir="$(mktemp -d -p /)" + log_begin_msg 'remount read-only subvolume as read-only layer in non-persistent, writable overlay' + trap log_end_msg EXIT + lower_dir="$(mktemp -dp /)" + ram_dir="$(mktemp -dp /)" upper_dir="$ram_dir"/upper work_dir="$ram_dir"/work mount --move "$rootmnt" "$lower_dir" mount -t tmpfs cowspace "$ram_dir" mkdir -p "$upper_dir" "$work_dir" mount -t overlay -o lowerdir="$lower_dir",upperdir="$upper_dir",workdir="$work_dir" rootfs "$rootmnt" - log_end_msg fi From 98ced8c3ecbaae271eb22329225f3a6849833139 Mon Sep 17 00:00:00 2001 From: Luis Marsano Date: Tue, 20 Dec 2022 02:39:23 -0500 Subject: [PATCH 3/6] add setup instructions for ubuntu initramfs --- initramfs/readme.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/initramfs/readme.md b/initramfs/readme.md index 233f667..27ca2e0 100644 --- a/initramfs/readme.md +++ b/initramfs/readme.md @@ -44,6 +44,18 @@ Distributions that use Dracut to make their initramfs (many of the Fedora based Grub-btrfs provides the variable `GRUB_BTRFS_SNAPSHOT_KERNEL_PARAMETERS` to add any command to the kernel command line. Set it to `GRUB_BTRFS_SNAPSHOT_KERNEL_PARAMETERS="rd.live.overlay.overlayfs=1"` to make snapshots immutable when booted into. After changing this run `sudo /etc/grub.d/41_snapshots-btrfs` to generate a new snapshot-submenu with the parameter added. +#### Ubuntu +1. Install initramfs scripts. + + ``` shell + sudo ./initramfs/ubuntu/setup + ``` +2. Re-generate initramfs. + + ``` shell + sudo update-initramfs -u + ``` + #### Other distribution Refer to your distribution's documentation or contribute to this project to add a paragraph. # From e5c641d6403beb7c02b84fe0a9b504047bcea62a Mon Sep 17 00:00:00 2001 From: Luis Marsano Date: Sat, 14 Jan 2023 19:39:25 -0500 Subject: [PATCH 4/6] define uninstall subcommand for ubuntu setup parse options and subcommands in setup script update readme --- initramfs/readme.md | 13 +++----- initramfs/ubuntu/setup | 71 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 72 insertions(+), 12 deletions(-) diff --git a/initramfs/readme.md b/initramfs/readme.md index 27ca2e0..8de44cc 100644 --- a/initramfs/readme.md +++ b/initramfs/readme.md @@ -45,16 +45,11 @@ Grub-btrfs provides the variable `GRUB_BTRFS_SNAPSHOT_KERNEL_PARAMETERS` to add After changing this run `sudo /etc/grub.d/41_snapshots-btrfs` to generate a new snapshot-submenu with the parameter added. #### Ubuntu -1. Install initramfs scripts. + Install initramfs scripts & re-generate initramfs. - ``` shell - sudo ./initramfs/ubuntu/setup - ``` -2. Re-generate initramfs. - - ``` shell - sudo update-initramfs -u - ``` +``` shell +sudo initramfs/ubuntu/setup install +``` #### Other distribution Refer to your distribution's documentation or contribute to this project to add a paragraph. diff --git a/initramfs/ubuntu/setup b/initramfs/ubuntu/setup index b9c5aff..c9e7e23 100755 --- a/initramfs/ubuntu/setup +++ b/initramfs/ubuntu/setup @@ -1,5 +1,70 @@ #!/usr/bin/env bash +log() { + local CODE=$? + echo >&2 "$*" + return $CODE +} +print-help() { + log "\ +usage: ${0##*/} [-h] [--] (install|uninstall) +Install initramfs scripts for Ubuntu. -SCRIPT_DIR="$(cd -P -- "$(dirname -- "$BASH_SOURCE")" && pwd)" -install {"$SCRIPT_DIR",/etc/initramfs-tools}/hooks/grub-btrfs-overlay -install {"$SCRIPT_DIR",/etc/initramfs-tools}/scripts/local-bottom/grub-btrfs-overlay +# Options +-h display this help & exit + +# Subcommands +install install initramfs scripts +uninstall remove initramfs scripts" +} +usage-error() { + print-help + exit 2 +} +action-install() { + local SCRIPT_DIR="$(cd -P -- "$(dirname -- "$BASH_SOURCE")" && pwd)" + install {"$SCRIPT_DIR",/etc/initramfs-tools}/hooks/grub-btrfs-overlay + install {"$SCRIPT_DIR",/etc/initramfs-tools}/scripts/local-bottom/grub-btrfs-overlay +} +action-uninstall() { + rm -f /etc/initramfs-tools/{hooks,scripts/local-bottom}/grub-btrfs-overlay +} +set -e +while getopts h OPT +do case "$OPT" in + h) + print-help + exit + ;; + *) + usage-error +esac done +shift $(( OPTIND - 1 )) +OPTIND=1 +ACTION= +case "$#" in + 0) + log event: a subcommand is required + usage-error + ;; + 1) + case "$1" in + install|uninstall) + ACTION="action-$1" + ;; + *) + log "\ +event: unknown subcommand +subcommand: $1" + usage-error + esac + ;; + *) + log "\ +event: too many arguments +arguments: $*" + usage-error +esac +"$ACTION" || log "\ +event: execution failure +suggestion: rerun with sudo" +exec update-initramfs -u From 8e7352d5acc963aa67d205f1e4d10cb89082ab3a Mon Sep 17 00:00:00 2001 From: Luis Marsano Date: Sat, 14 Jan 2023 19:57:45 -0500 Subject: [PATCH 5/6] update Makefile for mkinitramfs introduce feature flag for mkinitramfs in Makefile extend install & uninstall targets when feature flag is true document flag in help target --- Makefile | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 93be560..3dd3e7c 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,7 @@ PKGNAME ?= grub-btrfs PREFIX ?= /usr INITCPIO ?= false +MKINITRAMFS ?= false SYSTEMD ?= true OPENRC ?= false @@ -59,6 +60,11 @@ install: install -Dm644 "initramfs/Arch Linux/overlay_snap_ro-install" "$(LIB_DIR)/initcpio/install/grub-btrfs-overlayfs"; \ install -Dm644 "initramfs/Arch Linux/overlay_snap_ro-hook" "$(LIB_DIR)/initcpio/hooks/grub-btrfs-overlayfs"; \ fi + @# Ubuntu like distros only : + @if test "$(MKINITRAMFS)" = true; then \ + echo "Installing mkinitramfs hook"; \ + initramfs/ubuntu/setup install; \ + fi @install -Dm644 -t "$(SHARE_DIR)/licenses/$(PKGNAME)/" LICENSE @install -Dm644 -t "$(SHARE_DIR)/doc/$(PKGNAME)/" README.md @install -Dm644 "initramfs/readme.md" "$(SHARE_DIR)/doc/$(PKGNAME)/initramfs-overlayfs.md" @@ -80,6 +86,7 @@ uninstall: @rm -f "$(DESTDIR)/etc/conf.d/grub-btrfsd;" @rm -f "$(LIB_DIR)/initcpio/install/grub-btrfs-overlayfs" @rm -f "$(LIB_DIR)/initcpio/hooks/grub-btrfs-overlayfs" + @initramfs/ubuntu/setup uninstall @rm -f "$(MAN_DIR)/man8/grub-btrfs.8.bz2" @rm -f "$(MAN_DIR)/man8/grub-btrfsd.8.bz2" @# Arch Linux UNlike distros only : @@ -108,14 +115,15 @@ help: @echo " uninstall" @echo " help" @echo - @echo " parameter | type | description | defaults" - @echo " ----------+------+--------------------------------+----------------------------" - @echo " DESTDIR | path | install destination | " - @echo " PREFIX | path | system tree prefix | '/usr'" - @echo " SHARE_DIR | path | shared data location | '\$$(DESTDIR)\$$(PREFIX)/share'" - @echo " LIB_DIR | path | system libraries location | '\$$(DESTDIR)\$$(PREFIX)/lib'" - @echo " PKGNAME | name | name of the ditributed package | 'grub-btrfs'" - @echo " INITCPIO | bool | include mkinitcpio hook | false" - @echo " SYSTEMD | bool | include unit files | true" - @echo " OPENRC | bool | include OpenRc daemon | false" + @echo " parameter | type | description | defaults" + @echo " ------------+------+--------------------------------+----------------------------" + @echo " DESTDIR | path | install destination | " + @echo " PREFIX | path | system tree prefix | '/usr'" + @echo " SHARE_DIR | path | shared data location | '\$$(DESTDIR)\$$(PREFIX)/share'" + @echo " LIB_DIR | path | system libraries location | '\$$(DESTDIR)\$$(PREFIX)/lib'" + @echo " PKGNAME | name | name of the ditributed package | 'grub-btrfs'" + @echo " INITCPIO | bool | include mkinitcpio hook | false" + @echo " MKINITRAMFS | bool | include mkinitramfs hook | false" + @echo " SYSTEMD | bool | include unit files | true" + @echo " OPENRC | bool | include OpenRc daemon | false" @echo From c3e2c198697bb472ff4de89903cd731d6963a9ef Mon Sep 17 00:00:00 2001 From: Luis Marsano Date: Sun, 22 Jan 2023 19:55:15 -0500 Subject: [PATCH 6/6] ignore failures from mkinitramfs uninstall uninstall recipe should proceed for other distros --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3dd3e7c..a1efe5d 100644 --- a/Makefile +++ b/Makefile @@ -86,7 +86,7 @@ uninstall: @rm -f "$(DESTDIR)/etc/conf.d/grub-btrfsd;" @rm -f "$(LIB_DIR)/initcpio/install/grub-btrfs-overlayfs" @rm -f "$(LIB_DIR)/initcpio/hooks/grub-btrfs-overlayfs" - @initramfs/ubuntu/setup uninstall + @initramfs/ubuntu/setup uninstall || true @rm -f "$(MAN_DIR)/man8/grub-btrfs.8.bz2" @rm -f "$(MAN_DIR)/man8/grub-btrfsd.8.bz2" @# Arch Linux UNlike distros only :