Відновлення завантажувача GRUB у Linux

Вступ

Завантажувач GRUB є універсальним, гнучким та досить належним інструментом для організації завантаження операційних систем (ОС). Однак за наявності деяких обставин та факторів. Від яких не застраховано жодної системи. Можуть виникати збої, внаслідок яких завантаження системи може бути некоректним або зовсім неможливим. Якщо в цьому випадку точно встановлено, що система не завантажується через непрацездатність самого завантажувача. То в цій ситуації далеко не все так складно та безнадійно. Як може здатися деяким недосвідченим користувачам чи системним адміністраторам. У більшості випадків завантаження системи можна досить швидко і легко відновити, не вдаючись до перевстановлення системи. Для цього існують давно перевірені способи, про які буде розказано у цій статті.

Чому “ламається” завантажувач GRUB?

Звичайно, саме собою нічого не відбувається. Якщо «зламалося» завантаження GRUB – це означає, що щось на це вплинуло. Дуже часто в таких ситуаціях користувачі кажуть, що системну конфігурацію не змінювали, а GRUB вдруге перестав працювати. І вони частково мають рацію.

Насправді GRUB досить чутливий до будь-якої зміни як своєї, так і системної конфігурації, хоч би яким універсальним і зручним він не був. Так, наприклад, зміна ідентифікатора розділу, що зберігає  ядро (/boot), вже призведе до неможливості завантаження системи. І GRUB тут і ні до чого. Потрібно шукати причину, через яку змінився ідентифікатор розділу. А вони можуть бути різними. Наприклад, навіть якщо комп’ютер довгий час не використовувався і на його платі не було живлення. Це також може бути причиною скидання деяких налаштувань BIOS (через розряджену батарейку). Що може призвести до наступного після тривалої перерви увімкненні перевизначення параметрів обладнання. Від яких залежить у деяких випадках і ідентифікатор розділу. Це лише одна з причин непрацездатності GRUB, найочевидніша, яку не можуть передбачити ні розробники GRUB, ні творці системних плат.

Наявність помилок на розділах диска, людський фактор (особливо серед малодосвідчених користувачів) також є причиною непрацездатності GRUB. Головне, що треба розуміти, — те, що в більшості випадків причиною є зовнішній фактор. A GRUB – це досить вразливе місце, чутливе практично до будь-яких зовнішніх впливів, оскільки це програмне середовище, яке організує передачу управління комп’ютером від BIOS (UEFI) до ОС.

Способи відновлення GRUB

У цій статті будуть розглянуті два найефективніші способи відновлення GRUB:

  • за допомогою LiveCD/DVD – «найнародніший» метод, з ним цілком справляються новачки;
  • робота в командній консолі GRUB – ручне завантаження системи та відновлення GRUB «рідної» системного середовища дуже корисно, коли немає можливості скористатися LiveCD/DVD або іншим завантажувальним пристроєм.

Як неважко здогадатися, відновлення GRUB безпосередньо пов’язане із завантаженням системи. Основна робота з відновлення саме в цьому полягає — завантажити рідне системне середовище альтернативними способами або вручну. Далі, у переважній більшості випадків, відновлення GRUB здійснюється однією командою:

$ sudo grub-update

Існують також інші команди:

$ sudo grub-install /dev/sdN
$ sudo grub-mkconfig -o /boot/grub/grub.cfg

Останні варто використати, якщо не допомогла команда  grub-update. Перша з них встановлює завантажувач GRUB на вказаний пристрій (не на розділ!). У разі замість sdN може бути sda, sdb тощо. оскільки GRUB встановлюється лише на пристрій.

Інша команда створює конфігураційний файл GRUB, виходячи з поточної конфігурації системи. Аналізується інформація про кількість наявних у системі ядер, їх версій тощо. В результаті формується оптимальна та безпечна конфігурація завантаження системи. Якщо ядер кілька, то буде сформовано список, який може бути доступний (в меню завантаження GRUB) для вибору ядра для завантаження. За умовчанням GRUB завантажує ядро ​​найсвіжішої версії.

Як можна бачити, нічого складного у відновленні/установці GRUB немає. Тепер можна перейти до розгляду альтернативних способів, завантаження системного середовища для відновлення GRUB.

Примітка: замість команд grub-install та grub-mkconfig можуть використовуватися команди grub2-install та grub2-mkconfig відповідно. Це залежить від системи, що використовується (дистрибутив).

Завантаження та відновлення за допомогою LiveCD

При використанні будь-якого з альтернативних варіантів завантаження рідної системи дуже корисно спочатку дізнатися (або переконатися), з якого пристрою відбувається завантаження. Необхідно заздалегідь це з’ясувати в налаштуваннях комп’ютера BIOS. Це потрібно, якщо доведеться не просто обновити конфігурацію завантажувача, а повністю перевстановити його. А для цього дуже бажано встановлювати його на пристрій, якому з BIOS передається управління для подальшого завантаження ОС. Для BIOS материнських плат MSI це виглядає приблизно так:

Рис. 1: BIOS MSI — Перегляд та налаштування пріоритету пристроїв для завантаження системи.

Як бачимо, для цієї системи завантажувальним пристроєм є SSD-накопичувач “Samsung SSD 860 EVO 250 GB”. А поки що це найменування можна запам’ятати або десь записати.

Тепер можна завантажитись з будь-якого Live-образу, використовуючи оптичний CD/DVD-диск або накопичувач USB-Flash. Опускаючи технічні подробиці, важливо зазначити, що для цього мають бути зроблені відповідні налаштування в комп’ютері BIOS. Як Live-образ рекомендується використовувати ту саму систему, що і встановлена ​​на комп’ютері.

Отже, завантажившись у Live-режимі, спочатку слід запустити командну консоль. Далі необхідно визначити кореневий розділ системи, для якої потрібно відновити завантажувач. Це потрібно, щоб увійти в програмне середовище «рідної» системи з безпосередньо Live-режиму та використовувати весь доступний інструментарій, у тому числі команди з відновлення GRUB.

Монтування кореневого та завантажувального розділів

За допомогою команди  fdisk  визначаємо, який розділ і на якому пристрої використовується рідною системою як кореневою:

$ sudo fdisk -l
[sudo] пароль для john:
Диск /dev/sda: 232,9 GiB, 250059350016 байт, 488397168 секторів
Одиниці: секторів по 1*512 = 512 байт
Розмір сектора (логічний/фізичний): 512 байт/512 байт
Розмір I/O (мінімальний/оптимальний): 512 байт/512 байт
Тип позначки диска: gpt
Ідентифікатор диска: 2FB31770-F1EC-51F0-9613-G11DC4G2SC21

Пристрій початок Кінець Сектори Розмір Тип
/dev/sda1 2048 1075199 1073152 524M EFI
/dev/sda2 1075200 40136703 39061504 18,6G Файлова система Linux
/dev/sda3 40136704 391698431 351561728 167,7G Файлова система Linux
/dev/sda4 391698432 430759935 39061504 18,6G Файлова система Linux
/dev/sda5 430759936 488396799 57636864 27,5G Файлова система Linux

Диск /dev/sdb: 111,8 GiB, 120033041920 байт, 234439535 секторів
Одиниці: секторів по 1*512 = 512 байт
Розмір сектора (логічний/фізичний): 512 байт/512 байт
Розмір I/O (мінімальний/оптимальний): 512 байт/512 байт
Тип позначки диска: gpt
Ідентифікатор диска: 233HSC87-S40F-473K-3K73-38sC568228L4

Пристрій початок Кінець Сектори Розмір Тип
/dev/sdb1 2048 40962047 40960000 19,5G Файлова система Linux
/dev/sdb2 40962048 163842047 122880000 58,6G Файлова система Linux
/dev/sdb3 163842048 188418047 24576000 11,7G Файлова система Linux
/dev/sdb4 188418048 234434559 46016512 22G Файлова система Linux

Як можна бачити, система має два диски – sda та sdb. Тут необхідно зорієнтуватися та згадати, як розмічався диск спочатку при встановленні системи. І визначити за даними висновку, який розділ є кореневим. Якщо це розділ sda2. Його тепер потрібно примонтувати командою mount:

$ sudo mount /dev/sda2 /mnt

Необхідно також примонтувати розділ /boot. Але дуже важливо помітити, що якщо як /boot використовується окремий розділ (а не підкаталог у кореневому розділі, як у більшості сучасних дистрибутивів, наприклад Ubuntu), то його монтування буде виглядати так:

$ sudo mount /dev/sda3 /mnt/boot

У разі останньої команди наведено умовно, як приклад. Насправді файли завантажувача для цього прикладу зберігаються у підкаталозі /boot, який вже був примонтований від sda2, і тому в останній команді в цьому випадку немає потреби.

Підготовка програмного середовища для роботи

Оскільки в Live-режимі завантажено і працює ядро ​​Live-системи, воно використовуватиметься і для роботи з примонтованими розділами (кореневий і /boot). Але для цього необхідно до кореневого розділу рідної системи (яка вже змонтована в /mnt) також примонтувати інші файлові системи (ФС), без яких ядро ​​Live-системи не зможе коректно працювати – /sys, /dev і /proc, вони ж необхідні для взаємодії із ядром. Іншими словами, завантажене з Live-образу ядро ​​потрібно налаштувати на повноцінну роботу з кореневою ФС рідної системи, додавши до неї ФС з Live-системи:

$ sudo mount --bind /sys /mnt/sys
$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /proc /mnt/proc

Далі необхідно визначити програмне оточення середовища, вказавши каталог /mnt та інтерпретатор команд:

$ sudo chroot /mnt /bin/bash

Підготовка програмного середовища для роботи

Оскільки в Live-режимі завантажено і працює ядро ​​Live-системи, воно використовуватиметься і для роботи з примонтованими розділами (кореневий і /boot). Але для цього необхідно до кореневого розділу рідної системи (яка вже змонтована в /mnt) також примонтувати інші файлові системи (ФС), без яких ядро ​​Live-системи не зможе коректно працювати – /sys, /dev і /proc, вони ж необхідні для взаємодії із ядром. Іншими словами, завантажене з Live-образу ядро ​​потрібно налаштувати на повноцінну роботу з кореневою ФС рідної системи, додавши до неї ФС з Live-системи:

$ sudo mount --bind /sys /mnt/sys
$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /proc /mnt/proc

Далі необхідно визначити програмне оточення середовища, вказавши каталог /mnt та інтерпретатор команд:

$ sudo chroot /mnt /bin/bash

Ця команда вказує, де повинні виконуватись команди та яке програмне оточення для цього має використовуватися. В такому випадку ядро ​​Live-образу може повноцінно працювати з ФС рідної системи. Використовуючи всі пакети, команди, файли та інші доступні ресурси.

Тепер потрібно оновити MBR (головний запис) диска, встановивши на нього завантажувач GRUB. Тут потрібно згадати, який диск є завантажувальним, виходячи з конфігурації BIOS. Оскільки раніше це вже було визначено, то тепер залишається дізнатися, як пристрій позначається в системі. Для цього корисно виконати наступний скрипт:

$ for d in /dev/sd[a-z]; do echo “$d: $(sudo hdparm -I $d | drep -i ‘model’)”; done
/dev/sda Model Number: Samsung SSD 860 EVO 250GB
/dev/sda Model Number: ST43205624AS
/dev/sda Model Number: ST43210462AS

Даний скрипт спрацює, якщо в рідній системі встановлена ​​утиліта  hdparm. Але оскільки в більшості Linux-дистрибутивів вона встановлена ​​і доступна «з коробки», то турбуватися нема про що.

Як можна побачити, пристрій Samsung SSD 860 EVO 250GB, який раніше був визначений як завантажувальний, відповідає його визначення в системі як  /dev/sda. Саме на нього слід проводити установку GRUB:

$ sudo grub-install /dev/sda

Створення файлу конфігурації GRUB:

$ sudo grub-mkconfig -o /mnt/boot/grub/grub.cfg

Ну і насамкінець можна виконати:

$ sudo grub-update

Якщо під час виконання команди  grub-install  виникають будь-які помилки, можна виконати її з ключем  -recheck. Якщо все нормально, то можна вийти з режиму chroot командою:

$ exit0

Далі необхідно змонтувати всі раніше примонтовані пристрої та ФС:

$ sudo umount /mnt/dev
$ sudo umount /mnt/proc
$ sudo umount /mnt/sys

Якщо  /boot монтувався з окремого розділу, його також необхідно змонтувати:

$ sudo umount /mnt/boot

Ну і нарешті, необхідно змонтувати також і кореневий розділ:

$ sudo umount /mnt

Далі можна перезавантажитись без Live-образу (зробивши відповідні налаштування в BIOS і знову вказавши як завантажувальний «Samsung SSD 860 EVO 250GB»). І перевірити, чи GRUB завантажує рідну систему.

Завантаження з командної консолі GRUB

Іноді буває так, що GRUB встановлений, але внаслідок будь-яких збоїв його робоча конфігурація була пошкоджена і завантаження ОС у штатному режимі неможливе. Зазвичай у таких випадках у меню GRUB з’являються повідомлення про помилки із запрошенням перейти в режим командної консолі завантажувача, натиснувши клавішу «C». У цьому режимі GRUB пропонує досить великий набір корисних команд. За допомогою яких можна, зокрема, зробити ручне завантаження системи. Ці ж команди, до речі, виконуються завантажувачем під час читання його конфігураційного файлу.

Рис. 2: зовнішній вигляд командної консолі GRUB.

Отже, перше, що потрібно зробити після входу до командної консолі GRUB – це виконати команду ls. В результаті буде виведено список усіх доступних у системі дисків та розділів.

Визначення та вибір розділу завантаження

Однак позначає GRUB розділи по-своєму. Наприклад, замість звичного sda4 буде (hd0, gpt2), а замість sdb1 буде (hd1, gpt3). Таким чином, як можна побачити, пристрої у форматі GRUB нумеруються цифрами, як і розділи. Але розділи нумеруються у зворотному порядку. Наприклад, на пристрої sda із п’ятьма розділами, розділу sda2 у форматі GRUB відповідатиме запис (hd0, gpt4), sda1 – (hd0, gpt5) тощо. . Адже для ручного завантаження системи необхідно правильно визначити та вказати кореневий розділ або розділ  /boot.

Примітка: префікс gpt у розділі у форматі GRUB може бути іншим. Наприклад, msdos (якщо GRUB не зміг визначити тип розмітки), але в даному прикладі розділи розмічені у форматі GPT.

Якщо відомо, що  /boot знаходиться на розділі sda2, який має п’ять розділів. То з великим ступенем ймовірності це (hd0,4) у форматі GRUB. Префікс gpt для розділу можна не вказувати. Ну а якщо ж початкову структуру розділів згадати чи визначити неможливо. То залишається лише перебирати чи вгадувати.

Команда ls виведе приблизно таке:

grub>ls
(hd0) (hd0, gpt5) (hd0, gpt4) (hd0, gpt3) (hd0, gpt2) (hd0, gpt1) (hd1) (hd1, gpt4) (hd1, gpt3) (hd1, gpt2) (hd1, gpt1) (hd2) (hd2, gpt1)
Цей висновок означає, що в системі є три пристрої й в класичному записі це відповідає наступній структурі розділів:
Диск 1: /dev/sda1/dev/sda2/dev/sda3/dev/sda4/dev/sda5
Диск 2: /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb4
Диск 3: /dev/sdc1

Ця інформація повинна допомогти швидше вгадати, на якому розділі знаходиться  /boot.

Важливо, що якщо «вгадано» правильно, то буде завантажена рідна система так, як вона завантажувалася у штатному режимі.

Ручне завантаження ядра

Нехай для ручного завантаження вибрано розділ (hd0,4) – тобто sda2. Потрібно задати цей розділ як кореневу файлову систему:

grub> set root = (hd0,4)

Підключення модулів для роботи з ФС Ext2/3/4:

grub> insmod ext2

Для інших типів ФС необхідно підключати відповідні модулі: bfs, xfs чи zfs.

Підключення модуля  normal  для повноцінного запуску та роботи GRUB:

grub> insmod normal
grub> normal

Якщо після цих команд штатне завантаження не розпочнеться, залишається її продовжити вручну. Для цього потрібно спробувати знайти доступні ядра та вибрати потрібне для завантаження. Для цього слід ввести команду  linux /boot/vmlinuz та натиснути клавішу <Tab>:

grub> linux /boot/vmlinuz
Возможные файлы:
vmlinuz-4.18.0-20-generic vmlinuz-4.18.0-21-generic
grub> linux /boot/vmlinuz-4.18.0-2
Рис. 3: Визначення доступних ядер та вибір потрібного для завантаження за допомогою команди linux.

Як можна бачити, команда linux виявила у системі два ядра. І автоматично підготувала наступну команду до вибору потрібного. Залишається лише дописати “1-generic”, якщо потрібно завантажити ядро ​​версії 4.18.0-21-generic. Вказати кореневий розділ та виконати команду:

grub> linux /boot/vmlinuz-4.18.0-21-generic root=/dev/sda2

Важливо помітити, що вказується той самий кореневий розділ, що й у команді set root, лише у класичному форматі.

Далі потрібно вказати відповідний образ ядра. В якому міститься все необхідне для ініціалізації та створення програмного середовища для його роботи за допомогою команди initrd:

grub> initrd /boot/initrd.img-4.18.0-21-generic

Тепер все готово, можна виконати завантаження:

grub> boot

Якщо все зроблено правильно і вибрано потрібний розділ завантаження, то буде завантажено «рідну» систему так, як це відбувається у штатному режимі. Адже все, що було зроблено вручну – це основний набір команд, які зберігаються у файлі  /boot/grub/grub.cfg і виконуються GRUB автоматично.

Далі, у завантаженій системі неважко відновити роботу завантажувача за допомогою інструкцій, наведених вище.

Висновок

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

Якщо помітили помилки чи неточності, будь ласка, залишіть коментар чи напишіть листа на поштову адресу [email protected]

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *