我在 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
will有时导致这种情况。这种情况发生在特定长度/组合下,我无法确定。如果第一次尝试没有发生这种情况,请继续将内容附加到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}
简而言之,将变量名放在 $ 美元符号后面和 { } 花括号之间。希望你尝试这样做时你的机器不会出现问题。