找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 628|回复: 23

[已解决] 有没有办法不修改引导文件,自适应长文件名

[复制链接]
发表于 5 天前 | 显示全部楼层 |阅读模式
本帖最后由 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
}



 楼主| 发表于 5 天前 | 显示全部楼层
放假折腾中
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
支持折腾
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
完整 grub.cfg 菜单项供测试
  1. menuentry "启动 Kali Linux (自适应ISO/内核)" --hotkey=k {
  2.   insmod part_gpt
  3.   insmod part_msdos
  4.   insmod fat
  5.   insmod ntfs
  6.   insmod iso9660
  7.   insmod loopback
  8.   insmod search_fs_uuid
  9.   insmod ext2

  10.   # --------------------------
  11.   # 1) 自动查找 Kali ISO(支持长文件名)
  12.   # --------------------------
  13.   # 匹配根目录下所有 kali 开头的 .iso(不区分大小写)
  14.   set isopattern="/kali*.iso"
  15.   # 或严格匹配:set isopattern="/kali-linux-*-live-amd64.iso"
  16.   search --no-floppy --file --set=root "${isopattern}"

  17.   # 把找到的第一个ISO赋值给 isofile
  18.   loopback loop "${root}${isopattern}"

  19.   # --------------------------
  20.   # 2) 自动匹配 /live/vmlinuz & initrd.img(通配内核版本)
  21.   # --------------------------
  22.   set kernel="(loop)/live/vmlinuz*"
  23.   set initrd="(loop)/live/initrd.img*"

  24.   # 加载内核 + 启动参数(findiso 用变量)
  25.   linux ${kernel} boot=live components quiet splash noeject \
  26.        findiso="${root}${isopattern}" locales=zh_CN.UTF-8

  27.   # 加载 initrd
  28.   initrd ${initrd}
  29. }
复制代码



点评

这个也试过了,不行  详情 回复 发表于 5 天前
好 人  发表于 5 天前

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
如果你经常放多个 Kali ISO,可用 GRUB2 for 循环 自动生成菜单项(可不用手动加):
  1. # 放在 grub.cfg 开头(全局)
  2. for iso in /kali*.iso /KALI*.ISO; do
  3.   if [ -f "${iso}" ]; then
  4.     menuentry "Kali Live: ${iso}" {
  5.       insmod loopback
  6.       search --set=root -f "${iso}"
  7.       loopback loop "${iso}"
  8.       linux (loop)/live/vmlinuz* boot=live components quiet splash noeject findiso="${iso}" locales=zh_CN.UTF-8
  9.       initrd (loop)/live/initrd.img*
  10.     }
  11.   fi
  12. done
复制代码


点评

这个我也知道,为什么不行了。因为我的iso文件和grub不在一个分区  详情 回复 发表于 4 天前
带脚本的好像房子哪都不行, menuentry "自动查找Kali ISO" { for iso in /kali-linux-*-live-amd64.ISO; do if [ -f "$iso" ]; then echo "找到ISO: $iso" set isofile="$iso"  详情 回复 发表于 4 天前
感谢中将的支援,测试了下,不知道是不是自己机子的问题,就是通不过。但是根据中将的提示,我将菜单从 menuentry "启动 kali " --hotkey=k { set isofile="/kali-linux-2026.1-live-amd64.ISO" s  详情 回复 发表于 5 天前
助 人 为 乐  发表于 5 天前

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

发表于 5 天前 来自手机 | 显示全部楼层
围观大家讨论技术
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
谢谢分享
回复

使用道具 举报

发表于 5 天前 来自手机 | 显示全部楼层
支持大佬折腾
回复

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
本帖最后由 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就不能用通配符。
不知道怎么回事
回复

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
a66 发表于 2026-4-4 17:31
完整 grub.cfg 菜单项供测试

这个也试过了,不行
回复

使用道具 举报

发表于 4 天前 来自手机 | 显示全部楼层
本帖最后由 窄口牛 于 2026-4-5 06:52 编辑

感觉不行,这样,一堆文件,到底启动哪个?至于内核那句,有的确实会存在多个内核,这也确定不了要用哪个。这么弄就成了随机的了。

点评

我确实只有一个iso文件,确实代码有问题。 还有,就算有多个,好歹匹配一个启动啊  详情 回复 发表于 4 天前
回复

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
窄口牛 发表于 2026-4-5 06:49
感觉不行,这样,一堆文件,到底启动哪个?至于内核那句,有的确实会存在多个内核,这也确定不了要用哪个。 ...

我确实只有一个iso文件,确实代码有问题。
还有,就算有多个,好歹匹配一个启动啊
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
感谢楼主分享~!
回复

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
经过不断的学习,问题的症结已经找到:

GRUB不会自动展开变量中的通配符,$isofile的值就是包含*的字符串,而不是匹配到的实际文件名。

现在就是怎么解决了。

点评

linux (loop)/live/vmlinuz-* boot=live components quiet splash noeject findiso="${isofile}" locales=zh_CN.UTF-8 initrd (loop)/live/initrd.img-* 这两个却可以使用通配符  详情 回复 发表于 4 天前
回复

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
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-*
这两个却可以使用通配符
回复

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
a66 发表于 2026-4-4 17:32
如果你经常放多个 Kali ISO,可用 GRUB2 for 循环 自动生成菜单项(可不用手动加):

...

带脚本的好像房子哪都不行,
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-*
}
这个也不行
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
感谢分享
回复

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
a66 发表于 2026-4-4 17:32
如果你经常放多个 Kali ISO,可用 GRUB2 for 循环 自动生成菜单项(可不用手动加):

...

这个我也知道,为什么不行了。因为我的iso文件和grub不在一个分区,for iso in不会在所有分区中查找
回复

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
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-*
}
最终结果出炉,感谢各位前辈大神的指导
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
下载使用一下看看, 支持分享了
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
下载了  准备测试一下 回头反馈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-4-9 19:42

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表