10

РЕДАКТИРОВАТЬ: (для ясности) я хочу изменить внешний вид загрузочного меню grub, отредактировав файлы конфигурации (возможно, но не обязательно grub.cfg).

Итак, любой пользователь Ubuntu знает, как заполняется меню загрузки после нескольких обновлений ядра. Во времена menu.lst вы могли настроить меню, чтобы скрыть ненужные параметры, но при этом оставить их доступными.

Например, если ваше меню grub выглядело так:

A
В
С
D

Вы можете сделать параметры C и D невидимыми, вставив пустой параметр между B и C. Таким образом, параметры C и D не будут видны при загрузке, но станут видимыми, если вы прокрутите их до конца в меню загрузки.

Попытка того же самого трюка в grub.cfg не привела ни к какому результату. Итак, я ищу способ достичь того же результата с помощью нового меню grub, отредактировав файл grub.cfg. Другие эстетические настройки также приветствуются.

Спасибо

РЕДАКТИРОВАТЬ 2: Если скрыть пункты меню невозможно, я бы хотел добавить разделитель между ними, чтобы меню выглядело так:

A
В

--Others--
С
D

3 ответа3

8

Во-первых, понять, как Ubuntu настраивает Grub2.

  • /boot/grub/grub.cfg - это меню Grub2
  • команда update-grub автоматически генерирует этот файл
  • ... читая настройки по умолчанию из /etc/defaults/grub
  • ... и запуска скриптов в /etc/grub.d

Итак, если вы не хотите редактировать grub.cfg после каждого обновления ядра, вы хотите настроить скрипты в /etc/grub.d, чтобы ваши изменения применялись каждый раз, когда запускается update-grub .


Во-вторых, чтобы ответить на ваш первый вопрос напрямую, я не знаком с какими-либо способами сделать определенные параметры загрузки невидимыми, но все же доступными через меню Grub. В Grub1 есть много мелочей, которые не были переопределены в Grub2, и меня не удивит, если это будет одна из них.

Вместо этого вы можете сделать все пункты меню невидимыми (пока они не будут выделены), установив цвет шрифта меню таким же, как цвет фона. В /etc/grub.d/05_debian_theme измените menu_color_normal так, чтобы первый цвет (шрифт) соответствовал второму цвету (фон). Оставьте menu_color_highlight другим, чтобы отображалась запись под курсором.

# example from a likely-tweaked Karmic /etc/grub.d/05_debian_theme
set menu_color_normal=white/black
set menu_color_highlight=black/white

# ...to this
set menu_color_normal=black/black
set menu_color_highlight=black/white

Получение разделителя в меню Grub.

В Grub1 вы добавляете новую запись, подобную этой. Насколько я помню, вам нужно было корневое объявление, чтобы сделать его действительным пунктом меню, иначе Grub1 проигнорировал его.

# separator
title  --------------------
root

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

# basic example
menuentry "Memory test (memtest86)" {
        linux   /boot/memtest86+.bin
}

Так как «что-нибудь» в двойных кавычках отображается как заголовок, вы можете подделать разделитель с этим. Как и Grub1, Grub2 хочет, чтобы ключевое слово linux рассматривало его как реальную запись меню, поэтому будьте осторожны, чтобы случайно не выбрать его.

# a separator!  no, really!
menuentry "....." {
        linux   /boot/memtest86+.bin
}

К сожалению, "ничего" не означает ничего; в то время как я проверял это, я пробовал длинную строку черт ("----------------"), и это никогда не работало. Но ему нравится короткая цепочка точек, показанная выше, так что вы можете использовать это.

.....

Теперь, как сделать один разделитель. Чтобы собрать и разместить их там, где вы хотите их автоматически, вам нужно добавить их в сценарии в /etc/grub.d.

Для этого примера давайте поместим простой разделитель между различными разделами grub.cfg. Если вы посмотрите на /etc/grub.d, вы увидите следующие скрипты:

  • 00_header
  • 05_debian_theme
  • 10_linux - записи для ядер Ubuntu и восстановления
  • 20_memtest86+ - запись для Memtest86+
  • 30_os-prober - записи для Windows и других дистрибутивов Linux
  • 40_custom - ничего по умолчанию; специальные записи пользователя могут идти здесь

Мы создадим новый скрипт, разделитель и поместим в него следующее:

#!/bin/sh
# create a separator menu entry
cat << EOF
menuentry "....." {
  linux /boot/memtest86+.bin
}
EOF

Теперь переместите этот сценарий на место для первого разделителя и свяжите его на месте для остальных. Сценарии выполняются по порядку, поэтому, если вы хотите, чтобы первый был перед 10_linux, назовите его 09_separator или что-то в этом роде.

cd /etc/grub.d

# start the editor, paste in the script above, save, and exit
sudo nano separator

# set executable
sudo chmod +x separator

# rename into the first position
mv separator 09_separator

# link into remaining positions (can also use cp)
ln -s 09_separator 19_separator
ln -s 09_separator 29_separator
# not really necessary since 40_custom is empty by default
ln -s 09_separator 39_separator

Если в /etc/default/grub определена определенная запись по умолчанию, вам может потребоваться ее обновить - Grub2 начинает считать пункты меню с 0, и каждый из этих "разделителей" является действительной записью, поэтому они тоже учитываются. Если ваша предыдущая запись по умолчанию была 0, и вы добавили один разделитель перед ней, не забудьте изменить GRUB_DEFAULT на 1

Теперь запустите update-grub и изучите /boot/grub/grub.cfg - там вы увидите разделители. Если вы это сделаете, перезагрузите компьютер и проверьте их.

....

Если вы хотите разместить разделители в другом месте, скажем, между разными версиями ядра, вам нужно будет отредактировать 10_linux (или другой скрипт) напрямую и найти подходящее место для добавления разделителя. Вы можете использовать строки из сценария выше; включите все, кроме первого #!/bin/sh line.


Если вы хотите что-то красивее, используйте заставки Grub или темы. Я должен дать вам raincheck на эти темы, но проверьте ресурсы ниже.


Ресурсы:

На UbuntuForum есть два больших руководства по Grub2, которые я знаю и люблю:

GNU Grub 2 - еще один замечательный ресурс. У него есть набор скриптов для настройки Grub2 от Karmic (полное раскрытие: я их не пробовал).

Страница формата тем Grub Wiki обязательна для взлома тем Grub2.

4

Разделитель может быть сделан из тире, если его первым символом является пробел. Также нет необходимости использовать команду linux для разделителя разделов, вы можете использовать любую команду, подобную этой:

menuentry " -----------------------------------------------------------" {
  echo "It is just a separator, select another item!"
}

Или даже "правда", чтобы вернуться молча

menuentry " -----------------------------------------------------------" {
  true
}
0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .