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

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

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

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

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

Коротко

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

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

  1. Образ дистрибутива: alt-sp8-workstation-20201202-x86_64.iso, MD5: 19e544457da85bd1c95b54b097b409f5, КС: 5712fc4a (Legacy/CMS & 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).

Рис. 4b

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

Рис. 5

4. По окончании процесса будет показан размер созданной резервной копии и мы окажемся в Консоли восстановления. Здесь можно видеть, что бэкап назван по текущей дате и символьная ссылка LAST указывает на последний бэкап (рис. 6).

Рис. 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).

Рис. 7

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

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

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

Рис. 4b

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

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

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

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

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

Рис. 4a

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 и нажимаем ENTER (рис i1).

Рис. i1

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

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

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

Рис. e1

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

Рис. e2

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

Рис. 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.

Приложение 4: архив с примерами скриптов

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


Enjoy! ;-)