Я установил Ubuntu 20.04 на корневой раздел Btrfs для его функциональности снимка.
сделай это как можно проще, Я хотел бы интегрировать создание снимка Btrfs в мою команду upgrade
-alias, которая в настоящее время выглядит следующим образом:
update sudo apt && sudo apt upgrade -y && sudo flatpak update -y && sudo Обновление моментальных снимков
Как лучше всего добавить моментальный снимок перед обновлениями, чтобы можно было выполнить откат, если что-то пойдет не так?
Есть ли возможность удалить более старые моментальные снимки одновременно? (Мой корневой раздел заполнен менее чем на 10%, поэтому я могу скопировать всю свою систему несколько раз, но я полагаю, он будет быстро заполняться еженедельными обновлениями?)
Довольно просто сделать снимок в btrfs
.
Сначала смонтируйте ваш раздел содержащий файловую систему btrfs
, например, / mnt
. Мы предполагаем, что это / dev / sda1
.
sudo mount /dev/sda1 /mnt
cd /mnt
Если у вас установлена стандартная Ubuntu с /
в @
и / home
] в @home
, при запуске ls
будут отображаться два элемента: @
и @home
.
Также, если вы ранее создавали снимки они также будут показаны там.
Чтобы создать снимки ваших /
и / home
, выполните команду:
sudo btrfs sub snap @ @-BACKUP && sudo btrfs sub snap @home @home-BACKUP
Если вы хотите удалить существующие резервные копии перед созданием новая команда будет:
sudo btrfs sub del @-BACKUP && sudo btrfs sub del @home-BACKUP
Так просто.
После того, как вы закончите с этим, размонтируйте ваш раздел из / mnt
следующим образом:
sudo umount /mnt
Кроме того, я могу добавить, что вы можете создавать снимки с отметкой времени или делать инкрементные резервные копии. Но это немного выходит за рамки вопроса.
Вы можете объединить эти команды в текстовый файл, например backup.sh
.
Пример:
#!/bin/sh
mount /dev/sda1 /mnt
cd /mnt
[ -d @-BACKUP ] && sudo btrfs sub del @-BACKUP #Checks is backup exists and deletes it
[ -d @home-BACKUP ] && sudo btrfs sub del @home-BACKUP
btrfs sub snap @ @-BACKUP
btrfs sub snap @home @home-BACKUP
cd /
umount /mnt
Сценарий должен запускаться с Sudo
.
Вы можете легко сделать это с помощью этого сценария оболочки.
Создать сценарий оболочки с этим содержимым:
# Directory for saving snapshots
SNAPDIR=/snapshots
export SNAPDIR
# Delete snapshots
sudo btrfs subvolume delete /mnt/btrfs/backup_*
# Ask user for the name of snapshot
echo -n "What will be the name of snapshot? "
read SNAPNAME
# Create the snapshot
sudo btrfs subvolume snapshot /mnt/btrfs/ $SNAPDIR/backup_$SNAPNAME
# Check if the snapshot created successfully, if not then exit
if [ $? -ne 0 ]
then
echo "Failed to create snapshot"
exit 1
fi
# Commands to execute after creating snapshot
sudo apt update && sudo apt upgrade -y && sudo flatpak update -y && sudo snap refresh
После создания файла замените / snapshots на нужный вам каталог моментальных снимков, в который будут сохраняться снимки. Затем поместите его куда угодно.
Теперь сделайте его исполняемым, выполнив:
chmod +x /path/to/shell/script.sh
Теперь измените команду для своего псевдонима обновления, чтобы он указывал на сценарий.
Теперь при запуске вашего псевдонима сначала будут удалены снимки с backup_
. ], затем будет сделан снимок сохраненной файловой системы с именем, начинающимся с backup_
.
Обратите внимание, что при первом запуске может отображаться ошибка. Но игнорируйте его, как при первом запуске, резервной копии нет, поэтому удалять нечего. Также не надо Создайте вложенные тома или снимок с именем, начинающимся с backup_
в каталоге, в котором будет сохранен снимок резервной копии. Это приведет к его удалению при запуске скрипта. Также снимок не будет включать файлы из других снимков, подразделов и смонтированных разделов.
У меня есть несколько идей для вас. Выбирайте, выбирайте и объединяйте.
sub-snapshot btrfs -r / mnt / btrfsroot / @ / / mnt / btrfsroot / snapshots / root - $ (date +% y% m% d)
. 12135] В любом случае, когда есть такие хуки для apt / dpkg, там нет ни одного снимка , и я не уверен насчет остальных. Но это не должно быть проблемой, так как вы сначала запускаете apt в соответствии со своим вопросом. / mnt / btrfsroot / snapshots / @ * - apthook-YYMMDDHH
, тогда вы, например, будете запускать cronjob для каждого 12-го числа месяц как 34 03 12 * * btrfs sub delete / mnt / btrfsroot / snapshots / @ * - apthook - $ (date --date = '15 days ago '+ \% y \% m) *
, Обратитесь к справочным страницам для man 5 crontab
и man date
для получения дополнительной информации. Я надеюсь, что это поможет вам двигаться в правильном направлении. Очередной раз, Я бы предложил просто перейти с apt-btrfs-snapshot
и покончить с этим. Обратите внимание, что на данный момент apt-btrfs-snapshot
предполагает , что ваш корневой раздел называется @
. Это значение по умолчанию для Ubuntu и ряда других дистрибутивов.
Не стесняйтесь задавать дополнительные вопросы в случае, если что-то неясно.
PS: Вы понимаете разницу между /
( корень вашей работающей системы) и btrfs-root?
Я бы использовал хороший сценарий Игнасио Нуньеса Эрнанца :
#!/bin/bash
#
# Script that creates BTRFS snapshots, manually or from cron
#
# Usage:
# sudo btrfs-snp <dir> (<tag>) (<limit>) (<seconds>) (<destdir>)
#
# Copyleft 2017 by Ignacio Nunez Hernanz <nacho _a_t_ ownyourbits _d_o_t_ com>
# GPL licensed (see end of file) * Use at your own risk!
#
# Based on btrfs-snap by Birger Monsen
#
# More at https://ownyourbits.com
#
function btrfs-snp()
{
local BIN="${0##*/}"
local DIR="${1}"
local TAG="${2:-snapshot}"
local LIMIT="${3:-0}"
local TIME="${4:-0}"
local DST="${5:-.snapshots}"
## usage
[[ "$*" == "" ]] || [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]] && {
echo "Usage: $BIN <dir> (<tag>) (<limit>) (<seconds>) (<destdir>)
dir │ create snapshot of <dir>
tag │ name the snapshot <tag>_<timestamp>
limit │ keep <limit> snapshots with this tag. 0 to disable
seconds │ don't create snapshots before <seconds> have passed from last with this tag. 0 to disable
destdir │ store snapshot in <destdir>, relative to <dir>
Cron example: Hourly snapshot for one day, daily for one week, weekly for one month, and monthly for one year.
cat > /etc/cron.hourly/$BIN <<EOF
#!/bin/bash
/usr/local/sbin/$BIN /home hourly 24 3600
/usr/local/sbin/$BIN /home daily 7 86400
/usr/local/sbin/$BIN /home weekly 4 604800
/usr/local/sbin/$BIN / weekly 4 604800
/usr/local/sbin/$BIN /home monthly 12 2592000
EOF
chmod +x /etc/cron.hourly/$BIN"
return 0
}
## checks
local SNAPSHOT=${TAG}_$( date +%F_%H%M%S )
[[ ${EUID} -ne 0 ]] && { echo "Must be run as root. Try 'sudo $BIN'" ; return 1; }
[[ -d "$SNAPSHOT" ]] && { echo "$SNAPSHOT already exists" ; return 1; }
mount -t btrfs | cut -d' ' -f3 | grep -q "^${DIR}$" || {
btrfs subvolume show "$DIR" | grep -q "${DIR}$" || {
echo "$DIR is not a BTRFS mountpoint or snapshot"
return 1
}
}
DST="$DIR/$DST"
mkdir -p "$DST"
local SNAPS=( $( btrfs subvolume list -s --sort=gen "$DST" | awk '{ print $14 }' | grep "${TAG}_" ) )
## check time of the last snapshot for this tag
[[ "$TIME" != 0 ]] && [[ "${#SNAPS[@]}" != 0 ]] && {
local LATEST=$( sed -r "s|.*_(.*_.*)|\\1|;s|_([0-9]{2})([0-9]{2})([0-9]{2})| \\1:\\2:\\3|" <<< "${SNAPS[-1]}" )
LATEST=$( date +%s -d "$LATEST" ) || return 1
[[ $(( LATEST + TIME )) -gt $( date +%s ) ]] && { echo "No new snapshot needed for $TAG"; return 0; }
}
## do it
btrfs subvolume snapshot -r "$DIR" "$DST/$SNAPSHOT" || return 1
## prune older backups
[[ "$LIMIT" != 0 ]] && \
[[ ${#SNAPS[@]} -ge $LIMIT ]] && \
echo "Pruning old snapshots..." && \
for (( i=0; i <= $(( ${#SNAPS[@]} - LIMIT )); i++ )); do
btrfs subvolume delete "$DIR/${SNAPS[$i]}"
done
echo "snapshot $SNAPSHOT generated"
}
btrfs-snp "$@"
# License
#
# This script is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This script is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this script; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
# Boston, MA 02111-1307 USA
Соответствующая информация об использовании:
# btrfs-snp
Usage: btrfs-snp <dir> (<tag>) (<limit>) (<seconds>) (<destdir>)
dir │ create snapshot of <dir>
tag │ name the snapshot <tag>_<timestamp>
limit │ keep <limit> snapshots with this tag. 0 to disable
seconds │ don't create snapshots before <seconds> have passed from last with this tag. 0 to disable
destdir │ store snapshot in <destdir>, relative to <dir>
Ваш псевдоним обновления будет должен выглядеть так:
btrfs-snp / syschanges 3 600 && ...
, который создает снимок с тегом syschanges в /. snapshonges
, но не если он уже был за последние 5 минут, и сохраняет максимум 3 из них.
Это дает вам 5-минутное окно для выполнения повторных операций без загромождения, например, если вы хотите выполнить установку из разных репозиториев или ppas за один шаг установки, а не только для обновлений.
Затем вы можете использовать и восстанавливать эти снимки в соответствии с рекомендациями btrfs.