Проблемы с разрешением UEFI

Ошибка, которую вы получаете, указывает, что $chunkсодержит многострочное значение, все числа от 0 до 9. Это произойдет, если слово -расщепление не произойдет в результате $(seq...)в for.

Обычный способ предотвратить разбиение слова -заключается в заключении расширения в двойные -кавычки, чтобы for chunk in "$(seq...)"не расширялось. Но здесь это не так, поскольку вы бы знали, добавили ли вы двойные -кавычки, и в любом случае это работает в некоторых случаях.

Но разбиение слова -не всегда одинаково, оно основано на значении IFS, которое по умолчанию содержит пробел, табуляцию и новую строку($' \t\n'с использованием стиля C -цитирования ). Если он содержит что-то другое, то эти символы будут приняты в качестве разделителей слов.

И действительно, вы модифицировали IFSвнутри select, непосредственно перед вызовомfoo:

local IFS=@
case "@${options[*]}@" in
(*"@$opt@"*)
        foo

Способ работы области видимости переменных в Bash заключается в том, что fooтакже видит измененное значение IFS. localне означает, что изменение видно только этой функции,но вместо этого он также виден для всех подфункций, вызываемых с этого уровня:

$ x=999
$ a() { echo "a: x=$x"; }
$ b() { local x=$1; a; }
$ b 123
a: x=123

Это не похоже на то, что было бы, скажем, в C.


В качестве обходного пути можно было бы вместо этого сохранить IFSв другую переменную, что-то вроде этого:

local oldifs=$IFS
IFS=@
str="@${options[*]}@"
IFS=$oldifs
case $str in...

или изменить его в подоболочке (, скрывая IFSизменение там):

str=$(IFS=@; echo "@${options[*]}@")
case $str in...

Вы также можете создать функцию для объединения строк (, скрывающую IFSизменение в функции ), вам просто нужны ссылки на имена для передачи переменных по имени:

# join a b c:
# join the values of array 'a' with the character 'b', and put the result in 'c'
join() {
    local -n _arr=$1
    local IFS=$2
    local -n _res=$3
    _res="${_arr[*]}"
}
src=(11 22 33)
join src @ dst
echo "$dst"        # outputs "11@22@33"

(Конечно, это немного громоздко для одного использования, и ссылки на имена тоже не идеальны :ссылка на имя внутри функция не может ссылаться на переменную с таким же именем снаружи это (по крайней мере в Bash 4 ). Небольшое преимущество этого по сравнению с просто использованием подстановки команд заключается в том, чтобы избежать форка для запуска подоболочки.)

Или, на всякий случай, (повторно )устанавливайте IFSкаждый раз, когда вам это нужно. Внутриfoo:

foo() {
    local IFS=$' \t\n'      # or just IFS=$'\n'
    for chunk in $(seq...); do
       ...
}
0
28.02.2021, 06:48
2 ответа

Выпуск

Я нашел большинство элементов, на которые @Claus Anderson ссылался в старых сообщениях на форумах FreeBSD, но независимо от того, какие настройки я возился с моим efifb(VT), разрешение зависло на 1024x768. Для меня это было неприемлемо, потому что я предпочитаю использовать консоль вместо терминала с графическим интерфейсом (Alt + Fn против Konsole ). Поскольку это только личные предпочтения, я продолжал копать и, наконец, нашел решение, если оно может помочь другим читателям/посетителям.

Решение

Мой ПК был изготовлен по индивидуальному заказу OEM-производителем и содержит MSI Z270 -A PRO . Когда я начал устанавливать несколько ОС, я использовал утилиту настройки UEFI и отключил режим «Только UEFI», который в меню настроек загрузки утилиты называется UEFI + Legacy , но более известен как CSM, и со временем полностью перенес все мои установки только в UEFI.

Оказывается, включение CSM отключает для этой материнской платы так называемую поддержку Windows 8.1/10 WHQL, которая все еще была отключена даже после того, как я перенес все свои ОС. См. фото ниже:

[MSI WHQL Settings

Отключение этого параметра, даже если в настройках загрузки включен режим Pure UEFI, отключает доступ к двум нижним параметрам, показанным на фотографии выше.:

  1. Внутренняя конфигурация GOP
  2. Безопасная загрузка

Хотя я не использую безопасную загрузку (в личных предпочтениях ), после работы с несколькими вариантами я понял, что если доступ к конфигурации GOP отключен, любая заглушка ОС или EFI, которая загружается, зависает на базовое разрешение 1024x768. Другими словами, без включенной поддержки WHQL настройка GOP помечается как прочитанная -только в NVRAM даже для ОС, не связанных с Windows.Почему это так, я не знаю, поскольку WHQL предназначен для обеспечения безопасности драйверов только в Windows , гарантируя, что установленные драйверы имеют цифровую подпись и прошли проверку контроля качества. Мне неизвестно, почему это тестирование необходимо для изменения разрешения для ОС, отличной от Windows.


Это означало, что независимо от того, какую настройку я передал загрузчику FreeBSD, я всегда получал размер экрана 1024x768 на мониторе, поддерживающем родное разрешение 1920x1080/1080p при 60 Гц, если только я не использовал вариант 3 загрузчика . , что происходит после того, как UEFI завершает загрузку в rEFInd, и NVRAM получает пометку для чтения/записи.

Теперь у меня есть exec mode 0в boot/loader.confс включенной поддержкой Windows 8.1/10 WHQL, и у меня собственное разрешение консоли 1080p. В качестве побочного эффекта правильной настройки rEFInd также загружается в собственном разрешении.

Что я пытался сделать до того, как нашел указанное выше решение

Я не рекомендую их, но я перечислю их здесь для полноты картины

  1. Обновлена ​​прошивка моей видеокарты, та же модель и OEM, но более новая версия.
  2. Обновлен мой протокол GOP, полагая, что в прошивке моей видеокарты есть ошибки.
0
18.03.2021, 22:28

На самом деле я прочитал вопрос так внимательно, как только мог. три раза. И я все больше запутываюсь с каждым чтением.

Вы тратите время на описание своей установки. Но какова ваша настоящая основная проблема? Почему вы настаиваете на том, чтобы делать это таким образом? Почему вы так интерпретируете отчет об ошибке? (Я интерпретирую это по-другому ). Документация на самом деле не так уж и плоха, но я согласен, что в некоторых важных ключевых местах она должна быть намного лучше. Но мы, кажется, гоняемся за другим кроликом.

Я не запускаю Gentoo, поэтому "Спецификации ОС" мне чужды (Я ожидалuname -a). Есть много способов загрузить систему, но вы, кажется, довольно далеко, поэтому нам не нужно погружаться слишком глубоко.

Но FreeBSD находится в переходной фазе перехода от загрузчика на основе Forth к загрузчику на основе Lua . FreeBSD использует загрузчик Forth уже много лет, поэтому многие ссылаются на него. Загрузчик Lua был представлен в версии 11 и стал использоваться по умолчанию в версии 12. См. Загрузчик LUA включен по умолчанию

.

И снова из-за того, что он использовался так долго, в него прокрался некоторый фортизм /boot/loader.rc.local. Это то, что Кайл Эванс и Уорнер Лош пытаются объяснить далее в отчете об ошибке, на который вы ссылаетесь.

В современной системе FreeBSD вы не должны не вмешиваться в /boot/loader.rc.local. Он существует по наследственным причинам. он будет прочитан только загрузчиком Forth, а не загрузчиком Lua.

Я хочу свой Форт!

Если я правильно понимаю, вы собираете все из исходников, включая саму FreeBSD. В этом случае вы можете отредактировать /etc/src.confи установить :

.
WITH_FORTH="yes"
WITHOUT_LUA="yes"

Затем выберите загрузчик, который вы используете.

Современный способ

В течение многих лет правильным способом изменения настроек загрузчика было использование loader.conf (5). Этот файл читается и анализируется обоими загрузчиками.

Вам просто нужно соединить точки между вашим «Половина решения» и Ошибка 235040

Отредактируйте /boot/loader.conf(, который является "определяемым пользователем" ), и добавьте что-нибудь вроде:

exec="gop set 0"
exec="gop set 2"

/boot/loader.conf.localработают так же, но предназначены для конкретных настроек машины для сайтов с общимloader.conf

Выможетеписать свои собственные Lua-скрипты так же, как и Forth, но они не предназначены для общего использования.

Разрешение по умолчанию

Вы пишете, что у вас разрешение по умолчанию 1024x768. Вместо использования gop setвы можете снова использоватьefi_max_resolution(loader.conf (5)).

Value        Resolution
480p         640x480
720p         1280x720
1080p        1920x1080
2160p        3840x2160
4k           3840x2160
5k           5120x2880
WidthxHeight WidthxHeight

Итак, в /boot/loader.confвы можете попробовать:

efi_max_resolution="1080p"

Драйвер Nvidia

Опять неясно, какие именно у вас проблемы. Вы заявляете, что используете x11/nvidia-driver. Это актуально только для X11. Во время загрузки должен запуститься драйвер консоли vt (4 ). При загрузке BIOS он переключится на 640x480x16, если у вас нет драйвера KMS (, как у вас ). Я бы предположил, что в UEFI сохраняется разрешение, поскольку он уже переключился с текстового режима на графический.

После этого драйвер будет использоваться только при запуске X11. Конфигурация не требуется, так как она должна определяться автоматически. Это должно отправить вас либо в графический менеджер входа в систему, такой как Slim , либо прямо на рабочий стол.

Переключение между RELEASE и STABLE

Если вы хотите вести более резвый образ жизни, вы можете переключиться на STABLE. Или сойти с ума с CURRENT. Но если бы я понял вашу проблему, то это не имело бы никакого значения.

24.4. Отслеживание ветки разработки

В чем разница между тремя версиями FreeBSD? (Ток,Релиз и стабильная версия)

1
18.03.2021, 22:28

Теги

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