Создание бэкапа в BTRFS (gpt)
Сейчас мы просто загружены в нашу систему, которую планируем бэкапить. Собираем всю необходимую информацию. Для наглядности и для полного понимания всего процесса, разберём ситуацию наглядно.
Итак, у нас есть "HHD"(здесь это vdi) диск sda, это интересующий нас диск с системой для бэкапа. На нём создано всего три раздела при стандартной установке дистрибутива Fedora 35, по умолчанию предлагают btrfs, Вот как это примерно выглядит уже в установленной системе:
- /dev/sda1 раздел /boot/efi
Системный раздел EFI (также называемый ESP или EFISYS) представляет собой физический раздел в формате FAT32 (в основной таблице разделов диска, а не под LVM или программным RAID и т.д.), откуда прошивка UEFI запускает загрузчик и приложение UEFI.
Это независимый от ОС раздел, который служит местом хранения загрузочных устройств EFI и приложений, которые будут запускаться с помощью прошивки EFI. Это необходимо для загрузки UEFI.
-
/dev/sda2 раздел /boot с файлами grub и ядрами, в формате ФС ext4 размером 1gb
-
/dev/sda3 основной раздел диска 30gb в btrfs c двумя подтомами. С корнем системы - subvolume : root00 и домашним пространством пользователя в subvolume : home00
В этой инструкции мы сделаем бэкап всей системы, средствами встроенных утилит ядра и GNU, в частности (dd) для первых двух разделов, и утилит для работы с btrfs для основного третьего раздела.
Здесь при выполнении операций подготовки к бэкапу, сразу входим в режим суперпользователя root, чтобы не вводить постоянно слово sudo
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. Посмотрим на эту же картину, с помощью утилиты:
При этом обратим внимание, что результатом выполнения команды с ключом -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 с помощью команд:
ls /mnt
☯
Terminal:
⌕
≡
✕
[root@fedora vs]# mount /dev/sda3 /mnt [root@fedora vs]# ls /mnt home00 root00 [root@fedora vs]#
Видим, что здесь два каталога, хоть внешне они ничем не отличаются, но это не просто каталоги, это и есть наши подтома subvolume
убедимся в этом с помощью команды, которая показывает все подтома в указанной точке монтирования:
☯
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
☯
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 найдёте инструкцию.
Итак выполняем следующие действия:
- Выключаем систему.
- Подключаем загрузочный диск Live DVD(USB) и ставим первым в загрузку, чтобы загрузить linux с него.
- Подключаем дополнительный диск - принимающий, наш репозитарий. Куда и будем сохранять наш backup
- Включаем систему.
- На диске репозитария(другими словами целевой диск, куда мы поместим бэкап), создадим раздел, достаточного размера и обязательно, в формате 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/sdb1
mount /dev/sda3 /mnt/sda3
mount /dev/sdb1 /mnt/sdb1
Но если при выполнении команды mount /dev/sda3 /mnt/sda3 мы оказались внутри подтома, т.е. при ls /mnt/sda3 не видим на нём каталоги с именами подтомов, а видим другие файлы, значит был смонтирован подтом, который установлен как монтируемый по умолчанию. Поэтому смонтируем разделы btrfs следущим образом, и это уже будет верняк. Т.е. монтируем конкретно указывая корневой подтом /, целевой раздел и желаемую точку монтирования, вот так:
Так как целевой и исходный у нас в 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. И отправим туда образы первых двух разделов, благо не смотря на всю свою важность, они имеют относительно маленький размер:
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, в этот же каталог:
Обратите внимание, что данные разделы /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/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 и иметь достаточно свободного места, но об этом мы уже позаботились заблаговременно...
Осуществим перенос наших двух снимков, по очереди.
Команда двойная, которая пишется строго через Пайп, где с левой стороны указывается путь к смонтированному источнику, с именем снимка, а с правой полный путь смонтированного приёмника, следующим образом:
btrfs send /mnt/sda3/root_bp | btrfs receive /mnt/sdb1/backup_7_11_21/
Эта процедура выполняется совсем не мнговенно, как предыдущие, поэтому придётся подождать. Например размеры около 80gb, у меня пересылись около 10-20 минут. Всё зависит от процессорных мощностей, но как ни крути, это всё-равно, на порядок быстрее чем копия таких объёмов утилитой dd.
Заметьте, у принимающей стороны мы указаваем только имя каталога, без имени подтома, которое останется таким же как и у источника.
☯
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
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.