Эстетическое редактирование grub.cfg

10

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

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

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

A
B
C
D

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

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

Спасибо

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

A
B

--Другие -
C
D

Malabarba
источник
Вы хотите внести все изменения в grub.cfg ? если вы запускаете update-grub для его автоматической генерации, вы, вероятно, захотите отредактировать сценарии в /etc/grub.d ; см. superuser.com/questions/102692/… для краткого обзора.
Квик-кихот
@ ~ шарлатан: это немного помогает, и довольно информативно. Я все еще надеюсь на способ скрыть пункты меню или, по крайней мере, поместить разделитель между ними.
Малабарба
Итак, я думаю, просто удалить старые ядра не вариант?
Бобби

Ответы:

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 .


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


Ресурсы:

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

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

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

шарлатан
источник
Вау, спасибо за ответ. Стыдно видеть, что некоторые функции не добрались до этой версии. Я уже пытался вставить разделитель, он не работал, потому что я оставил его пустым между скобками. Все выше, кажется, работает. Еще раз спасибо.
Малабарба
@D Connors - да, в Grub1 я скучал по нескольким вещам, но в целом я думаю, что Grub2 - это улучшение. у него есть своя собственная кривая обучения. Я ожидаю, что разработчики приложили больше усилий к графическим возможностям Grub2 за счет текстового меню, но, возможно, это изменится по мере развития проекта.
Квик-кихот
5

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

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

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

menuentry " -----------------------------------------------------------" {
  true
}
MarSoft
источник
0

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

ajackbot
источник
Я редко использую их для устранения неполадок, когда мне случается испортить текущую установку. Кроме того, ядра были только примером, у меня также есть 3 других загрузочных раздела, которые я хотел бы скрыть, но все еще иметь их в наличии.
Малабарба
(чтобы избежать путаницы. Когда я сказал «скрыть», я не имел в виду «скрыть раздел», я имел в виду только «скрыть соответствующую запись ОС из меню загрузки»)
Малабарба