Невозможно удалить переменную UEFI -места не осталось/операция не разрешена

В более ранних версиях bash вы можете сделать это с индексированными массивами, но не с ассоциативными массивами, используя косвенную переменную:

$ declare -p start_obj end_obj gopath
declare -A start_obj='([one]="start-obj-one" [two]="start-obj-two" )'
declare -A end_obj='([one]="end-obj-one" [two]="end-obj-two" )'
declare -A gopath='([start]="/path/to/start" [end]="/path/to/end" )'

$ for t in "${!gopath[@]}"; do tmp="${t}_obj[@]"; ary=( "${!tmp}" ); declare -p ary; done
declare -a ary='([0]="start-obj-one" [1]="start-obj-two")'
declare -a ary='([0]="end-obj-one" [1]="end-obj-two")'

Обратите внимание, как мы можем получить значения , но не ключи ассоциативных массивов.

Для получения дополнительной информации см. 4-й абзац вhttps://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion

0
17.05.2020, 11:21
1 ответ

Итак, получается, что для предотвращения случайного удаления переменных UEFI по умолчанию разрешено удалять только переменные из белого списка. Другие помечены как неизменяемые, что предотвращает их случайное удаление :

.
# lsattr
--------------------./BootCurrent-8be4df61-93ca-11d2-aa0d-00e098032b8c
----i---------------./334-71db7b7e-4165-48fa-ac9d-f9af4cefc534
----i---------------./2151678337-417acee0-6fa9-4a82-99d7-f9b1dd271e48
--------------------./Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c
----i---------------./2151678336-417acee0-6fa9-4a82-99d7-f9b1dd271e48

Это было сделано для того, чтобы запуск rm -rf /не уничтожил неизвестные переменные UEFI, которые, как было обнаружено, вызывают сбои при загрузке некоторых реализаций прошивки с ошибками. (В спецификациях говорится, что системы должны нормально загружаться со всеми удаленными переменными UEFI, но некоторые машины не соответствуют требованиям и могут быть заблокированы таким образом.)

Сначала необходимо удалить неизменяемый атрибут:

# chattr -i 2151678336-417acee0-6fa9-4a82-99d7-f9b1dd271e48

Что по-прежнему не позволяло мне удалить или перезаписать переменную, но позволило удалить другую. Я по-прежнему не мог добавить новые переменные, но после перезагрузки Linux занял лишнее место и bootctl install, наконец, преуспел.

При сравнении с другой идентичной машиной оказывается, что эта массивная переменная UEFI на самом деле должна быть там! Таким образом, вы просто получаете небольшое количество свободного места для хранения переменных загрузки на этих машинах с Linux (, потому что, по-видимому, Linux откажется записывать любые переменные UEFI, если свободного места меньше 50% ).

РЕДАКТИРОВАТЬ :Вы также можете загрузить ядро ​​с параметром efi_no_storage_paranoia, чтобы отключить это ограничение и получить доступ к полной области хранения EFI, если вы уверены, что ваша прошивка не является одной из ранних. которые не загружаются, когда свободное пространство переменных EFI падает ниже 50%.

0
28.04.2021, 23:13

Теги

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