LINUX.ORG.RU
решено ФорумAdmin

Реализация автоматической загрузки системы с резервного раздела при отвале раздела/диска

 ,


0

3

Добрый день! Подскажите пожалуйста. Есть блок на котором крутиться Astra linux 1.6. Блок не имеет подключения монитора, клавы, мыши. У блока есть 4 ssd, 3 из которых работают с системой, а 4-й резервный. Мне надо что бы при невозможности монтирования раздела(например дикс отвалился, или раздел посыпался), например sdb или sda2(корень) КТО-то в системе на этапе загрузки это мог понять и переключить или примонтировать резерв и уже грузится с него. Я копал в сторону initramfs, но не получается с её помощью монтировать резерв, при отвале одного из дисков, как я понимаю из-за того, что на этапе загрузки initramfs еще не доступны разделы. GRUB тоже такие проверки и определения не может сделать. Мне нужно настроить так блок, что бы он без оператора сам там разобрался может или не может грузиться, переходит на резервный раздел. Такой вариант еще можно: например грузить сперва в ОЗУ загрузочную ОС (финикс например), она пробует и проверяет доски, или контрольные суммы, а затем уже принимает решения грузить со стандартных настроек или менять grub, ставить загрузку с резерва и уходить в ребут. Такого не делал еще


Нафига такую хрень городить? Если у тебя есть основной диск и резервный, можно просто RAID1 собрать. Загрузчик, конечно, должен быть на обоих дисках, и они должны идти один за другим в очереди загрузки в BIOS.

Vsevolod-linuxoid ★★★★★
()

дикс отвалился

Применительно к efi bios.

Если может отвалиться загрузочный efi-раздел, то надо создать два efi-раздела (на загрузочном и резервном дисках) и расставить приоритеты загрузки в биосе.

раздел посыпался

grub search --file искать специальный файл, если нет, то файловая система с таким файлом не найдена («посыпалась»), грузим другой вариант.

anonymous
()

Это как раз тот случай, когда надо просто использовать RAID. Хотя если под «посыпался» подразумевается наличие критических ошибок в ФС, то тут надо обеспечить доступ администратора. Например, включить SSH в initramfs.

anonymous
()

в интирамфс доступны все носители что и в основной системе. для этого в интирамфс упиховывают весь набор (при modules=most) модулей ядра для железа носителей. при ошибке загрузки тебя и выкидывают в инитрамфс для принятия решений - поменять скрипты чтобы выкидывало в финикс.
у меня вот прямщас чтото подобное. комп поменял на другой, а опция стояла modules=dep (оптимизатор хреновъ) и необходимого модуля для драйвера сата в материнке просто нет в интирамфс - Gave up waiting for root file system device…

pfg ★★★★★
()

Как насчёт просто положить в initramfs dropbear для ssh, шелл и настройки сети?

Например, как для удалённой разблокировки luks. Первая попавшаяся инструкция, наверняка есть лучше: https://www.arminpech.de/2019/12/23/debian-unlock-luks-root-partition-remotely-by-ssh-using-dropbear/

anonymous
()

Блок не имеет подключения монитора, клавы, мыши.

Это всё можно вывести через последовательный порт (включая grub и kernel/initramfs) на другой ПК.

Я копал в сторону initramfs, но не получается с её помощью монтировать резерв, при отвале одного из дисков,

Если поврежден раздел на котором initramfs, то конечно ничего не выйдет (аналогично и для GRUB).

например грузить сперва в ОЗУ загрузочную ОС (финикс например),

откуда грузить, если раздел поврежден? по сети что-ли?

MirandaUser2
()
Ответ на: комментарий от MirandaUser2

Ни каких других ПК, ни по сети, ничего нет. Блок летает, плавает и работает и его нет возможности администрировать. Если ломается, то вынимают в новый ставят, но системы маломальского восстановления должна быть. Я понимаю, что если отвалиться винт полностью, то не спасёт ни initramfs, ничего. Но есть sdb, sdc. Я смог положить в /srv/finnix.iso и можно с него грузиться. Можно выставлять в /boot/grub/grubenv next_entry=4, можно через finnix монтировать эту директорию и прописывать этот параметр и при перезагрузке загружается finnix. Я не могу разобраться с initramfs, точнее с его скриптами и как они выполняются и выполняются ли они вообще. Я пишу скрипт

#!/bin/sh
   PREREQ=""

   prereqs() {
       echo "$PREREQ"
   }

   case $1 in
       prereqs) exit 0 ;;
   esac

   if [ $? -ne 0 ]; then
       echo "Ошибка при монтировании раздела. Перезагрузка..."
       
       grub-reboot 0  
       reboot
   fi

кладу его в директорию /etc/initramfs-tools/scripts/init-top/, скрипт исполняемый делаю. Так же клал в директорию /etc/initramfs-tools/hooks, уже не знаю куда и положит его, и скрипты разные делал, что бы просто система уходила в ребут, что бы проверить выполняется ли скрипт. Ну ничего. Делаю update-initramfs -ut. Как я могу сделать, что бы initramfs при отвале или при каком-то условии хотя бы перегружался?

McCake
() автор топика
Ответ на: комментарий от anonymous

Спасибо за наводку! Рассказываю как сделал:

  1. На sdc сделал разделы идентичные основному разделу. И потом dd перенес копию всех разделов.
  2. Файл fstab, который стал резервным, я переписал, предварительно заменив у каждого раздела UUID. Получилась полностью идентичная копия основной системы.
  3. Добавил в GRUB пункт с резервным разделом и протестировал, что он загружается и на нём все поднимается.
  4. В grub.cfg добавил команды, условия выбора раздела, которые может выполнять grub, а конкретно:
#Проверка на наличие раздела
        set error=0
	echo	' Поиск UUID …'
        search --fs-uuid XXX
#Если была ошибка, то переменную меняем с 0 на 1
	if [ $? -ne 0 ]; then set error=1; fi 
        search --fs-uuid XXX
	if [ $? -ne 0 ]; then set error=1; fi
        search --fs-uuid XXX
	if [ $? -ne 0 ]; then set error=1; fi
echo	'Поиск файлов …'
#       sdb2
	search --file /pathtofile
#Если была ошибка, то переменную меняем с 0 на 1
	if [ $? -ne 0 ]; then set error=1; fi
#	sdc1
	search --file /pathtofile
	if [ $? -ne 0 ]; then set error=1; fi
#Если переменная хоть где-то превратилась в 1, то грузимся с резерва

if [ $error -ne 0 ]; then
#тут прописаны настройки резервного раздела
else
# иначе штатно. Настройки штатного раздела
fi

Да, если отвалиться раздел с grub, то это не спасет, но происходит хоть какой-то контроль других точек отказа. Так же в grub можно запхать проверку по контрольным суммам файлов

McCake
() автор топика
Ответ на: комментарий от McCake

https://www.gnu.org/software/grub/manual/grub/html_node/search.html

В нужных файловых системах создаем уникальные файлы (например, с помощью uuidgen), и ищем с установкой переменной root (или другой переменной)

set root=
search --file <uuid1_file> --set root
search --file <uuid2_file> --set root
search --file <uuid3_file> --set root

# далее проверяем, установлен ли root и грузим.
# в root - последний успешный search
...
anonymous
()