Где установлен grub и нужен ли мне новый для отдельной установки Linux?

(возможно) более простой вариант принятого ответа:

  1. Используйте set -e , чтобы вызвать сбой одной команды для прерывания выполнения списка.
  2. Просто перечислите свои команды.
  3. Используйте оператор if - then - else для выполнения ваших команд обработки ошибок. Этот последний кусок немного сложен. Смотрите:
set -e
if
    cmd1                        # e.g.,     cd foo
    cmd2                        # e.g.,     rm a
    cmd3                        # e.g.,     cd bar
    cmd4                        # e.g.,     rm b
then
    set +e
    commands to do upon success (if any)
else
    set +e
    myfunc
    other commands to do upon failure (if any)
fi

Сложность заключается в том, что вы помещаете свои команды в if часть из if - затем - else , не часть , затем или часть else . Напомним, что синтаксис оператора if равен

if list; then list; [ elif list; then list; ] ... [ else list; ] fi
   ↑↑↑↑
set -e

сообщает оболочке, что if cmd1 (cd foo) не выполняется, он не должен продолжать выполнение cmd2 (rm a), и так далее по строке. Если это произошло с командой на самом внешнем уровне сценария оболочки, оболочка завершит работу. Однако, поскольку cmd1 · cmd2 · cmd3 · cmd4 является (составным) списком, следующим за if , сбой любой из этих четырех команд просто вызывает сбой всего списка - , что вызывает выполнение предложения else. Если все четыре команды выполнены успешно, условие then выполняется.

В любом случае первое, что вам следует сделать, это, вероятно, отключить {{1} } (отключите) параметр e , выполнив set + e . В противном случае сценарий может вылететь из воды , если команда в myfunc не работает.

set -e определен и описан в спецификации POSIX .

6
24.08.2016, 00:51
3 ответа

Соглашение об именах:

  • GRUB (его часть) остается в MBR.

  • GRUB (остальное) - это несколько загружаемых файлов из / boot / grub (например: это красивое изображение, которое появляется в качестве фона в GRUB, не сохраняется в MBR)

Примечания:

  • Ответ касается настройки MBR, GRUB можно использовать в других настройках.

  • В настройке EFI все становится непросто, можно использовать GRUB, но также можно использовать само ядро ​​в качестве собственной заглушки EFI.


GRUB (часть его) установлен в MBR. MBR - это первые 512 байтов на диске. MBR также используется таблицей разделов диска, поэтому сам GRUB имеет несколько меньше места, чем 512 байт.

GRUB (часть его) внутри MBR загружает более полный GRUB (остальную часть) из другой части диска, которая определяется во время установки GRUB в MBR ( grub-install ) . Поскольку MBR GRUB необходимо найти свой аналог на диске, который обычно находится в / boot , раздел, на котором находится основной GRUB, не может находиться слишком далеко от таблицы разделов (часто 512 МБ , но может различаться).

Очень полезно иметь / boot в качестве отдельного раздела, поскольку оттуда можно управлять GRUB для всего диска.

Что это означает:

  • GRUB в MBR может загружать только один GRUB (остальную часть) с диска.

  • Этот конкретный GRUB (остальная часть) на диске должен быть настроен для поиска всех операционных систем на машине.


Команда grub-mkconfig -o /boot/grub/grub.cfg запускает os-prober (если может его найти), который сканирует все разделы и выдает сообщение grub.cfg , указывающий на все ОС.

Поэтому, если у вас есть несколько разделов с / boot (или эквивалентами MS Windows, я их не знаю, но os-prober знает), то os-prober найдет их и соответственно создаст grub.cfg . Выполнение grub-install устанавливает GRUB (его часть) в MBR, который указывает на GRUB текущей работающей ОС с текущим grub.cfg .

Что это означает:

  • Вам нужен только один GRUB для всей системы.

  • У вас могут быть разные GRUB на разных дисках (поскольку у них разные MBR), но это имеет смысл только в том случае, если вы планируете удалить диск.

  • Вы можете управлять загрузкой всех операционных систем из одной установки GRUB.

  • На одном диске вы всегда должны запускать grub-install только из одной ОС! Это важно, иначе вы продолжите перезаписывать свой config.

12
27.01.2020, 20:20

Grub не привязан к конкретной ОС. Он может находиться в своем частном разделе, хотя обычно он устанавливается вместе с основной файловой системой. Но чтобы он мог загрузить вашу систему (системы), он должен знать о них. Поэтому вам необходимо обновить Grub после любых важных изменений в системах, присутствующих на вашем компьютере, таких как установка новой ОС или обновление ядра. Если вы удалите единственный существующий Grub, вы не загрузите свою систему (ы). На одной машине может быть много личинок, но только один является основным или активным. Помимо Grub, можно использовать другие загрузчики (вместо Grub). Windows имеет собственный загрузчик, который можно установить как основной для всей машины.

3
27.01.2020, 20:20

Чтобы уточнить: вы используете grub2 , правильно?

Если Grub2 установлен в своем собственном загрузочном разделе, вам не нужно ничего менять. Когда это не так (что было бы действительно странно), вы можете технически сохранить grub.cfg , а если он есть в вашем дистрибутиве, также /etc/grub.d . Однако

/ boot должен быть его собственным разделом. Если вы запустите mount и увидите что-то вроде этого:

/dev/sda1 on /boot type ext4 (rw,relatime,seclabel,stripe=4,data=ordered)

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

В случае возникновения ужасных ситуаций

Загрузите GParted , поместите его на USB-накопитель, загрузитесь с него и смонтируйте раздел / boot .

Затем просто запустите от имени пользователя root (или с помощью sudo ):

grub-mkconfig -o /boot/grub/grub.cfg

Grub2 должен иметь возможность автоматически определять ваши разделы и действовать соответственно.

(На данный момент я не уверен, нужно ли монтировать все разделы, чтобы Grub2 обнаружил на них ОС)

Если вы тем временем пытались установить Windows, это может быть Windows перезаписал загрузчик. Чтобы исправить это, просто запустите как root (или с помощью sudo ):

grub-install /dev/sdX

, где / dev / sdX - это диск, на котором находится ваш загрузочный раздел.


Небольшое пояснение:

Grub2 - это загрузчик этапа 2 .Это означает, что это не совсем операционная система, но она намного сложнее, чем простой загрузчик цепи, который поместился бы в первые 446 байт вашего основного раздела (остальная часть первого сектора - это таблица разделов, флаги и т. Д.).

MBR содержит только код для выполнения кода Grub2, который находится в вашем разделе / boot . Затем Grub2 либо chainloads в другой раздел (например, для загрузки Windows, поскольку он устанавливает свой собственный загрузчик), но он также может запускать код (такие как memtest ), либо получить доступ и запустите образ ядра и модуля ( vmlinuz ).

Что важно отметить, так это то, что в обоих случаях Grub2 выгружается из памяти при запуске ядра или при загрузке другого раздела.

10
27.01.2020, 20:20

Теги

Похожие вопросы