как получить список элементов меню grub2 в UEFI

Вот решение sed, которое работает с вашим точным форматом ввода и, надеюсь, работает быстро.

sed -rz 's:[ \t]+:,:g;s:$:,:mg;:l;s:,([^,]+),(.*),\1,:,\1,\2,:;tl;s:,$::mg;s:^([^,]+),:\1\t:mg' file.csv

Как это работает:

Флаг ' -z' загружает весь файл, поэтому следующий код применяется один раз, а не к каждой строке, как это делается по умолчанию.

#transform input format to actual CSV format
s:[ \t]+:,:g;s:$:,:mg;
#loop while the s command can still find and replace
:l;
    #main code: find two identical cell values anywhere and delete the latter
    #on a very big file this can suffer from backtracking nightmare
    s:,([^,]+),(.*),\1,:,\1,\2,:;
tl;
#transform format back
s:,$::mg;s:^([^,]+),:\1\t:mg
0
15.09.2020, 09:38
1 ответ

В RHEL/CentOS 8 GRUB использует новый модуль blscfg, который считывает записи для отдельных ядер Linux из /boot/loader/entries/. Для каждой записи должен быть один файл .conf.

Для получения дополнительной информации см.https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault

Это не относится к UEFI, но также используется классическим GRUB на основе MBR -. Фактически, каталог /boot/loader/entries/с его файлами также будет существовать на архитектурах, которые вообще не будут использовать GRUB, например, s390x или aarch64.

Вместо номеров загрузочные записи идентифицируются именами, которые по сути являются именами отдельных файлов /boot/loader/entries/*.confбез пути и суффикса .conf.

Следующее может быть близким эквивалентом вашего awkодного -вкладыша для RHEL/Centos 8:

for i in /boot/loader/entries/*.conf
do 
    entryname=$(basename $i.conf)
    entrytitle=$(grep title $i | cut -f 2-)
    echo "$entryname : $entrytitle"
done

Запись по умолчанию определяется настройкой saved_entry=в/boot/grub2/grubenv(в устаревших системах BIOS/MBR )или/boot/efi/EFI/redhat/grubenv(в системах UEFI ). При установке по умолчанию оба файла будут существовать с одинаковым содержимым как в загрузочных системах BIOS/MBR, так и в UEFI -, но только один из них будет изменен GRUB, если во время загрузки будет выбрана запись по умолчанию, отличная от -.

Этот фрагмент может использоваться для идентификации текущей -выбранной загрузочной записи:

if [ -d /sys/firmware/efi ]
then
    envfile=/boot/efi/EFI/redhat/grubenv
else
    envfile=/boot/grub2/grubenv
fi
bootdefault=$(awk -F '=' '/^saved_entry/{print $2;}' $envfile)
echo "Default boot entry name: $bootdefault"
3
18.03.2021, 23:04

Теги

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