Как навсегда изменить порядок, в котором '$ vt_handoff' встречается в командах ядра?

Ранее я пытался добавить параметр nomodeset в / etc / default / grub для решения другой проблемы, связанной с ненормальные способы загрузки моего ноутбука. Это не сработало. Поэтому я нажал «е» в меню личинки, чтобы удалить его. После входа в систему я вернул файл grub и обновил его.

Однако теперь, когда я перезапускаю, он останавливается на пустом экране с мигающим курсором. Я перезагрузил его и нажал «е» в меню личинки.Затем я изменил

[...] тихий всплеск $ vt_handoff к [...] ro $ vt_handoff тихий всплеск

, затем нажал F10, и он загрузился нормально, с меньшей графикой, чем до использования nomodeset . Проблема в том, что мне приходится делать это каждый раз при загрузке. Как сделать это последнее изменение постоянным?

PS: Мой ноутбук был и подвержен сбоям при воспроизведении видео в Ubuntu 18.04, а теперь и в 19.04 (при двойной загрузке с 18 и 19). В 18 я перезагружался, и после этого система работала нормально, однако в 19 она зависает сразу после выбора Ubuntu 19 в меню grub (после сбоя, при воспроизведении видео), и мне нужно переустановить его. Я знаю, что это, скорее всего, неправильный способ делать что-то, и предложения приветствуются.

Edit1: Как упоминалось в Как мне добавить параметр загрузки ядра? Я знаю, как добавить новые параметры, такие как nomodeset, в файл grub и, следовательно, изменить команды ядра навсегда, однако $ vt_handoff уже присутствует в командах ядра, но не в файле grub, поэтому я не понимаю, что делать, если удалить его или изменить его порядок в списке параметров?

0
задан 1 October 2019 в 06:11

1 ответ

Исходный код

Файл, который обрабатывает аспект создания конфигурации GRUB, которую вы хотите изменить, это /etc/grub.d/10_linux , а элемент $vt_handoff командной строки ядра обрабатывается дважды в его коде (начиная с версии, которую я сейчас использую установлен, v2.04).

  1. Во-первых (что более важно для желаемого результата, поскольку именно здесь обрабатывается размещение переменной $vt_handoff) во вложенном блоке if в строках 154-160:

    ...если [ "$vt_handoff" = 1 ]; тогда
    для слова в $GRUB_CMDLINE_LINUX_DEFAULT; делать
    если [ "$word" = всплеск ]; тогда
    GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT \$vt_handoff"
    фи
    Выполнено
    фи
    ...
    
  2. Затем снова во вложенном блоке if в строках 348-358, где принимается решение о том, какое значение установить для переменной $vt_handoff:

    ...
    установить gfxpayload="${1}"
    EOF
    если [ "$vt_handoff" = 1 ]; тогда
    кошка << 'ЕОФ'
    если [ "${1}" = "сохранить" ]; тогда
    установить vt_handoff=vt.handoff=7
    еще
    установить vt_handoff=
    фи
    EOF
    фи
    ...
    

Анализ

В первом примере, показанном выше, мы видим, как интерпретатор оболочки Dash объединяет значение $GRUB_CMDLINE_LINUX_DEFAULT, полученное из файла /etc/default/grub, с имя переменной $vt_handoff¹. Код в том виде, в каком он написан, выбирает добавление последнего к первому, но вместо этого вы можете сделать это так же просто, как изменить положение элементов в переназначенной переменной $GRUB_CMDLINE_LINUX_DEFAULT в строке 157. Тогда это будет выглядеть так: это:

...
    if [ "$word" = splash ]; then
      GRUB_CMDLINE_LINUX_DEFAULT="\$vt_handoff $GRUB_CMDLINE_LINUX_DEFAULT"
    fi
...

Это, безусловно, самый прямой способ добиться желаемого результата, хотя он не соответствует моему собственному определению «постоянного» решения, потому что этот файл будет перезаписываться каждый раз, когда ваша система устанавливает обновление для GRUB. В свете этого я бы посчитал это более точным «постоянным» решением, поскольку оно действительно будет выживать от одного цикла питания к другому в течение всего срока службы любого данного выпуска пакета GRUB, но не более того.

Потенциальные постоянные решения

Использование значения GRUB_GFXPAYLOAD_LINUX

Поскольку чаще всего рекомендуется «работать» с системами такими, какие они есть (когда это возможно), а не «работать против» них, я вижу одно потенциальное средство это делается во втором фрагменте кода из файла /etc/grub.d/10_linux, показанного выше. В частности, мы видим, что логика скрипта оценивает позиционный параметр и активирует переменную $vt_handoff, только если ее значение равно 'keep'. Рассматриваемый параметр (через несколько уровней запутывания логики оболочки) на самом деле является значением для GRUB_GFXPAYLOAD_LINUX , которое указано в /etc/default/grub, файле, который предназначен быть изменен конечными пользователями и, таким образом, переживает обновления пакетов невредимыми.

Только если для GRUB_GFXPAYLOAD_LINUX установлено значение keep, переменная $vt_handoff имеет установленное значение. Согласно GNU GRUB Manual, в то время как наиболее распространенными вариантами для GRUB_GFXPAYLOAD_LINUX являются сохранить (ваша текущая настройка) и текст (очевидно, не подходит для вашего варианта использования) , также может быть установлено любое допустимое значение для gfxmode.Это означает, что вы можете изменить его на авто или, что еще лучше, на точное ширина✕высота разрешение экрана по умолчанию, выбранное в BIOS/EFI вашей системы (это то, что сохраняет означает эквивалент), который можно обнаружить с помощью команды videoinfo в самом загрузчике (а также, в большинстве случаев, с помощью команды sudo fbset -s в терминале после загрузки вашей системы).

Это дает то преимущество, что текущий процесс загрузки остается без изменений ЗА ИСКЛЮЧЕНИЕМ для удаления назначения значения для $vt_handoff, и даже если вы все равно увидите его в конце командная строка ядра при нажатии e при входе в меню загрузчика,поскольку теперь он не имеет значения, он фактически не будет передан ядру. Вы можете убедиться в этом, введя cat /proc/cmdline в терминал после изменения GRUB_GFXPAYLOAD_LINUX и перезагрузив компьютер.

Последний шаг — восстановить значение, которое GRUB заменяет $vt_handoff в командной строке ядра, на этот раз в том месте, которое ВЫ хотите. Во втором фрагменте кода выше мы видим, что когда для GRUB_GFXPAYLOAD_LINUX установлено значение keep, $vt_handoff присваивается значение vt.handoff=7, и эта часть в жирный шрифт — это то, что вам нужно добавить перед другими настройками командной строки ядра, назначенными GRUB_CMDLINE_LINUX_DEFAULT в /etc/default/grub. Еще раз, вы можете убедиться, что все в порядке с cat /proc/cmdline после внесения изменений и перезагрузки. Вот как бы я сам подошел к вашей проблеме, если бы столкнулся с ней.

Настройщик GRUB

В качестве альтернативы непосредственному редактированию файла /etc/default/grub можно установить и использовать Настройщик GRUB, который предоставляет те же самые переменные в продуманном графическом интерфейсе. макет. Установить его просто, если вы используете недавнюю версию (19.10 «Eoan Ermine» или более позднюю) Ubuntu или одну из ее разновидностей, например Kubuntu, с sudo apt install grub-customizer в терминале.Он имеет диалоговое окно «Дополнительные настройки» (показано ниже), которое предоставляет те же значения, которые вам нужно изменить в /etc/default/grub, и сохраняет резервные копии измененных файлов на случай, если вам понадобится отменить изменения позже. .

GRUB Customizer screenshot


¹ Следует отметить, что на протяжении рассматриваемого здесь процесса настройки GRUB все ссылки на $vt_handoff являются экземплярами самого имени переменной, а не более часто встречающимся расширением параметра/ поведение замещения, выполняемое оболочками *NIX различных и разных вкусов. Ожидаемое поведение варианта Ubuntu среды GRUB заключается в том, что ссылки на него останутся в качестве имени переменной во всех экземплярах командной строки ядра, ведущих к файлу grub.cfg включительно. конечный результат начального grub mkconfig процесса и каждого последующего update-grub вызова. Значение переменной также определяется в файле конфигурации GRUB, и сам загрузчик выполняет замену во время каждого цикла загрузки. Вот почему его часто видят экранированным как \$vt_handoff в приведенных выше фрагментах кода, поскольку это предотвращает любую преждевременную замену имени переменной на ее значение.

0
ответ дан 16 January 2021 в 06:13

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

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