Bootstrap

Создание бэкапа в BTRFS (mbr)

Создание бэкапа в BTRFS (mbr)

Для наглядности и для полного понимания всего процесса, разберём простую ситуацию. В этом случае вся файловая система линукс, кроме раздела с /boot у нас установлена на btrfs в два subvolume.

У нас есть "HHD"(здесь это vdi) диск sda, на нём создано всего два раздела при установке системы.

/dev/sda1 для файлов загрузчика grub2 и ядер, в формате ФС ext4 размером 1gb с загрузочным флагом

/dev/sda2 раздел диска 30gb в btrfs c двумя подтомами. С корнем системы - subvolume : root и домашним пространством пользователя в subvolume : home

Здесь при выполнении операций подготовки к бэкапу, сразу входим в режим суперпользователя root, чтобы не вводить постоянно слово sudo

sudo su
fdisk -l

И вот что мы видим:

Terminal:

  [vs@fedora ~]$ sudo su  
  [sudo] пароль для vs: 
  [root@fedora vs]# 
  [root@fedora vs]# fdisk -l
  Диск /dev/sda: 31 GiB, 33290158080 байт, 65019840 секторов
  Disk model: VBOX HARDDISK   
  Единицы: секторов по 1 * 512 = 512 байт
  Размер сектора (логический/физический): 512 байт / 512 байт
  Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
  Тип метки диска: dos
  Идентификатор диска: 0x0863b45a
  
  Устр-во    Загрузочный  начало    Конец  Секторы Размер Идентификатор Тип
  /dev/sda1  *              2048  2099199  2097152     1G            83 Linux
  /dev/sda2              2099200 65017855 62918656    30G            83 Linux
  
  

В данном случае у нас структура разделов dos, значит это система с MBR и BIOS.  Загрузчик GRUB и ядра OS, в этой системе находится в разделе sda1. Вся остальная файловая система в sda2. Убедимся в этом с помощью следующих команд:

mount /dev/sda1 /mnt
ls /mnt
lsblk -f

При этом обратим внимание, что с результатом выполнения последней команды с ключом -f, мы получаем информацию и об UUID разделов, знание о которых нам понадобится, уже на следующем шаге.

Terminal:

  [root@fedora vs]# mount /dev/sda1 /mnt
  [root@fedora vs]# ls /mnt  
  config-5.11.14-300.fc34.x86_64
  config-5.11.3-300.fc34.x86_64
  efi
  elf-memtest86+-5.31
  extlinux
  grub2
  initramfs-0-rescue-3cc94cbb1b0243dea550c3d45be8a0ba.img
  initramfs-5.11.14-300.fc34.x86_64.img
  initramfs-5.11.3-300.fc34.x86_64.img
  loader
  lost+found
  memtest86+-5.31
  System.map-5.11.14-300.fc34.x86_64
  System.map-5.11.3-300.fc34.x86_64
  vmlinuz-0-rescue-3cc94cbb1b0243dea550c3d45be8a0ba
  vmlinuz-5.11.14-300.fc34.x86_64
  vmlinuz-5.11.3-300.fc34.x86_64
  [root@fedora vs]# 
  [root@fedora vs]# lsblk -f 
  NAME   FSTYPE  FSVER          LABEL                 UUID                                 FSAVAIL FSUSE% MOUNTPOINT
  sda                                                                                                     
  ├─sda1 ext4    1.0                                  690c0d1a-43f3-4fe3-ae0d-b4dc3acad065  705,3M    21% /mnt
  └─sda2 btrfs                  fedora_localhost-live 1246f778-7ba5-430d-809a-a80ea801f09a   17,2G    41% /home
  zram0                                                                                                   [SWAP]
  [root@fedora vs]# 
        

Первый раздел у нас в формате ext4, поэтому снять btrfs снимок с него нельзя, но мы желаем забэкапить всю систему. Поэтому снимем и сохраним образ sda1 в подтом на втором разделе, другим способом. Для создания полного бэкапа системы в снимках, с помощью btrfs subvolume snapshot ... Но об этом чуть позже. Сейчас отмонтируем первый раздел и посмотрим на второй - наш основной раздел btrfs с помощью команд:

umount /mnt
  mount /dev/sda2 /mnt
ls /mnt

Terminal:

  [root@fedora vs]# umount /mnt
  [root@fedora vs]# mount /dev/sda2 /mnt
  [root@fedora vs]# ls /mnt
  home  root
  [root@fedora vs]# 

Видим, что здесь два каталога, хоть внешне они ничем не отличаются, но это не просто каталоги, это и есть наши подтома subvolume
убедимся в этом с помощью команды, которая показывает все подтома в указанной точке монтирования:

btrfs subvolume list /mnt

Terminal:

    [root@fedora vs]# btrfs subvolume list /mnt
    ID 258 gen 94317 top level 5 path home
    ID 272 gen 100141 top level 5 path root
    ID 275 gen 57817 top level 272 path root/var/lib/machines
    [root@fedora vs]# 
    [root@fedora vs]# umount /mnt     
    [root@fedora vs]# 
  

В этих двух подтомах находится вся наша система, поэтому всё, что нам нужно сделать, это снять с них snapshot и переместить их на другой носитель для хранения, предварительно, сохранив в один из них образ с первого раздела sda1. Тут также видно и ещё один подтом созданный самой системой внутри root, не имеющий особой важности root/var/lib/machines. Однако на всякий случай запомните, что снимок подтома не сохраняет вложенные подтома, вместо них сохраняется одноимённый каталог без содержимого. В стандартной ситуации как сейчас у нас, нам именно этот подтом не требуется, и мы не будем сохранять его в бэкап, но вопрос о нюансах рекурсивных снимков подробно раскрыт ЗДЕСЬ

Кстати, чтобы увидеть нашу ситуацию целиком, ознакомимся, каким образом смонтирована система. Это видно в конфигурационном файле /etc/fstab

cat /etc/fstab

Terminal:

  [root@fedora vs]#cat /etc/fstab

  #
  # /etc/fstab
  # Created by anaconda on Fri Apr 16 15:13:25 2021
  #
  # Accessible filesystems, by reference, are maintained under '/dev/disk/'.
  # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
  #
  # After editing this file, run 'systemctl daemon-reload' to update systemd
  # units generated from this file.
  #
  UUID=1246f778-7ba5-430d-809a-a80ea801f09a /                       btrfs   subvol=root,compress=zstd:1 0 0
  UUID=690c0d1a-43f3-4fe3-ae0d-b4dc3acad065 /boot                   ext4    defaults        1 2
  UUID=1246f778-7ba5-430d-809a-a80ea801f09a /home                   btrfs   subvol=home,compress=zstd:1 0 0
  [root@fedora vs]# 
  

Здесь мы видим, что разделы монтируются с помощью имён UUID, они принадлежат разделам блочных устройств /dev/sdX. Эти данные мы уже встречали, при выводе в терминале команды lsblk -f.  Прямо сейчас нам эта информация особо не требеуется. Работать с ней придётся, лишь на этапе востановления из бэкапа, который мы сейчас создадим.

Итак выполняем следующие действия:

  1. Выключаем систему.
  2. Подключаем загрузочный диск Live DVD(USB) и ставим первым в загрузку, чтобы загрузить linux с него.
  3. Подключаем дополнительный диск - принимающий, наш репозитарий. Куда и будем сохранять наш backup
  4. Включаем систему.
  5. На диске репозитария создаём раздел, достаточного размера, в формате btrfs с помощью утилиты gparted(ссылка как пользоваться пример)

В результате имеем примерно такую ситуацию:

Terminal:

  demo@mx1:~/Desktop
  $ sudo su
  [sudo] password for demo: 
  root@mx1:/home/demo/Desktop# 
  root@mx1:/home/demo/Desktop# lsblk -f
  NAME   FSTYPE   FSVER            LABEL                 UUID                                 FSAVAIL FSUSE% MOUNTPOINT
  loop0  squashfs 4.0                                                                               0   100% /live/linux
  sda                                                                                                        
  ├─sda1 ext4     1.0                                    690c0d1a-43f3-4fe3-ae0d-b4dc3acad065                
  └─sda2 btrfs                     fedora_localhost-live 1246f778-7ba5-430d-809a-a80ea801f09a                
  sdb                                                                                                        
  └─sdb1 btrfs                                           f7274863-edf2-44f1-b64d-7d2ce764f441                
  sr0    iso9660  Joliet Extension MX-Live               2021-10-19-23-10-23-00                     0   100% /live/boot-dev
  root@mx1:/home/demo/Desktop# 
  

Здесь, видим по номерам UUID, и по структуре разделов, что sda это исходящий диск, с которого мы делаем backup, а sdb это целевой диск, наш будующий репозитарий где будет и храниться резервная копия(backup).

Создадим каталоги для точек монтирования. И смонтируем нужные нам разделы btrfs, исходящий и целевой:

mkdir /mnt/sda2
mkdir /mnt/sdb1
mount /dev/sda2 /mnt/sda2
mount /dev/sdb1 /mnt/sdb1

Terminal:

root@mx1:/home/demo/Desktop# mkdir /mnt/sda2
root@mx1:/home/demo/Desktop# mkdir /mnt/sdb1
root@mx1:/home/demo/Desktop# mount /dev/sda2 /mnt/sda2
root@mx1:/home/demo/Desktop# mount /dev/sdb1 /mnt/sdb1
root@mx1:/home/demo/Desktop# 
root@mx1:/home/demo/Desktop# ls /mnt/sda2
home  root
root@mx1:/home/demo/Desktop# 
root@mx1:/home/demo/Desktop# ls /mnt/sdb1
root@mx1:/home/demo/Desktop# 
  

Всё в порядке, видим два наших subvolume, которые мы сохраним. Но сначала сделаем обещанный backup раздела загрузки sda1 с помощью утилиты dd в подтом root, создадим для этого каталог внутри подтома root. И отправим туда образ загрузочного раздела:

mkdir /mnt/sda2/root/backup_boot
dd if=/dev/sda1 of=/mnt/sda2/root/backup_boot/dd_sda1_boot_1024mb.iso

Так как у нас структура разделов msdos, то нам стоит сохранить и блок MBR всего диска sda. (для структуры GPT нам этого делать было бы не нужно подробнее об этом здесь.)
Сохраним MBR-запись в файл file.mbr, сюда же:

dd if=/dev/sda of=/mnt/sda2/root/backup_boot/file.mbr bs=512 count=1

Terminal:

  root@mx1:/home/demo/Desktop# mkdir /mnt/sda2/root/backup_boot
  root@mx1:/home/demo/Desktop# dd if=/dev/sda1 of=/mnt/sda2/root/backup_boot/dd_sda1_boot_1024mb.iso
  2097152+0 records in
  2097152+0 records out
  1073741824 bytes (1.1 GB, 1.0 GiB) copied, 10.4123 s, 103 MB/s
  root@mx1:/home/demo/Desktop# dd if=/dev/sda of=/mnt/sda2/root/backup_boot/file.mbr bs=512 count=1
  1+0 records in
  1+0 records out
  512 bytes copied, 0.000619172 s, 827 kB/s
  root@mx1:/home/demo/Desktop#
  root@mx1:/home/demo/Desktop# ls /mnt/sda2/root/backup_boot/
  dd_sda1_boot_1024mb.iso  file.mbr
  root@mx1:/home/demo/Desktop#

Теперь всё, что осталось, чтобы сделать полноценную резервную копию (backup) системы, это снять снимки (snapshot) двух subvolume root и home и перенести их на другой носитель в репозитарий sdb1.

Сначала делаются снимки в исходном разделе sda2 с защитой от записи ключ -r, эту опцию необходимо добавлять, т.к. в btrfs пересылать на другой раздел можно только readonly снимки.  

btrfs subvolume snapshot -r /mnt/sda2/root /mnt/sda2/root_bp
btrfs subvolume snapshot -r /mnt/sda2/home /mnt/sda2/home_bp

снимки сделаются почти мгновенно

Terminal:

root@mx1:/home/demo/Desktop# btrfs subvolume snapshot -r /mnt/sda2/root /mnt/sda2/root_bp
Create a readonly snapshot of '/mnt/sda2/root' in '/mnt/sda2/root_bp'
root@mx1:/home/demo/Desktop# btrfs subvolume snapshot -r /mnt/sda2/home /mnt/sda2/home_bp
Create a readonly snapshot of '/mnt/sda2/home' in '/mnt/sda2/home_bp'
root@mx1:/home/demo/Desktop# ls /mnt/sda2
home  home_bp  root  root_bp
root@mx1:/home/demo/Desktop# 

Работая с btrfs будет не лишним выполнять синхронизацию данных на диске с данными в памяти. При этом выполняется системный вызов sync, который вызывает запись всех буферизованных изменений метаданных файлов и данных в базовые файловые системы.

Terminal:

root@mx1:/home/demo/Desktop# sync
root@mx1:/home/demo/Desktop# 
root@mx1:/home/demo/Desktop# btrfs filesystem sync /mnt/sda2
root@mx1:/home/demo/Desktop# 

Подготовим диск для приёма сделанных снимков, создав каталог с текущей датой. Помним, что наш принимающий раздел, должен быть в формате btrfs и иметь достаточно свободного места.

И осуществим в него сам перенос двух снимков, по очереди.
Команда двойная, которая пишется строго через Пайп, где с левой стороны указывается путь к смонтированному источнику, с именем снимка, а с правой полный путь смонтированного приёмника, следующим образом:

mkdir /mnt/sdb1/backup_4_11_21
btrfs send /mnt/sda2/root_bp | btrfs receive /mnt/sdb1/backup_4_11_21/

Эта процедура выполняется совсем не мнговенно, как предыдущие, поэтому придётся подождать. Например размеры около 80gb, у меня пересылись около 10-20 минут. Всё зависит от процессорных мощностей, но как ни крути, это всё-равно, на порядок быстрее чем копия таких объёмов утилитой dd. 

btrfs send /mnt/sda2/home_bp | btrfs receive /mnt/sdb1/backup_4_11_21/

Заметьте, у принимающей стороны мы указаваем только имя каталога, без имени подтома, которое останется таким же как и у источника.

Terminal:

root@mx1:/home/demo/Desktop# mkdir /mnt/sdb1/backup_4_11_21
root@mx1:/home/demo/Desktop# btrfs send /mnt/sda2/root_bp | btrfs receive /mnt/sdb1/backup_4_11_21/
At subvol /mnt/sda2/root_bp
At subvol root_bp
root@mx1:/home/demo/Desktop# btrfs send /mnt/sda2/home_bp | btrfs receive /mnt/sdb1/backup_4_11_21/
At subvol /mnt/sda2/home_bp
At subvol home_bp
root@mx1:/home/demo/Desktop# 

Мы успешно осуществили задуманное, выполним синхронизацию и выключаем систему.  Теперь можете переходить к следующей статье, посвящённую пошаговому восстановлению из подобного бэкапа.

Terminal:

root@mx1:/home/demo/Desktop# sync
root@mx1:/home/demo/Desktop# 
root@mx1:/home/demo/Desktop# btrfs filesystem sync /mnt/sda2
root@mx1:/home/demo/Desktop# 
root@mx1:/home/demo/Desktop# btrfs filesystem sync /mnt/sdb1
root@mx1:/home/demo/Desktop# 
root@mx1:/home/demo/Desktop# ls /mnt/sdb1/backup_4_11_21
home_bp  root_bp
root@mx1:/home/demo/Desktop# 

Копирование материалов разрешается только с указанием автора Roman Sakhno и индексируемой прямой ссылкой на сайт (http://itdid.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/sahroman.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/sahroman.

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как настроить свой компьютер

  2. Текстовая ссылка:

    Она выглядит вот так: Как настроить свой компьютер

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

крипто-донат, на развитие сайта itdid.ru:

В новом окне с терминалом itdid.ru, введите любую сумму: