Bootstrap

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

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

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

Итак, у нас есть "HHD"(здесь это vdi) диск sda, это интересующий нас диск с системой для бэкапа. На нём создано всего три раздела при стандартной установке дистрибутива Fedora 35, по умолчанию предлагают btrfs, Вот как это примерно выглядит уже в установленной системе:


  1. /dev/sda1 раздел /boot/efi 

    Системный раздел EFI (также называемый ESP или EFISYS) представляет собой физический раздел в формате FAT32 (в основной таблице разделов диска, а не под LVM или программным RAID и т.д.), откуда прошивка UEFI запускает загрузчик и приложение UEFI.

    Это независимый от ОС раздел, который служит местом хранения загрузочных устройств EFI и приложений, которые будут запускаться с помощью прошивки EFI. Это необходимо для загрузки UEFI.

  2. /dev/sda2 раздел /boot с файлами grub и ядрами, в формате ФС ext4 размером 1gb 

  3. /dev/sda3  основной раздел диска 30gb в btrfs c двумя подтомами. С корнем системы - subvolume : root00 и домашним пространством пользователя в subvolumehome00

В этой инструкции мы сделаем бэкап всей системы, средствами встроенных утилит ядра и GNU, в частности (dd) для первых двух разделов, и утилит для работы с btrfs для основного третьего раздела.


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

sudo su
fdisk -l

Вот как это выглядит:

Terminal:

  [vs@fedora ~]$ sudo su  
  [sudo] пароль для vs: 
  [root@fedora vs]# 
  [root@fedora vs]# fdisk -l  
  Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 sectors
  Disk model: VBOX HARDDISK   
  Units: sectors of 1 * 512 = 512 bytes
  Sector size (logical/physical): 512 bytes / 512 bytes
  I/O size (minimum/optimal): 512 bytes / 512 bytes
  Disklabel type: gpt
  Disk identifier: 4D268846-4D53-49F1-99B0-532CA3AF6FCC
  
  Device       Start      End  Sectors  Size Type
  /dev/sda1     2048  1230847  1228800  600M EFI System
  /dev/sda2  1230848  3327999  2097152    1G Linux filesystem
  /dev/sda3  3328000 62912511 59584512 28.4G Linux filesystem
  
  
  Disk /dev/zram0: 3.81 GiB, 4090494976 bytes, 998656 sectors
  Units: sectors of 1 * 4096 = 4096 bytes
  Sector size (logical/physical): 4096 bytes / 4096 bytes
  I/O size (minimum/optimal): 4096 bytes / 4096 bytes

  

В данном случае это структура разделов gpt, значит это система с UEFI. Файлы для которой, судя по листингу fdisk -l находятся в разделе sda1. Загрузчик GRUB и ядра OS, в этой системе находится в разделе sda2. Это нам интуитивно понятно, ведь мы видим всю информацию по разделам, в том числе и их размеры... Все основные файлы системы у нас в разделе sda3 с размером в 28.4.GB. Посмотрим на эту же картину, с помощью утилиты:

lsblk -f

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

Terminal:

    [root@fedora vs]# lsblk -f 
    NAME   FSTYPE FSVER LABEL                 UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
    sda                                                                                           
    ├─sda1 vfat   FAT32                       D58C-0FAF                             584.9M     2% /boot/efi
    ├─sda2 ext4   1.0                         4fa6cee5-6902-4bf5-bed6-dad03bc8c83e  756.7M    15% /boot
    └─sda3 btrfs        fedora_localhost-live 48bebba0-a3c9-4408-8fcd-d2ea03201a35   20.1G    29% /home
                                                                                                    /
    sr0                                                                                           
    zram0                                                                                         [SWAP]
    [root@fedora vs]# 
        

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

mount /dev/sda3 /mnt
ls /mnt

Terminal:

  [root@fedora vs]# mount /dev/sda3 /mnt
  [root@fedora vs]# ls /mnt
  home00  root00
  [root@fedora vs]# 

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

btrfs subvolume list /mnt

Terminal:

    [root@fedora vs]# btrfs subvolume list /mnt
    ID 256 gen 492 top level 5 path home00
    ID 258 gen 488 top level 5 path root00
    ID 264 gen 431 top level 256 path root00/var/lib/machines
    [root@fedora vs]# 
    [root@fedora vs]# umount /mnt     
    [root@fedora vs]# 
  

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

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

cat /etc/fstab

Terminal:

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

    #
    # /etc/fstab
    # Created by anaconda on Sat Nov  6 06:53:48 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=48bebba0-a3c9-4408-8fcd-d2ea03201a35 /                       btrfs   subvol=root00 0 0
    UUID=4fa6cee5-6902-4bf5-bed6-dad03bc8c83e /boot                   ext4    defaults        1 2
    UUID=D58C-0FAF                            /boot/efi               vfat    umask=0077,shortname=winnt 0 2
    UUID=48bebba0-a3c9-4408-8fcd-d2ea03201a35 /home                   btrfs   subvol=home00 0 0
    [root@fedora vs]# 
    

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

Сначала загрузимся с liveUSB в любой Linux, чтобы иметь полный доступ ко всем физическим дискам из консоли, нас интересует диск с системой и целевой диск куда бы будем складывать бэкап. Кто не знает, как просто сделать LiveUSB, рекомендую ПО Ventoy, в статьях на этом сайте, по поиску Ventoy найдёте инструкцию.

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

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

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

Terminal:

  demo@mx1:~/Desktop
  $ sudo su   
    We trust you have received the usual lecture from the local System
    Administrator. It usually boils down to these three things:
    
        #1) Respect the privacy of others.
        #2) Think before you type.
        #3) With great power comes great responsibility.
    
    [sudo] password for demo: 
    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 vfat     FAT32                                  D58C-0FAF                                           
        ├─sda2 ext4     1.0                                    4fa6cee5-6902-4bf5-bed6-dad03bc8c83e  710.8M    20% /media/demo/4fa6cee5-6902-4bf5-bed6-dad03bc8c83e
        └─sda3 btrfs                     fedora_localhost-live 48bebba0-a3c9-4408-8fcd-d2ea03201a35                
        sdb                                                                                                        
        └─sdb1 btrfs                                          6474de7f-b5a6-4f08-addc-c2ee57e82971                
        sr0    iso9660  Joliet Extension MX-Live               2021-10-19-23-10-23-00                     0   100% /live/boot-dev
    

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

Создаём в текущей LiveOS, каталоги для точек монтирования. И смонтируем нужные нам разделы btrfs, исходный(с системой) и целевой(наш будущий репозитарий).

Обратите внимание, что исходный диск, раздел с ситемой, мы монтируем целиком, т.е. верхний уровень файловой системы над всеми подтомами, а не отдельно подтома внутри него. Но есть риск, что какой-то подтом, установлен как монтируемый по умолчанию опцией set-default, без томов по умолчанию это делается так:


mkdir /mnt/sda3
mkdir /mnt/sdb1
mount /dev/sda3 /mnt/sda3
mount /dev/sdb1 /mnt/sdb1

Но если при выполнении команды mount /dev/sda3 /mnt/sda3 мы оказались внутри подтома, т.е. при ls /mnt/sda3 не видим на нём каталоги с именами подтомов, а видим другие файлы, значит был смонтирован подтом, который установлен как монтируемый по умолчанию. Поэтому смонтируем разделы btrfs следущим образом, и это уже будет верняк. Т.е. монтируем конкретно указывая корневой подтом /, целевой раздел и желаемую точку монтирования, вот так:





umount /mnt/sda3 



mount -o subvol=/ /dev/sda3 /mnt/sda3 

Так как целевой и исходный у нас в btfrs, то чтобы смонтировать правильно, будем использовать этот способ исключающий монтирование подтома по умолчанию, вот так:

Terminal:

root@mx1:/home/demo/Desktop# mkdir /mnt/sda3
root@mx1:/home/demo/Desktop# mkdir /mnt/sdb1
root@mx1:/home/demo/Desktop# mount -o subvol=/ -o /dev/sda3 /mnt/sda3
root@mx1:/home/demo/Desktop# mount -o subvol=/ -o /dev/sdb1 /mnt/sdb1
root@mx1:/home/demo/Desktop# 
root@mx1:/home/demo/Desktop# ls /mnt/sda3
home00  root00
root@mx1:/home/demo/Desktop# 
root@mx1:/home/demo/Desktop# ls /mnt/sdb1
root@mx1:/home/demo/Desktop# 
  

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

mkdir /mnt/sda3/root00/backup_boot
dd if=/dev/sda1 of=/mnt/sda3/root00/backup_boot/dd_sda1_efi_600mb.iso
dd if=/dev/sda2 of=/mnt/sda3/root00/backup_boot/dd_sda2_boot_1024mb.iso

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

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


Обратите внимание, что данные разделы /dev/sda, /dev/sda1, /dev/sda2, у нас не смонтированы, так и должно быть в этой операции, утилитой dd мы берём данные целиком напрямую из блочного устройства, создаём образы этих разделов.


Terminal:

  root@mx1:/home/demo/Desktop# mkdir /mnt/sda3/root00/backup_boot
  root@mx1:/home/demo/Desktop# dd if=/dev/sda1 of=/mnt/sda3/root00/backup_boot/dd_sda1_efi_600mb.iso
  root@mx1:/home/demo/Desktop# dd if=/dev/sda1 of=/mnt/sda3/root00/backup_boot/dd_sda2_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/sda3/root00/backup_boot/
  dd_sda1_efi_600mb.iso  dd_sda2_boot_1024mb.iso  file.mbr
  root@mx1:/home/demo/Desktop#

Обратите внимание, какие мы дали имена этим образам, это делается для того, чтобы при восстановлении системы на другом диске, было понятно каких размеров создавать разделы, они прописаны в имени образа. Размер и его назначение. Таблица разделов в file.mbr редко бывает кому-то нужна, за редким исключением, поэтому эти 512 байт, думаю никому не помешают. Пусть просто тоже будет.


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

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

btrfs subvolume snapshot -r /mnt/sda3/root00 /mnt/sda3/root_bp
btrfs subvolume snapshot -r /mnt/sda3/home00 /mnt/sda3/home_bp

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

Terminal:

root@mx1:/home/demo/Desktop# btrfs subvolume snapshot -r /mnt/sda3/root00 /mnt/sda3/root_bp
Create a readonly snapshot of '/mnt/sda3/root00' in '/mnt/sda3/root_bp'
root@mx1:/home/demo/Desktop# btrfs subvolume snapshot -r /mnt/sda3/home00 /mnt/sda3/home_bp
Create a readonly snapshot of '/mnt/sda3/home00' in '/mnt/sda3/home_bp'
root@mx1:/home/demo/Desktop# ls /mnt/sda3
home00  home_bp  root00  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/sda3
root@mx1:/home/demo/Desktop# 

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

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

mkdir /mnt/sdb1/backup_7_11_21
btrfs send /mnt/sda3/root_bp | btrfs receive /mnt/sdb1/backup_7_11_21/

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

btrfs send /mnt/sda3/home_bp | btrfs receive /mnt/sdb1/backup_7_11_21/

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

Terminal:

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

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

Terminal:

root@mx1:/home/demo/Desktop# sync
root@mx1:/home/demo/Desktop# 
root@mx1:/home/demo/Desktop# btrfs filesystem sync /mnt/sda3
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_7_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, введите любую сумму: