有没有办法不修改引导文件,自适应长文件名
本帖最后由 crzwy 于 2026-4-5 09:41 编辑比如简单使用kali.iso。kali升级后就要重写启动grub.cfg。有没有办法让grub2自适应文件的变化。我用8.3文件名试了一下,行不通。那位前辈大神可以帮小弟看看怎么解决?
menuentry"启动 kali "--hotkey=k {
insmod loopback
set isofile="/KALI-L~1.ISO"
search --set -f "${isofile}"
loopback loop "${isofile}"
set gfxpayload=keep
linux (loop)/live/vmlinuz-6.18.12+kali-amd64 boot=live components quiet splash noeject findiso="${isofile}" locales=zh_CN.UTF-8
initrd (loop)/live/initrd.img-6.18.12+kali-amd64
}
放假折腾中{:1_186:} 支持折腾 完整 grub.cfg 菜单项供测试menuentry "启动 Kali Linux (自适应ISO/内核)" --hotkey=k {
insmod part_gpt
insmod part_msdos
insmod fat
insmod ntfs
insmod iso9660
insmod loopback
insmod search_fs_uuid
insmod ext2
# --------------------------
# 1) 自动查找 Kali ISO(支持长文件名)
# --------------------------
# 匹配根目录下所有 kali 开头的 .iso(不区分大小写)
set isopattern="/kali*.iso"
# 或严格匹配:set isopattern="/kali-linux-*-live-amd64.iso"
search --no-floppy --file --set=root "${isopattern}"
# 把找到的第一个ISO赋值给 isofile
loopback loop "${root}${isopattern}"
# --------------------------
# 2) 自动匹配 /live/vmlinuz & initrd.img(通配内核版本)
# --------------------------
set kernel="(loop)/live/vmlinuz*"
set initrd="(loop)/live/initrd.img*"
# 加载内核 + 启动参数(findiso 用变量)
linux ${kernel} boot=live components quiet splash noeject \
findiso="${root}${isopattern}" locales=zh_CN.UTF-8
# 加载 initrd
initrd ${initrd}
}
如果你经常放多个 Kali ISO,可用 GRUB2 for 循环 自动生成菜单项(可不用手动加):# 放在 grub.cfg 开头(全局)
for iso in /kali*.iso /KALI*.ISO; do
if [ -f "${iso}" ]; then
menuentry "Kali Live: ${iso}" {
insmod loopback
search --set=root -f "${iso}"
loopback loop "${iso}"
linux (loop)/live/vmlinuz* boot=live components quiet splash noeject findiso="${iso}" locales=zh_CN.UTF-8
initrd (loop)/live/initrd.img*
}
fi
done
围观大家讨论技术 支持大佬折腾 本帖最后由 crzwy 于 2026-4-4 22:33 编辑
a66 发表于 2026-4-4 17:32
如果你经常放多个 Kali ISO,可用 GRUB2 for 循环 自动生成菜单项(可不用手动加):
...
感谢中将的支援,测试了下,不知道是不是自己机子的问题,就是通不过。但是根据中将的提示,我将菜单从
menuentry"启动 kali "--hotkey=k {
set isofile="/kali-linux-2026.1-live-amd64.ISO"
search --set -f "${isofile}"
loopback loop "${isofile}"
set gfxpayload=keep
linux (loop)/live/vmlinuz-6.18.12+kali-amd64 boot=live components quiet splash noeject findiso="${isofile}" locales=zh_CN.UTF-8
initrd (loop)/live/initrd.img-6.18.12+kali-amd64
}
改成
menuentry "启动 kali Linux (自适应ISO/内核) (通配符版)" {
set isofile="/kali-linux-2026.1-live-amd64.ISO"
search --set -f "${isofile}"
loopback loop "${isofile}"
set gfxpayload=keep
linux (loop)/live/vmlinuz-* boot=live components quiet splash noeject findiso="${isofile}" locales=zh_CN.UTF-8
initrd (loop)/live/initrd.img-*
}
也可以通过。
但是文件引用处set isofile就不能用通配符。
不知道怎么回事 a66 发表于 2026-4-4 17:31
完整 grub.cfg 菜单项供测试
这个也试过了,不行 本帖最后由 窄口牛 于 2026-4-5 06:52 编辑
感觉不行,这样,一堆文件,到底启动哪个?至于内核那句,有的确实会存在多个内核,这也确定不了要用哪个。这么弄就成了随机的了。 窄口牛 发表于 2026-4-5 06:49
感觉不行,这样,一堆文件,到底启动哪个?至于内核那句,有的确实会存在多个内核,这也确定不了要用哪个。 ...
我确实只有一个iso文件,确实代码有问题。
还有,就算有多个,好歹匹配一个启动啊{:1_188:} 感谢楼主分享~! 经过不断的学习,问题的症结已经找到:
GRUB不会自动展开变量中的通配符,$isofile的值就是包含*的字符串,而不是匹配到的实际文件名。
现在就是怎么解决了。
crzwy 发表于 2026-4-5 08:06
经过不断的学习,问题的症结已经找到:
GRUB不会自动展开变量中的通配符,$isofile的值就是包含*的字符串 ...
linux (loop)/live/vmlinuz-* boot=live components quiet splash noeject findiso="${isofile}" locales=zh_CN.UTF-8
initrd (loop)/live/initrd.img-*
这两个却可以使用通配符{:1_193:} a66 发表于 2026-4-4 17:32
如果你经常放多个 Kali ISO,可用 GRUB2 for 循环 自动生成菜单项(可不用手动加):
...
带脚本的好像房子哪都不行,{:1_188:}
menuentry "自动查找Kali ISO" {
for iso in /kali-linux-*-live-amd64.ISO; do
if [ -f "$iso" ]; then
echo "找到ISO: $iso"
set isofile="$iso"
break
fi
done
if [ -z "$isofile" ]; then
echo "未找到Kali ISO文件"
exit
fi
search --set -f "${isofile}"
loopback loop "${isofile}"
set gfxpayload=keep
linux (loop)/live/vmlinuz-* boot=live components quiet splash noeject findiso="${isofile}" locales=zh_CN.UTF-8
initrd (loop)/live/initrd.img-*
}
这个也不行 感谢分享 a66 发表于 2026-4-4 17:32
如果你经常放多个 Kali ISO,可用 GRUB2 for 循环 自动生成菜单项(可不用手动加):
...
这个我也知道,为什么不行了。因为我的iso文件和grub不在一个分区,for iso in不会在所有分区中查找:dizzy: menuentry "启动Kali (全盘搜索ISO)" {
# 标记是否找到ISO
set found=0
# 获取所有磁盘和分区
# 注:GRUB脚本能力有限,这里简化处理
for disk in hd0 hd1 hd2 hd3; do
for part in 1 2 3 4 5 6 7 8 9 10; do
# 检查分区是否存在
if [ -e ($disk,$part) ]; then
echo "正在搜索 ($disk,$part)..."
# 临时设置根目录到该分区
set tmproot=$root
set root=($disk,$part)
# 搜索ISO文件
for iso in /kali-linux-*-live-amd64.iso; do
if [ -f "$iso" ]; then
echo "在 ($disk,$part) 找到: $iso"
set isofile="$iso"
set found=1
break 2# 跳出分区循环
fi
done
# 恢复原来的根目录
set root=$tmproot
fi
done
if [ $found -eq 1 ]; then
break# 跳出磁盘循环
fi
done
if [ $found -eq 0 ]; then
echo "错误: 未在任何分区找到Kali ISO文件"
echo "请按任意键返回菜单..."
read
exit
fi
# 使用找到的ISO
search --set=root -f "$isofile"
echo "使用ISO: $isofile"
loopback loop "$isofile"
set gfxpayload=keep
linux (loop)/live/vmlinuz-* boot=live components quiet splash noeject findiso="$isofile" locales=zh_CN.UTF-8
initrd (loop)/live/initrd.img-*
}
最终结果出炉,感谢各位前辈大神的指导{:1_183:} 下载使用一下看看, 支持分享了 感谢分享 下载了准备测试一下 回头反馈 辛苦了,内容详细,收藏了。
页:
[1]
