понедельник, 11 августа 2014 г.

The btrfs filesystem backup for roll back


Т. к. я смотрю, что pacman не имеет отката, подобного yum undo, надо что-то придумать, используя btrfs и др.

Какие есть варианты?

1) НА ДРУГОЙ РАЗДЕЛ
Если делать backup на другой раздел, то в любом случае придется копировать данные, например с помодью rsync.

    rsync -aix --delete /home /home-backup
    btrfs subvolume snapshot /home-backup /home-backup/ss/`date +%y-%m-%d_%H-%M`


2) НА ЭТОТ ЖЕ РАЗДЕЛ
Если делать backup в этот же раздел, то испоользовать snapshots.

2.1) BY SUBVOLUMES WITHOUT ROOT Если делать snapshot не /, то просто создавать subvolume, затем с него snapshot, при откате subvolume удалить, snapshot подставить вместо subvolume.
Недостаток в том, что subvolume может же использоваться, для / такой вариант не подойдёт.

btrfs sub snap -r fs snapshot
... do things on fs
btrfs sub del fs
btrfs sub snap snapshot fs
btrfs sub del snapshot


2.2) ROOT
Если делать snapshot /, то из-за того что / имеет sublolid=0, надо как-то выкручиваться.
The root volume has a subvolume ID of zero, so mounting with subvolid=0 will mount the root.
Хотя, когда я сделал snapshot'у / set-default, и когда после перезагрузки система грузилась с него как с /, то в инфо по subvolume выдавало, что родительский subvolid=5 (а не 0), и когда я сделал set-default 5, то благополучно вернул на /.
Вот что попалось:
In Ubuntu 11.04 and later, the installer sets up btrfs with a specific layout:
The default subvolume to mount is always the top of the btrfs tree (subvolid=5).


2.2.1) ROOT AS SUBVOLUME (начиналось всё как надо, и схема, и snapshot, а закончилось восстановлением не root)
Изначально создавать / как subvolume, и далее делать как в п. 2.1).
Но это не решает проблему п. 2.1) - когда subvolume используется.
Т. е. для home, www и др. можно остановить службы, заставить выйти пользователей, и восстановить.
Но в случае с / такой вариант не пройдет: если система грузится с subvolume, то удалить его и подставить snapshot без перезагрузки, наверное, неправильно или, возможно, вообще не получится.

Filesystem layout:

/
 `--- root             * default subvolume
 |       `--- bin
 |       `--- etc
 |       `--- usr
 |            ...
 `--- root_snapshot_2011_01_09
 |       `--- bin
 |       `--- etc
 |       `--- usr
 |       `--- ...
 `--- root_snapshot_2011_01_10
 |       ...
 `--- home
 |       ...
 `--- home_snapshot_A
         ...


/etc/fstab:

+ Что это за параметр LABEL=btr_pool?
Run lsblk -f to list the partitions, and prefix the values in the LABEL column with LABEL=:

# Это на схеме root, не /? Неясно. И почему не указан параметр subvol=root тогда?
LABEL=btr_pool      /                btrfs   defaults                     0 0
# Subvolume home
LABEL=btr_pool      /home            btrfs   defaults,subvol=home         0 0
# Указываем, что это верхний уровень и не монтируем его, а будем монитовать когда надо будет работать с subvolumes и snapshots
# У себя назову /subvolumes, а не /media/btrfs
LABEL=btr_pool      /media/btrfs     btrfs   defaults,noauto,subvolid=0   0 0


Creating a snapshot:

# Монтируем верхний уровень
# mount /media/btrfs
# cd /media/btrfs
# Делается snapshot subvolume root
# btrfs subvolume snapshot root root_snapshot_2011_01_11
# cd ~
# umount /media/btrfs


Rolling back a snapshot:

# mount /media/btrfs
# umount /home
# Монтируем на размонтированный /home snapshot home_snapshot_A
# mount -o defaults,subvol=home_snapshot_A /dev/sda /home
# Удаляем размонтированный subvolume home
# btrfs subvolume delete /media/btrfs/home                 
# optional; this is so the /etc/fstab need not change - опционально, например, так не надо менять fstab
# Можно делать не mv, а создать snapshot со snapshot'а как указано в п. 2.1)
# mv /media/btrfs/home_snapshot_A /media/btrfs/home        
# umount /media/btrfs


2.2.2) ROOT WITH SUBVOLID=0
Восстанавливать / со snapshot'а, используя rsync.


2.2.2.1) Редактировать grub.conf. Use the kernel command line parameters in the bootloader configuration files.
В этом варианте / имеет subvolumeid=0 (т. е. / не subvolume).

Редактируем grub.conf:
linux /kernel-x86_64-2.6.39-gentoo root=/dev/sda2 rootflags=subvol=before-updating-2011-05-24
or
linux /kernel-x86_64-2.6.39-gentoo root=/dev/sda2 rootflags=subvolid=256

Перегружаемся.

Далее, монтируем / на /mnt:
mount -o subvolid=0 /mnt

Делаем откат (синхронизируем со shapshot, с которого сейчас загрузились):
rsync --progress -aHAX --exclude=/proc --exclude=/dev --exclude=/sys --exclude=/mnt / /mnt

Возвращаем boot.conf, перегружаемся, если надо, удаляем snapshot.

2.2.2.2) Командами btrfs. Fiddle with the default subvolume numbers.

Аналогично п. 2.2.2.1), только вместо редактирования grub.conf выполнять:
btrfs subvolume set-default 256 /
и после синхронизации:
btrfs subvolume set-default 0 /mnt



3) ИТОГ. ЧТО Я ВЫБРАЛ И НА ЧЁМ ОСТАНОВИЛСЯ

3.1) Во время установки системы создаю раздел с btrfs, монтирую на /mnt, создаю /mnt/subvolumes

3.2) В /mnt/subvolumes создаю subvolume root, который монтирую на /mnt2 и уже на него выполняю pacstrap /mnt2 base.

3.3) Установка Grub, формируя конфиг, определяет и указывает в grub.cfg, что грузиться надо с subvol=root.

3.4) Если надо сделать snapshot всей системы.
Монтирую: mount -o defaults,subvolid=0 /dev/sda6 /subvolumes (позже я добавил это монтирование в fstab с параметром noauto).
Создаю инфо-файл,описывающий snapshot: touch /_root_after_install_xorg_mate.txt.
Создаю в /subvolumes snapshot системы: btrfs sub snap root root_after_install_xorg_mate.
Удаляю инфо-файл: rm /_root_after_install_xorg_mate.txt.
Учитывая btrfs технологию COW, можно делать столько snapshot'ов, сколько надо - на дисковом пространстве это не сказывается.
Переназначить default subvolume на любой snapshot, чтобы можно было удалять subvolume root.

3.5) Если надо сделать roll back.
Меняю в grub.cfg subvol=root на subvolid=ID, где ID - номер необходимого snapshota'а, например subvolid=262.
Перегружаюсь, загружается указанный snapshot. В grub.cfg опять subvol=root, но это и хорошо, так и надо.
Монтирую /subvolume.
Переношу (если не сделал в п. 3.4) btrfs sub set-default на любой snapshot, в моем случае это ни на что не влияет.
Удаляю subvolume root (процесс удаления выполняется в background'е).
Создаю snapshot root со snapshot'а, с которого загружался.
Перегружаюсь. Откат выполнен.
Все довольно просто и быстро: редактирование grub.cfg, перезагрузка, удаление и создание root, перезагрузка.



ИСТОЧНИКИ:проработанные
https://btrfs.wiki.kernel.org/index.php/Main_Page
https://btrfs.wiki.kernel.org/index.php/Incremental_Backup
https://lwn.net/Articles/579009/
https://btrfs.wiki.kernel.org/index.php/SysadminGuide
http://www.funtoo.org/BTRFS_Fun#Using_snapshots_for_system_recovery_.28aka_Back_to_the_Future.29
еще нет
https://btrfs.wiki.kernel.org/index.php/UseCases#How_can_I_use_btrfs_for_backups.2Ftime-machine.3F
https://wiki.archlinux.org/index.php/Btrfs_-_Tips_and_tricks


TODO

- Почитать на Arch Wiki что рекомендуют в разделе "После инсталляции", список программ и т. д.

+ Просмотреть WM и DE
Понравился gala-wm, откомпилировал его с AUR, но так и не запустил - wiki по нему нет.
Зато по MATE замечательное wiki, его и поставил: mate, mate-extra, mate-netbook, xf86-intel-semantics.

+ Сравнить web-browsers.
Midori легче всех, но он еще сыроват, не нашел синхронизацию и как убрать строку статуса.
Firefox и Chromium, показалось, что второй прожорливее.

+ Посмотреть btrfs-image.
All data will be zeroed, but metadata and the like is preserved. Как это понимать? Что это за образ без данных.

+ Посмотреть btrfs send/receive.
Это находит/применяет изменения для everyday inc backup, когда есть full backup.

+ Поискать, почему пишет, что родительский subvolid равен 5, а должен быть 0.
Использовал и 0 и 5, вроде бы работает.

- Разобраться как увеличивать/уменьшать разделы с btrfs. Сравнить с LVM, где аналог группы, тома?
Btrfs изменяет раздел ФС, а манипуляция разделами производится с помощью, скажем, Gparted?

- Какими командами контролировать место раздела с btrfs и subvolumes?

- Создать еще один раздел с btrfs, добавить к root, сбалансировать, т. е. сделать своего рода программный рейд.

- Попробовать сжатие и шифрование btrfs.

2 комментария:

  1. 1) After pacman -Syu

    starting version 217
    hwdb.bin does not exist, please run udevadm hwdb --update
    Scanning for Btrfs filesystems
    failed to open /dev/btrfs-control skipping device registration: No such file or directory
    ERROR: error -2 while registering
    /sbin/fsck.btrfs: BTRFS file system.
    [ 3.497013] BTRFS: open_ctree failed
    mount: wrong fs type, bad option, bad superblock on /dev/sda6,
    missing codepage or helper program, or other error

    In some cases useful info is found in syslog - try
    dmesg | tail or so.
    You are now being dropped into an emergancy shell.
    sh: can't access tty; job control turned off
    [rootfs /]#

    # ls /root (empty)

    2) Need to mount the top level filesystem (sda6 and sda7 are united in one raid0 btrfs volume)

    # mount -o subvolid=0 /dev/sda6 /root (or sda7)

    If successfull goto 4).

    3) If the mount of filesystem return error

    # mount -o subvolid=0 /dev/sda6 /root
    [ 939.823478] BTRFS: open_ctree failed
    mount: wrong fs type, bad option, bad superblock on /dev/sda6,
    missing codepage or helper program, or other error

    In some cases useful info is found in syslog - try
    dmesg | tail or so.

    # btrfsck /dev/sda6 (and sda7)

    And repeat 2).

    4) Roll back

    # cd /root
    # ls
    root root_14-10-25_11-42 root_after_installation
    # btrfs sub del root
    Transaction commit: none (default)
    Delete subvolume '/root/root'
    # ls
    root_14-10-25_11-42 root_after_installation
    # btrfs sub snap root_14-10-25_11-42/ root
    Create a snapshot of 'root_14-10-25_11-42/' in './root'
    # ls
    root root_14-10-25_11-42 root_after_installation

    5) Umount and reboot

    # cd /
    # umount /root
    Ctrl+Alt+Del

    ОтветитьУдалить
  2. # mount /subvolumes
    # cd /subvolumes
    # ls
    root root_15-01-31_20-22 root_after_installation
    # btrfs sub del root
    Deleted /subvolumes/root
    # btrfs sub snap root_15-01-31_20-22 root
    -bash: /usr/bin/btrfs not found

    shut down

    GRUB loading...
    Welcome to GRUB!

    error: file '/root/boot/grub/i386-pc/normal.mod' not found.
    Entering rescue mode...
    grub rescue>

    > ls
    (hd0) (hd0, msdos7) (hd0, msdos6) (hd0, msdos5) (hd0, msdos2) (hd0, msdos1)
    > set
    cmdpath=(hd0)
    prefix=(hd0,msdos6)/root/boot/grub
    root=hd0,msdos6
    > ls /
    root_15-01-31_20-22 root_after_installation
    > set prefix=(hd0,msdos6)/root_15-01-31_20-22/boot/grub
    > insmod normal
    > normal

    Press ... `e' to edit the commands before booting and change:
    rootflags=subvol=root_15-01-31_20-22
    linux /root_15-01-31_20-22/boot/vmlinuz-linux
    initrd /root_15-01-31_20-22/boot/initramfs-linux-fallback.img

    boot

    # mount /subvolumes
    # cd /subvolumes
    # ls
    root_15-01-31_20-22 root_after_installation
    # btrfs sub snap root_15-01-31_20-22/ root
    Create a snapshot of 'root_15-01-31_20-22/' in './root'
    # ls
    root root_15-01-31_20-22 root_after_installation
    # reboot

    ОтветитьУдалить