grub2,使用变量传递给linux入口

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_KERNELBOOT_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 $TESTwill有时导致这种情况。这种情况发生在特定长度/组合下,我无法确定。如果第一次尝试没有发生这种情况,请继续将内容附加到TEST,然后echo $TEST最终会导致闪存重启。

答案1

我知道这个问题已经很老了,但今天我进行了搜索并回到这里。

这是我使用的解决方案:

在 bash 脚本中定义变量:
readonly ISONAME=$(ls -1 -c "/mnt/isoLinux" | head -n 1)

包括menuentry在 a 中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

答案2

GRUB 变量需要用命令导出export才能影响菜单。

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

命令:export envvar

导出环境变量 envvar。导出的变量对于使用 configfile 加载的子配置文件可见。

答案3

我建议你参考 GNU Grub 文档。请参阅echo 命令。它详细说明了如何包含变量、换行符、回车符、制表符等。

要回显您的 $TEST 变量,请尝试以下操作:

ECHO ${TEST}

简而言之,将变量名放在 $ 美元符号后面和 { } 花括号之间。希望你尝试这样做时你的机器不会出现问题。

相关内容