Как я могу автоматически создать снимок Btrfs перед обновлением моей системы?

Я установил Ubuntu 20.04 на корневой раздел Btrfs для его функциональности снимка.

сделай это как можно проще, Я хотел бы интегрировать создание снимка Btrfs в мою команду upgrade -alias, которая в настоящее время выглядит следующим образом:

update sudo apt && sudo apt upgrade -y && sudo flatpak update -y && sudo Обновление моментальных снимков

Как лучше всего добавить моментальный снимок перед обновлениями, чтобы можно было выполнить откат, если что-то пойдет не так?

Есть ли возможность удалить более старые моментальные снимки одновременно? (Мой корневой раздел заполнен менее чем на 10%, поэтому я могу скопировать всю свою систему несколько раз, но я полагаю, он будет быстро заполняться еженедельными обновлениями?)

5
задан 5 May 2020 в 13:36

4 ответа

Довольно просто сделать снимок в 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 .

1
ответ дан 19 June 2020 в 21:43

Вы можете легко сделать это с помощью этого сценария оболочки.

Создать сценарий оболочки с этим содержимым:

# 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_ в каталоге, в котором будет сохранен снимок резервной копии. Это приведет к его удалению при запуске скрипта. Также снимок не будет включать файлы из других снимков, подразделов и смонтированных разделов.

0
ответ дан 19 June 2020 в 21:43

У меня есть несколько идей для вас. Выбирайте, выбирайте и объединяйте.

  1. Специально разработанное, готовое к использованию программное обеспечение, например apt-btrfs-snapshot или etckeeper , которое делает это автоматически за кулисами. Вероятно, это лучший путь в будущем.
  2. Чтобы скопировать пользовательскую версию вышеупомянутых пакетов, вы подключаете apt для запуска скрипта после каждого обновления. Вышеупомянутые пакеты, конечно, могут помочь вам узнать о наилучшей практике, как это делается, и пример сложного сценария был дан в другой ответ . Но это может быть что-то такое же простое, как sub-snapshot btrfs -r / mnt / btrfsroot / @ / / mnt / btrfsroot / snapshots / root - $ (date +% y% m% d) . 12135] В любом случае, когда есть такие хуки для apt / dpkg, там нет ни одного снимка , и я не уверен насчет остальных. Но это не должно быть проблемой, так как вы сначала запускаете apt в соответствии со своим вопросом.
  3. У вас будет много снимков, поэтому вам также понадобится способ вручную или автоматически удалить устаревшие снимки. Чтобы дать вам представление о том, как это можно сделать, при условии, что ваши автоматические снимки имеют следующие пути / 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?

1
ответ дан 19 June 2020 в 21:43

Я бы использовал хороший сценарий Игнасио Нуньеса Эрнанца :

#!/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.

1
ответ дан 19 June 2020 в 21:43

Другие вопросы по тегам:

Похожие вопросы: