无忧启动论坛

标题: 能否把grub2的loopback命令移植到grub4dos? [打印本页]

作者: liuzhaoyzz    时间: 2021-11-27 15:56
标题: 能否把grub2的loopback命令移植到grub4dos?
本帖最后由 liuzhaoyzz 于 2023-5-12 03:43 编辑

有的linux发行版可以借助loopback命令启动,这种模式下跟grub4dos的map命令有一定区别,loopback能启动的,map不一定能启动,他们的工作机理似乎不同,同样的ventoy启动linux.iso/pe.iso的时候,底层也做了类似的iso虚拟仿真+碎片解析。

现在的grub4dos整体启动linux.iso,如果linux启动脚本在内核层支持挂载iso,就可以用特定的bootcode挂载linux.iso,从而继续启动;如果内核启动脚本没有设计挂载iso,map命令就不能整体启动linux.iso,只能用改造initrd的办法启动,或者用有一定风险的partnew方案启动,都不完美,linux发行版官方用isolinux/grub2作为引导器的要比grub4dos的多。

如果能把grub2的loopback命令移植到grub4dos,作为一个内部或者外部命令,有的linux.iso就可以整体启动了吧,理论上是否有可行性?大神们可有兴趣移植?
@2011yaya2007777,@wintoflash,@chenall......



作者: 邪恶海盗    时间: 2021-11-27 16:15
表示除了围观之外啥也干不了的撸过...
作者: 不点    时间: 2021-11-27 17:23
liu 版主,我从另一个角度考虑,就是 “为 yaya 减轻工作量” 这个角度,我不想让 yaya 做这个工作。

我不是开发者,我的话,对任何人,都没有任何约束力。我只是发表个人看法。

当然了,如果 yaya 能通过复制粘贴之类的办法,把 grub2 的 loopback 弄过来,这我赞成。

如果要花费较大的精力,那么我不赞成。

还有一点,对于增加这个功能是不利的,yaya 要明白。细说如下:

grldr 的体积大起来,如果超过某个限度,那就完蛋了。

启动屏幕的第一行显示 常规内存、扩展内存、高位内存,最后还有个 End: ....... 这个数值,就是用来参考的。如果它逐步变大,出现内存冲突的可能性就增加了。

我怀疑,目前的 grldr 在碎片处理上,可能就有问题了。究竟是不是内存冲突,那还不知道。

无论如何,如果把 loopback 的功能弄进来,增大了 End:..... 的值,那可能会引发一连串的问题,难以排解。

我甚至建议 yaya,把某些不需要或不重要的功能,再进一步删减,来减少 grldr 的体积。

体积小了安全,体积大了不安全。

比如,把 USB 功能去掉,或者变成外置命令。

如果 yaya 没时间处理,那就不动它。

作者: liuzhaoyzz    时间: 2021-11-27 17:28
不点 发表于 2021-11-27 17:23
liu 版主,我从另一个角度考虑,就是 “为 yaya 减轻工作量” 这个角度,我不想让 yaya 做这个工作。

我 ...

如果要花费太多精力,还是算了,我也就是信口说说。 用loopback模式启动的似乎也不太多。      
作者: 不点    时间: 2021-11-27 17:47
liuzhaoyzz 发表于 2021-11-27 17:28
如果要花费太多精力,还是算了,我也就是信口说说。 用loopback模式启动的似乎也不太多。

liu 版主,你这句:

linux发行版官方用 isolinux/grub2 作为引导器的要比 grub4dos 的多。

说得太客气了吧?照顾 grub4dos 开发者的脸面?嗯??据我所知,貌似目前的 linux 发行版无一采用 grub4dos 的。

liu 版主,我们画个图,更直观:

linux  --------> grub2,  syslinux(包括 isolinux ,memdisk 等), 完全没 grub4dos 的事。

Windows -----> 微软自己的引导,grub4dos(bios+uefi),别的引导器也有很多.....

两个阵线,比较清晰,互不影响,也好像互不往来(抱歉说得有点难听了)。

该弄啥,就弄啥。强扭的瓜果不甜。

作者: 2011yaya2007777    时间: 2021-11-27 17:47
我对linux的启动机理没有完全搞懂。处理uefi版本时就没有搞定,搁置起来,还是w大打了补丁。grldr里的usb驱动是使用汇编语言,不超过2k,启动旧电脑还是有用的。要减少体积的话,是否可以砍掉一些不经常使用的文件系统?
作者: 不点    时间: 2021-11-27 17:56
2011yaya2007777 发表于 2021-11-27 17:47
我对linux的启动机理没有完全搞懂。处理uefi版本时就没有搞定,搁置起来,还是w大打了补丁。grldr里的usb驱 ...

提醒得对!有 n 多文件系统,躺在那里睡大觉,说得难听点,是占着茅坑。
作者: 旁观者清    时间: 2021-11-27 18:05
高层对话,颇感风度。
作者: wintoflash    时间: 2021-11-27 18:11
2011yaya2007777 发表于 2021-11-27 17:47
我对linux的启动机理没有完全搞懂。处理uefi版本时就没有搞定,搁置起来,还是w大打了补丁。grldr里的usb驱 ...

保留 UD/FAT/exFAT/NTFS/ISO9660/UDF/EXT2 就可以了。
如果还是觉得空间紧张,甚至可以删除 EXT2。
我记得几年前的时候发现grldr.mbr遇到EXT分区就会死机。反正目前 UEFI 启动为主,linux kernel 和 initrd 都放在 FAT 分区里面。
作者: wintoflash    时间: 2021-11-27 18:14
这种模式下跟grub4dos的map命令有一定区别,loopback能启动的,map不一定能启动

grub2:
  1. loopback loop /xxx.iso
  2. linux (loop)/xxx/vmlinuz iso_path=/xxx.iso
  3. initrd (loop)/xxx/initrd.xz
复制代码

grub4dos:
  1. map /xxx.iso (0xff)
  2. map --hook
  3. kernel (0xff)/xxx/vmlinuz iso_path=/xxx.iso
  4. initrd (0xff)/xxx/initrd.xz
复制代码

有什么区别?
作者: liuzhaoyzz    时间: 2021-11-27 18:26
本帖最后由 liuzhaoyzz 于 2021-11-27 18:33 编辑
wintoflash 发表于 2021-11-27 18:14
grub2:

grub4dos:


你说的这种,指的是发行版里面,启动脚本里面考虑了iso挂载的情况。比如debian,ubuntu这样子的发行版,用了findiso, iso-scan/filename这样的参数,有的iso内部systemd/init启动脚本似乎没有考虑,只有loopback.cfg这样子的,似乎只能用grub2,不能用g4d了,不过不是很多了。     
作者: liuzhaoyzz    时间: 2021-11-27 18:33
不点 发表于 2021-11-27 17:47
liu 版主,你这句:

linux发行版官方用 isolinux/grub2 作为引导器的要比 grub4dos 的多。

不是说客气话,论坛里那么多linux发行版,linux.iso虽然官网用的大多是isolinux/grub2,但是民间大家很多还是用g4d来启动的啊。      
作者: 2011whp    时间: 2021-11-27 19:24
grub4 是第三方吧,
   
操作系统有专用引导器,不过 linux开源, bcd更是闭合了,进去出不来

再一个是 ,体积小,随然 现在不在乎 400KB,还是 几MB,但潜意识,一样的话,还是选 小的。

微软史 影响大众方面,比linux 要深



作者: wintoflash    时间: 2021-11-27 19:54
liuzhaoyzz 发表于 2021-11-27 18:26
你说的这种,指的是发行版里面,启动脚本里面考虑了iso挂载的情况。比如debian,ubuntu这样子的发行版 ...
只有loopback.cfg这样子的

所以这和loopback功能有什么关系?
你想要的其实是在grub4dos下执行grub2脚本。这是没意义的。
作者: liuzhaoyzz    时间: 2021-11-27 21:47
哦,那就算了吧。
作者: 不点    时间: 2021-11-28 06:15
wintoflash 发表于 2021-11-27 18:11
保留 UD/FAT/exFAT/NTFS/ISO9660/UDF/EXT2 就可以了。
如果还是觉得空间紧张,甚至可以删除 EXT2。
我 ...

目前的 grldr.mbr 在 ext2 上面不会出问题了。yaya 专门为此重写了代码。

ext2 要是干掉了,那就基本上等于说不支持 Linux 了。

作者: 2011yaya2007777    时间: 2021-11-28 06:39
应当支持。现在清理僵尸,只是属于优化方案,而不是因为文件尺寸过大出现问题,不得不为之。
作者: 不点    时间: 2021-11-28 07:45
2011yaya2007777 发表于 2021-11-28 06:39
应当支持。现在清理僵尸,只是属于优化方案,而不是因为文件尺寸过大出现问题,不得不为之。

是的,目前还没有证据表明,已经出现内存冲突了。清理僵尸以后,会让代码更安全,让代码的保险系数提高。

同时也要注意,尽量不要再增加功能代码了。注意体积问题确实是个事。

UEFI 的情况我不接触,可能不存在此类问题。旧的 bios 之下,grub4dos 的设计,是按节约内存来设计的。所以,内存问题就比较敏感了。


作者: ql1307096    时间: 2021-12-16 14:36
自从电脑硬盘换成3T后,就使用了gpt,然后启动管理器就从G4D改为grub2了,好久没有再用g4d。但我一直觉得g4d很多方便都比grub2要好些。如果g4d在不影响使用的情况下,加入类似loopback的功能似乎不错、。
作者: wintoflash    时间: 2021-12-16 14:51
ql1307096 发表于 2021-12-16 14:36
自从电脑硬盘换成3T后,就使用了gpt,然后启动管理器就从G4D改为grub2了,好久没有再用g4d。但我一直觉得g4 ...

(10#)http://bbs.wuyou.net/forum.php?m ... &fromuid=487838
什么事情是loopback可以做,但是map做不到的?
作者: dfw9    时间: 2021-12-16 15:06
这是在搭鹊桥?其实已经有分水岭了,各走各路、各通各桥更能适应新技术的推广。或许今后G4D和Linux都用不到了,也未必可知。
作者: 2011whp    时间: 2021-12-16 15:29
g4e  未来 10 年   不是 问题,  硬件存量大, x86 没那么容易 末落的

现在 10年前的 g4d  还在 用

用map 和 loopback  提取文件 是 一样的,实在不行,把光盘内的 kernel  提取到硬盘 ,让它以为是 从硬盘启动 内核 , 查找 iso 继续 安装

作者: 2011yaya2007777    时间: 2021-12-17 09:31
提醒得对!有 n 多文件系统,躺在那里睡大觉,说得难听点,是占着茅坑。

清理僵尸以后,grldr 减少了 13Kb。
作者: liuzhaoyzz    时间: 2021-12-17 11:58
本帖最后由 liuzhaoyzz 于 2023-5-12 03:47 编辑
wintoflash 发表于 2021-12-16 14:51
(10#)http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=427967&pid=4430688&fromuid=487 ...


举个例子,veket/puppy linux,可以用grub2+loopback方案整体启动veket/puppy.iso,但是g4d/g4e的map功能就是不行,因为systemd/init脚本上没有解析外部iso传递到linux kernel的bootcode启动参数。所以启动veket/puppy我都是推荐用grub2,解开veket/puppy.iso或者不解开,grub2都能够胜任,g4d就不行,这是g4d功能上的缺失。g4d+partnew方案整体启动iso局限性较大,而且这个方案有一定的风险。

grub2在BIOS方面启动兼容性方面感觉比不上g4d,但是用bootmgr/g4d作为第一启动,用grub2-bios作为中转感觉还可以,我喜欢把grub2-bios作为第二引导。

如果一个linux发行版,想要支持loopback启动,感觉不是太复杂。但是要一个linux发行版支持g4d的map,那就需要改造systemd/init脚本,这些东西,懂的人怕是不多。像是ventoy就用了patch initrd的方案吧,还有你的grubfilemanager是不是也用了,我不清楚呢。patch initrd方案,是一整套启动解决方案,不能独立。      

作者: wintoflash    时间: 2021-12-17 12:15
liuzhaoyzz 发表于 2021-12-17 11:58
举个例子,veket/puppy linux,可以用grub2+loopback方案整体启动veket/puppy.iso,但是g4d/g4e的map功 ...

具体是怎么启动veket/puppy iso的?

作者: liuzhaoyzz    时间: 2021-12-17 12:17
本帖最后由 liuzhaoyzz 于 2021-12-17 14:41 编辑
wintoflash 发表于 2021-12-17 12:15
具体是怎么启动veket/puppy iso的?

我是手机回帖,在高铁上呢,晚点贴个
veket.v22.a微软edge浏览器
https://cloud.189.cn/web/share?code=fq2INnAFjINn

insmod gfxterm
insmod terminal
insmod loopback

menuentry "/linux/veket/v22a.1215/veket_22.a.iso-loopback.cfg" "/linux/veket/v22a.1215/veket_22.a.iso" {
terminal_output console
search --no-floppy --set --file $2
export iso_path=$2;loopback -d loop;loopback loop $2
set root=loop
configfile (loop)/boot/grub/loopback.cfg
}

menuentry "/linux/veket/v22a.1215/veket_22.a.iso-partnew[not_recommend]" "/linux/veket/v22a.1215/veket_22.a.iso" {
set gfxpayload=keep
search --no-floppy --set --file $2;regexp --set=x '(.*),' "$root";loopback loop $2
partnew -t 0x00 -f $2 ($x) 4
linux (loop)/vmlinuz PSUBDIR=/ pmedia=cd pfix=fsck
initrd (loop)/initrd.gz
}

v20下载地址:https://cloud.189.cn/web/share?code=bM3QNnAry26r
menuentry "/linux/veket/v20-v20211201/veket_20/vmlinuz" "/linux/veket/v20-v20211201/veket_20/vmlinuz" {
search --no-floppy --set --file $2
linux $2 PSUBDIR=/linux/veket/v20-v20211201/veket_20
initrd /linux/veket/v20-v20211201/veket_20/initrd.gz
}

menuentry "/linux/veket/v20-v20211201/veket_20/vmlinuz[no_save_file]" "/linux/veket/v20-v20211201/veket_20/vmlinuz" {
search --no-floppy --set --file $2
linux $2 pfix=ram savefile=none PSUBDIR=/linux/veket/v20-v20211201/veket_20
initrd /linux/veket/v20-v20211201/veket_20/initrd.gz
}

puppy下载地址:清华大学开源软件镜像站 | Tsinghua Open Source Mirror https://mirrors.tuna.tsinghua.edu.cn/https://mirrors.tuna.tsinghua.edu.cn/puppy/puppy-fossa/
fossapup64-9.5.iso
MD5:6a45e7a305b7d3172ebd9eab5ca460e4  fossapup64-9.5.iso

menuentry "/linux/puppy/fossapup64-9.5.iso-loopback.cfg" "/linux/puppy/fossapup64-9.5.iso" {
terminal_output console
search --no-floppy --set --file $2
export iso_path=$2;loopback -d loop;loopback loop $2
set root=loop
configfile (loop)/boot/grub/loopback.cfg
}






作者: wintoflash    时间: 2021-12-18 08:25
本帖最后由 wintoflash 于 2021-12-18 08:33 编辑
liuzhaoyzz 发表于 2021-12-17 12:17
我是手机回帖,在高铁上呢,晚点贴个
veket.v22.a微软edge浏览器
https://cloud.189.cn/web/share?code ...

你贴的这些例子并不能说明grub4dos下loopback的必要性。

(1) 和 (5): 打开iso看看loopback.cfg文件,看看kernel命令行是怎么写的,抄过来就能用。再说了,执行loopback.cfg与loopback功能本身并没有关系。grub2 map之后一样能执行loopback.cfg。
(2): 在grub4dos下用partnew和map,完全一样。
(3) 和(4): 根本没有用到loopback,在grub4dos下一样能启动。
作者: 2011grassll    时间: 2021-12-18 09:36
我觉得loop驱动的好处是不是基本可以忽略iso文件碎片的问题?
常看到讨论map iso因为碎片不成功的问题,而全载入内存可能某些机器又受不了
作者: liuzhaoyzz    时间: 2021-12-18 10:04
本帖最后由 liuzhaoyzz 于 2021-12-18 10:45 编辑
wintoflash 发表于 2021-12-18 08:25
你贴的这些例子并不能说明grub4dos下loopback的必要性。

(1) 和 (5): 打开iso看看loopback.cfg文件, ...


我说的主要是(1)和(5)的场景,其他的是顺别贴出来的,抱歉误导了。

光盘里面,\boot\grub2\loopback.cfg内容如下:

loadfont /boot/grub/font.pf2

color_normal=cyan/black
#menu_color_highlight=black/light-gray
menu_color_highlight=yellow/red
menu_color_normal=light-gray/black

menuentry "veket 22" {
    linux /vmlinuz pfix=fsck pmedia=cd find_iso=${iso_path}
    initrd /initrd.gz
}

menuentry "veket 22 - Copy SFS files to RAM" {
    linux /vmlinuz pfix=copy,fsck pmedia=cd find_iso=${iso_path}
    initrd /initrd.gz
}

menuentry "veket 22 - Don't copy SFS files to RAM" {
    linux /vmlinuz pfix=nocopy,fsck pmedia=cd find_iso=${iso_path}
    initrd /initrd.gz
}

menuentry "veket 22 - RAM only" {
    linux /vmlinuz pfix=ram,fsck pmedia=cd find_iso=${iso_path}
    initrd /initrd.gz
}

menuentry "veket 22 - No X" {
    linux /vmlinuz pfix=nox,fsck pmedia=cd find_iso=${iso_path}
    initrd /initrd.gz
}

menuentry "veket 22 - No KMS (Kernel modesetting)" {
    linux /vmlinuz nomodeset pfix=fsck pmedia=cd find_iso=${iso_path}
    initrd /initrd.gz
}

menuentry "veket 22 - Ram Disk SHell" {
    linux /vmlinuz pfix=rdsh pmedia=cd find_iso=${iso_path}
    initrd /initrd.gz
}

menuentry "Shutdown" {
        halt
}

menuentry "Reboot" {
        reboot
}

find_iso=${iso_path}这个参数是假的,根本没什么用,因为systemd/init里面没有对这个find_iso进行解析并挂载,他似乎是用来适配grub2的loopback方案的。好像是,我测试过,因此直接map是不行的。所以有想把grub2的loopback移植到grub4dos环境的奇怪想法。
我马上要出去下。


作者: liuzhaoyzz    时间: 2021-12-18 10:06
2011grassll 发表于 2021-12-18 09:36
我觉得loop驱动的好处是不是基本可以忽略iso文件碎片的问题?
常看到讨论map iso因为碎片不成功的问题,而 ...

碎片问题也是一个好处,grub2的碎片解析,感觉上来说,要比g4d的碎片解析稳定,而且可解析的碎片没有上限,似乎只有解析时间问题,解析速度感觉很快。

作者: liuzhaoyzz    时间: 2021-12-18 10:29
wintoflash 发表于 2021-12-18 08:25
你贴的这些例子并不能说明grub4dos下loopback的必要性。

(1) 和 (5): 打开iso看看loopback.cfg文件, ...
再说了,执行loopback.cfg与loopback功能本身并没有关系。grub2 map之后一样能执行loopback.cfg。        


现在是想用grub4dos的loopback来整体启动linux.iso啊,grub4dos map之后,怎么调用/boot/grub/loopback.cfg?不行吧?
作者: liuzhaoyzz    时间: 2021-12-18 10:36
本帖最后由 liuzhaoyzz 于 2021-12-18 10:54 编辑
2011yaya2007777 发表于 2021-12-17 09:31
清理僵尸以后,grldr 减少了 13Kb。


想顺便问下,grub4dos如果增加外部命令,对于grldr的大小应该没有什么影响吧?我的意思是说,如果loopback移植起来简单的话,移植到g4d作为外部命令,不会挤占grldr的有限空间,外部命令也不会对于grldr的稳定性产生影响。这应该是不点大担心的那个关注点吧。

当然这是在有必要,大神们有兴趣,移植难度不大的前提下。如果移植难度大,相关联的内容多,项目难度大,性价比太低的话,还是算了。      

作者: liuzhaoyzz    时间: 2021-12-18 11:09
wintoflash 发表于 2021-11-27 19:54
所以这和loopback功能有什么关系?
你想要的其实是在grub4dos下执行grub2脚本。这是没意义的。


你这段话说的有道理,似乎根本不是移植loopback功能的事情,退一步说即使移植loopback到g4d成功了,g4d又怎么能够识别iso里面的/boot/grub/loopback.cfg文件并加载启动?这些菜单文件menuentry什么的都是grub2体系的,这似乎是个悖论。
作者: wintoflash    时间: 2021-12-18 11:23
liuzhaoyzz 发表于 2021-12-18 11:09
你这段话说的有道理,似乎根本不是移植loopback功能的事情,退一步说即使移植loopback到g4d成功了,g4d ...

你终于明白了。
find_iso=${iso_path}这个参数是假的,根本没什么用,因为systemd/init里面没有对这个find_iso进行解析并挂载,他似乎是用来适配grub2的loopback方案的。好像是,我测试过,因此直接map是不行的。

那按理说loopback也是不行的。
loopack没什么神秘的,就是在grub内部挂载一个文件。这个磁盘只在grub内部有效。

loopback唯一的长处,如2011grassll所说,就是与固件平台无关,不用去管bios/uefi那堆破事。
作者: 2011whp    时间: 2021-12-18 11:35
整体 移出引导 及相关,然后 chainloader才是 正解,(先把 iso内 原来的引导 搞清 楚)

专门的iso 用 专门的引导 (如果不行,那就只能  占一个分区 安装了)
(再奇巴,那就得用 真光驱动    或   加类似 svbus的 驱动了)
作者: liuzhaoyzz    时间: 2021-12-18 11:52
wintoflash 发表于 2021-12-18 11:23
你终于明白了。

那按理说loopback也是不行的。

veket/puppy.iso用grub2-loopback启动没问题的,本人亲测,那个find_iso参数好像在systemd/init脚本里面有的,用于适配grub2-loopback方案。
作者: liuzhaoyzz    时间: 2021-12-18 11:56
本帖最后由 liuzhaoyzz 于 2021-12-18 13:00 编辑
2011whp 发表于 2021-12-18 11:35
整体 移出引导 及相关,然后 chainloader才是 正解,(先把 iso内 原来的引导 搞清 楚)

专门的iso 用  ...

linux的引导,一般都是用kernet+initrd语句,很少有chainloader语句,chainloader似乎更多地用于启动ntldr/bootmgr之类的。

svbus只能用于windows或者pe环境,linux下面没有人移植,就是svbus_for linux编译成功了,那么多linux发行版,怎么可能适配得过来呢。
作者: 2011whp    时间: 2021-12-18 11:57
看来 veket/puppy.iso是 普通 的 iso

参数向后续 传递 ,没有用过的 参数  会保留到   bash  环境变量


作者: wintoflash    时间: 2021-12-18 11:59
liuzhaoyzz 发表于 2021-12-18 11:52
veket/puppy.iso用grub2-loopback启动没问题的,本人亲测,那个find_iso参数好像在systemd/init脚本里面 ...

你这说法,前后矛盾啊。
如果grub2用这个参数可以启linux,那么grub4dos也可以。
如果没成功,估计是你哪里搞错了。
作者: liuzhaoyzz    时间: 2021-12-18 13:02
wintoflash 发表于 2021-12-18 11:59
你这说法,前后矛盾啊。
如果grub2用这个参数可以启linux,那么grub4dos也可以。
如果没成功,估计是你 ...

尝试了很多参数写法,直接map无法启动,搞不明白,官方也没有相关资料。




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3