В данной статье рассматривается процесс восстановления загрузчика GRUB 2.
Причины, по которым может понадобится восстановить GRUB, могут быть разными.
Очень часто требуется восстанавливать GRUB после установки Windows. Если у вас был установлен Linux и вы установили в соседний раздел или на соседний диск Windows, то после перезагрузки компьютера загрузится Windows, как будто Linux вообще пропал. Загрузчик GRUB даже не появился. Иногда подобное происходит при обновлении существующего Windows.
Иногда требуется восстановление GRUB после установки Linux, когда неверно был выбран раздел для установки загрузчика.
Во всех случаях нужно выполнить восстановление загрузчика GRUB. Существуют разные способы восстановления. В данном руководстве рассматривается процесс использованием загрузочного Live-образа Linux. Загрузившись в Live-систему вам нужно будет ввести несколько команд, чтобы выполнить восстановление. Рассматривается способ восстановления без использования сторонних программ.
Также иногда различают процесс восстановления для систем с BIOS и с UEFI. Описанный ниже способ рассматривает оба этих случая. Я тестировал его как на компьютерах с традиционным BIOS, так и с UEFI.
Подготовка
Для восстановления GRUB потребуется загрузочный диск или флешка с дистрибутивом Linux. Если у вас его нет, то нужно скачать образ с дистрибутивом. Например, можно скачать ISO образ Ubuntu.
Для создания загрузочной флешки можно воспользоваться программой Etcher. Она работает в Linux, Windows и MacOS. Подробная инструкция: Как создать загрузочную флешку.
Загрузка в Live-режиме
Теперь нужно загрузиться с созданного диска или флешки.
Чтобы это сделать сначала нужно в BIOS выбрать приоритет загрузки с CD/DVD или с USB (если вы используете флешку).
На современных компьютерах, где используется BIOS/UEFI, для входа в BIOS нужно при включении компьютера удерживать специальную клавишу. У разных производителей клавиша может быть разной. Обычно это: F2, Del, F10, Esc, F11 или F3.
На старых компьютерах, где используется классический BIOS, чтобы войти в BIOS нужно при загрузке компьютера, в самом начале, когда появляется логотип материнской платы, нажать специальную клавишу. Для разных материнских плат клавиша может быть разной. Обычно это одна из клавиш: Del, F1, F2, F8, F10 или какая-нибудь другая, или даже сочетание клавиш. Подробности: Настройка BIOS для загрузки с CD/DVD-диска или с USB-носителя
Открываем терминал
Итак, вы загрузились в Live-режиме. Теперь нужно открыть терминал.
В Ubuntu и некоторых других дистрибутивах это можно сделать нажатием сочетания клавиш Ctrl+Alt+T. Или запустить терминал через меню программ.
Определение разделов
Теперь нужно определить раздел диска, на котором был установлен GRUB.
Выведем список разделов, для этого выполняем команду (в конце команды стоит строчная буква L):
sudo fdisk -l
Вывод fdisk для BIOS
Пример вывода команды:
В моем случае мы видим 2 диска: /dev/sda (SSD диск) и /dev/sdb (флешка, с которой сейчас загружена Live-система).
Нас интересует диск /dev/sda. На диске /dev/sda создано несколько разделов. В моем случае /dev/sda4, на котором установлен Windows, а также 4 раздела с пометкой Linux (см. последний столбец таблицы). У вас скорее всего может быть один раздел Linux (корневой раздел) или два раздела (корневой и home). На одном из этих разделов установлен GRUB.
То есть из таблицы вы должны определить какой раздел является корневым, на нем скорее всего у вас установлен GRUB. В моем случае GRUB установлен в раздел /dev/sda2. Далее по тексту я буду его использовать (вы должны будете указывать свой раздел).
Иногда бывает, что для загрузчика GRUB выделен отдельный раздел (он называется boot-раздел). Если это так, то на следующем шаге вам нужно будет примонтировать корневой раздел и раздел с загрузчиком.
Вывод fdisk для UEFI
Для новых компьютеров с UEFI вывод команды fdisk -l может быть примерно следующим:
Нам нужно определить, на каком разделе установлен Linux (корневой раздел), а также определить EFI-раздел. В моем случае это разделы: /dev/nvme0n1p5 и /dev/nvme0n1p1, которые расположены на диске /dev/nvme0n1.
Монтирование разделов
Примонтируем корневой раздел. Выполняем команду (вместо /dev/sda2 вы должны указать свой раздел):
sudo mount /dev/sda2 /mnt
Мы примонтировали раздел /dev/sda2 в директорию /mnt.
Если для загрузчика у вас выделен отдельный раздел, то нужно примонтировать еще и его (вместо /dev/sdX укажите ваш boot-раздел):
sudo mount /dev/sdX /mnt/boot
Теперь можно посмотреть содержимое директории /mnt, чтобы убедиться, что мы примонтировали верный раздел:
ls /mnt
Вывод команды должен быть примерно следующим. Обратите внимание есть ли в этом списке каталог /boot, так как именно в нем установлен GRUB.
Также можно проверить, что директория boot не пустая:
ls /mnt/boot
У меня вывод команды выглядит следующим образом. Обратите внимание на присутствие каталога с именем grub.
Далее нужно создать ссылки на несколько директорий, к которым GRUB должен иметь доступ для обнаружения всех операционных систем. Для этого выполните команды:
sudo mount --bind /dev /mnt/dev
sudo mount --bind /dev/pts /mnt/dev/pts
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
Монтирование EFI-раздела
Если у вас используется UEFI, то еще нужно примонтировать EFI-раздел в директорию /mnt/boot/efi (выше я указал пример вывода команды fdisk -l в котором показан EFI-раздел):
sudo mount /dev/nvme0n1p1 /mnt/boot/efi
Выполняем chroot на /mnt
На предыдущем шаге мы смонтировали все необходимые директории в директорию /mnt. Теперь переключимся (выполним chroot) на данную директорию. Выполняем команду:
sudo chroot /mnt
Генерация файла конфигурации GRUB
Данный шаг нужно выполнять не всем. Если у вас был установлен GRUB и вы уверены, что его конфигурация верная, то можно перейти к следующему шагу.
Для генерации файла конфигурации GRUB используется команда update-grub. Данная команда автоматически определяет файловые системы на вашем компьютере и генерирует новый файл конфигурации. Выполняем команду:
sudo update-grub
В выводе команды будет показано, какие операционные системы были найдены.
Если вдруг утилита update-grub не определила ваш Windows (у меня такое было для UEFI), то можно будет запустить update-grub повторно уже из вашей Linux-системы, когда вы в нее загрузитесь (мне это помогло и Windows определился).
Устанавливаем GRUB
Осталось выполнить установку GRUB на диск. Мы определили раздел на котором у нас установлен GRUB на первом шаге данного руководства. В моем случае это раздел /dev/sda2, который расположен на диске /dev/sda.
Для установки GRUB используется команда grub-install, которой нужно передать в качестве параметра диск, на который будет выполняться установка (в моем случае это диск /dev/sda):
grub-install /dev/sda
Перезагрузка компьютера
Выходим из окружения chroot, для этого выполняем команду:
exit
Отмонтируем все разделы, которые мы примонтировали:
sudo umount /mnt/sys
sudo umount /mnt/proc
sudo umount /mnt/dev/pts
sudo umount /mnt/dev
Если вы монтировали boot-раздел, то его тоже нужно отмонтировать:
sudo umount /mnt/boot
Если вы монтировали EFI-раздел, отмонтируем:
sudo umount /mnt/boot/efi
Отмонтируем корневой раздел:
sudo umount /mnt
Перезагружаем компьютер. Для этого выполняем команду:
reboot
Если во время перезагрузки компьютера меню GRUB не появилось, то это еще не значит, что он не восстановился. Возможно, просто установлена нулевая задержка и меню не показывается. Чтобы показать меню GRUB нужно во время загрузки, после того, как появился логотип материнской платы:
- удерживать клавишу Shift, если у вас классический BIOS;
- нажать Esc, если у вас UEFI.
Если у вас, при выполнении grub-update, не определился Windows и не был добавлен в меню GRUB, то уже загрузившись в вашу систему Linux (не LiveCD), откройте терминал и выполните:
sudo grub-update
Мне это помололо на компьютере, который использует UEFI.
Шпаргалка
Мы рассмотрели процесс восстановления загрузчика GRUB 2. Для удобства привожу краткую шпаргалку по командам, которые мы выполняли. Учитывайте, что названия и имена разделов (/dev/sd...) у вас могут отличаться.
sudo fdisk -l
sudo mount /dev/sda2 /mnt
# sudo mount /dev/sdaX /mnt/boot
# sudo mount /dev/sdaY /mnt/boot/efi
sudo mount --bind /dev /mnt/dev && sudo mount --bind /dev/pts /mnt/dev/pts && sudo mount --bind /proc /mnt/proc && sudo mount --bind /sys /mnt/sys
sudo chroot /mnt
sudo update-grub
grub-install /dev/sda
Комментарии
21:54
21:25
06:14
Надо бы было уточнить, что это для deb-подобных дистрибутивов (Ubuntu, Mint...).
В Arch, команда восстановления будет другой:
sudo grub-mkconfig -o /boot/grub/grub.cfg
И размонтировать всё присоединённое можно одной командой:
sudo umount -R /mnt
20:23
20:52
11:26
mint@mint:~$ sudo mount /dev/sda4 /mnt
mint@mint:~$ sudo mount --bind /dev /mnt/dev
mint@mint:~$ sudo mount --bind /dev/pts /mnt/dev/pts
mint@mint:~$ sudo mount --bind /proc /mnt/proc
mint@mint:~$ sudo mount --bind /sys /mnt/sys
mint@mint:~$ sudo chroot /mnt
root@mint:/# sudo update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/50_linuxmint.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.0.0-17-generic
Found initrd image: /boot/initrd.img-5.0.0-17-generic
Found linux image: /boot/vmlinuz-5.0.0-16-generic
Found initrd image: /boot/initrd.img-5.0.0-16-generic
Found linux image: /boot/vmlinuz-4.15.0-20-generic
Found initrd image: /boot/initrd.img-4.15.0-20-generic
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
Adding boot menu entry for EFI firmware configuration
done
root@mint:/# grub-install /dev/sda
Installing for i386-pc platform.
grub-install: warning: this GPT partition label contains no BIOS Boot Partition; embedding won't be possible.
grub-install: warning: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..
grub-install: error: will not proceed with blocklists.
20:22
11:44
mint@mint:~$ sudo mount /dev/sda1 /mnt
mint@mint:~$ ls /mnt
EFI
mint@mint:~$ sudo fdisk -l
Disk /dev/loop0: 1.8 GiB, 1890041856 bytes, 3691488 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: F2B6A3FB-7460-4422-B2FC-33A98A9895F5
Device Start End Sectors Size Type
/dev/sda1 2048 206847 204800 100M EFI System
/dev/sda2 206848 468991 262144 128M Microsoft reserved
/dev/sda3 468992 475138047 474669056 226.3G Microsoft basic data
/dev/sda4 475138048 592324607 117186560 55.9G Linux filesystem
/dev/sda5 592324608 608325631 16001024 7.6G Linux swap
/dev/sda6 608325632 976771071 368445440 175.7G Linux filesystem
11:48
mint@mint:~$ ls /mnt
bin dev initrd.img lib64 mnt root srv tmp vmlinuz
boot etc initrd.img.old lost+found opt run sys usr vmlinuz.old
cdrom home lib media proc sbin timeshift var
mint@mint:~$
mint@mint:~$ sudo mount /dev/sda1 /mnt
mint@mint:~$ ls /mnt
EFI
10:20
15:57
02:13
17:31
12:35
08:58
15:29
16:05
22:44
13:40
14:02
15:40
« sudo grub2-install /dev/sd* » - для восстановления(установки) загрузчика на диске «*» и потом(возможно
«sudo grub-mkconfig -o /boot/grub/grub.cfg» - для обновления GRUB (=update-grub)
22:52
16:14
20:37
16:04
17:42
16:06
12:47
00:13
10:45
Не получаеться
Вот мои диски
Disk label type: dos
Disk identifier: 0x495ee280
Deuice Boot StartEnd Sectors Size Id Type
/deu/sdbl2048 2097141155 2097139108 1000G 8e Linux LUM
Disk /deu/sda: 1000 GiB, 1073741824000 bytes, 2097152000 sectors
Disk model: UMuare Uirtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x495ee286
DeuiceBootStartEndSectorsSizeIdType
/deu/sda1*2048409599940939522G83Linux
/deu/sda2409600020971411552093045156998G8eLinuxLUM
Disk /deu/mapper/homeug-home: 999.97 GiB, 1073708269568 bytes, 2097086464 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /deu/mapper/rootug-swap: 57.75 GiB, 62008590336 bytes, 121110528 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /deu/mapper/rootug-root: 940.25 GiB, 1009585750016 bytes, 1971847168 sectors
Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes CrootPlocalhost /]#
Выполняю монтирование
IrootGlocalhost /]# mount /deu/sda2 /mnt/boot mount: /mnt/boot: no filesystem type specified.
IrootGlocalhost /]# mount /deu/sdal /mnt/boot mount: /mnt/boot: mount point does not exist.
IrootGlocalhost /]#
05:12
03:16
как лечить убунту 20.04
21:45
Админ, позвольте спросить, вы вводите команду grub-install /dev/sda (где dev/sda - весь диск). Я ввёл также. Но думаю, раз у меня efi-биос, может мне нужно было вместо всего диска указать efi-раздел?
13:17
sudo mount -o subvol=@ /dev/nvme0n1p2 /mnt
sudo mount /dev/nvme0n1p1 /mnt/boot/efi
sudo manjaro-chroot /mnt /bin/bash
grub-install /dev/nvme0n1
grub-mkconfig -o /boot/grub/grub.cfg
Без manjaro-chroot у вас не будет ошибка "(/dev смонтирован?)"
13:27
19:40
Если попытаться сделать просто "sudo chroot /mnt" вместо manjaro-chroot, то при попытке сделать grub-install /dev/sda будет показана эта ошибка с текстом про "/dev смонтирован?"
Так как /dev устройства при просто chroot не будут смонтированы и папка будет пуста.
Поэтому нужно установить и выполнить именно manjaro-chroot, как написал выше
11:26
21:14
14:37
15:41
Погуглив нашёл ответ что в системный файл /etc/default/grub нужно добавить или раскомментировать строку "GRUB_DISABLE_OS_PROBER=false". И я не могу сохранить файл. Большинство ответов гугла подразумевает запуск линукса с внутреннего накопителя, а не с флешки.
Как можно изменить системный файл в запущенным дистрибутивом с флешки?
19:18
18:19
Restore installed system settings - это небольшая программа, которая через графический интерфейс поможет восстановить загрузчик автоматически. Может кому-то будет легче так, чем через консоль.