Альт 8СП/Раздел восстановления

Материал из ALT Linux Wiki

ОС Альт 8 СП обеспечивает следующие возможности:

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

Подключение к сети, доступ к интернет, скачивание файлов не требуется, все операции выполняются в обычной консоли.

Кортоко

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

Применимость ниже предлагаемых примеров

  1. Образ дистрибутива: alt-sp8-workstation-20201202-x86_64.iso, MD5: 19e544457da85bd1c95b54b097b409f5, КС: 5712fc4a (Legacy & UEFI)
  2. Образ дистрибутива: alt-sp8-workstation-20201202-i586.iso, MD5:2e1c18f05a93613b1dd2a204d36183a4, КС: c1e658fe (только Legacy/CSM)

Определение режима загрузки ОС

В зависимости от того, как выглядит первый экран с загрузочным меню установщика, вы находитесь либо в режиме Legacy/CSM (загрузчик isolinux, рис. 1a), либо в режиме UEFI (загрузчик refind, рис. 1b).

Рис. 1a
Рис. 1b

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

Режим загрузки Legacy/CSM

1. Устанавливаем ОС по своему усмотрению и согласно документации. На шаге 4 необходимо выбрать ручную разметку (рис 2).

Рис. 2

В данном примере диск разбивается по следующей схеме: 1-й раздел -- swap, 2-й раздел -- корневой, 3-й раздел -- /home. Оставшееся на диске место резервируем для спасательного раздела, отключив галку "Создать том" (рис. 3a).

Рис. 3a

2. После установки системы открываем терминал и получаем права root (su-).

3. Смотрим все блочные устройства, чтобы понять, какой раздел был зарезервирован для спасательных целей:

# lsblk -f
NAME   FSTYPE  LABEL                UUID                                 FSAVAIL FSUSE% MOUNTPOINT
sda                                                                                     
├─sda1 swap                         cda4de4a-71b0-4972-a4c8-cd569951f454                [SWAP]
├─sda2 ext4                         e9039de5-7f83-4836-98a6-259e6b4b2359    6,9G    47% /
├─sda3 ext4                         c060ec4c-1565-42dd-93f9-a44e58e1e6de    9,2G     0% /home
├─sda4                                                                                  
└─sda5                                                                                  
sr0    iso9660 ALT 8 SP Workstation 2020-12-02-14-49-51-00                     0   100% /media/ALTLinux

# fdisk -l /dev/sda
...
Устр-во    Загрузочный   начало    Конец  Секторы Размер Идентификатор Тип
/dev/sda1                  2048  1048575  1046528   511M            82 Linux своп / Solaris
/dev/sda2  *            1048576 31766527 30717952  14,7G            83 Linux
/dev/sda3              31766528 52735999 20969472    10G            83 Linux
/dev/sda4              52736000 62910463 10174464   4,9G             5 Расширенный
/dev/sda5              52738048 62910463 10172416   4,9G            83 Linux

Из этого примера понятно, что нас интересует последний раздел на диске: /dev/sda5.

4. Подготовим этот раздел несколькими командами:

# mkfs.ext4 -j -L RECOVERY /dev/sda5
# mkdir /tmp/recovery
# mount -L RECOVERY /tmp/recovery
# mkdir -m700 /tmp/recovery/backup

5. Вставим установочный диск с Альт 8 СП. По умолчанию его содержимое доступно в точке монтирования /media/ALTLinux. Скопируем с него три файла на созданный раздел (ядро, образ initrd и файл второй стадии загрузки):

# cp -Lf /media/ALTLinux/EFI/BOOT/vmlinuz /tmp/recovery/backup/
# cp -Lf /media/ALTLinux/EFI/BOOT/full.cz /tmp/recovery/backup/
# cp -Lf /media/ALTLinux/rescue /tmp/recovery/

6. Смотрим, что получилось, как называется целевой диск и какие порядковые номера используются для разделов:

# lsblk -f
NAME   FSTYPE  LABEL                UUID                                 FSAVAIL FSUSE% MOUNTPOINT
sda                                                                                     
├─sda1 swap                         cda4de4a-71b0-4972-a4c8-cd569951f454                [SWAP]
├─sda2 ext4                         e9039de5-7f83-4836-98a6-259e6b4b2359    6,9G    47% /
├─sda3 ext4                         c060ec4c-1565-42dd-93f9-a44e58e1e6de    9,2G     0% /home
├─sda4                                                                                  
└─sda5 ext4    RECOVERY             b36db3ba-6e81-460a-af7a-61c070ae12f1    4,4G     0% /tmp/recovery
sr0    iso9660 ALT 8 SP Workstation 2020-12-02-14-49-51-00                     0   100% /media/ALTLinux

7. В соответствии с полученной информацией создаём "карту устройств" на спасательном разделе:

# cat >/tmp/recovery/backup/map.conf <<EOF
target=/dev/sda
swap=1
root=2
home=3
EOF

Здесь target -- название целевого диска, а остальное -- порядковые номера разделов, если таковые используются в схеме разметки диска.

8. Создаём три файла: full-backup, full-restore и 15_grub командами в консоли, см. приложения 1, 2 и 3.

9. Выполняем ещё несколько команд и перезагружаемся:

# ln -snf full-restore /tmp/recovery/sys-restore
# chmod +x /tmp/recovery/full-restore
# chmod +x /tmp/recovery/full-backup
# chmod +x /etc/grub.d/15_rescue
# update-grub
# umount /tmp/recovery
# reboot

10. В результате первый экран с загрузочным меню будет выглядеть как на рис. 4a.

Рис. 4a

Теперь можно пользоваться разделом восстановления, см. детали в описании Консоли восстановления.

Режим загрузки UEFI

1. Устанавливаем ОС по своему усмотрению и согласно документации. На шаге 4 необходимо выбрать ручную разметку (рис 2).

Рис. 2

В данном примере диск разбивается по следующей схеме: 1-й раздел -- EFI System (FAT32), 2-й раздел -- swap, 3-й раздел -- корневой, 4-й раздел -- /home. Оставшееся на диске место резервируем для спасательного раздела, отключив галку "Создать том" (рис. 3b).

Рис. 3b

2. После установки системы открываем терминал и получаем права root (su-).

3. Смотрим все блочные устройства, чтобы понять, какой раздел был зарезервирован для спасательных целей:

# lsblk -f
NAME   FSTYPE  LABEL                UUID                                 FSAVAIL FSUSE% MOUNTPOINT
sda                                                                                     
├─sda1 vfat                         E9AA-7350                              97,5M     4% /boot/efi
├─sda2 swap                         03911215-d8f7-48a5-bbd2-11e01ec11299                [SWAP]
├─sda3 ext4                         6f4000ff-29ee-43d2-808a-1b9f2b818d96    6,9G    47% /
├─sda4 ext4                         1564f924-df3e-44b6-b805-550dc4231f00      9G     0% /home
└─sda5                                                                                  
sr0    iso9660 ALT 8 SP Workstation 2020-12-02-14-49-51-00                     0   100% /media/ALTLinux

# fdisk -l /dev/sda
...
Устр-во      начало    Конец  Секторы Размер Тип
/dev/sda1      2048   212991   210944   103M EFI
/dev/sda2    212992  1261567  1048576   512M Файловая система Linux
/dev/sda3   1261568 31981567 30720000  14,7G Файловая система Linux
/dev/sda4  31981568 52461567 20480000   9,8G Файловая система Linux
/dev/sda5  52461568 62910463 10448896     5G Файловая система Linux

Из этого примера понятно, что нас интересует последний раздел на диске: /dev/sda5.

4. Подготовим этот раздел несколькими командами:

# mkfs.ext4 -j -L RECOVERY /dev/sda5
# mkdir /tmp/recovery
# mount -L RECOVERY /tmp/recovery
# mkdir -m700 /tmp/recovery/backup

5. Вставим установочный диск с Альт 8 СП. По умолчанию его содержимое доступно в точке монтирования /media/ALTLinux. Скопируем с него три файла на созданный раздел (ядро, образ initrd и файл второй стадии загрузки):

# cp -Lf /media/ALTLinux/EFI/BOOT/vmlinuz /tmp/recovery/backup/
# cp -Lf /media/ALTLinux/EFI/BOOT/full.cz /tmp/recovery/backup/
# cp -Lf /media/ALTLinux/rescue /tmp/recovery/

6. Смотрим, что получилось, как называется целевой диск и какие порядковые номера используются для разделов:

# lsblk -f
NAME   FSTYPE  LABEL                UUID                                 FSAVAIL FSUSE% MOUNTPOINT
sda                                                                                     
├─sda1 vfat                         E9AA-7350                              97,5M     4% /boot/efi
├─sda2 swap                         03911215-d8f7-48a5-bbd2-11e01ec11299                [SWAP]
├─sda3 ext4                         6f4000ff-29ee-43d2-808a-1b9f2b818d96    6,9G    47% /
├─sda4 ext4                         1564f924-df3e-44b6-b805-550dc4231f00      9G     0% /home
└─sda5 ext4    RECOVERY             43cf8808-32d5-4229-914f-6ebe28c5a6e7    4,6G     0% /tmp/recovery
sr0    iso9660 ALT 8 SP Workstation 2020-12-02-14-49-51-00                     0   100% /media/ALTLinux

7. В соответствии с полученной информацией создаём "карту устройств" на спасательном разделе:

# cat >/tmp/recovery/backup/map.conf <<EOF
target=/dev/sda
swap=2
root=3
home=4
EOF

Здесь target -- название целевого диска, а остальное -- порядковые номера разделов, если таковые используются в схеме разметки диска. Обратите внимание, что раздел EFI здесь не указан. В процессе работы наших скриптов он будет определён автоматически.

8. Создаём три файла: full-backup, full-restore и 15_grub командами в консоли, см. приложения 1, 2 и 3.

9. Выполняем ещё несколько команд и перезагружаемся:

# ln -snf full-restore /tmp/recovery/sys-restore
# chmod +x /tmp/recovery/full-restore
# chmod +x /tmp/recovery/full-backup
# chmod +x /etc/grub.d/15_rescue
# update-grub
# umount /tmp/recovery
# reboot

10. В результате первый экран с загрузочным меню будет выглядеть как на рис. 4b.

Рис. 4b

Теперь можно пользоваться разделом восстановления, см. детали в описании Консоли восстановления.

Использование Консоли восстановления

Данная консоль позволяет выполнять различные спасательные работы: сохранять и восстанавливать разделы, устанавливать загрузчик, итд. Подробнее про ALT Rescue можно почитать в соответствующем описании. В загрузочный образ rescue зашиты многие полезные команды, такие как partclone (для всех известных файловых систем), system-backup, sfdisk, partprobe, итд. Более подробно с этими командами можно ознакомиться на этой странице. В приложениях ниже можно увидеть примеры автоматизации с использованием некоторых из перечисленных команд.

Создание точки восстановления системы

1. Перезагружаем компьютер.

2. В загрузочном меню выбираем пункт "Создать резервную копию" (рис. 4a, 4b).

3. Процесс создания точки восстановления может занять длительное время, но происходящее отражается на экране (рис. 5).

4. По окончании процесса будет показан размер созданной резервной копии и мы окажемся в Консоли восстановления. Здесь можно видеть, что бэкап назван по текущей дате и символьная ссылка LAST указывает на последний бэкап (рис. 6). Симлинк LAST позволяет управлять вопросом, из какого бэкапа будут производиться процедуры восстановления системы. Чтобы указать другой бэкап достаточно дать в консоли команду: ln -snf <BACKUP-DATE> /image/backup/LAST, предварительно перемонтировав диск на запись: mount -o remount,rw /image.

5. Даём команду reboot либо просто перезагружаем компьютер через Ctrl-Alt-Del.

Раздел восстановления в установленной системе

1. Пользователь root может вручную смонтировать раздел, например, такими командами:

# mkdir /tmp/recovery
# mount -L RECOVERY /tmp/recovery

При этом содержимое каталога /backup на этом разделе со всеми бэкапами будет доступно только пользователю root. Поскольку запись в /etc/fstab для данного раздела не предусмотрена, он не будет автоматически монтироваться при загрузке компьютера.

2. В среде обычного пользователя раздел восстановления недоступен, для доступа к нему требуется авторизация (рис. 7).

Восстановление всех разделов

1. Перезагружаем компьютер.

2. В загрузочном меню выбираем пункт "Восстановить все разделы" (рис. 4a, 4b).

3. Дожидаемся окончания процесса восстановления всей системы и раздела данных пользователей.

По окончании процесса компьютер перезагрузится. Следует иметь ввиду, что в данном режиме также восстанавливаются исходная разметка диска, области начальной загрузкм и раздел /home.

Восстановление системных разделов

1. Перезагружаем компьютер.

2. В загрузочном меню выбираем пункт "Восстановить только систему" (рис. 4a, 4b).

3. Дожидаемся окончания процесса восстановления.

По окончании процесса компьютер перезагрузится. Следует иметь ввиду, что в данном режиме не восстанавливаются исходная разметка диска, области начальной загрузкм и раздел /home. Можно внести изменения в скрипт full-restore, чтобы изменить это поведение под свои нужды.

А если комьютер вообще не загружается?

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

1. Перезагружаем компьютер с установочного CD/DVD/флэшки.

2. В режиме загрузки Legacy/CSM.

2.1. Выбираем третий пункт "Восстановление системы", но ничего не нажимаем.

2.2. Дописываем руками следующие параметры загрузки: automatic=method:disk,label:RECOVERY autorun=method:disk,run:sys-restore vga=normal nomodeset и нажимаем ENTER (рис i1).

2.3. По окончании загрузки в ALT Rescue переключаемся на первый терминал (Alt-F1), чтобы видеть происходящее (необязательно).

3. В режиме загрузки UEFI.

3.1. Выбираем второй пунк "Boot ALT Linux Rescue" в верхнем ряду и нажимем клавишу F2 (рис. e1).

3.2. Выбираем первый пункт "Boot using default options" повторным нажатием клавиши F2 (рис. e2).

3.3. Дописываем руками следующие параметры загрузки: automatic=method:disk,label:RECOVERY autorun=method:disk,run:sys-restore vga=normal nomodeset nosplash и нажимаем ENTER (рис e3).

4. После восстановления системы компьютер будет перезагружен. Если процедура восстановления не помогла, повторяем операцию с использованием опции full-restore вместо sys-restore. Если при этом необходимо сохранить данные, придётся сначала внести изменения в файл /backup/map.conf на разделе RECOVERY, закомментировав строку home=...

А если спасательный раздел не был создан изначально?

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

А можно использовать другой физический диск для спасательного раздела?

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

Приложение 1: создание скрипта сохранения системы

# cat >/tmp/recovery/full-backup <<EOF
#!/bin/sh -efu

. /mnt/autorun/backup/map.conf

uefi=1
ppart=
name="\$(date +%F)"
backup="/mnt/autorun/backup/\$name"

devnode() {
  if [ -n "\$ppart" ]; then
     echo "\${target}p\$1"
  else
     echo "\${target}\$1"
  fi
}

backup() {
  "partclone.\$1" -N -c -s "\$(devnode \$2)" |
    pigz -9qnc >"\$3.pc.gz"
}

if [ -b "\${target}p1" ]; then
   ppart=1
elif [ ! -b "\${target}1" ]; then
   exit 1
fi
mount -o remount,rw /mnt/autorun
rm -rf -- "\$backup"
mkdir -p -m700 -- "\$backup"
cd "\$backup"/
umask 0077

[ -d /sys/firmware/efi ] || uefi=
[ -n "\${root-}" ] && [ -b "\$(devnode \$root)" ] || exit 1
[ -n "\${swap-}" ] && [ -b "\$(devnode \$swap)" ] || swap=
[ -n "\${home-}" ] && [ -b "\$(devnode \$home)" ] || home=

sfdisk -d "\$target" >sfdisk.txt
dd if="\$target" bs=512 count=100 |pigz -9qnc >vbr.gz
[ -z "\$swap" ] || blkid -c /dev/null -o value \\
  -s UUID -- "\$(devnode \$swap)" >swap.uuid
[ -z "\$uefi" ] || backup fat32 \$uefi uefi
[ -z "\$home" ] || backup ext4  \$home home
[ -z "\$root" ] || backup ext4  \$root root
clear

cd ..
echo "Backup created:"
du -sh -- "\$name"
ln -snf -- "\$name" LAST
cd / && mount -o remount,ro /mnt/autorun
exec /bin/sh -c "umount /mnt/autorun && rmdir /mnt/autorun"

EOF

Приложение 2: создание скрипта восстановления системы

# cat >/tmp/recovery/full-restore <<EOF
#!/bin/sh -efu

. /mnt/autorun/backup/map.conf

uefi=1
ppart=
backup="\$(readlink -fv /mnt/autorun/backup/LAST)"

devnode() {
  if [ -n "\$ppart" ]; then
     echo "\${target}p\$1"
  else
     echo "\${target}\$1"
  fi
}

restore() {
  [ ! -s "\$1.pc.gz" ] ||
    unpigz -qnc <"\$1.pc.gz" |
      "partclone.\$2" -N -r -s - -o "\$(devnode \$3)"
}

if [ -b "\${target}p1" ]; then
   ppart=1
elif [ ! -b "\${target}1" ]; then
   exit 1
fi
cd "\$backup"/

[ -d /sys/firmware/efi ] || uefi=
[ -n "\${root-}" ] && [ -b "\$(devnode \$root)" ] || exit 1
[ -n "\${swap-}" ] && [ -b "\$(devnode \$swap)" ] || swap=
[ -n "\${home-}" ] && [ -b "\$(devnode \$home)" ] || home=

if [ "\${0##*/}" != "full-restore" ]; then
   home=
else
   unpigz -qnc <vbr.gz |
      dd of="\$target" bs=512 oflag=direct
   sync; partprobe "\$target" 2>/dev/null ||:
fi

if [ -n "\$swap" ]; then
   wipefs -a -- "\$(devnode \$swap)"
   mkswap -U "\$(head -n1 swap.uuid)" -- "\$(devnode \$swap)"
fi
[ -z "\$uefi" ] || restore uefi fat32 \$uefi
[ -z "\$root" ] || restore root ext4  \$root
[ -z "\$home" ] || restore home ext4  \$home
clear

cd /
echo "System restored!"
exec /bin/sh -c "umount /mnt/autorun && /sbin/reboot"

EOF

Приложение 3: создание скрипта расширения загрузочного меню

# cat >/etc/grub.d/15_rescue <<EOF
#!/bin/sh -e

prefix="/usr"
exec_prefix="/usr"
datarootdir="/usr/share"

. "\$pkgdatadir/grub-mkconfig_lib"

export TEXTDOMAIN=grub
export TEXTDOMAINDIR="\$datarootdir/locale"

CLASS="--class gnu-linux --class gnu --class os --unrestricted"

[ -n "\$boot_device_id" ] || boot_device_id="\$(grub_get_device_id "\$GRUB_DEVICE")"

rescue_entry() {
  echo "menuentry '\$1' \$CLASS \\\$menuentry_id_option 'gnulinux-alt8sp-\$boot_device_id' {"
  echo "  load_video"
  echo "  insmod gzio"
  echo "  insmod part_msdos"
  echo "  insmod part_gpt"
  echo "  insmod ext2"
  echo "  search --no-floppy --set=root -l 'RECOVERY'"
  echo "  linux /backup/vmlinuz initrd=/backup/full.cz quiet ramdisk_size=301045 automatic=method:disk,label:RECOVERY stagename=rescue vga=normal nomodeset nosplash autorun=method:disk,run:\$2"
  echo "  initrd /backup/full.cz"
  echo "}"
}

rescue_entry "Консоль восстановления" rescue
rescue_entry "Создать резервную копию" full-backup
rescue_entry "Восстановить все разделы" full-restore
rescue_entry "Восстановить только систему" sys-restore
EOF

Можно предусмотреть собственный уровень подменю для подобных задач, можно адаптировать под них конкретный список пунктов меню. В данном примере добаваляется четыре пункта на первом уровне меню GRUB (четыре последние строки). Единственный вопрос к этому скрипту: откуда берётся значение "301045"? Это размер файла второй стадии загрузки (/media/ALTLinux/rescue) в килобайтах плюс один, которое можно посчитать либо найти в этом файле: /media/ALTLinux/EFI/BOOT/refind.conf или в этом: /media/ALTLinux/syslinux/isolinux.cfg.


Enjoy! ;-)