无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 8588|回复: 36

关于g4d和grub2的partnew命令用于linux.iso整体仿真启动的一些研究和测试

[复制链接]
发表于 2021-2-8 16:33:27 | 显示全部楼层 |阅读模式
本帖最后由 liuzhaoyzz 于 2021-12-8 22:23 编辑

关于g4d和grub2的partnew命令用于linux.iso整体仿真启动的一些研究和测试

严重警告:在grub2_uefi下用partnew新建一个已经存在的MBR硬盘分区表项,并且从该分区“挂载”一个linux.iso启动,可能会导致partnew指向的分区在windows下被覆盖掉,必须用diskgenius找回分区才行!新手不要尝试这个方案!



一、g4d_BIOS下面的partnew命令

查看sratlf版主写的关于partnew命令帮助:
partnew
用法: partnew [--active] PART TYPE START [LEN]
描述:


create a primary patition at the starting address START with the length LEN, with the type TYPE. START and LEN are in sector units.if --active is used, the new partition will be active. START can be a contiguous file that will be used as the content/data of the new partition, in which case the LEN parameter is ignored, and TYPE can be either 0x00 for auto or 0x10 for hidden-auto.
创建一个新的主分区。START 为起始扇区号,LEN 为其包含的扇区数,TYPE 为其分区类型。0x00是自动判断。

可以使用 PARTNEW 来建立一个新的主分区。PARTNEW可以为逻辑分区生成一个新的主分区项(在分区表中)。

例1:
partnew (hd0,3) 0x07 (hd0,4)+1
这里的(hd0,4)+1 代表了整个(hd0,4)分区。这条命令将建立一个分区类型为 0x07 的新的主分区(hd0,3),
并且它的内容(即数据)和逻辑分区(hd0,4)一样。

例2:
就像整个逻辑分区时的情况一样,一个连续的分区映像文件也可以用在PARTNEW 命令中
partnew (hd0,3) 0x00 (hd0,0)/my_partition.img
#这个 0x00 类型表示这个 MY_PARTITION.IMG 映像文件的分区类型由自动检测确定。上面的命令将建立一个类型恰当的新的主分区(hd0,3),并且使用这个连续的(hd0,0)/my_partition.img 文件中的全部内容(数据)作为它的内容(数据)。
注意:PARTNEW 将自动修正 BPB 中的“隐藏扇区数”并且这个修改是永久的。而且PARTNEW修改分区表也是永久的。

例3:
除了建立分区表项外,PARTNEW也可以用来删除(抹掉,擦除)一个分区表项。例如,
partnew (hd0,3) 0 0 0
这样,主引导记录中最后一个分区表项将被清空。通常,你可以用"partnew PARTITION 0 0 0"的格式来抹掉其分区表项,但是已经存储在这个分区中的数据不被影响。

我在网上看了一篇帖子:https://www.cnblogs.com/jinzhenshui/p/13344786.html
也就是说,可以grub4dos partnew可以通过读取文件系统上的ISO文件来模拟一个mbr主分区,然后,就是通过map ISO文件到虚拟光驱,最后通过该虚拟光驱启动。
注意事项:
1.ISO文件必须在grub4dos支持的文件系统上
2.ISO文件必须是连续存储的,不能有碎片
3.ISO文件所在磁盘必须与partnew模拟的mbr主分区在一个物理磁盘上
4.ISO文件必须时基于dracut内存盘体系构建的
5.partnew 其实不一定是(hd0,3)。只要是没有用到的、有效的都可以。比如(hd【0+】,【1-3】)

我进行了一些尝试,对于原生不支持不解开启动的linux.iso,比如puppy.iso及其衍生版veket.iso,还有slitaz这样子的,应该都可以借助于partnew命令来进行启动;对于原生支持不解开启动的linux.iso,就没有必要用partnew命令来启动了,这个命令还有些上面说的限制。

比如整体启动veket.iso:
title /linux/veket/veket_20.iso
find --ignore-floppies --ignore-cd --set-root /linux/veket/lucky8k-20-rc/veket-20.10.iso
map /linux/veket/lucky8k-20-rc/veket-20.10.iso (hd32) ;; map --hook
partnew (hd1,3) 0x00 /linux/veket/lucky8k-20-rc/veket-20.10.iso
kernel (hd32)/vmlinuz PSUBDIR=/ pmedia=cd pfix=fsck
initrd (hd32)/initrd.gz
我测试了可以启动,因为g4d环境下map仿真的磁盘,在进入linux之后会失效,除非有驱动支持,比如windows下面的firadisk/winvblock/svbus驱动,否则必然失效,而firadisk/winvblock/svbus驱动没有for linux的版本,即使有,由于linux发行版众多,适配起来也是非常费劲的事情。而partnew所做的事情,就是用linux.iso仿真出一个可以以假乱真的“真实的”物理分区,这个“真实的”物理分区,在g4d环境下有效,在linux下面仍然有效,这就可以保证linux.iso可以继续启动加载除了kernel之外的其他模块。
需要注意的是:
1、linux.iso必须连续存放,如果不连续可以用复制-粘贴-重命名的方法消除碎片;
2、上面菜单里面partnew (hd1,3)的(hd1,3)必须根据linux.iso所在的盘符进行有针对性地修改。
上面菜单中/linux/veket/lucky8k-20-rc/veket-20.10.iso是保存在(hd1,2)中,所以partnew后面紧跟的分区,必须是hd1,不能是hd0,hd2,而且(hd1,3)后面的这个3必须是hd1里面不存在的主分区,对于MBR硬盘,一般只能有4个主分区,其他的都是扩展分区以及从中划分出去的逻辑分区。注意g4d下面,主分区编号是0 1 2 3,比如(hd1,0)   (hd1,1)   (hd1,2)  (hd1,3),而(hd1,4) (hd1,5)..这样子的都是逻辑分区。


比如整体启动puppy.iso:
title /linux/puppy/fossapup64-9.5.iso
find --ignore-floppies --ignore-cd --set-root /linux/puppy/fossapup64-9.5.iso
map /linux/puppy/fossapup64-9.5.iso (hd32) ;; map --hook
partnew (hd1,3) 0x00 /linux/puppy/fossapup64-9.5.iso
kernel (hd32)/vmlinuz PSUBDIR=/ pmedia=cd pfix=nocopy
initrd (hd32)/initrd.gz

比如整体启动kylin.iso
title /linux/kylin/Kylin_v4_x64.iso-partnew
find --ignore-floppies --ignore-cd --set-root /linux/kylin/Kylin_v4_x64.iso
map /linux/kylin/Kylin_v4_x64.iso (hd32) ;; map --hook
partnew (hd1,3) 0x00 /linux/kylin/Kylin_v4_x64.iso
kernel (hd32)/casper/vmlinuz boot=casper locale=zh_CN.UTF-8 timezone=Asia/Shanghai localtime=Asia/Shanghai quiet splash
initrd (hd32)/casper/initrd.lz

理论上来讲,这种方法,应该可以拓展到几乎所有的linux.iso发行版,对于不喜欢解开linux.iso的网友,livecd版本的linux.iso比较方便,根本不需要把xxx.sfs这样的文件打包到initrd中,打包到initrd中还有大小的限制。但这个方法也有一定的局限性,就是linux.iso必须和partnew虚拟的分区处于同一个硬盘中,而且MBR磁盘要求主分区数目小于等于3个,因为需要预留一个主分区号给partnew用,而且不支持GPT分区。
g4d环境下,怎么用一系列的菜单命令判断linux.iso所在的分区倒底有几个主分区?还没有深入研究。

这些缺点在grub2中得到了一定的改进(后面会讲)。

这个partnew好像是不点大神写的?chenall、yaya、wintoflash能否针对上面所说的缺点改进下?比如能否支持逻辑分区的虚拟?能否跨硬盘、跨分区虚拟?
我用partnew作为关键字,在论坛搜索不到任何相关资料。lianjiang在20070828写的grub4dos教程中,已经有了这个命令,这个命令应该是很早的了。
我在README_GRUB4DOS.txt中,看到2006-08-27日前后有关于partnew命令的英文说明,这段说明跟sratlf版主的说明一样。
2006年写的功能,2021年,这都15年了,我才想着用上这个功能,真是让人唏嘘啊!

二、grub2_UEFI下面的partnew命令
好像是wintoflash大神做了一些改进,不要求iso所在的硬盘和partnew所虚拟的硬盘必须是同一个硬盘,可以跨硬盘,而且partnew不但支持MBR硬盘虚拟出一个主分区(要求主分区数目小于等于3个),还支持在一个存在的gpt硬盘后面虚拟出一个主分区。菜单中输入一个不存在的硬盘的时候,虽然也会出错,但是好像仿真还是会生效,比较强大。

命令说明:https://a1ive.github.io/grub2_cmd_zh.html
partnew OPTIONS DISK PARTNUM
为 msdos 分区表的磁盘创建主分区
警告:使用此命令有可能会造成数据损失
--active, -a 激活该分区
--file=FILE, -f 将文件作为分区内容使用
--type=HEX, -t 指定分区类型,0x00 为自动检测分区类型 (支持 FAT, exFAT, NTFS, EXT),0x10 为自动检测并设为隐藏分区。
--start=n, -s 指定开始地址(单位为扇区)
--length=n, -l 指定长度(单位为扇区)

比如启动puppy.iso:
menuentry "/linux/puppy/fossapup64-9.5.iso-gpt" "/fossapup64-9.5.iso" {
set gfxpayload=keep
search --no-floppy --set --file $2
loopback loop $2
partnew -t 0x00 -f /fossapup64-9.5.iso (hd30) 4
linux (loop)/vmlinuz PSUBDIR=/ pmedia=cd pfix=nocopy
initrd (loop)/initrd.gz
}
上面的菜单中,(hd30)根本就不存在,而且分区号4也就是(hd30,4)根本不存在,puppy.iso也可以正常启动。不过启动的时候会提示出错,“error:failed to open (hd30. Press any key to continue”,按回车键之后可以正常启动puppy.iso,抛出的这个错误能否不暂停,改成提示?@wintoflash?
这就比较爽了,可以跨硬盘、跨分区启动linux.iso。
另外我试了在命令行中,用partnew虚拟一个GPT分区,也会提示出错,“Unsupported partition table.”但是linux.iso仍然可以整体启动。



GPT-TEST-2021-02-08-16-18-50.png
GPT-TEST-2021-02-08-14-45-22.png

点评

partnew 命令是 grub legacy 原来就有的。grub4dos 对 grub legacy 的许多命令都进行了功能加强或改进,而且排除了其中的很多 bug。改造幅度最大的,是 map 命令。对 partnew 命令也进行了较大幅度的改造。  发表于 2021-2-9 03:58
发表于 2021-2-8 18:36:39 | 显示全部楼层
你的理解有误。
本帖最后由 liuzhaoyzz 于 2021-2-8 16:51 编辑


关于g4d和grub2的partnew命令用于linux.iso整体仿真启动的一些研究和测试
一、g4d_BIOS下面的partnew命令
查看sratlf版主写的关于partnew命令帮助:
partnew
用法: partnew [--active] PART TYPE START [LEN]
描述:


create a primary patition at the starting address START with the length LEN, with the type TYPE. START and LEN are in sector units.if --active is used, the new partition will be active. START can be a contiguous file that will be used as the content/data of the new partition, in which case the LEN parameter is ignored, and TYPE can be either 0x00 for auto or 0x10 for hidden-auto.
创建一个新的主分区。START 为起始扇区号,LEN 为其包含的扇区数,TYPE 为其分区类型。0x00是自动判断。

可以使用 PARTNEW 来建立一个新的主分区。PARTNEW可以为逻辑分区生成一个新的主分区项(在分区表中)。

例1:
partnew (hd0,3) 0x07 (hd0,4)+1
这里的(hd0,4)+1 代表了整个(hd0,4)分区。这条命令将建立一个分区类型为 0x07 的新的主分区(hd0,3),
并且它的内容(即数据)和逻辑分区(hd0,4)一样。

例2:
就像整个逻辑分区时的情况一样,一个连续的分区映像文件也可以用在PARTNEW 命令中
partnew (hd0,3) 0x00 (hd0,0)/my_partition.img
#这个 0x00 类型表示这个 MY_PARTITION.IMG 映像文件的分区类型由自动检测确定。上面的命令将建立一个类型恰当的新的主分区(hd0,3),并且使用这个连续的(hd0,0)/my_partition.img 文件中的全部内容(数据)作为它的内容(数据)。
注意:PARTNEW 将自动修正 BPB 中的“隐藏扇区数”并且这个修改是永久的。而且PARTNEW修改分区表也是永久的。

例3:
除了建立分区表项外,PARTNEW也可以用来删除(抹掉,擦除)一个分区表项。例如,
partnew (hd0,3) 0 0 0
这样,主引导记录中最后一个分区表项将被清空。通常,你可以用"partnew PARTITION 0 0 0"的格式来抹掉其分区表项,但是已经存储在这个分区中的数据不被影响。

请仔细阅读这段说明。

点评

没有注意到问题在哪里?  详情 回复 发表于 2021-2-8 19:13
回复

使用道具 举报

 楼主| 发表于 2021-2-8 19:13:47 来自手机 | 显示全部楼层
wintoflash 发表于 2021-2-8 18:36
你的理解有误。

请仔细阅读这段说明。

      没有注意到问题在哪里?  

点评

这段说明里面有没有提到 "模拟一个mbr主分区"? 这里所说的 "创建主分区" 是什么意思?创建到哪里了? 为什么我要写这句警告? 你找一个没有什么重要数据的u盘(或虚拟机里面挂载虚拟磁盘),执行以下操  详情 回复 发表于 2021-2-8 19:49
回复

使用道具 举报

发表于 2021-2-8 19:49:05 | 显示全部楼层
liuzhaoyzz 发表于 2021-2-8 19:13
没有注意到问题在哪里?

这段说明里面有没有提到 "模拟一个mbr主分区"?
创建一个新的主分区。START 为起始扇区号,LEN 为其包含的扇区数,TYPE 为其分区类型。0x00是自动判断。

可以使用 PARTNEW 来建立一个新的主分区。PARTNEW可以为逻辑分区生成一个新的主分区项(在分区表中)。

这里所说的 "创建主分区" 是什么意思?创建到哪里了?
partnew OPTIONS DISK PARTNUM
​ 为 msdos 分区表的磁盘创建主分区
​ 警告:使用此命令有可能会造成数据损失

为什么我要写这句警告?


你找一个没有什么重要数据的u盘(或虚拟机里面挂载虚拟磁盘),执行以下操作:
  1. partnew (hd0,0) 0 0 0
  2. partnew (hd0,1) 0 0 0
  3. partnew (hd0,2) 0 0 0
  4. partnew (hd0,3) 0 0 0
复制代码

然后看看u盘里面的数据还在吗?

点评

partnew (hd0,0) 0 0 0 partnew (hd0,1) 0 0 0 partnew (hd0,2) 0 0 0 partnew (hd0,3) 0 0 0 这一段说明,我有注意到啊,这样子填零数据估计就没有了。  详情 回复 发表于 2021-2-8 20:28
回复

使用道具 举报

 楼主| 发表于 2021-2-8 20:28:18 来自手机 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-2-9 15:33 编辑
wintoflash 发表于 2021-2-8 19:49
这段说明里面有没有提到 "模拟一个mbr主分区"?

这里所说的 "创建主分区" 是什么意思?创建到哪里了? ...

partnew (hd0,0) 0 0 0
partnew (hd0,1) 0 0 0
partnew (hd0,2) 0 0 0
partnew (hd0,3) 0 0 0

这一段说明,我有注意到啊,这样子填零分区表项估计就没有了,数据没法访问,需要找回分区这样的操作了。

如果用一个完全不存在的硬盘符号,应该不会有什么风险吧,比如我用(hd30)这样子的。grub2下我更加倾向于用一个不存在的主分区,这样子没有风险,g4d下面只能用已有的磁盘来虚拟"挂载",操作实体磁盘,感觉有一定的风险,但是都是可控的风险。


哦,我又试了下,对于grub2,如果用一个不存在的硬盘,比如(hd30)这样子的,有的linux发行版有的电脑不能成功启动,如果提前用一个存在的硬盘partnew执行一次,比如(hd0)这样子的,就可以成功启动linux。可能用一个不存在的硬盘还是没有生效,生效的只是用一个存在的硬盘partnew生效的效果。
回复

使用道具 举报

 楼主| 发表于 2021-2-8 22:25:29 来自手机 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-2-8 22:48 编辑
        这段说明里面有没有提到 "模拟一个mbr主分区"?

对于g4d,发帖之前我测试过了的,如果在GPT分区后面创建主分区会出错的(帖子里面也说了),我用的是2016-12-23版本的g4d,因为这个版本可以较好地适配sratlf的run模块,我也没有发现旧版本有什么大的问题。所以就没有用g4d最新版。g4d最新版改进了吗?我没有尝试。
partnew最早应该写于2006年,那时候GPT分区应该还没有流行,当时的partnew应该只能用于MBR磁盘。map命令好像也是那时候写的吧。


        这里所说的 "创建主分区" 是什么意思?创建到哪里了?

        对于g4d,我的理解是,对于少于三个主分区的情况,分区表里面的四个分区表项,有几个是没有起作用的,g4d利用这个空白的分区表项来创建一个虚拟的主分区,用来“挂载”xxx.iso的内容,“挂载”这个词不太准确,只是一个通俗的比喻。而grub2进行了加强,可以创建一个物理硬盘分区,我的理解对吗?
回复

使用道具 举报

 楼主| 发表于 2021-2-9 08:29:45 | 显示全部楼层
partnew 命令是 grub legacy 原来就有的。grub4dos 对 grub legacy 的许多命令都进行了功能加强或改进,而且排除了其中的很多 bug。改造幅度最大的,是 map 命令。对 partnew 命令也进行了较大幅度的改造。


        原来如此。
回复

使用道具 举报

发表于 2021-2-9 10:01:12 | 显示全部楼层
本帖最后由 wintoflash 于 2021-2-9 10:18 编辑

partnew 就是直接改写你的硬盘mbr分区表,新建一个分区。这个分区当然是真实的,不是虚拟的。如果参数是一个文件,它只是把文件开头所在扇区号当作分区的开始,把文件的长度当作分区的长度,创建这样一个分区。文件如果不连续,那分区里面的数据就是乱的。

Linux (以及一些 BSD 发行版) 认可这种分区,所以能找到这个分区里面的系统文件。
Windows / GRUB 不认可这种类型为 0x00 的分区,所以就当这个分区不存在。
如果这个文件是个 img , 里面是 FAT 或者 NTFS 等文件系统,GRUB 就可以识别它,修改分区表的时候填上合适的分区类型,这样这个分区可以被 Windows / GRUB 识别了。
Fbinst 搞的分区表项法支持多个 efi 启动分区,玩的就是这种操作。

不要求iso所在的硬盘和partnew所虚拟的硬盘必须是同一个硬盘,可以跨硬盘,而且partnew不但支持MBR硬盘虚拟出一个主分区(要求主分区数目小于等于3个),还支持在一个存在的gpt硬盘后面虚拟出一个主分区。菜单中输入一个不存在的硬盘的时候,虽然也会出错,但是好像仿真还是会生效,比较强大。

根本就没有这回事。

点评

感谢讲解partnew的原理。 你的意思是说,grub2下面,partnew仍然要求xxx.iso所在的分区比如(hdx,y)这种,与partnew所修改的硬盘必须是同一个硬盘,必须也是(hdx)是吗? 可能我前一次我已经用partnew修改  详情 回复 发表于 2021-2-9 10:48
回复

使用道具 举报

 楼主| 发表于 2021-2-9 10:48:28 | 显示全部楼层
wintoflash 发表于 2021-2-9 10:01
partnew 就是直接改写你的硬盘mbr分区表,新建一个分区。这个分区当然是真实的,不是虚拟的。如果参数是一 ...

        感谢讲解partnew的原理。

你的意思是说,grub2下面,partnew仍然要求xxx.iso所在的分区比如(hdx,y)这种,与partnew所修改的硬盘必须是同一个硬盘,必须也是(hdx)是吗?
可能我前一次我已经用partnew修改了物理硬盘的分区表项,创建的主分区指向了xxx.iso文件,已经生效了。所以导致我产生了错误的认识。

点评

它就是一个用来写分区表的命令,你在另一个磁盘上按这个磁盘上文件的起始扇区和长度创建分区,那么这个新建的分区里面的数据一般来说都是无效的。  详情 回复 发表于 2021-2-9 11:23
回复

使用道具 举报

发表于 2021-2-9 11:23:51 | 显示全部楼层
liuzhaoyzz 发表于 2021-2-9 10:48
感谢讲解partnew的原理。

你的意思是说,grub2下面,partnew仍然要求xxx.iso所在的分区比如(h ...

它就是一个用来写分区表的命令,你在另一个磁盘上按这个磁盘上文件的起始扇区和长度创建分区,那么这个新建的分区里面的数据一般来说都是无效的。

点评

感谢指点!  详情 回复 发表于 2021-2-9 13:25
回复

使用道具 举报

发表于 2021-2-9 11:31:08 | 显示全部楼层
本帖最后由 longpanda 于 2021-2-9 16:17 编辑

Easy2Boot很多年了,一直以来它的核心就是 partnew

partnew 有一些固有缺点,其中有一些你已经提到了。
1. U盘必须可写,写保护了肯定不行
2. BIOS必须支持写入磁盘的操作(比如一些虚拟机上就不行)
3. ISO文件在磁盘上必须连续,不能分段
4. 必须预留一个MBR分区表的位置给它用,4个主分区表都用满了就不行了
5. 应该还不支持 GPT 分区表
6. 有一些系统(比如 FreeBSD系列)根本不认这种假分区表
7. 有一些系统(比如CentOS 6系列)U盘里的iso9660格式的分区它也不认,它只认传统光驱
8. 遗留副作用。平时U盘插在Linux系统下会多出一个分区来
9. 无法实现一些高级功能(比如自动安装、自动注入驱动等)


Ventoy在一定程度上就是为了突破这些限制而开始设计开发的。






点评

你这个帖子揭示了很多真相,我之前从来没有了解和接触过的,原来Easy2boot用的是基于partnew的方案啊,我没有用过Easy2boot。 感觉用partnew方案有个好处是,对于linux.iso如果原生支持iso整体启动,那么  详情 回复 发表于 2021-2-9 13:28

评分

参与人数 1无忧币 +10 收起 理由
liuzhaoyzz + 10 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2021-2-9 13:25:28 | 显示全部楼层
wintoflash 发表于 2021-2-9 11:23
它就是一个用来写分区表的命令,你在另一个磁盘上按这个磁盘上文件的起始扇区和长度创建分区,那么这个新 ...

        感谢指点!
回复

使用道具 举报

 楼主| 发表于 2021-2-9 13:28:53 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-2-9 15:16 编辑
longpanda 发表于 2021-2-9 11:31
Easy2Boot很多年了,一直以来它的核心就是 partnew

partnew 有一些固有缺点,其中有一些你已经提到了。
...

        你这个帖子揭示了很多真相,我之前从来没有了解和接触过的,原来Easy2boot用的是基于partnew的方案啊,我没有用过Easy2boot。感谢!

感觉用partnew方案有个好处是,所有的分区都是可读写的。对于linux.iso如果原生支持iso整体启动,那么iso所在的介质会被linux挂载为只读分区,有的linux系统甚至完全不会挂载这个iso所在的硬盘介质。

点评

这个其实算不上是好处,反而某些情况下可能会出问题。 这其实是利用了一个Linux内核检查分区表时不严格的一个漏洞(不检查两个分区表对应的区域相互交叉嵌套的情况)。让系统误认为是两个独立的分区。如果你这样启  详情 回复 发表于 2021-2-9 16:28
用这种或者类似方案的多了去了。 AIOBoot 也是用的这种方案,不过增加了对 BSD disklabel 的支持。 UD, UDm 等一些隐藏分区的方案,其实也用到了一些修改分区表的小把戏。 我也不喜欢这种需要写磁盘的方式,只不  详情 回复 发表于 2021-2-9 14:10
回复

使用道具 举报

发表于 2021-2-9 14:10:45 | 显示全部楼层
liuzhaoyzz 发表于 2021-2-9 13:28
你这个帖子揭示了很多真相,我之前从来没有了解和接触过的,原来Easy2boot用的是基于partnew的方 ...

用这种或者类似方案的多了去了。
AIOBoot 也是用的这种方案,不过增加了对 BSD disklabel 的支持。
UD, UDm 等一些隐藏分区的方案,其实也用到了一些修改分区表的小把戏。
我也不喜欢这种需要写磁盘的方式,只不过它是最省事和通用的。
我更喜欢 loopback.cfg ,不过除了 Ubuntu 和 Manjaro 等发行版,其他的发行版根本不鸟这种方式。(https://www.supergrubdisk.org/wiki/Loopback.cfg)


点评

Ventoy开发初期也考虑过类似loopback的方式,不过缺点也很多,比如: 1. 支持的发行版少,只有几种类型的发行版支持,其他大部分都不支持 2. loopback 最终还是依赖 grub 来引导,但有些系统比如 BSD/Xen 等 标  详情 回复 发表于 2021-2-9 16:18
回复

使用道具 举报

发表于 2021-2-9 16:18:39 | 显示全部楼层
wintoflash 发表于 2021-2-9 14:10
用这种或者类似方案的多了去了。
AIOBoot 也是用的这种方案,不过增加了对 BSD disklabel 的支持。
UD, ...


Ventoy开发初期也考虑过类似loopback的方式,不过缺点也很多,比如:
1. 支持的发行版少,只有几种类型的发行版支持,其他大部分都不支持
2. loopback 最终还是依赖 grub 来引导,但有些系统比如 BSD/Xen 等 标准grub是引导不了
3. 有些系统的grub会自己魔改,比如 CentOS 7系列的grub 菜单里面的 \x 就自己修改支持的
4. 几乎很难支持用户基于某个发行版自己定制的系统
5. 当前支持loopback的系统,挂载 exFAT/NTFS 都只能依赖fuse这种用户态的文件系统, 性能损失很多

回复

使用道具 举报

发表于 2021-2-9 16:22:39 | 显示全部楼层
在整体引导 Linux ISO 方面:
目前来看只有 partnew 和 Ventoy 的 patch initrd 这两种算是比较通用的方案。
相比来讲,Ventoy的方案支持的系统更多一些,缺点少一些。(这句算是自卖自夸的

点评

我也觉得partnew方案不是个很完美的方案,只能用于原生不支持ISO整体启动的linux.iso,只能作为备胎。ventoy用于linux.iso方案确实是个比较好的方案,但ventoy主要是想解决USB设备启动这一个问题,我对于所  详情 回复 发表于 2021-2-9 17:20
回复

使用道具 举报

发表于 2021-2-9 16:28:02 | 显示全部楼层
liuzhaoyzz 发表于 2021-2-9 13:28
你这个帖子揭示了很多真相,我之前从来没有了解和接触过的,原来Easy2boot用的是基于partnew的方 ...

这个其实算不上是好处,反而某些情况下可能会出问题。
这其实是利用了一个Linux内核检查分区表时不严格的一个漏洞(不检查两个分区表对应的区域相互交叉嵌套的情况)。让系统误认为是两个独立的分区。如果你这样启动起来之后,你把分区上的这个对应的ISO文件删除了,或者是其他原因导致这个ISO文件位置变动了。你当前这个系统可能直接就挂掉了。
回复

使用道具 举报

 楼主| 发表于 2021-2-9 17:20:33 来自手机 | 显示全部楼层
longpanda 发表于 2021-2-9 16:22
在整体引导 Linux ISO 方面:
目前来看只有 partnew 和 Ventoy 的 patch initrd 这两种算是比较通用的方案 ...

        我也觉得partnew方案不是个很完美的方案,只能用于原生不支持ISO整体启动的linux.iso,只能作为备胎。ventoy用于linux.iso方案确实是个比较好的方案,但ventoy主要是想解决USB设备启动这一个问题,我对于所有USB启动方案其实都不怎么感兴趣,包括十年前的ud方案,udm方案,USB启动方案是我的备胎方案。另外ventoy似乎都是用的grub2为主引导?包括BIOS和UEFI,这会导致BIOS下面会有花屏这样的难以解决的问题,BIOS下面为什么不用grub4dos方案呢?

点评

本来不想说的,但我装机十多年实际应用中bios下用grub4dos有一大堆问题,花屏、启动菜单项莫名其妙找不到文件,grub2除了启动慢个两秒,花屏几率也不多,没发现其他问题,  详情 回复 发表于 2021-2-11 23:14
这个原生支持ISO整体启动的Linux ISO 也能用啊。  详情 回复 发表于 2021-2-9 17:47
我也纳闷L大为什么没有选择g4d做legacy方案。grub2天生是强efi弱bios  详情 回复 发表于 2021-2-9 17:26
回复

使用道具 举报

发表于 2021-2-9 17:26:07 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2021-2-9 17:20
我也觉得partnew方案不是个很完美的方案,只能用于原生不支持ISO整体启动的linux.iso,只能作为 ...

我也纳闷L大为什么没有选择g4d做legacy方案。grub2天生是强efi弱bios
回复

使用道具 举报

发表于 2021-2-9 17:45:18 | 显示全部楼层
g4d和grub2完全是两套东西啊,这样的话工作量就翻翻了。
现在Ventoy我只需要一套grub2的代码。而且菜单、主题、内部实现等等,都是相同的,无需分别考虑。

Easy2Boot 就是这样的,Legacy BIOS模式用g4d,  UEFI 模式用 agFM。用起来没有统一的一套方案的感觉,有点像大杂烩。当然这只是我个人的观点。

再者就是 UEFI 是未来的主流,Legacy BIOS模式越来越少,总会有退出舞台的一天。现在可以认为是主要支持UEFI模式,Legacy BIOS模式顺带就支持了,有些兼容性问题也没太大关系。

Ventoy安装在本地硬盘还是U盘都可以,只是现在U盘上用的最多,也最合适。不过Ventoy解决ISO整体启动的思路未来是可以独立出来的。


点评

本地硬盘上面,有微软bootmgfw.efi,有BIOS下面的g4d,有UEFI下面的grub2,ventoy设计初衷主要用于USB设备,这是个有损的方案,要想占领硬盘,就要重新分区,难度挺大。我对于ventoy的hook+注入initrd这一套机制挺感  详情 回复 发表于 2021-2-9 17:59
回复

使用道具 举报

发表于 2021-2-9 17:47:36 | 显示全部楼层
liuzhaoyzz 发表于 2021-2-9 17:20
我也觉得partnew方案不是个很完美的方案,只能用于原生不支持ISO整体启动的linux.iso,只能作为 ...
我也觉得partnew方案不是个很完美的方案,只能用于原生不支持ISO整体启动的linux.iso,只能作为备胎


这个原生支持ISO整体启动的Linux ISO 也能用啊。
回复

使用道具 举报

 楼主| 发表于 2021-2-9 17:59:53 | 显示全部楼层
longpanda 发表于 2021-2-9 17:45
g4d和grub2完全是两套东西啊,这样的话工作量就翻翻了。
现在Ventoy我只需要一套grub2的代码。而且菜单、 ...

本地硬盘上面,有微软bootmgfw.efi,有BIOS下面的g4d,有UEFI下面的grub2,ventoy设计初衷主要用于USB设备,这是个有损的方案,要想占领硬盘,就要重新分区,难度挺大。我对于ventoy的hook+注入initrd这一套机制挺感兴趣,如果能把有些东西独立出来或者融入g4d、g4e、grub2之中,那就很有意思了。我不懂瞎说的。

点评

grub4dos 是基于年久失修的 grub legacy 开发的,现在已经很难在最新的系统上编译了,而且里面用了很多 hack,一般的 gcc 编译出来的都有问题,代码已经快成 "屎山" 了。  详情 回复 发表于 2021-2-9 19:15
理论上是可以的。 比如 vtoyboot 这个功能现在就独立出来了。https://www.ventoy.net/cn/plugin_vtoyboot.html 当然Ventoy从最开始的一个设想到后面的具体实现,有很多细节都是边想、边做、边改。等后面有时间了  详情 回复 发表于 2021-2-9 19:07
回复

使用道具 举报

发表于 2021-2-9 19:07:12 | 显示全部楼层
liuzhaoyzz 发表于 2021-2-9 17:59
本地硬盘上面,有微软bootmgfw.efi,有BIOS下面的g4d,有UEFI下面的grub2,ventoy设计初衷主要用于USB设 ...

理论上是可以的。
比如 vtoyboot 这个功能现在就独立出来了。https://www.ventoy.net/cn/plugin_vtoyboot.html

当然Ventoy从最开始的一个设想到后面的具体实现,有很多细节都是边想、边做、边改。等后面有时间了可以回过头来好好设计一番。
回复

使用道具 举报

发表于 2021-2-9 19:15:01 | 显示全部楼层
本帖最后由 wintoflash 于 2021-2-9 19:19 编辑
liuzhaoyzz 发表于 2021-2-9 17:59
本地硬盘上面,有微软bootmgfw.efi,有BIOS下面的g4d,有UEFI下面的grub2,ventoy设计初衷主要用于USB设 ...

grub4dos 是基于年久失修的 grub legacy 开发的,现在已经很难在最新的系统上编译了,而且里面用了很多 hack,一般的 gcc 编译出来的都有问题,代码已经快成 "屎山" 了,很难修改。

点评

大神,我用一楼的grub2菜单,当我用partnew“新建一个”分区表项,这个分区表项已经存在,然后我用一楼的菜单启动linux.iso,结果partnew新建的这个分区表项(其实就是linux.iso),会把真实的原来的物理分区表项给  详情 回复 发表于 2021-2-10 19:15
回复

使用道具 举报

 楼主| 发表于 2021-2-10 19:15:50 | 显示全部楼层
wintoflash 发表于 2021-2-9 19:15
grub4dos 是基于年久失修的 grub legacy 开发的,现在已经很难在最新的系统上编译了,而且里面用了很多 h ...

大神,我用一楼的grub2菜单,当我用partnew“新建一个”分区表项,这个分区表项已经存在,然后我用一楼的菜单启动linux.iso,结果partnew新建的这个分区表项(其实就是linux.iso),会把真实的原来的物理分区表项给覆盖掉,导致windows下我的电脑里面,丢失了真实的物理分区,这个后果有点严重。
g4d下面没有这个风险,如果partnew新建一个指向已有的分区比如(hd0,1)的时候,g4d会提示出错并拒绝执行,很安全。

想请问下,grub2菜单里面怎么判断某个分区已经存在?
if [ -f (hd0,1)]; then
echo 分区已存在
fi;

点评

https://github.com/a1ive/grub2-filemanager/blob/master/boot/grubfm/rules/iso/e2b.sh  详情 回复 发表于 2021-2-10 19:27
回复

使用道具 举报

发表于 2021-2-10 19:27:09 | 显示全部楼层
liuzhaoyzz 发表于 2021-2-10 19:15
大神,我用一楼的grub2菜单,当我用partnew“新建一个”分区表项,这个分区表项已经存在,然后我用一楼的 ...

https://github.com/a1ive/grub2-f ... fm/rules/iso/e2b.sh

点评

看了下grubfm里面的partnew方案,grubfm好像是用动态脚本func.sh,动态判断iso所在的硬盘${grubfm_disk}是否存在,如果存在就给出提示让用户确认,告知用户会删除该分区里面的所有数据,感觉还是有一定的风险,如果  详情 回复 发表于 2021-2-11 11:45
哦,你这里已经有成套的解决方案了,这个看起来容易懂。我怎么看easy2boot那么复杂,里面那么多文件。  详情 回复 发表于 2021-2-10 22:52
回复

使用道具 举报

 楼主| 发表于 2021-2-10 22:52:25 | 显示全部楼层
wintoflash 发表于 2021-2-10 19:27
https://github.com/a1ive/grub2-filemanager/blob/master/boot/grubfm/rules/iso/e2b.sh

哦,你这里已经有成套的解决方案了,这个看起来容易懂。我怎么看easy2boot那么复杂,里面那么多文件。
回复

使用道具 举报

 楼主| 发表于 2021-2-11 11:45:44 | 显示全部楼层
wintoflash 发表于 2021-2-10 19:27
https://github.com/a1ive/grub2-filemanager/blob/master/boot/grubfm/rules/iso/e2b.sh

看了下grubfm里面的partnew方案,grubfm好像是用动态脚本func.sh,动态判断iso所在的硬盘${grubfm_disk}是否存在,如果存在就给出提示让用户确认,告知用户会删除该分区里面的所有数据,感觉还是有一定的风险,如果能够把写入分区表项的风险控制在开发侧,而不是在用户侧就好了。否则用户把菜单里面的(hd1,4)改成(hd1,0)就可能导致已存在的(hd1,0)分区表项失效,用diskgenius找回分区可能会找到很多个(以前的旧的分区都有可能被找到),如果保存错误,就有数据丢失的风险。
1、能否在partnew的源代码级别进行修改判断,比如(hd1,4)如果是个存在的真实的物理分区,partnew -t 0x00 -f /fossapup64-9.5.iso (hd1) 4直接抛出个错误,并拒绝执行后续操作。如果(hd1,4)不是个真实的物理分区,而是partnew创造出来的分区表项,内容是iso的文件,就修改对应的分区表项,建立(hd1,4)主分区。grub2应该可以判断(hd1,4)是否是真实的物理分区,还是“假的”分区表项吧?
2、能否让partnew支持GPT分区,这样子的话,iso放在GPT分区,由于GPT支持很多个主分区,完全可以用一个后面的空白分区表项建立一个指向iso的新的,比如(hd1,99),这样子就不会干扰原来的物理分区了。这样子的话,基本上绝大多数liveCD的linux.iso启动都没问题了。


回复

使用道具 举报

发表于 2021-2-11 23:14:19 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2021-2-9 17:20
我也觉得partnew方案不是个很完美的方案,只能用于原生不支持ISO整体启动的linux.iso,只能作为 ...

本来不想说的,但我装机十多年实际应用中bios下用grub4dos有一大堆问题,花屏、启动菜单项莫名其妙找不到文件,grub2除了启动慢个两秒,花屏几率也不多,没发现其他问题,

点评

怎么没有见到你反馈什么grub4dos的错误? 我用grub4dos没有遇到你说的那么多错误,你说的是以前的grub4dos版本吧?  详情 回复 发表于 2021-2-12 09:41
回复

使用道具 举报

 楼主| 发表于 2021-2-12 09:41:55 | 显示全部楼层
江南一根葱 发表于 2021-2-11 23:14
本来不想说的,但我装机十多年实际应用中bios下用grub4dos有一大堆问题,花屏、启动菜单项莫名其妙找不到 ...

怎么没有见到你反馈什么grub4dos的错误?
我用grub4dos没有遇到你说的那么多错误,你说的是以前的grub4dos版本吧?

点评

前几天遇到错误的是2021年的grub4dos版本  详情 回复 发表于 2021-2-12 14:09
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-29 04:19

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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