crzwy 发表于 2026-4-4 17:12:08

有没有办法不修改引导文件,自适应长文件名

本帖最后由 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
}



crzwy 发表于 2026-4-4 17:13:20

放假折腾中{:1_186:}

yyz2191958 发表于 2026-4-4 17:28:02

支持折腾

a66 发表于 2026-4-4 17:31:13

完整 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}
}



a66 发表于 2026-4-4 17:32:07

如果你经常放多个 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


sn4735 发表于 2026-4-4 19:19:09

围观大家讨论技术

无所适从 发表于 2026-4-4 22:06:05

支持大佬折腾

crzwy 发表于 2026-4-4 22:17:25

本帖最后由 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就不能用通配符。
不知道怎么回事

crzwy 发表于 2026-4-4 22:18:14

a66 发表于 2026-4-4 17:31
完整 grub.cfg 菜单项供测试

这个也试过了,不行

窄口牛 发表于 2026-4-5 06:49:09

本帖最后由 窄口牛 于 2026-4-5 06:52 编辑

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

crzwy 发表于 2026-4-5 07:38:36

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

我确实只有一个iso文件,确实代码有问题。
还有,就算有多个,好歹匹配一个启动啊{:1_188:}

wcz328628706 发表于 2026-4-5 07:59:20

感谢楼主分享~!

crzwy 发表于 2026-4-5 08:06:21

经过不断的学习,问题的症结已经找到:

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

现在就是怎么解决了。

crzwy 发表于 2026-4-5 08:19:52

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:}

crzwy 发表于 2026-4-5 08:25:19

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-*
}
这个也不行

蒸蒸日上 发表于 2026-4-5 08:31:06

感谢分享

crzwy 发表于 2026-4-5 08:59:39

a66 发表于 2026-4-4 17:32
如果你经常放多个 Kali ISO,可用 GRUB2 for 循环 自动生成菜单项(可不用手动加):

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

crzwy 发表于 2026-4-5 09:17:06

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:}

ebaqiang 发表于 2026-4-5 14:49:53

下载使用一下看看, 支持分享了

smile_z 发表于 2026-4-5 19:39:06

感谢分享

sml131 发表于 2026-4-5 20:45:52

下载了准备测试一下 回头反馈

seven0 发表于 2026-8-13 10:34:59

辛苦了,内容详细,收藏了。
页: [1]
查看完整版本: 有没有办法不修改引导文件,自适应长文件名