Сброс загрузки Grub по умолчанию

У меня есть система с несколькими установками Red Hat на одном жестком диске. Я хотел бы автоматически выбрать установку по умолчанию для загрузки во время выполнения. Red Hat способ сделать это (который немного отличается от документации Grub) - войти в оболочку grub и сказать

savedefault --stage2=<Stage 2 File> --default=<default>

который сохраняется в указанный.

Я использую цепную загрузку, поэтому на диске есть несколько файлов grub.conf. Я хочу изменить только файл stage2, связанный с файлом, привязанным к MBR в / boot, а не отдельные файлы, связанные с самими установками. В жратве, если я скажу

find /boot/grub/stage2

or

find /grub/stage2

Я получаю действительные списки полных путей к задействованным разделам и файлам. В первом случае что-то вроде

(hd0,1)
(hd0,2)

а в последнем

(hd0,0)

Я хочу изменить последний случай. Однако, если я скажу

корень (hd0,0)

savedefault --stage2=/grub/stage2 --default=1

или варианты вроде

savedefault --stage2=(hd0,0)/grub/stage2
savedefault --stage2=(hd0,0)/boot/grub/stage2

или подобное, я получаю

Error 15: File not found

Я смутно подозреваю, что я неправильно монтирую раздел и что он, возможно, доступен только для чтения, как я делаю, но ничего, что я делаю, похоже, не меняет правильный файл stage2. Обратите внимание: если я просто скажу

savedefault --stage2=/boot/grub/stage2 --default=1

или оставьте параметр --stage2 = ... полностью выключенным, команда завершится успешно, но изменяет файл stage2 в разделе, из которого была загружена текущая операционная система, а не в том, который связан с MBR grub.conf, который фактически контролирует начальная загрузка.

Что мне здесь не хватает?


person SixDegrees    schedule 27.03.2015    source источник


Ответы (1)


Итак, похоже, ответ заключается в том, чтобы перебрать перебором файл grub stage2. Здесь хранится сохраненный пункт меню.

Устаревшая версия Grub гарантирует, что определенные переменные жестко запрограммированы в определенные места в этом файле (см. здесь). Обратите внимание, что эти смещения даны относительно 512-байтового смещения в случае stage2. В нашем конкретном случае мы хотим изменить номер сохраненной записи по смещению 0x200 + 0xC. Чтобы изменить его на 1, мы говорим

printf '\x01' | dd conv-notrunc of=/boot/grub/stage2 bs=1 seek=$((0x20c))

и при следующей перезагрузке grub автоматически выберет пункт меню 1.

Это то, что должна делать команда grub-set-default, но она отсутствует в дистрибутивах Redhat, и альтернативное «исправление», описанное выше, не работает.

person SixDegrees    schedule 28.03.2015