Как сделать резервную копию на внешний раздел btrfs со снимками, если моя система работает на ext4?

Предполагая, что это не просто проблема с каким-то сторожевым устройством, вы можете попробовать перехватить цель kexecдля systemd. Обычно это используется для загрузки ядра kdump для дампа памяти, но вы действительно можете настроить эту цель для выполнения чего угодно.

Я создал модуль systemd с именем kexec-sleepи поместил его в /etc/systemd/system/kexec-sleep.service(. Я не уверен, что эти строки Requires/After/Beforeверны, но они работали у меня в виртуальном машина):

[Unit]
Description=Sleep forever at kexec
DefaultDependencies=no
Requires=umount.target
After=umount.target
Before=final.target

[Service]
Type=oneshot
ExecStart=/sbin/kexec-sleep
KillMode=none

[Install]
WantedBy=kexec.target

Это вызовет /sbin/kexec-sleep, который является просто сценарием оболочки (, показанным ниже ). Он пытается перемонтировать корневую файловую систему только для чтения -, поэтому она должна оставаться в чистом состоянии, пока устройство не выключится. У меня есть несколько sleeps, которые, вероятно, длиннее, чем вам нужно, плюс подсказка в конце, которая позволит вам перезагрузиться без необходимости тянуть шнур питания.

#!/bin/sh

stty sane < /dev/console       # enable automatic CRLF output on console
exec < /dev/console > /dev/console 2>&1  # redirect stdio to/from console
echo "Sleeping several seconds for processes to terminate..."
sleep 10
# kill some expected processes
killall dhclient
# sleep again...
sleep 5
echo "Processes still running:"
/bin/ps --ppid 2 -p 2 --deselect    # list non-kernel processes
echo "Attempting to remount root filesystem read-only..."
sync; sync; sync
mount -o remount,ro /
grep /dev/sda /proc/mounts
while true; do
    echo "System paused. Type 'reboot' to reboot"
    read -p '> ' entry
    if [ "$entry" = "reboot" ]; then
        /sbin/reboot -f
    fi
done

После создания этих файлов запустите chmod +x /sbin/kexec-sleepи systemctl enable kexec-sleep.

Чтобы вызвать это вместо обычного завершения работы, запустите systemctl kexec.

0
14.09.2020, 17:49
2 ответа

Настройка

При условии, что /media/myuser/btrbaksявляется точкой монтирования раздела btrfs, который находится на внешнем диске (подробности о разделах и монтировании см. в конце ), здесь команды, которые нужно запускать только в первый раз.

Создайте каталог для резервных копий:

sudo mkdir /media/myuser/btrbaks/BACKUPS

Создайте подтом @, который будет местом назначения команды rsync

sudo btrfs subvolume create /media/myuser/btrbaks/BACKUPS/@

Обычные команды резервного копирования

Здесь команды, которые нужно запускать для каждой резервной копии

Рсинхронизация:

sudo rsync -aAXv --delete --exclude=/dev/* --exclude=/proc/* --exclude=/sys/* --exclude=/tmp/* --exclude=/run/* --exclude=/mnt/* --exclude=/media/* --exclude="swapfile" --exclude="lost+found" --exclude=/home/* --exclude=/root/* / /media/myuser/btrbaks/BACKUPS/@/

Моментальный снимок Btrfs:

sudo btrfs subvolume snapshot /media/myuser/btrbaks/BACKUPS/@ /media/myuser/btrbaks/BACKUPS/@_bak_`date +%Y.%m.%d_%H.%M.%S`

Затем вы можете проверить:

sudo btrfs subvolume list /media/attilio/btrbaks/
ID 279 gen 109 top level 5 path BACKUPS/@
ID 280 gen 109 top level 5 path BACKUPS/@_bak_2020.09.14_08.12.2

Восстановление

Если ваша система загружается, вы можете восстановить ее с помощью:

sudo rsync -aAXv --dry-run --delete --exclude=/dev/* --exclude=/proc/* --exclude=/sys/* --exclude=/tmp/* --exclude=/run/* --exclude=/mnt/* --exclude=/media/* --exclude="swapfile" --exclude="lost+found" --exclude=/home/* --exclude=/root/* /media/attilio/btrbaks/BACKUPS/@/ /

Не забудьте удалить параметр --dry-run, чтобы выполнить реальное восстановление.

Поскольку @указывает на вашу последнюю резервную копию, вы можете изменить ее с помощью @_bak_2020.09.14_08.12.22или любого другого снимка.

Если ваша система не загружается, вы можете загрузиться с живого USB и выполнить ту же команду, изменив rsync <source>и<destination>

Примечание по разделам и монтированию

Это конфигурация моего оборудования:

/dev/sda5   ext4    /                       # system installation
/dev/sdb3   btrfs   /media/myuser/btrbaks   # external drive has several partitions, one is btrfs and here is the mount point that is automatically assigned by linux mint
2
18.03.2021, 23:04

Вы также можете конвертировать ext4 в btrfs без переустановки. Снапшоты и живая система теперь используют один и тот же раздел.

  • Преимущества :Быстрее и требуется меньше места на диске
  • Недостаток :Когда диск выходит из строя, вы также теряете снимки. Этому можно противодействовать либо :
    • Сочетание обоих методов. (Использование моментальных снимков btrfs со сдвигом во времени и использование rsync для перемещения выбранных моментальных снимков на другой диск)
    • Использование RAID (Сама btrfs может использоваться для RAID, хотя обычные методы также применимы в равной степени)

Преобразование включает несколько шагов:
Примечание.:Сначала протестируйте его на виртуальной машине. Я еще не делал и мог что-то забыть.

  1. Загрузка с работающего USB-накопителя -(например. тот, который вы использовали для установки Mint )и получения прав root в новом терминале с помощьюsudo -i
  2. Преобразуйте ваш ext4 в btrfs :btrfs-convert /dev/sda1(, предполагая, что /dev/sda1является вашим разделом)
  3. Установите его, чтобы начать «работать»:mount /dev/sda1 /mnt
  4. Убедитесь, что корневая файловая система находится в подтоме с именем@:btrfs sub snap /mnt /mnt/@
  5. Создайте отдельный для вашего дома -каталоги:btrfs sub create /mnt/@home && rsync -HAXav /mnt/home/ /mnt/@/home/
  6. Найдите UUID вашего раздела:ls -l /dev/disk/by-uuid | grep sda1
  7. Заменить линию, соединяющую /в /mnt/@/etc/fstab, на 2 линии:
    UUID=xxxxxxxx-xxxx-xxxx-xxxxxxxx / btrfs defaults,subvol=@ 0 1
    UUID=xxxxxxxx-xxxx-xxxx-xxxxxxxx /home btrfs defaults,subvol=@home 0 2

и замените(xxxxxxxx-xxxx-xxxx-xxxxxxxxсвоим реальнымUUID).

  1. В том же файле удалите строку, в которой упоминается своп
  2. Измените первую строку, содержащую linuxв /mnt/boot/grub/grub.cfg, на
    linux /@/boot/vmlinuz-YYYY root=UUID=XXXX ro rootflags=subvol=@ YYYYв качестве версии ядра, которая у нее была изначально, и XXXXсноваUUID)и запуститеcp /mnt/boot/grub/grub.cfg /mnt/@/boot/grub/grub.cfg
  3. Перезагрузите систему и продолжите работу с правами root:sudo -i
  4. Хранить только данные в вашем @и вашем @homeподтомах:mkdir /mnt/fullbtrfs && mount /dev/sda1 /mnt/fullbtrfs && rm -rf /mnt/fullbtrfs/[a-z]* && umount /mnt/fullbtrfs
  5. Исправьте остальную часть конфигурации grub (пару шагов назад мы сделали только самое необходимое):update-grub
  6. Перезагрузитесь еще раз и измените конфигурацию timeshift на btrfs
0
26.11.2021, 06:53

Теги

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