Pacman hook that creates a btrfs snapshot with snapper prior to the operation as a system restore point
Find a file
2016-04-22 21:38:28 -05:00
10_snapper-post.hook update hook names so that snapshots are the first things done 2016-03-17 19:49:27 -05:00
10_snapper-pre.hook update hook names so that snapshots are the first things done 2016-03-17 19:49:27 -05:00
99_grub-config.hook update README 2016-04-22 20:11:06 -05:00
LICENSE Initial commit 2016-03-11 13:56:09 +00:00
README.md update README 2016-04-22 21:38:28 -05:00
snapper-pac-grub make config generation redirect stderr to /dev/null 2016-03-17 20:15:28 -05:00
snapper-pac-post update descriptions to show just pacman command 2016-04-22 13:52:35 -05:00
snapper-pac-pre update descriptions to show just pacman command 2016-04-22 13:52:35 -05:00

snap-pac

This makes Arch Linux's pacman use snapper to automatically take a pre and post snapshot before and after pacman transactions, similar to how YaST does with OpenSuse. This provides a simple way to undo changes to a system after a pacman transaction.

The snapshots are set up to use snapper's number algorithm. That is, snapper will periodically clean up snapshots tagged with number after reaching a set threshold in the snapper configuration file.

Additionally the package provides a hook to regenerate your GRUB configuration file after every pacman transaction. This is useful when using grub-btrfs. If you don't use grub-btrfs, then you should remove 99_grub-config.hook after installation.

Note: Snapshots are only taken of the subvolume corresponding with the root snapper config; other subvolumes are not included. You must modify the scripts to include other subvolumes. Additionally, you should create subvolumes of directories you do not want included in your snapshots (e.g. /var/cache/pacman/pkg).

Installation

Install the package from the AUR.

Optionally, install grub-btrfs to populate your GRUB menu with the ability to boot into snapshots.

Usage

Taking snapshots

Use pacman—and AUR helpers—as normal and watch snapper do its thing. No bash scripts for you to call. No bash aliases to setup.

Because these are pacman hooks, it doesn't matter how you call pacman—whether directly, through an AUR helper, or using an alias—snapper will create the snapshots when pacman installs, upgrades, or removes a package. The pacman command used is logged in the snapper description for the snapshots.

Undoing a transaction

To undo changes from a pacman transaction, use snapper undochange. See the snapper manpage and the following example.

Example

Installing the nano package as normal:

# pacman -S nano
resolving dependencies...
looking for conflicting packages...

Packages (1) nano-2.5.3-1

Total Installed Size:  2.14 MiB

:: Proceed with installation? [Y/n] Y
(1/1) checking keys in keyring                               [######################################] 100%
(1/1) checking package integrity                             [######################################] 100%
(1/1) loading package files                                  [######################################] 100%
(1/1) checking for file conflicts                            [######################################] 100%
(1/1) checking available disk space                          [######################################] 100%
:: Running pre-transaction hooks...
(1/1) snapper pre snapshot
:: Processing package changes...
(1/1) installing nano                                        [######################################] 100%
:: Running post-transaction hooks...
(1/2) snapper post snapshot
(2/2) generate GRUB configuration file

And here are the snapshots:

# snapper -c root list -t pre-post | tail -n 1
1033  | 1034   | Fri 22 Apr 2016 01:54:13 PM CDT | Fri 22 Apr 2016 01:54:14 PM CDT | pacman -S nano      | 

What changed?

# snapper -c root status 1033..1034
+..... /etc/nanorc
c..... /etc/snapper/.snap-pac-pre
+..... /usr/bin/nano
+..... /usr/bin/rnano
+..... /usr/share/doc/nano
+..... /usr/share/doc/nano/faq.html
+..... /usr/share/doc/nano/fr
+..... /usr/share/doc/nano/fr/nano.1.html
+..... /usr/share/doc/nano/fr/nanorc.5.html
+..... /usr/share/doc/nano/fr/rnano.1.html

I truncated the above output, but it continues. See the manpage for snapper to see what each symbol means. You can also do snapper diff in the same way—I'll spare you that one.

To undo the upgrade:

# snapper -c root undochange 1033..1034
create:0 modify:3 delete:100

And nano is now gone, along with all the files it changed:

$ pacman -Qi nano
error: package 'nano' was not found

References