Compare commits
No commits in common. "main" and "v2.0" have entirely different histories.
20
README.md
20
README.md
@ -13,17 +13,17 @@ required (though the name remains).
|
|||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
|
|
||||||
While not depending on it directly, this tool expects that you already set up
|
This tool expects that you already set up snapper. It also expects that each
|
||||||
snapper. It expects, that each snapshot contains its kernel
|
snapshots linux and initramfs files (`/boot/vmlinuz-linux` and
|
||||||
(`/boot/vmlinuz-linux`) and initramfs (`/boot/intitramfs-linux.img`), as well as
|
`/boot/initramfs-linux.img`) as well as a kernel command line file
|
||||||
a kernel command line file (`/etc/snap-pac-uki/kernel-cmd`).
|
(`/etc/snap-pac-uki/kernel-cmd`) are available within each snapshot.
|
||||||
|
|
||||||
For generating the current and fallback UKIs, the kernel and initramfs files of
|
The fallback initramfs (`/boot/initramfs-linux-fallback.img`) and fallback
|
||||||
the currently running system are used. For a kernel cmd, it uses
|
command line file (`/etc/snap-pac-uki/kernel-cmd-fallback`) are only required
|
||||||
`/etc/snap-pac-uki/kernel-cmd-current` and `/etc/snap-pac-uki/kernel-cmd-fallback`.
|
on the current system.
|
||||||
|
|
||||||
If you want to boot a UKI directly, use the `efibootmgr` command to create an
|
EFI boot options are only created for each snapshot. If you want the UKIs
|
||||||
entry.
|
created for the current system, you'll need to add boot entries yourself:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# template
|
# template
|
||||||
@ -53,7 +53,7 @@ efibootmgr -c \
|
|||||||
1. You can install the dependencies of this program with the following command:
|
1. You can install the dependencies of this program with the following command:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pacman -S fish ripgrep sbsigntools sed
|
pacman -S fish efibootmgr jq ripgrep sbsigntools sed snapper
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Download the latest release from [here][releases] and unpack it.
|
2. Download the latest release from [here][releases] and unpack it.
|
||||||
|
@ -8,13 +8,8 @@ if not test -d "/etc/snap-pac-uki"
|
|||||||
echo "created config dir."
|
echo "created config dir."
|
||||||
end
|
end
|
||||||
|
|
||||||
if not test -f "/etc/snap-pac-uki/config.fish"
|
|
||||||
cp ./src/config.fish /etc/snap-pac-uki/config.fish
|
cp ./src/config.fish /etc/snap-pac-uki/config.fish
|
||||||
echo "installed config script."
|
echo "installed config script."
|
||||||
else
|
|
||||||
cp ./src/config.fish /etc/snap-pac-uki/config-new.fish
|
|
||||||
echo "found existing config script -> installed as -new file."
|
|
||||||
end
|
|
||||||
|
|
||||||
cp ./pacman/* /usr/share/libalpm/hooks/
|
cp ./pacman/* /usr/share/libalpm/hooks/
|
||||||
echo "installed pacman hooks."
|
echo "installed pacman hooks."
|
||||||
|
@ -1,14 +1,5 @@
|
|||||||
function config -d "sets some configuration variables"
|
function config -d "sets some configuration variables"
|
||||||
|
|
||||||
# If this is not set to "yes", snap-pac-uki will not do anything when
|
|
||||||
# executed.
|
|
||||||
#
|
|
||||||
# This is to make sure that this program can be installed with pacman. If
|
|
||||||
# this wasn't done, pacman would install this program with an default
|
|
||||||
# config, which most likely wouldn't work correctly. Therefore this needs
|
|
||||||
# to be set to "yes" by the user, once they've configured snap-pac-uki.
|
|
||||||
set -g CFG_ENABLED "no"
|
|
||||||
|
|
||||||
# A directory where ukis can be built.
|
# A directory where ukis can be built.
|
||||||
#
|
#
|
||||||
# It is recommended to keep this within /tmp, as the generated data will not
|
# It is recommended to keep this within /tmp, as the generated data will not
|
||||||
@ -21,6 +12,18 @@ function config -d "sets some configuration variables"
|
|||||||
# images.
|
# images.
|
||||||
set -g CFG_DEFAULT_SUBVOL "@"
|
set -g CFG_DEFAULT_SUBVOL "@"
|
||||||
|
|
||||||
|
# The device the EFI partition resides on
|
||||||
|
set -g CFG_EFI_DEV "/dev/nvme0n1"
|
||||||
|
|
||||||
|
# The "efi directory" that will contain the ukis
|
||||||
|
set -g CFG_EFI_PATH "\EFI\Linux"
|
||||||
|
|
||||||
|
# The efi partitions number on the device
|
||||||
|
set -g CFG_EFI_PART "1"
|
||||||
|
|
||||||
|
# The snapper config name
|
||||||
|
set -g CFG_SNAPSHOT_CONFIG "root"
|
||||||
|
|
||||||
# The linux fs path containing all snapshot data
|
# The linux fs path containing all snapshot data
|
||||||
set -g CFG_SNAPSHOT_PATH "/.snapshots"
|
set -g CFG_SNAPSHOT_PATH "/.snapshots"
|
||||||
|
|
||||||
|
@ -7,8 +7,12 @@ end
|
|||||||
|
|
||||||
function check_deps -d "checks if all dependencies are available"
|
function check_deps -d "checks if all dependencies are available"
|
||||||
set -l dependencies \
|
set -l dependencies \
|
||||||
|
"efibootmgr" \
|
||||||
|
"jq" \
|
||||||
"rg" \
|
"rg" \
|
||||||
|
"sbsign" \
|
||||||
"sed" \
|
"sed" \
|
||||||
|
"snapper" \
|
||||||
|
|
||||||
for dep in $dependencies
|
for dep in $dependencies
|
||||||
which $dep >/dev/null 2>/dev/null
|
which $dep >/dev/null 2>/dev/null
|
||||||
@ -17,19 +21,13 @@ function check_deps -d "checks if all dependencies are available"
|
|||||||
error "missing depenency: $dep"
|
error "missing depenency: $dep"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
which "sbsign" >/dev/null 2>/dev/null
|
|
||||||
if test $status != "0" -a $CFG_SECUREBOOT = "yes"
|
|
||||||
set -g CFG_SECUREBOOT "no"
|
|
||||||
echo "CFG_SECUREBOOT overwriten to \"no\": 'sbsign' not available"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function find_ukiless_snapshots -d "find"
|
function find_tasks -d "finds out what the program needs to do"
|
||||||
set -ge TASK_UKI
|
set -ge TASK_UKI
|
||||||
|
|
||||||
for id in (ls $CFG_SNAPSHOT_PATH)
|
for id in (snapper -c $CFG_SNAPSHOT_CONFIG --jsonout ls | jq ".$CFG_SNAPSHOT_CONFIG [] | .number")
|
||||||
if test $id = "0"
|
if test "$id" = "0"
|
||||||
continue
|
continue
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -45,7 +43,6 @@ function create_uki -d "creates a new uki" -a variant id
|
|||||||
switch $variant
|
switch $variant
|
||||||
case "rolling"
|
case "rolling"
|
||||||
set bd "$CFG_BUILD_DIR/current"
|
set bd "$CFG_BUILD_DIR/current"
|
||||||
set current "-current"
|
|
||||||
case "fallback"
|
case "fallback"
|
||||||
set bd "$CFG_BUILD_DIR/current"
|
set bd "$CFG_BUILD_DIR/current"
|
||||||
set fallback "-fallback"
|
set fallback "-fallback"
|
||||||
@ -57,17 +54,12 @@ function create_uki -d "creates a new uki" -a variant id
|
|||||||
error "unknown uki variant: $variant"
|
error "unknown uki variant: $variant"
|
||||||
end
|
end
|
||||||
|
|
||||||
# create initrd
|
|
||||||
set initrd "$bd/initramfs-linux$fallback.img"
|
|
||||||
cat "$prefix/boot/initramfs-linux$fallback.img" >> $initrd
|
|
||||||
|
|
||||||
# create uki
|
|
||||||
objcopy \
|
objcopy \
|
||||||
--add-section .osrel="$bd/os-release$fallback" --change-section-vma .osrel=0x20000 \
|
--add-section .osrel="$bd/os-release$fallback" --change-section-vma .osrel=0x20000 \
|
||||||
--add-section .cmdline="$bd/kernel-cmd$current$fallback" --change-section-vma .cmdline=0x30000 \
|
--add-section .cmdline="$bd/kernel-cmd$fallback" --change-section-vma .cmdline=0x30000 \
|
||||||
--add-section .splash="$prefix/usr/share/systemd/bootctl/splash-arch.bmp" --change-section-vma .splash=0x40000 \
|
--add-section .splash="$prefix/usr/share/systemd/bootctl/splash-arch.bmp" --change-section-vma .splash=0x40000 \
|
||||||
--add-section .linux="$prefix/boot/vmlinuz-linux" --change-section-vma .linux=0x2000000 \
|
--add-section .linux="$prefix/boot/vmlinuz-linux" --change-section-vma .linux=0x2000000 \
|
||||||
--add-section .initrd="$initrd" --change-section-vma .initrd=0x3000000 \
|
--add-section .initrd="$prefix/boot/initramfs-linux$fallback.img" --change-section-vma .initrd=0x3000000 \
|
||||||
"$prefix/usr/lib/systemd/boot/efi/linuxx64.efi.stub" "$bd/arch-linux$fallback$snid.efi.unsigned"
|
"$prefix/usr/lib/systemd/boot/efi/linuxx64.efi.stub" "$bd/arch-linux$fallback$snid.efi.unsigned"
|
||||||
|
|
||||||
# sign
|
# sign
|
||||||
@ -113,7 +105,7 @@ function create_current_uki -d "creates an uki for the current system"
|
|||||||
|
|
||||||
# create default
|
# create default
|
||||||
cp "/usr/lib/os-release" "$bd/os-release"
|
cp "/usr/lib/os-release" "$bd/os-release"
|
||||||
sed "s/SNAPSHOT/$CFG_DEFAULT_SUBVOL/" <"/etc/snap-pac-uki/kernel-cmd-current" >"$bd/kernel-cmd-current"
|
sed "s/SNAPSHOT/$CFG_DEFAULT_SUBVOL/" <"/etc/snap-pac-uki/kernel-cmd" >"$bd/kernel-cmd"
|
||||||
create_uki rolling
|
create_uki rolling
|
||||||
|
|
||||||
# create fallbac
|
# create fallbac
|
||||||
@ -122,21 +114,21 @@ function create_current_uki -d "creates an uki for the current system"
|
|||||||
create_uki fallback
|
create_uki fallback
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function add_efi_entry -d "adds an efi boot entry for a snapshot uki" -a id
|
||||||
|
efibootmgr -q -C -d $CFG_EFI_DEV -p $CFG_EFI_PART \
|
||||||
|
-l "$CFG_EFI_PATH\arch-linux-$id.efi" \
|
||||||
|
-L "Arch Linux (Snapshot $id)"
|
||||||
|
end
|
||||||
|
|
||||||
function main
|
function main
|
||||||
# prepare for execution
|
# prepare for execution
|
||||||
|
check_deps
|
||||||
source "/etc/snap-pac-uki/config.fish"
|
source "/etc/snap-pac-uki/config.fish"
|
||||||
config
|
config
|
||||||
|
|
||||||
if test "$CFG_ENABLED" != "yes"
|
|
||||||
echo "==> snap-pac-uki not enabled in config file" 1>&2
|
|
||||||
exit 0
|
|
||||||
end
|
|
||||||
|
|
||||||
check_deps
|
|
||||||
|
|
||||||
switch $argv[1]
|
switch $argv[1]
|
||||||
case "snapshots"
|
case "snapshots"
|
||||||
find_ukiless_snapshots
|
find_tasks
|
||||||
for id in $TASK_UKI
|
for id in $TASK_UKI
|
||||||
echo "==> found snapshot without uki: $id"
|
echo "==> found snapshot without uki: $id"
|
||||||
|
|
||||||
@ -145,6 +137,9 @@ function main
|
|||||||
|
|
||||||
cp "$CFG_BUILD_DIR/$id/arch-linux-$id.efi" "$CFG_UKI_DIR"
|
cp "$CFG_BUILD_DIR/$id/arch-linux-$id.efi" "$CFG_UKI_DIR"
|
||||||
echo " -> copied uki for snapshot $id into uki directory"
|
echo " -> copied uki for snapshot $id into uki directory"
|
||||||
|
|
||||||
|
add_efi_entry $id
|
||||||
|
echo " -> created efi boot entry for uki of snapshot $id"
|
||||||
end
|
end
|
||||||
|
|
||||||
case "current"
|
case "current"
|
||||||
@ -160,11 +155,13 @@ function main
|
|||||||
case "clean"
|
case "clean"
|
||||||
echo "==> cleaning ukis"
|
echo "==> cleaning ukis"
|
||||||
|
|
||||||
set ids (ls $CFG_SNAPSHOT_PATH)
|
set ids (snapper -c $CFG_SNAPSHOT_CONFIG --jsonout ls | jq ".$CFG_SNAPSHOT_CONFIG [] | .number")
|
||||||
for uki in (ls "$CFG_UKI_DIR" | rg "[0-9]" | sed "s/arch-linux-\([0-9]*\).efi/\1/")
|
for uki in (ls "$CFG_UKI_DIR" | rg "[0-9]" | sed "s/arch-linux-\([0-9]*\).efi/\1/")
|
||||||
if not contains "$uki" $ids
|
if not contains "$uki" $ids
|
||||||
echo " -> cleaning uki and boot entry for removed snapshot $uki"
|
echo " -> cleaning uki and boot entry for removed snapshot $uki"
|
||||||
rm "$CFG_UKI_DIR/arch-linux-$uki.efi"
|
rm "$CFG_UKI_DIR/arch-linux-$uki.efi"
|
||||||
|
|
||||||
|
efibootmgr -q -b (efibootmgr -v | rg "arch-linux-$uki.efi" | sed "s/\*//;s/Boot0*\(.*\) Arch .*/\1/") -B
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
3
uninstall.fish
Executable file → Normal file
3
uninstall.fish
Executable file → Normal file
@ -3,6 +3,9 @@
|
|||||||
rm /usr/local/bin/snap-pac-uki
|
rm /usr/local/bin/snap-pac-uki
|
||||||
echo "removed script."
|
echo "removed script."
|
||||||
|
|
||||||
|
rm /etc/snap-pac-uki/config.fish
|
||||||
|
echo "removed config script."
|
||||||
|
|
||||||
for name in (ls ./pacman)
|
for name in (ls ./pacman)
|
||||||
rm /usr/share/libalpm/hooks/$name
|
rm /usr/share/libalpm/hooks/$name
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user