btrfs полное восстановление на gpt без переустановки efi
Полное восстановление системы на диске с gpt из созданных снимков btrfs
Сейчас у нас есть репозитарий со снимком системы, который мы сделали в предыдущей статье. И есть новый диск, на который мы востановим систему.
Подробности по текущей задаче:
Мы сделали снимки(snapshot) двух подтомов(subvolume) с системой, в один из которых предварительно поместили образы загрузочных разделов EFI и BOOT. Эти снимки мы переслали на другой носитель, в целях сохранности данных в случае неисправности основного диска. Для этого нужно было провести ряд подготовительных работ. В btrfs снимки системы делаются мгновенно, но они остаются на том же разделе, того же диска, на котором делаются... Это является удобным и надёжным решением для сохранения данных, но не в случае когда сам диск с системой выходит из строя. Чтобы убедиться в абсолютной надёжности и целесообразности бэкапов btrfs с помощью snapshot, в этой статье мы пошагово восстановимся из снимков, которые переслали на другой носитель - наш репозитарий.
Итак предположим, что основной диск с системой у нас накрылся... теперь у нас есть совершенно новый диск подходящего размера, и репозитарий - со снимками. Благодаря этой инструкции мы пошагово, восстановим систему в состояние на момент созданных снимков.
Порядок действий:
- Всё достаточно просто, нам необходимо на новом диске воссоздать структуру накрывшегося диска, который состоял из трёх разделов, эту информацию мы тоже сохранили в снимках... Первый раздел там был и теперь будет для EFI в формате fat32, второй загрузочным в формате ext4, их мы востановим из сохранённых образов. А основной третий раздел btrfs, восстановим снапшотами.
- Есть несколько важных моментов, которые необходимо будет учесть: это смена UUID основного раздела на новом носителе, его мы изменим на исходный, на тот, что указан в снимке конфигурационного файла загрузки fstab.
- Имена при создании снимков, которые теперь и есть наши новые подтома, отличаются от имён подтомов с которых их снимали. Здесь с загрузчиком efi, эти новые имена подтомов нужно будет вернуть в исходное состояние т.е. переименовать текущие имена снимков на те, что указаны в fstab... утилитой mv (это одно из ключевых отличий от востановления на дисках с mbr и bios, где мы просто правили эти имена subvolume в самом файле fstab, а переустановка grub2 закрывала вопрос.)
- Снять защиту от записи, сбросить флаг ro, с подтомов после переноса их на целевой диск командой btrfs property set.
И после выполнения этой последовательности процедур, наша система будет полностью восстановлена.
Решение задачи:
Сейчас я всё это делаю в виртуальной машине. Поэтому, первым делом добавляем новый диск в эту машину, на него мы будем востанаваливаться из бэкапа. 40gb, судя по размерам репозитария, нам хватит с лихвой. Старый диск, который по сценарию накрылся, здесь же убираем из системы, чтобы он нам не мешал. Все необходимые инструкции по работе в программе VirtualBox здесь.
Загружаемся с live образа линукс, например MXlinux, удобный, дистрибутив, не зря, на день создания этого туториала занимает первое место в рейтинге https://distrowatch.com/
Здесь уже в лайв системе, для выполнении операций, сразу входим в режим суперпользователя root, чтобы не вводить постоянно слово sudo
последовательность команд:
lsblk -f
Как они выглядят в терминале:
☯
Terminal:
⌕
≡
✕
demo@mx1:~/Desktop $ sudo su [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 btrfs 6474de7f-b5a6-4f08-addc-c2ee57e82971 sdb sr0 iso9660 Joliet Exten MX-Live 2021-10-19-23-10-23-00 0 100% /live/boot-
Так видно, что диск sdb, который у нас здесь пока вообще без разделов будет целевым. А диск sda, у которого есть один раздел sda1, это наш репозитарий с backup-ом.
- Создадим точку монтирования, смонтируем раздел sda1 и посмотрим. Откроем каталог снимка root_bp с backup-ом образов загрузочных разделов, чтобы в именах увидеть размеры разделов и их количество. Теоретически ведь разделов может быть много, это всё тоже видно в файле fstab
- Видим по uuid и точкам монтирования в выводе терминала ниже, у нас всего четыре точки монтирования и три раздела. Две точки монтирования в разные подтома первая и четвёртая на разделе btrfs
- Поэтому создадим разделы соответствующих размеров на целевом диске sdb с помощью gparted. ( статья как пользоваться gparted)
последовательность команд:
mount /dev/sda1 /mnt/sda1
ls /mnt/sda1/
ls /mnt/sda1/backup_7_11_21/root_bp/backup_boot
cat /mnt/sda1/backup_7_11_21/root_bp/etc/fstab
Как они выглядят в терминале:
☯
Terminal:
⌕
≡
✕
root@mx1:/home/demo/Desktop# mkdir /mnt/sda1 root@mx1:/home/demo/Desktop# mount /dev/sda1 /mnt/sda1 root@mx1:/home/demo/Desktop# ls /mnt/sda1/ backup_7_11_21 root@mx1:/home/demo/Desktop# ls /mnt/sda1/backup_7_11_21 home_bp root_bp root@mx1:/home/demo/Desktop# ls /mnt/sda1/backup_7_11_21/root_bp backup_boot boot etc lib lost+found mnt proc run srv tmp var bin dev home lib64 media opt root sbin sys usr root@mx1:/home/demo/Desktop# ls /mnt/sda1/backup_7_11_21/root_bp/backup_boot dd_sda1_efi_600mb.iso dd_sda2_boot_1024mb.iso root@mx1:/home/demo/Desktop# root@mx1:/home/demo/Desktop# cat /mnt/sda1/backup_7_11_21/root_bp/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@mx1:/home/demo/Desktop#
Теперь на диске sdb нам нужно создать таблицу разделов gpt и отформатировать третий раздел sdb3 в btrfs. В нашем случае sdb1 и sdb2 можно было бы просто создать нужных размеров без форматирования, ведь они будут полностью востановлены утилитой dd из образов, вместе с форматом файловой системы... Но sdb3 сейчас форматируем обязательно.
Открываем gparted и сделаем это всё сразу.
как пользоваться gparted, parted, fdisk... можно изучить здесь
В результате данных действий, мы должны увидеть вот такой вывод команды lsblk -f. Т.е. на целевом диске sdb имеем теперь три нужных раздела. Обратите внимание, что у всех трёх разделов при создании утилитой gparted присвоились свои уникальные UUID. Причём у разделов sdb1 и sdb2 UUID вернуться на исходные, из образов утилитой dd, уже на следующем шаге.
В то время UUID на sdb3 мы изменим самостоятельно с помощью утилиты btrfstune, выставим его таким же каким он есть в снимке, в файле fstab. Тогда в итоге все разделы будут с исходными uuid и всё загрузится успешно без дополнительных действий и настроек..., с загрузчиком efi такой номер пройдёт на ура.
последовательность команд:
cat /mnt/sda1/backup_7_11_21/root_bp/etc/fstab
Вывод в терминале текущей ситуации:
☯
Terminal:
⌕
≡
✕
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 btrfs 6474de7f-b5a6-4f08-addc-c2ee57e82971 16.1G 35% /mnt/sda1 sdb ├─sdb1 vfat FAT32 9374-D76C ├─sdb2 ext4 1.0 ead313f6-d00b-418c-be5c-81187c484400 907.4M 0% /media/demo/ead313f6-d00b-418c-be5c-81187c484400 └─sdb3 btrfs efc75c33-6462-47d4-9315-65c502aa684b 36.6G 0% /mnt/sdb3 sr0 iso9660 Joliet Extension MX-Live 2021-10-19-23-10-23-00 0 100% /live/boot-dev root@mx1:/home/demo/Desktop# root@mx1:/home/demo/Desktop# cat /mnt/sda1/backup_7_11_21/root_bp/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@mx1:/home/demo/Desktop#
Прямо сейчас, пока он совершенно чист мы и сменим uuid третьего раздела sdb3, до приёма на него подтомов из снимков.
Мы меняем uuid текущего раздела на uuid в fstab значит, тот uuid, что относится (в выводе терминала выше) к синему фону, нам нужно будет изменить на тот, что относится к зелёному. Т.е. нам осталось только поменять uuid текущего основного раздела утилитой btrfstune.
последовательность команд:
btrfstune -U 48bebba0-a3c9-4408-8fcd-d2ea03201a35 /dev/sdb3
btrfsck /dev/sdb3
lsblk -f
Как они выглядят в терминале:
☯
Terminal:
⌕
≡
✕
root@mx1:/home/demo/Desktop# root@mx1:/home/demo/Desktop# btrfstune -U 48bebba0-a3c9-4408-8fcd-d2ea03201a35 /dev/sdb3 WARNING: it's recommended to run 'btrfs check --readonly' before this operation. The whole operation must finish before the filesystem can be mounted again. If cancelled or interrupted, run 'btrfstune -u' to restart. We are going to change UUID, are your sure? [y/N]:y Current fsid: efc75c33-6462-47d4-9315-65c502aa684b New fsid: 48bebba0-a3c9-4408-8fcd-d2ea03201a35 Set superblock flag CHANGING_FSID Change fsid in extents Change fsid on devices Clear superblock flag CHANGING_FSID Fsid change finished root@mx1:/home/demo/Desktop# root@mx1:/home/demo/Desktop# btrfsck /dev/sdb3 Opening filesystem to check... Checking filesystem on /dev/sdb3 UUID: 48bebba0-a3c9-4408-8fcd-d2ea03201a35 [1/7] checking root items [2/7] checking extents [3/7] checking free space cache [4/7] checking fs roots [5/7] checking only csums items (without verifying data) [6/7] checking root refs [7/7] checking quota groups skipped (not enabled on this FS) found 9444917248 bytes used, no error found total csum bytes: 9047408 total tree bytes: 177946624 total fs tree bytes: 156893184 total extent tree bytes: 9928704 btree space waste bytes: 22031243 file data blocks allocated: 10243334144 referenced 9249550336 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 btrfs 6474de7f-b5a6-4f08-addc-c2ee57e82971 sdb ├─sdb1 vfat FAT32 9374-D76C ├─sdb2 ext4 1.0 ead313f6-d00b-418c-be5c-81187c484400 └─sdb3 btrfs 48bebba0-a3c9-4408-8fcd-d2ea03201a35 sr0 iso9660 Joliet Exten MX-Live 2021-10-19-23-10-23-00 0 100% /live/boot- root@mx1:/home/demo/Desktop#
Cоздаём - точку монтирования для нового btrfs раздела /mnt/sdb3 целевого диска, монтируемся.
последовательность команд:
mount /dev/sdb3 /mnt/sdb3
Настала пора, можно сказать, ключевого момента в процедуре востанавления системы из бэкапа - пересылаем подтома из sda1 на этот диск sdb3, но помним, что снимки всё ещё остаются в readonly
последовательность команд:
btrfs send /mnt/sda1/backup_7_11_21/home_bp | btrfs receive /mnt/sdb3
Как они выглядят в терминале:
☯
Terminal:
⌕
≡
✕
root@mx1:/home/demo/Desktop# mkdir /mnt/sdb3 root@mx1:/home/demo/Desktop# mount /dev/sdb3 /mnt/sdb3 root@mx1:/home/demo/Desktop# btrfs send /mnt/sda1/backup_7_11_21/root_bp | btrfs receive /mnt/sdb3 At subvol /mnt/sdb1/backup_7_11_21/root_bp At subvol root_bp root@mx1:/home/demo/Desktop# btrfs send /mnt/sda1/backup_7_11_21/home_bp | btrfs receive /mnt/sdb3 At subvol /mnt/sdb1/backup_7_11_21/home_bp At subvol home_bp root@mx1:/home/demo/Desktop# ls /mnt/sdb3 home_bp root_bp root@mx1:/home/demo/Desktop#
Так как мы работаем сейчас с btrfs, то самое время выполнить синхронизацию данных на диске с данными в памяти. При этом выполняется системный вызов sync, который вызывает запись всех буферизованных изменений метаданных файлов и данных в базовые файловые системы.
команды:
btrfs filesystem sync /mnt/sdb3
Как это выглядит в терминале:
☯
Terminal:
⌕
≡
✕
root@mx1:/home/demo/Desktop# sync root@mx1:/home/demo/Desktop# root@mx1:/home/demo/Desktop# btrfs filesystem sync /mnt/sdb3 root@mx1:/home/demo/Desktop#
Теперь востанавливаем раздел efi на sdb1 загрузочный раздел boot на sdb2 из образов, которые были сохранены предварительно в снимке root_bp. Воспользуемся той же самой утилитой dd, можно со статусом progress, чтобы видеть процесс копирования.
последовательность команд:
dd if=/mnt/sdb3/root_bp/backup_boot/dd_sda2_boot_1024mb.iso of=/dev/sdb2 status=progress
Смотрим вывод теминала, в котором добавлено пару команд для проверки, что всё у нас на месте. А именно после операции создали точки монтирования новых разделов, посмотрели содержимое и отмонтировали.
последовательность команд:
mkdir /mnt/sdb2
mount /dev/sdb1 /mnt/sdb1
mount /dev/sdb2 /mnt/sdb2
ls /mnt/sdb1
ls /mnt/sdb2
umount /mnt/sdb1 /mnt/sdb2
Как они выглядят в терминале:
☯
Terminal:
⌕
≡
✕
root@mx1:/home/demo/Desktop# ls /mnt/sdb3/root_bp/backup_boot/ dd_sda1_efi_600mb.iso dd_sda2_boot_1024mb.iso root@mx1:/home/demo/Desktop# dd if=/mnt/sdb3/root_bp/backup_boot/dd_sda1_efi_600mb.iso of=/dev/sdb1 status=progress 623915520 bytes (624 MB, 595 MiB) copied, 12 s, 52.0 MB/s 1228800+0 records in 1228800+0 records out 629145600 bytes (629 MB, 600 MiB) copied, 12.1629 s, 51.7 MB/s root@mx1:/home/demo/Desktop# dd if=/mnt/sdb3/root_bp/backup_boot/dd_sda2_boot_1024mb.iso of=/dev/sdb2 status=progress 1028129280 bytes (1.0 GB, 981 MiB) copied, 21 s, 49.0 MB/s 2097152+0 records in 2097152+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 21.7255 s, 49.4 MB/s root@mx1:/home/demo/Desktop# root@mx1:/home/demo/Desktop# mkdir /mnt/sdb1 root@mx1:/home/demo/Desktop# mkdir /mnt/sdb2 root@mx1:/home/demo/Desktop# mount /dev/sdb1 /mnt/sdb1 root@mx1:/home/demo/Desktop# mount /dev/sdb2 /mnt/sdb2 root@mx1:/home/demo/Desktop# ls /mnt/sdb1 EFI mach_kernel System root@mx1:/home/demo/Desktop# ls /mnt/sdb2 config-5.14.10-300.fc35.x86_64 initramfs-0-rescue-18dd197cc607412db54e3f15b51f36e0.img symvers-5.14.10-300.fc35.x86_64.gz vmlinuz-5.14.10-300.fc35.x86_64 config-5.14.16-301.fc35.x86_64 initramfs-5.14.10-300.fc35.x86_64.img symvers-5.14.16-301.fc35.x86_64.gz vmlinuz-5.14.16-301.fc35.x86_64 efi initramfs-5.14.16-301.fc35.x86_64.img System.map-5.14.10-300.fc35.x86_64 extlinux loader System.map-5.14.16-301.fc35.x86_64 grub2 lost+found vmlinuz-0-rescue-18dd197cc607412db54e3f15b51f36e0 root@mx1:/home/demo/Desktop# root@mx1:/home/demo/Desktop# umount /mnt/sdb1 /mnt/sdb2 root@mx1:/home/demo/Desktop#
Переводим subvolume в режим rw, т.е. убираем флаг только чтение, это обязательно нужно сделать, сделаем это прямо сейчас. Посмотреть флаг состояние подтома get, чтобы установить set. Если ro=true значит режим readonly. Нам нужно сделать ro=false.
последовательность команд:
btrfs property set /mnt/sdb3/home_bp ro false
Как они выглядят в терминале:
☯
Terminal:
⌕
≡
✕
root@mx1:/home/demo/Desktop# btrfs property get /mnt/sdb3/root_bp ro=true root@mx1:/home/demo/Desktop# btrfs property get /mnt/sdb3/home_bp ro=true root@mx1:/home/demo/Desktop# btrfs property set /mnt/sdb3/root_bp ro false root@mx1:/home/demo/Desktop# btrfs property set /mnt/sdb3/home_bp ro false root@mx1:/home/demo/Desktop# btrfs property get /mnt/sdb3/root_bp ro=false root@mx1:/home/demo/Desktop# btrfs property get /mnt/sdb3/home_bp ro=false root@mx1:/home/demo/Desktop#
Ещё раз посмотрим на fstab, в подтоме root_bp. Чтобы узнать нужные имена смонтированных подтомов, на которые мы изменим полученые снимки.
- Смотрим какие у нас сейчас указаны записи в конфигурационном файле cat /../fstab.
- Смотрим какие UUID сейчас у нас на новом диске командой lsblk -f. Убеждаемся, что UUID загрузочного раздела sdb1 и sdb2 уже восстановлены и теперь без изменений, ведь они скопировались полностью из образов, утилитой dd. Но если UUID основного раздела sdb3 у нас ещё отличается от исходного, то исправим это на следующем шаге.
- Утилитой mv изменим префикс у снимков с _bp на исходный у нас 00.
последовательность команд:
lsblk -f
ls /mnt/sdb3
mv /mnt/sdb3/root_bp /mnt/sdb3/root00
mv /mnt/sdb3/home_bp /mnt/sdb3/home00
ls /mnt/sdb3
Как они выглядят в терминале:
☯
Terminal:
⌕
≡
✕
root@mx1:/home/demo/Desktop# cat /mnt/sdb3/root_bp/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@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 btrfs 6474de7f-b5a6-4f08-addc-c2ee57e82971 16.1G 35% /mnt/sda1 sdb ├─sdb1 vfat FAT32 D58C-0FAF ├─sdb2 ext4 1.0 4fa6cee5-6902-4bf5-bed6-dad03bc8c83e 907.4M 0% /media/demo/ead313f6-d00b-418c-be5c-81187c484400 └─sdb3 btrfs 48bebba0-a3c9-4408-8fcd-d2ea03201a35 29.3G 23% /mnt/sdb3 sr0 iso9660 Joliet Extension MX-Live 2021-10-19-23-10-23-00 0 100% /live/boot-dev root@mx1:/home/demo/Desktop# root@mx1:/home/demo/Desktop# ls /mnt/sdb3 home_bp root_bp root@mx1:/home/demo/Desktop# root@mx1:/home/demo/Desktop# mv /mnt/sdb3/root_bp /mnt/sdb3/root00 root@mx1:/home/demo/Desktop# mv /mnt/sdb3/home_bp /mnt/sdb3/home00 root@mx1:/home/demo/Desktop# ls /mnt/sdb3 home00 root00 root@mx1:/home/demo/Desktop#
Обратите внимание на сделанную мною подстветку в терминале, идентичные записи у нас одного цвета. Она создана для наглядного понимания. В том числе и имена subvolume мы изменили с mv в конце этого шага, отмечены теперь зелёным...
Вытаскиваем загрузочный образ Live DVD и загружаемся с нового диска, в результате получаем полностью востановленную систему на момент сделанного backup.
-
- Roman Sakhno
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.