a1ive / grub2-filemanager

GRUB2-based file manager
https://a1ive.github.io/grub2-filemanager/
GNU General Public License v3.0
528 stars 106 forks source link

你好,提交个建议 #11

Closed sky5454 closed 7 years ago

sky5454 commented 7 years ago

建议增加自定义规则生成启动菜单的功能: 很多Linux发行版的iso文件里都有一个grub/grub2菜单配置文件,

目前各发行版最新版本的菜单路径: Debian的是 \BOOT\GRUB\GRUB.CFG Arch的是 \LOADER\ENTRIES\ARCHISO_X86_64.CONF Deepin的是 \BOOT\GRUB\GRUB.CFG

只要找到这个文件,就可根据该文件修改出适合【grub2引导ISO的菜单】 而这个文件的放置也是有规律,一般置于EFI BOOT GRUB LOADER等任一目录内, 人工来找肯定是找得到的,所以我觉得你可以写一个自动化搜索+读取规则的程序,然后让大家一起提交规则

找到后利用程序修改即可。

PS最好能增加挂载iso后,可打开文本的功能,这样便于人工操作

附上修改例子:

只要使用改动主要部分就可以作为【grub2引导ISO启动】的菜单:

① 如Arch里的grub2菜单( "H:\LOADER\ENTRIES\ARCHISO_X86_64.CONF")主要代码:

title Arch Linux archiso x86_64 UEFI USB linux /arch/boot/x86_64/vmlinuz initrd /arch/boot/intel_ucode.img initrd /arch/boot/x86_64/archiso.img options archisobasedir=arch archisolabel=ARCH_201706

② 按如下改动后可直接用于【grub2引导ISO启动】

menuentry "[9]Arch Linux archiso x86_64 UEFI USB" --hotkey="9" { set isofile="/0LIVE/Arch/archlinux-2017.06.01-x86_64.iso" search --set -f $isofile loopback loop $isofile linux (loop)/arch/boot/x86_64/vmlinuz archisobasedir=arch archisolabel=ARCH_201706 img_dev=/dev/disk/by-name/Win10 img_loop=$isofile earlymodules=loop initrd (loop)/arch/boot/intel_ucode.img initrd (loop)/arch/boot/x86_64/archiso.img }

本例子: ISO文件:"C:\0LIVE\Arch\archlinux-2017.06.01-x86_64.iso" C盘卷标:Win10 ISO挂载后卷标为:ARCH_201706

主要是在菜单里添加了 loopback功能、指定iso文件所在位置(所在分区+路径)

希望该程序越做越好。

sky5454 commented 7 years ago

还有,目前网上那些PE工具生成的ISO文件普遍是多合一PE,里面的引导文件很容易找到。 不过我不清楚如何loopback这些多合一PE的ISO文件,希望你能提供一个示例,谢谢。

a1ive commented 7 years ago

目前本项目使用4种方法启动ISO

  1. 标准grub2 ISO的回环映射配置文件/boot/grub/loopback.cfg。适用于所有基于Ubuntu的发行版。 snipaste20170612_164341
  2. 根据ISO内部文件结构判断Linux发行版类型,进而生成菜单。 例如,Fedora系列的特征是LiveOS文件夹,Arch系列的特征是arch文件夹。 snipaste20170612_164449
  3. 首先根据ISO内部文件结构判断Linux发行版类型,然后解析/isolinux/isolinux.cfg, /boot/isolinux/isolinux.cfg, /isolinux.cfg生成对应的菜单。 snipaste20170612_164717
  4. 借助memdisk或grub4dos的“磁盘仿真”功能,将ISO仿真为光驱。此方法只适用于WindowsPE及小型的Linux系统(例如SliTaz)。另外,此方法不能在UEFI下使用。 snipaste20170612_165121
a1ive commented 7 years ago

大部分Linux LiveCD并不是使用GRUB2引导的,而是使用各自维护的ISOLINUX,不同版本的语法差别很大。 使用GRUB2的发行版也并不总是按照标准行事,例如Manjaro和Kali Linux,它们提供的loopback.cfg里面的启动参数是错误的。而自身的GRUB2菜单写得非常复杂,基本上无法解析。

a1ive commented 7 years ago

还有,目前网上那些PE工具生成的ISO文件普遍是多合一PE,里面的引导文件很容易找到。 不过我不清楚如何loopback这些多合一PE的ISO文件,希望你能提供一个示例,谢谢。

WindowsPE无法loopback启动。只能磁盘仿真或者用NTBOOT(wimboot)。后者有违GPL协议。

sky5454 commented 7 years ago

多合一PE的iso不是直接启动winpe的,而是通过grub/grub2启动。 在实机中,首先是进入grub菜单,然后由用户选择进入某一个winpe,菜单例子如下: timeout 15 default 2 gfxmenu /BOOT/GRUB/MESSAGE graphicsmode -1 600:800 font /BOOT/GRUB/MENU.HEX

title [1] 启动 Windows 2003 PE (旧机型) find --set-root /WXPE/SETUPLDR.BIN chainloader /WXPE/SETUPLDR.BIN

title [2] 启动 Windows 10 PE x64 (新机型) find --set-root /BOOT/10PEX64 chainloader /BOOT/10PEX64

title [3] 启动 硬盘上的操作系统 find --set-root --ignore-floppies --ignore-cd /ntldr || find --set-root --ignore-floppies --ignore-cd /bootmgr map () (hd0) map (hd0) () map --rehook find --set-root --ignore-floppies --ignore-cd /ntldr || find --set-root --ignore-floppies --ignore-cd /bootmgr chainloader /ntldr || chainloader /bootmgr

title [4] 运行 DiskGenius 硬盘分区工具 terminal console pause --wait=2 Loading DiskGenius tool ... map --mem /BOOT/IMGS/DG.IMG (fd0) map --hook chainloader (fd0)+1 rootnoverify (fd0)

title [5] 运行 Ghost 备份恢复工具 configfile /BOOT/GRUB/GHOST.LST

title [6] 运行 MaxDos 工具箱 terminal console pause --wait=2 Loading DOS tool ... map --mem /BOOT/IMGS/DOS.IMG (fd0) map --hook chainloader (fd0)+1 rootnoverify (fd0)

title [7] 运行 其他工具 configfile /BOOT/GRUB/TOOL.LST

title [8] 关闭 计算机 halt

a1ive commented 7 years ago

多合一PE的iso不是直接启动winpe的,而是通过grub/grub2启动。 在实机中,首先是进入grub菜单,然后由用户选择进入某一个winpe,菜单例子如下: timeout 15 default 2 gfxmenu /BOOT/GRUB/MESSAGE graphicsmode -1 600:800 font /BOOT/GRUB/MENU.HEX title [1] 启动 Windows 2003 PE (旧机型) find --set-root /WXPE/SETUPLDR.BIN chainloader /WXPE/SETUPLDR.BIN title [2] 启动 Windows 10 PE x64 (新机型) find --set-root /BOOT/10PEX64 chainloader /BOOT/10PEX64 title [3] 启动 硬盘上的操作系统 find --set-root --ignore-floppies --ignore-cd /ntldr || find --set-root --ignore-floppies --ignore-cd /bootmgr map () (hd0) map (hd0) () map --rehook find --set-root --ignore-floppies --ignore-cd /ntldr || find --set-root --ignore-floppies --ignore-cd /bootmgr chainloader /ntldr || chainloader /bootmgr title [4] 运行 DiskGenius 硬盘分区工具 terminal console pause --wait=2 Loading DiskGenius tool ... map --mem /BOOT/IMGS/DG.IMG (fd0) map --hook chainloader (fd0)+1 rootnoverify (fd0) title [5] 运行 Ghost 备份恢复工具 configfile /BOOT/GRUB/GHOST.LST title [6] 运行 MaxDos 工具箱 terminal console pause --wait=2 Loading DOS tool ... map --mem /BOOT/IMGS/DOS.IMG (fd0) map --hook chainloader (fd0)+1 rootnoverify (fd0) title [7] 运行 其他工具 configfile /BOOT/GRUB/TOOL.LST title [8] 关闭 计算机 halt

你给的菜单是grub4dos的。注意,grub4dos的功能并不是grub/grub2的子集。应该通过"磁盘仿真"启动。

menuentry "xxxPE.iso" {
    linux /memdisk iso raw
    initrd /xxxx/xxxPE.iso
}
sky5454 commented 7 years ago

嗯,谢谢。没有其他疑问了。希望多加推广,这个程序非常好,但目前知名度还是很低的。

sky5454 commented 7 years ago

不好意思,等等。我的主板可以按F12(引导选择器)选择引导,那么请问该把grubfm.iso放到哪里?(UEFI的) 还有三个建议:

① 建议把这个程序当成默认系统选择器来做

如把外置菜单做在左上角,用数字图片表示。 如把图片1 图片2把中间数字切下来,使用按1~0快捷键启动外置菜单的1到10系统,按b键查看1~10代表的系统。

这样方便美观。

② 能否让这个程序实现模拟UEFI启动

③ 增加书签功能

让用户可以把某个ISO的启动菜单保存并加到书签里

a1ive commented 7 years ago

请问该把grubfm.iso放到哪里?

grubfm.iso是给legacy-bios/uefi-csm的机器用的。纯uefi的机器应该使用grubfmx64.efi或grubfmia32.efi,分别对应64位/32位uefi固件。 如果作为默认引导器使用,应该重命名为bootx64.efi/bootia32.efi (64/32位固件), 放到esp分区的/efi/boot/目录下 。如果默认引导器是grub之类的, 名称、路径随意, 参照README文件。

a1ive commented 7 years ago

建议把这个程序当作成默认选择器来做

直接用一般的grub就行了.

如把外置菜单做在左上角,用数字图片表示。如把图片1 图片2把中间数字切下来,使用按1~0快捷键启动外置菜单的1到10系统,按b键查看1~10代表的系统

对于特定的某个菜单是可行的,不具备通用性。而且我没太明白你的意思。

能否让这个程序实现模拟UEFI启动?

我不太熟悉duet, 而且目前我的电脑是纯uefi的,没办法测试.如果你实现了这个功能,欢迎提交PR.

增加书签功能 让用户可以把某个ISO的启动菜单保存并加到书签里

目前grub2不具备向磁盘写入文件的功能, 因此无法实现.

sky5454 commented 7 years ago

1,我的意思是③和①是搭配使用的 2,能否通过外部程序写入文件?

a1ive commented 7 years ago

能否通过外部程序写入文件?

当然是可以的。比较复杂,为了这么一个功能花费太大力气不值得。

a1ive commented 7 years ago

我的意思是③和①是搭配使用的 建议把这个程序当成默认系统选择器来做

程序应该只关注一个目标,并尽可能把它做好。 默认的系统选择器,用一般的GRUB2就足够了。

sky5454 commented 7 years ago

这个程序还是不够好,不如增加 “以此文件作为grub2菜单 loop启动” 的选项,因为目前很多发行版里刻录后是以grub2菜单选择启动的。 所以不如直接以菜单文件为基础,增加loop启动项。

一般来说,只要以菜单文件为基础,然后每个菜单项里都加上loop功能,再加载内核和文件映像路径前加(loop),然后指定ISO文件所在路径就可以正常启动了。

测试了一下,你的这个程序无法启动debian的net安装和DVD两个版本。

a1ive commented 7 years ago

debian netinst / debian installation dvd 均不支持loop启动. 只有debian live cd支持loop启动.

sky5454 commented 7 years ago

为什么不能在这个程序里加上loop功能呢?

a1ive commented 7 years ago

是镜像本身不支持。无法在不修改镜像的情况下整体启动ISO。

sky5454 commented 7 years ago

不能在外部加loop模块吗?

那还是加个文件读写模块吧,这样就可以把镜像里的必须文件复制出来,就不用loop了。

a1ive commented 7 years ago

无法交流。 你需要了解一下Linux的启动流程。