LINUX.ORG.RU

Библиотека функций для GRUB2

 ,


0

2

GRUB2 поддерживает написание функций и я этим активно пользуюсь. Свои функции я писал в отдельный конфиг и был счастлив.

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

В конце концов меня достала необходмость править список импорта каждый раз и пришла идея импортировать все файлы из каталога.

Для этого я написал такой код (import_all.txt):

for core in (hd0,1)/my_functions/library/* ; do
	source ${core}
	# DBG MSG:
	echo "sorce ${core}"
done
В основном конфиге прописал «source (hd0,1)/my_functions/import_all.txt», но это не заработало.

Я попробовал запускать source вручную и вот что заметил:

При первом запуске я вижу сообщение «source (hd0,1)/my_functions/library/*» и функции, естесственно, не импортируются.

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

Может кто-нибудь объяснить мне почему при первом выполнении for отрабатывает не корректно и как можно это поправить/обойти?

ОТВЕТ:

https://wiki.archlinux.org/index.php/GRUB_(Русский)#Arch_Linux_ISO

insmod regexp # для шаблонов * в именах файлов

★★

Последнее исправление: zzdnx (всего исправлений: 3)

Ответ на: комментарий от anonymous

Гитхаб с функциями

Много полезных трюков Grub2 можно прочитать в конфигах проекта Super Grub2 Disk Hybrid.

Я-же пишу функции в рамках создания своей мульти-загрузочной флэшки.

Основа - grub2. В комплекте пойдут : SuperGrub2Disk.ISO, memtest, memdisk, grub4dos, DUET.ISO (среда UEFI-разработчика, которая позволяет запускать *.efi файлы на BIOS-машинах с CPU от Intel), plop, smart boot manager, а так же firadisk (для установок старых Windows с флэшки).

Набор функций позволяет мне сократить и упростить текст в menuentry, а ещё функции, как я заметил, переживают смену контекста grub2, что решает проблему наследования/передачи переменных, на которую многие в сети жаловались.

Могу опубликовать на битбукете, если это кому-то это будет интетресным.

zzdnx ★★
() автор топика
Последнее исправление: zzdnx (всего исправлений: 1)
Ответ на: комментарий от mandala

Как-то так:

Флэшка имеет таблицу разделов MBR и разбита на 2 раздела.
На втором установвлен GRUB2.
Основной файл конфигурации GRUB2: /configs/grub.cfg
Вспомогательные файлы GRUB2:      /configs/grub2addons/
GRUB4DOS дотупен по адресу:       /kernels/grub4dos/grub.exe

Часть файла /configs/grub.cfg:

search -f /configs/grub.cfg --set bootpart
source ($bootpart)/configs/grub2addons/Functions.cfg

submenu "Магия оперативной памяти..." {
    set tail="via Grub4Dos"
    #===============================================================================
    # Active@ Boot Disk (LiveCD) 10.5.0 RePack by WYLEK (x64)
    #===============================================================================
    menuentry "ActiveBootDisk_by_WYLEK.ISO ${tail}" {
        set iso=/iso/ActiveBootDisk_by_WYLEK.ISO
        copy_image_to_ram "${iso}"
    }
    
    #===============================================================================
    # Acronis 32
    #===============================================================================
    menuentry "Acronis 32MB ${tail}" {
        set iso=/iso/Acronis.iso
        copy_image_to_ram "${iso}"
    }
}

menuentry "Пример конфига запуска с модификатором и без" {
    if keystatus; then
        if keystatus --shift; then
            echo "Запуск с shift."
        elif keystatus --ctrl; then
            echo "Запуск с ctrl."
        elif keystatus --alt; then
            echo "Запуск с alt."
        else 
            echo "Запуск с ...?"
        fi
    else
        echo "Нормальный запуск"
    fi
    wait_and_back
}

menuentry "Играть системным динамиком" {
    help play
    echo ""
    echo "Воспроизведение: play 480 440 1"
    play 480 440 1
    sleep 3
    echo "Воспроизведение: play 480 440 1 0 1 440 1 0 1 440 1"
    play 480 440 1 0 1 440 1 0 1 440 1
    wait_and_back 5
}

Содержимое ($bootpart)/configs/grub2addons/Functions.cfg:

# ########################################################################### #
#                                                                             #
#              Вспомогательная конфигурация GRUB2: набор функций              #
#                                                                             #
# ########################################################################### #

for f in source ($bootpart)/configs/grub2addons/functions/* ; do
    source "${f}"
done
unset f

В каталоге ($bootpart)/configs/grub2addons/functions/ лежат файлы:

copy_image_to_ram
wait_and_back
Содержимое wait_and_back:
function wait_and_back {
# Использование: wait_and_back [секунды] [конфиг]
# Ждёт [секунды] и переходит в указанный [конфиг]
# Умалчания: 3 сек. и возврат через команду false
# wait_and_back
# wait_and_back 15
# wait_and_back 10 (hd0,1)/path/to/config.cfg

    if [ "$1" == "" ] ; then
        set sec=3
    else
        set sec="$1"
    fi

    set w=""
    if regexp '1$' "${sec}" ; then 
        set w="у"
    elif regexp '[2-4]$' "${sec}" ; then 
        set w="ы" 
    fi

    if [ "$2" != "" ] ; then
        if ! test -f "$2" ; then
            echo "Не найден файл конфигурации:"
            echo "'$2'"
            echo ""
        fi
    fi

    echo "Возврат через $sec секунд$w."
    sleep $sec

    if test -f "$2" ; then
        configfile "$2"
    else
        false
    fi
}

Содержимое copy_image_to_ram:

function copy_image_to_ram {
# Использование: copy_image_to_ram [файл-образ]
# Для реализации используется загрузчик GRUB4DOS.
# Считывает файл-образ и передаёт ему управление.
# copy_image_to_ram /iso/Acronis.iso

    set iso=$1
    if [ "${iso}" != "" ] ; then
        search --set -f /kernels/grub4dos/grub.exe
        set cmd="
                 set iso=${iso};
                 find --set-root %iso%;
                 clear;
                 echo Copy image to RAM:;
                 map %iso% (hd32) || map --mem %iso% (hd32);
                 map --hook;
                 chainloader (hd32)
                "
        linux /kernels/grub4dos/grub.exe --config-file=${cmd}
    else
        echo "Неоходимо указать путь к файлу-образу."
        echo ""
        wait_and_back
    fi
}

zzdnx ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.