Вопрос или проблема
У меня есть следующая переменная в файле 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 и переменных
Чтобы успешно передать параметры загрузки, без добавления лишних кавычек и избегая переполнения среды, необходимо применить следующие шаги:
-
Экспорт переменных среды: Убедитесь, что переменные экспортируются. Это можно сделать с помощью команды
export
. Экспорт параметров гарантирует, что они будут правильно обработаны в дополнительных файлах конфигурации, загружаемых с помощьюconfigfile
. -
Минимизация окружения GRUB: Если проблема заключается в объеме переменных, попробуйте упростить или разделить переменные на несколько более коротких.
-
Использование подхода
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
. -
Избегание длинных строк и сложных комбинаций: Как вы заметили, длинные строки переменных могут вызвать сбой. Старайтесь избегать слишком длинных комбинаций параметров в одной переменной.
-
Проверка сочетаний и длины переменных с ‘Echo’: Проблемы с
echo
в командной строке GRUB связаны с Environment Stack. Старайтесь минимизировать длину строки и внимательно анализируйте, какие комбинации вызывают сбои.
Заключение
Корректное использование переменных в GRUB2 требует оптимизации, правильного экспорта и управления длиной переменных. Важно понимать, как работают разные компоненты GRUB, и интегрировать bash-скрипты для лучшего управления переменными. Надеюсь, данная информация поможет вам наладить стабильную работу системы и избежать дальнейших ошибок.