GRUB2 - создайте вторую загрузочную запись с различными параметрами командной строки ядра в GRUB_CMDLINE_LINUX_DEFAULT

Я хочу иметь отдельную запись в меню загрузки при загрузке. Единственное отличие - это значение GRUB_CMDLINE_LINUX_DEFAULT. Исходная (первая) загрузка имеет пустое значение для GRUB_CMDLINE_LINUX_DEFAULT, а вторая запись имеет значение, которое передается ядру.

Короче говоря, я хочу иметь две записи в меню загрузки, единственное отличие которых - аргументы ядра. Я копался в /etc/grub.d, но не нашел другого пути, кроме грубого взлома в /etc/grub.d.

0
задан 30 June 2019 в 22:33

3 ответа

Два способа:

  1. Быстрый, простой и с графическим интерфейсом: установите grub-customizer.

sudo apt update && sudo apt install grub-customizer

  1. Перейдите в /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, так как он чище, быстрее и проще.

0
ответ дан 30 June 2019 в 22:33

Я решил эту проблему, перезапустив /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
0
ответ дан 30 June 2019 в 22:33

Вот что я сделал 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 (как правило, их должно быть легко разрешить: вам просто нужен файл по умолчанию плюс экспорт ... строка).

1
ответ дан 11 January 2020 в 22:05

Другие вопросы по тегам:

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