Btrfs перенос, восстановление
Перенос на раздел
pacman -S rsync btrfs-progs arch-install-scripts
lsblk
- подсветить все разделы что бы определиться что монтировать.
При необходимости разбить диск, флаг -z
обнулить таблицу разделов.
cfdisk -z /dev/sda
Монтируем.
mount /dev/sda6 /mnt
Создадим три подтома root, домашний каталог пользователя и подтом для хранения.
btrfs subvolume create /mnt/@_root
btrfs subvolume create /mnt/@_home
btrfs subvolume create /mnt/@_snapshots
btrfs subvolume list /mnt
Для переноса смонтируйте резервную систему и перенесите ее.
mkdir /mnt/dump
mount /dev/sdb1 /mnt/dump
rsync -cauvP --delete --delete-excluded --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/var/lib/pacman/sync/*","/var/cache/*","/var/tmp/*","/boot/*","/home/*"} /mnt/dump/@/* /mnt/@_root/
rsync -cauvP --delete --delete-excluded --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/var/lib/pacman/sync/*","/var/cache/*","/var/tmp/*","/boot/*","/home/*"} /mnt/dump/@home/* /mnt/@_home/
И отмонтируем корень ФС.
umount /mnt
rm -rf /mnt/dump
Чтобы монтировать подтом подобно обычному разделу диска, команде mount нужно указывать опцию subvol=PATH. PATH - путь относительно корня ФС. Монтируем корень. Сжатие zstd, или lzo.
mount -o subvol=@,compress=zstd /dev/sda6 /mnt
Какие рекомендуемые варианты для установки на SD-карту, или медленный SSD-накопитель? В /etc/fstab
См. https://wiki.debian.org/Btrfs.
/dev/sdaX / btrfs x-systemd.device-timeout=0,noatime,compress=lzo,commit=0,ssd_spread,autodefrag 0 0
UUID=<the_device_uuid> /mount/point/ btrfs noauto,compress=lzo,noatime,autodefrag 0 0
Создаём директорию и монтируем в неё наш будущий каталог пользователей, если boot раздел отдеольно, нужно его тоже смонтироват в /mnt/boot
.
Если нужно mkdir /mnt/home
.
mount -o subvol=@home,compress=zstd /dev/sda6 /mnt/home
Если нужно mkdir /mnt/snapshots
.
mount -o subvol=@snapshots,compress=zstd /dev/sda6 /mnt/snapshots
mount -t proc none /mnt/proc
mount -t sysfs none /mnt/sys
mount -o bind /dev /mnt/dev
cp -L /etc/resolv.conf /mnt/etc
swapon /dev/sda3
Начиная с ядра 5.0 можно создать swap-файл, swap-файл должен располагаться целиком на одном устройстве, создаваться с отключенным COW и сжатием.
truncate -s 0 /swapfile
chattr +C /swapfile
btrfs property set /swapfile compression none
fallocate /swapfile -l4g
chmod 600 /swapfile
mkswap /swapfile
lsattr /swapfile
swapon /swapfile
Теперь нужно проинициализировать систему. Редактируем FSTAB, или запускаем genfstab.
rm /mnt/etc/fstab
genfstab -pU /mnt > /mnt/etc/fstab
Переходим в нашу новую систему.
chroot /mnt /bin/bash
Генерация initramfs с помощью mkinicpio.
mkinitcpio -p linux
Установить загрузчик GRUB2 и сконфигурировать его.
grub-install /dev/sdХ
grub-mkconfig -o /boot/grub/grub.cfg
exit
или “Ctrl + D” выйти из chroot.
Теперь нужно все размонтировать.
umount /mnt/home
umount /mnt/snapshots
umount /mnt
reeboot
Снапшот на другой раздел
Монтируем основной раздел.
mkdir /mnt/arch
mount /dev/sda6 /mnt/arch
Монтируем раздел/диск для сброса снапшота.
mkdir /mnt/dump
mount /dev/sda8 /mnt/dump
Нужно создавать снапшоты, только для чтения(readonly), требует send
. Для отправки на другие узлы.
Сбрасываем все из кэша на диск
sync
, ВАЖНО.
btrfs subvolume snapshot -r /mnt/arch/@ /mnt/arch/@_BACKUP
sync
btrfs subvolume snapshot -r /mnt/arch/@home /mnt/arch/@home_BACKUP
sync
Переносим снапшоты. Можно send в файл btrfs send /mnt/arch/@_BACKUP -f /dump.sn
, receive из файла btrfs receive /mnt/dump/ -f /dump.sn
.
btrfs send /mnt/arch/@_BACKUP | btrfs receive /mnt/dump/
btrfs send /mnt/arch/@home_BACKUP | btrfs receive /mnt/dump/
Инкрементальные readonly снимки.
btrfs subvolume snapshot -r /mnt/arch/@ /mnt/arch/@_BACKUP_new
sync
btrfs subvolume snapshot -r /mnt/arch/@home /mnt/arch/@home_BACKUP_new
sync
Создаём разность между снимками.
btrfs send -p /mnt/arch/@_BACKUP /mnt/arch/@_BACKUP_new | btrfs receive /mnt/dump/
btrfs send -p /mnt/arch/@home_BACKUP /mnt/arch/@home_BACKUP_new | btrfs receive /mnt/dump/
Просмотрим листинг.
btrfs subvolume list /mnt/dump
Отправка по ssh
Локально: генерируем ключи, создаём ~/.ssh/config
.
# генерация пары ключий, публичный(отправляем на сервер)
# id_rsa.pub
ssh-keygen -t rsa -b 4096 -C "lol@gmail.com"
# nano ~/.ssh/config
Host office
HostName 192.168.100.51
Port 22
User test
PasswordAuthentication yes # на сервере /etc/ssh/sshd_config
systemctl restart sshd
ssh-copy-id -i ~/.ssh/id_rsa.pub office # отправка ключа на сервер
# на сервере /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no # отключим доступ по паролю, всем.
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
systemctl restart sshd
systemctl enable sshd
btrfs send /mnt/arch/@_BACKUP | ssh office "btrfs receive /mnt/backups"
# или
btrfs send /mnt/arch/@_BACKUP | ssh -p 22 test@192.168.100.51 "btrfs receive /mnt/backups"
Пример скрипта - инкрементальный, взято с (ubuntu.ru/wiki).
#!/bin/bash
# точки монтирования
src=$(mktemp -d "${TMPDIR:-/tmp/}$(basename 0).XXXXXXXXXXXX")
dst=$(mktemp -d "${TMPDIR:-/tmp/}$(basename 0).XXXXXXXXXXXX")
#монтируем
mount /dev/sda2 $src
mount /dev/sdb2 $dst
if [ -e $src/root_BCKP ]
then # первый запуск полный бекап
# Создаем снимок read-only
btrfs subvolume snapshot -r $src/@ $src/root_BCKP
sync
# переносим
btrfs send $src/root_BCKP | btrfs receive $dst/
else # повторный запуск, инкрементальный
# Переименовываем
mv $src/root_BCKP $src/root_BCKP_prev
mv $dst/root_BCKP $dst/root_BCKP_prev
# Создаем текущий
btrfs subvolume snapshot -r $src/@ $src/root_BACKUP
sync
# инкрементальный бекап
btrfs send -p $src/root_BCKP_prev $src/root_BACKUP | btrfs receive $dst/
fi
# В $dst/root_BACKUP копия корня.
umount $src
umount $dst
# Удаляем точки монтирования
rmdir $src
rmdir $dst
Всё это работает и в обратном порядке.
Удаляем или переименовываем mv
.
btrfs subvolume delete /mnt/dump/@_BACKUP
btrfs subvolume delete /mnt/dump/@home_BACKUP
Переименовываем новые snapshot(ы).
mv /mnt/dump/@_BACKUP_new /mnt/dump/@
mv /mnt/dump/@home_BACKUP_new /mnt/dump/@home
Свойства. Сейчас они в ro - read-only(только чтение), изменим на rw - read-write(чтение-завись). Значения изменяются так:
ro true
,ro false
.
btrfs property get /mnt/dump/@ # посмотр свойств
btrfs property set /mnt/dump/@ ro false
btrfs property set /mnt/dump/@home ro false
btrfs subvolume show /mnt/dump/@ # информация
Удаляем, если нужно.
btrfs subvolume delete /mnt/arch/@_BACKUP
btrfs subvolume delete /mnt/arch/@home_BACKUP
Отмонтируем.
umount /mnt/arch
umount /mnt/dump
rmdir /mnt/{arch,dump}
Восстановление
Восстановление, как и выше, грузимся с live-usb, или с другой системы. Монтируем раздел для восстановления, поврежденный и раздел с backup, восстанавливаем снапшоты.
Монтируем файловую систему, для пересоздания fstab и инициализации.
mount -o subvol=@,compress=zstd /dev/sda8 /mnt
ls /mnt
mount -o subvol=@home,compress=zstd /dev/sda8 /mnt/home
Если boot раздел отдеольно, то нужно его тоже смонтироват в /mnt/boot и все другие subvolume.
mount /dev/sda2 /mnt/boot
mount -t proc none /mnt/proc
mount -t sysfs none /mnt/sys
mount -o bind /dev /mnt/dev
cp -L /etc/resolv.conf /mnt/etc
swapon /dev/sda3
Редактируем FSTAB, или запускаем genfstab.
rm /mnt/etc/fstab
genfstab -pU /mnt > /mnt/etc/fstab
nano /mnt/etc/fstab
Переходим в нашу новую систему.
chroot /mnt
Или zsh.
chroot /mnt /bin/zsh
Перегенерироваь.
mkinitcpio -p linux
Установить загрузчик GRUB2 и сконфигурировать его.
grub-install /dev/sdХ
grub-mkconfig -o /boot/grub/grub.cfg
Инициализируем ключи и обновим, если требуется.
pacman-key --init && pacman-key --populate && pacman-key --refresh-keys && pacman -Syy
exit
или “Ctrl + D” выйти из chroot.
Теперь нужно все размонтировать.
umount -R /mnt
reeboot
Больше разжёвано на ubuntu.ru/wiki.