grub2, использование переменных для передачи в запись linux

Вопрос или проблема

У меня есть следующая переменная в файле grub.cfg.

BOOT_PARAMETERS="rootwait rootfstype=ext4 rootimage=$BOOT_ROOT_IMAGE_NAME root=$ROOT_DEVICE console=none intel_idle.max_cstate=1 quiet"
BOOT_ROOT_INITRD=(hd0,gpt2)/boot1/initrd
BOOT_ROOT_KERNEL=(hd0,gpt2)/boot1/bzImage

Я хочу передать эти параметры в пункт меню.

menuentry 'pc'{
linux $BOOT_ROOT_KERNEL $BOOT_PARAMETERS
initrd $BOOT_ROOT_INITRD
}

BOOT_ROOT_KERNEL и BOOT_ROOT_INITRD работают нормально, но параметры не работают. Я не уверен, как это ломает загрузку, но этот пункт меню не загружается. Если я заменяю $BOOT_PARAMETERS содержанием переменной без кавычек, это работает.

Также работает следующее:

linux $BOOT_ROOT_KERNEL "$BOOT_PARAMETERS"

Однако в /proc/cmdline включены эти кавычки, и я не хочу ломать приложения, которые читают этот вывод.

Как сделать так, чтобы это работало?

linux $BOOT_ROOT_KERNEL $BOOT_PARAMETERS

Правка: В командной строке grub, если я делаю echo $BOOT_PARAMETERS, машина вдруг перезагружается. Если я делаю echo "$BOOT_PARAMETERS", он выводит нормально.

Правка2: Похоже, это связано с большими переменными среды. Выполнение set TEST="SFSFESFSEFDFUIHI rg s rjg sreuigsrgi sig isdfjgs dfkgd", а затем echo $TEST иногда вызовет это. Это происходит при определенной длине/комбинации, и я не могу понять, в чем дело. Если это не произошло с первого раза, продолжайте добавлять что-то в TEST, и затем echo $TEST в конечном итоге вызовет внезапную перезагрузку.

Я знаю, что этот вопрос старый, но сегодня я сделал поиск и снова наткнулся здесь.

Вот решение, которое я использую:

Определите переменную в bash-скрипте:
readonly ISONAME=$(ls -1 -c "/mnt/isoLinux" | head -n 1)

включите menuentry в cat << EOF, чтобы sh сделал подстановку переменной
определите переменную в grub:
set isofile="$ISONAME"

используйте переменную в grub:
loopback loop \$isofile
символ \ предотвращает подстановку переменной sh

мой полный скрипт /etc/grub.d/40_isoLinux

#!/bin/sh

readonly ISONAME=$(ls -1 -c "/mnt/isoLinux" | head -n 1)

cat << EOF

menuentry "Iso linux"  {
    set isofile="$ISONAME"
    set dri="free"
    set lang="fr_FR"
    set keytable="fr"
    set timezone="Europe/Paris"
    insmod ext4
    search --no-floppy -f --set=root \$isofile
    probe -u \$root --set=diskIsoUuid
    set diskDevice="/dev/disk/by-uuid/\$diskIsoUuid"
    loopback loop \$isofile
    linux  (loop)/boot/vmlinuz-x86_64  img_dev=\$diskDevice img_loop=\$isofile driver=\$dri tz=\$timezone lang=\$lang keytable=\$keytable copytoram
    initrd  (loop)/boot/amd_ucode.img (loop)/boot/initramfs-x86_64.img
}

EOF

Переменные GRUB необходимо экспортировать с помощью команды export, чтобы они влияли на меню.

Из https://www.gnu.org/software/grub/manual/grub/html_node/export.html#export

Команда: export envvar

Экспортировать переменную среды envvar. Экспортированные переменные видны в подчиненных файлах конфигурации, загружаемых с помощью configfile.

У меня была такая же проблема, вот мое решение. Оно работает идеально, как вы можете убедиться, проверив ‘/proc/cmdline’. Он показывает тот же текст, как и если не использовать переменные.

# идентификатор устройства:
  blkid="0321d94c-3834-3452-7348-fc15a99d4588"

# мои параметры загрузки
  opcoes="ro ipv6.disable=1 nomodeset vga=773"

# ...

# пункт загрузки
 menuentry 'Debian-12 BookWorm' --id 'kernelAtual' {
 load_video
 insmod gzio
 insmod part_msdos
 insmod ext2
 search --no-floppy --set=root --fs-uuid ${blkid}
 echo   'Carregando BookWorm'
 linux  /boot/vmlinuz root=UUID=${blkid} ${opcoes}
 initrd /boot/initrd.img
 savedefault
}

Я обращаю вас к документации GNU Grub. См. команду echo. Она описывает, как включать переменные, новую строку, возврат каретки, табуляцию и т.д.

Чтобы вывести на экран вашу переменную $TEST, попробуйте следующее:

ECHO ${TEST}

Кратко, поместите имя вашей переменной после знака $ доллара и между { } фигурными скобками. Надеюсь, ваша машина не взбесится, если вы попробуете это.

Ответ или решение

Конфигурация GRUB2 с использованием переменных для передачи параметров загрузки в Linux — это важная задача, которая требует точного подхода для гарантии стабильности системы. В этой ситуации основная проблема заключается в корректном использовании переменных в файле grub.cfg, чтобы они соответствующим образом передавались в ядро Linux при загрузке.

Проблема с использованием переменных в GRUB2

Ваши текущие попытки использования переменной BOOT_PARAMETERS включают:

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

Решение с использованием GRUB2 и переменных

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

  1. Экспорт переменных среды: Убедитесь, что переменные экспортируются. Это можно сделать с помощью команды export. Экспорт параметров гарантирует, что они будут правильно обработаны в дополнительных файлах конфигурации, загружаемых с помощью configfile.

  2. Минимизация окружения GRUB: Если проблема заключается в объеме переменных, попробуйте упростить или разделить переменные на несколько более коротких.

  3. Использование подхода EOF в bash: Как было предложено в другом решении, использование скрипта bash для генерации блоков конфигурации может помочь в обработке переменных прежде, чем они попадут в GRUB:

    #!/bin/sh
    
    readonly BOOT_PARAMETERS="rootwait rootfstype=ext4 rootimage=$BOOT_ROOT_IMAGE_NAME root=$ROOT_DEVICE console=none intel_idle.max_cstate=1 quiet" 
    
    cat << EOF
    menuentry "Linux" {
        linux $BOOT_ROOT_KERNEL $BOOT_PARAMETERS
        initrd $BOOT_ROOT_INITRD
    }
    EOF

    При таком подходе происходит расширение переменных в bash до их использования в блоке menuentry.

  4. Избегание длинных строк и сложных комбинаций: Как вы заметили, длинные строки переменных могут вызвать сбой. Старайтесь избегать слишком длинных комбинаций параметров в одной переменной.

  5. Проверка сочетаний и длины переменных с ‘Echo’: Проблемы с echo в командной строке GRUB связаны с Environment Stack. Старайтесь минимизировать длину строки и внимательно анализируйте, какие комбинации вызывают сбои.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...