User:Wentfullarch/Snapper (Русский)
Snapper — инструмент, созданный Арвином Шнеллом из openSUSE, который помогает управлять моментальными снимками подразделов Btrfs и томов LVM с тонким резервированием. Данная утилита создает и сравнивает снимки, позволяет отменять изменения между ними, а также поддерживает их автоматическое создание с заданным интервалом.
Установка
Установите пакет snapper. Версия для разработчиков snapper-gitAUR также доступна.
Помимо этого есть версия с графическим интерфейсом snapper-gui-gitAUR.
Настройка
Перед созданием конфигурации, нужный подтом должен уже быть создан.
Для создания новой конфигурации, с именем config
, для подтома /path/to/subvolume
, выполните:
# snapper -c config create-config /path/to/subvolume
Это:
- создаст файл конфигурации
/etc/snapper/configs/config
на основе шаблона по умолчанию из/etc/snapper/config-templates
. - создаст подтом
/path/to/subvolume/.snapshots
, где будут храниться будущие снимки для этой конфигурации. Путем снимка будет/path/to/subvolume/.snapshots/#/snapshot
, а#
— его номером. - добавит
config
кSNAPPER_CONFIGS
в/etc/conf.d/snapper
.
Например, чтобы создать файл конфигурации для подтома, смонтированного в /
, выполните:
# snapper -c root create-config /
Подробнее о snapper-configs
смотрите в соответствующей man page.
Создание снимков
Автоматическое создание снимков по графику
Временная шкала снимков создается с возможностью настраивать их количество, создаваемое каждый час, день, месяц или год. При заданных интервалах, по умолчанию снимок создается однажды в час. Раз в день снимки удаляются алгоритмом очистки временной шкалы.
Enable/disable
If you have a cron daemon, this feature should start automatically. To disable it, edit the configuration file corresponding with the subvolume you do not want to have this feature and set:
TIMELINE_CREATE="no"
If you do not have a cron daemon, you can use the provided systemd units. Start and enable snapper-timeline.timer
to start the automatic snapshot timeline. Additionally, start and enable snapper-cleanup.timer
to periodically cleanup older snapshots.
Set snapshot limits
The default settings will keep 10 hourly, 10 daily, 10 monthly and 10 yearly snapshots. You may want to change this in the configuration, especially on busy subvolumes like /
. See #Preventing slowdowns.
Here is an example section of a configuration named config
with only 5 hourly snapshots, 7 daily ones, no monthly and no yearly ones:
/etc/snapper/configs/config
TIMELINE_MIN_AGE="1800" TIMELINE_LIMIT_HOURLY="5" TIMELINE_LIMIT_DAILY="7" TIMELINE_LIMIT_WEEKLY="0" TIMELINE_LIMIT_MONTHLY="0" TIMELINE_LIMIT_YEARLY="0"
Change snapshot and cleanup frequencies
If you are using the provided systemd timers, you can edit them to change the snapshot and cleanup frequency.
For example, when editing the snapper-timeline.timer
, add the following to make the frequency every five minutes, instead of hourly:
[Timer] OnCalendar= OnCalendar=*:0/5
TIMELINE_LIMIT_HOURLY
is tied to the above setting. In the above example it now refers to how many 5-minute snapshots are kept.When editing snapper-cleanup.timer
, you need to change OnUnitActiveSec
. To make cleanups occur every hour instead of every day, add:
[Timer] OnUnitActiveSec=1h
See Systemd/Timers and Systemd#Drop-in files.
Manual snapshots
Simple snapshots
By default snapper takes snapshots that are of the simple type, having no special relationship to other snapshots.
To take a snapshot of a subvolume manually, do:
# snapper -c config create --description desc
The above command does not use any cleanup algorithm, so the snapshot is stored permanently or until deleted.
To set a cleanup algorithm, use the -c
flag after create
and choose either number
, timeline
, pre
, or post
. number
sets snapper to periodically remove snapshots that have exceeded a set number in the configuration file. For example, to create a snaphot that uses the number
algorithm for cleanup do:
# snapper -c config create -c number
See #Automatic timeline snapshots for how timeline
snapshots work and see #Pre/post snapshots on how pre
and post
work.
Pre/post snapshots
In addition to simple snapshots, you can also create pre/post snapshots where pre snapshots always have a corresponding post snapshot. The purpose of these pairs is to create a snapshot before and after a system modification.
To create a pre/post snapshot pair, first create a pre snapshot:
# snapper -c config create -t pre -p
Note the number of the snapshot printed, as it is required for the post snapshot.
Then perform a system modification (*e.g.*, install a new program, upgrade, etc.).
Now create the post snapshot:
# snapper -c config create -t post --pre-number N
where N
is the corresponding pre snapshot number.
An alternative method is to use the --command
flag for create
, which wraps a command with pre/post snapshots:
# snapper -c config create --command cmd
where cmd
is the command you wish to wrap with pre/post snapshots.
See #Wrapping pacman transactions in snapshots.
Snapshots on boot
To have snapper take a snapshot of the root
configuration, enable snapper-boot.timer
.
List snapshots
To list snapshots taken for a given configuration config do:
# snapper -c config list
List configurations
To list all configurations you have created do:
# snapper list-configs
Delete a snapshot
To delete a snapshot number N
do:
# snapper -c config delete N
Multiple snapshots can be deleted at one time. For example, to delete snapshots 65 and 70 of the root configuration do:
# snapper -c root delete 65 70
Access for non-root users
Each config is created with the root user, and by default, only root can see and access it.
To be able to list the snapshots for a given config for a specific user, simply change the value of ALLOW_USERS
in your /etc/snapper/configs/config
file. You should now be able to run snapper -c config list
as a normal user.
Eventually, you want to be able to browse the .snapshots
directory with a user, but the owner of this directory must stay root. Therefore, you should change the group owner by a group containing the user you are interested in, such as users
for example:
# chmod a+rx .snapshots # chown :users .snapshots
Tips and tricks
Wrapping pacman transactions in snapshots
There are a couple of packages used for automatically creating snapshots upon a pacman transaction:
- pacupg — "Script that wraps package and AUR upgrades in btrfs snapshots and provides an easy way to roll them back."
- snap-pac — "Makes pacman automatically use snapper to create #Pre/post snapshots like openSUSE's YaST". Uses Pacman#Hooks.
- snap-pac-grub — "Additionally updates GRUB entries for grub-btrfs after snap-pac made the snapshots. Also uses Pacman#Hooks.
- snap-pac-grubAUR || snap-pac-grubAUR
- snp — wrap any shell command in a snapper pre-post snapshot, e.g.
$ snp pacman -Syu
Backup non-btrfs boot partition on pacman transactions
If your /boot
partition is on a non btrfs filesystem (e.g. an ESP) you are not able to do snapper backups with it. You can copy the boot partition automatically on a kernel update to your btrfs root with a hook. This also plays nice together with snap-pac.
/usr/share/libalpm/hooks/50_bootbackup.hook
[Trigger] Operation = Upgrade Operation = Install Operation = Remove Type = Package Target = linux* [Action] Depends = rsync Description = Backing up /boot... When = PreTransaction Exec = /usr/bin/rsync -a --delete /boot /.bootbackup
Incremental backup to external drive
The following packages use btrfs send
and btrfs receive
to send backups incrementally to an external drive. Refer to their documenation to see differences in implementation, features, and requirements.
- buttersink — "Buttersink is like rsync for btrfs snapshots."
- snap-sync — "Use snapper snapshots to backup to external drive."
- snapsync — "A synchronization tool for snapper"
Suggested filesystem layout
snapper rollback
, but is intended to mitigate inherent problems with restoring /
with that command. See this forum thread.Here is a suggested file system layout for easily restoring your /
to a previous snapshot:
subvolid=5 | ├── @ | | | ├── /usr | | | ├── /bin | | | ├── /.snapshots | | | ├── ... | ├── @snapshots | └── @...
Where /.snapshots
is a mountpoint for @snapshots
. @...
are subvolumes that you want to keep separate from the subvolume you will be mounting as /
(@
). When taking a snapshot of /
, these other subvolumes are not included. However, you can still snapshot these other subvolumes separately by creating other snapper configurations for them. Additionally, if you were to restore your system to a previous snapshots of /
, these other subvolumes will remain unaffected.
For example if you want to be able restore /
to a previous snapshot but keep your /home
intact, you should create a subvolume that will be mounted at /home
. See Btrfs#Mounting subvolumes.
This layout allows the snapper utility to take regular snapshots of /
, while at the same time making it easy to restore /
from an Arch Live CD if it becomes unbootable.
In this sceneario, after the initial setup, snapper needs no changes, and will work as expected.
@
, a snapshot of /
will not include it. Be sure to set up snapper for any additional subvolumes you want to keep snapshots of besides the one mounted at /
.Configuration of snapper and mount point
Make sure /.snapshots
is not mounted and does not exist as folder.
# umount /.snapshots # rm -r /.snapshots
Then #Create a new configuration for /
.
Now mount @snapshots
to /.snapshots
.
For example, for a file system located on /dev/sda1
:
# mount -o subvol=@snapshots /dev/sda1 /.snapshots
To make this mount permanent, add an entry to your fstab.
Or if you have an existing fstab entry remount the snapshot subvolume:
# mount -a
Give the folder 750
permissions.
This will make all snapshots that snapper creates be stored outside of the @
subvolume, so that @
can easily be replaced anytime without losing the snapper snapshots.
Restoring /
to a previous snapshot of @
If you ever want to restore /
using one of snapper's snapshots, first boot into a live Arch Linux USB/CD.
Mount the toplevel subvolume (subvolid=5). That is, omit any subvolid
mount flags.
Find the snapshot you want to recover in /mnt/@snapshots/*/info.xml
.
vi
to easily browse through each file:
# vi /mnt/@snapshots/*/info.xmlUse
:n
to see the next file and :rew
to go back to the first file.Browse through the <description>
tags and the <date>
tags, and when you find the snapshot you wish to restore, remember the <num>
number.
Now, move @
to another location (e.g. /@.broken
) to save a copy of the current system. Alternatively, simply delete @
using btrfs subvolume delete
.
Create a read-write snapshot of the read-only snapshot snapper took:
# btrfs subvol snapshot /mnt/@snapshots/#/snapshot /mnt/@
Where #
is the number of the snapper snapshot you wish to restore. Your /
has now been restore to the previous snapshot. Now just simply reboot.
Deleting files from snapshots
If you want to delete a specific file or folder from past snapshots without deleting the snapshots themselves, snapperS is a script that adds this functionality to Snapper. This script can also be used to manipulate past snapshots in a number of other ways that Snapper does not currently support.
If you want to remove a file without using an extra script, you just need to make your snapshot subvolume read-write, which you can do with:
# btrfs property set /path/to/.snapshots/<snapshot_num>/snapshot ro false
verify that ro=false:
# btrfs property get /path/to/.snapshots/<snapshot_num>/snapshot ro=false
You can now modify files in /path/to/.snapshots/<snapshot_num>/snapshot like normal. You can use a shell loop to work on your snapshots in bulk.
Preventing slowdowns
Keeping many of snapshots for a large timeframe on a busy filesystem like /
, where many system updates happen over time, can cause serious slowdowns. You can prevent it by:
- Creating subvolumes for things that are not worth being snapshotted, like
/var/cache/pacman/pkg
,/var/abs
,/var/tmp
, and/srv
. - Editing the default settings for hourly/daily/monthly/yearly snapshots when using #Automatic timeline snapshots.
updatedb
By default, updatedb
will also index the .snapshots
directory created by snapper, which can cause serious slowdown and excessive memory usage if you have many snapshots. You can prevent updatedb
from indexing over it by editing:
/etc/updatedb.conf
PRUNENAMES = ".snapshots"
Preserving log files
It's recommended to create a subvolume for /var/log
so that snapshots of /
exclude it. That way if a snapshot of /
is restored your log files will not also be reverted to the previous state. This make it easier to troubleshoot.
Cleanup based on disk usage
Troubleshooting
Snapper logs
Snapper writes all activity to /var/log/snapper.log
- check this file first if you think something goes wrong.
If you have issues with hourly/daily/weekly snapshots, the most common cause for this so far has been that the cronie service (or whatever cron daemon you are using) was not running.
IO error
If you get an 'IO Error' when trying to create a snapshot please make sure that the .snapshots directory associated to the subvolume you are trying to snapshot is a subvolume by itself.
Another possible cause is that .snapshots directory does not have root as an owner (You will find Btrfs.cc(openInfosDir):219 - .snapshots must have owner root
in the /var/log/snapper.log
).