Я хочу иметь отдельную запись в меню загрузки при загрузке. Единственное отличие - это значение GRUB_CMDLINE_LINUX_DEFAULT. Исходная (первая) загрузка имеет пустое значение для GRUB_CMDLINE_LINUX_DEFAULT, а вторая запись имеет значение, которое передается ядру.
Короче говоря, я хочу иметь две записи в меню загрузки, единственное отличие которых - аргументы ядра. Я копался в /etc/grub.d, но не нашел другого пути, кроме грубого взлома в /etc/grub.d.
Два способа:
sudo apt update && sudo apt install grub-customizer
Перейдите в /etc/grub.d/proxifiedScripts
и добавьте пользовательскую запись с именем custom1 (вы можете скопировать конфигурацию из записи по умолчанию в / boot / grub / grub .cfg)
cd /etc/grub.d/proxifiedScripts sudo leafpad custom1 & amp;
Например, запись custom1 может выглядеть следующим образом, и вы можете настроить параметры загрузки по умолчанию в строке, которая начинается с linux
menuentry "Custom Gnu/Linux"{
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_msdos
insmod ext2
set root='hd0,msdos5' [YOUR CORRESPONDING ROOT LOCATION]
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=[YOUR CORRESPONDING ROOT LOCATION] --hint-efi=[YOUR CORRESPONDING ROOT LOCATION] --hint-baremetal=ahci0,msdos5 [UUID of / partition]
else
search --no-floppy --fs-uuid --set=root [UUID]
fi
echo 'Loading Linux custom1 ...'
linux /boot/[your vmlinuz] root=UUID=[UUID] ro initrd=/install/gtk/initrd.gz quiet splash acpi_osi=linux
echo 'Loading initial ramdisk ...'
initrd /boot/[your initrd.img]
}
Затем вам нужно отредактировать (или создать, если его там нет) 40_custom_proxy
в /etc/grub.d/
t
#!/bin/sh
#THIS IS A GRUB PROXY SCRIPT
'/etc/grub.d/proxifiedScripts/custom1' | /etc/grub.d/bin/grubcfg_proxy "-*
-#text
+'Custom1 Gnu/Linux'~f993006fab178e9acbf3ae439d2495c0~
и, наконец, запустите sudo grub-mkconfig
и sudo update-grub
Однако я бы порекомендовал вариант 1, так как он чище, быстрее и проще.
Я решил эту проблему, перезапустив /etc/grub.d/10_linux из /etc/grub.d/40_linux и выбрав пункт меню.
Первая часть - /etc/grub.d/40_linux
#!/bin/sh
. /etc/default/grub
export GRUB_DISABLE_RECOVERY=true
export GRUB_DISABLE_SUBMENU=y
export GRUB_CMDLINE_LINUX_DEFAULT=$GRUB_CMDLINE_LINUX_DEFAULT_ALT
/etc/grub.d/10_linux | python3 /usr/local/bin/extract-menuentry.py
Итак, я могу перезапустить 10_linux с помощью альтернативной командной строки.
Вставьте GRUB_CMDLINE_LINUX_DEFAULT_ALT в / etc / default / grub. (В моем случае, «aufs = tmpfs»)
И написал скрипт на python, чтобы выбрать пункт меню. (в моем случае это /usr/local/bin/extract-menuentry.py).
#!/usr/bin/env python3
import os, sys, re
menuentry_start = "menuentry"
def extract_menuentry(infile):
in_menuentry = False
for line in infile.readlines():
if in_menuentry:
if line.strip() == "}":
in_menuentry = False
print(line.rstrip())
pass
else:
print(line.rstrip())
pass
pass
else:
if line.startswith(menuentry_start):
in_menuentry = True
match = re.search(r"menuentry '[^']+' (.*)", line)
print("menuentry '%s' %s" % (os.environ.get('GRUB_ALT_NAME', 'Ubuntu alt'), match.group(1)))
pass
pass
pass
pass
if __name__ == "__main__":
extract_menuentry(sys.stdin)
pass
Вот что я сделал 16.04:
Сначала добавьте запись для вашей альтернативной команды строка в / etc / default / grub
1 :
export GRUB_CMDLINE_LINUX_2="quiet splash mitigations=off"
Конечно, измените содержимое, чтобы отразить нужные аргументы! Обратите внимание на , что вам нужен экспорт
, как показано, даже несмотря на то, что существующим переменным GRUB_CMDLINE ...
он не нужен: потому что существующие известные переменные экспортируются в другое место внутри grub-mkconfig
.
Во-вторых, отредактируйте /etc/grub.d/10_linux
, чтобы добавить новую строку linux_entry
, которая будет генерировать ваш новый пункт меню. То, где вы поместите это в файл, определяет, где он будет отображаться, но чтобы он отображался прямо под первым параметром по умолчанию, но он здесь:
if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; then
linux_entry "${OS}" "${version}" simple \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
# START
linux_entry "${OS} (mitigations off)" "${version}" simple \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_2}"
# END
Вновь добавленный материал находится между # START
и # END
и запись непосредственно выше - существующая, которая генерирует параметр по умолчанию. Вы можете скопировать предыдущую запись, но изменить GRUB_CMDLINE_LINUX_DEFAULT
на GRUB_CMDLINE_LINUX_2
и дать ему уникальное имя (в моем случае я добавил (смягчение последствий отключено}
) .
Теперь эта запись меню будет сгенерирована так же, как запись по умолчанию, за исключением использования других аргументов командной строки. Вы также можете добавить к аргументам по умолчанию с дополнительными аргументами вместо их замены, что на самом деле то, что я сделал, например:
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} ${GRUB_CMDLINE_EXTRA}"
где $ {GRUB_CMDLINE_EXTRA}
- дополнительные аргументы, которые мне нужны в дополнение к аргументам по умолчанию.
Запустите sudo update-grub
, и все готово.
1 Строго говоря, вам это не нужно: вы можете просто поместить значения прямо в 10_linux
linux_entry
на следующем шаге, но это немного проясняет ситуацию и позволяет при желании создавать несколько записей в новой командной строке. Одна из проблем заключается в том, что иногда могут возникать конфликты слияния при обновлении / etc / default / grub
(как правило, их должно быть легко разрешить: вам просто нужен файл по умолчанию плюс экспорт ...
строка).