无忧启动论坛

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

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

[复制链接]
1#
发表于 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
回复

使用道具 举报

2#
发表于 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
回复

使用道具 举报

3#
发表于 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
回复

使用道具 举报

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

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

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

点评

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

使用道具 举报

5#
发表于 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
回复

使用道具 举报

6#
发表于 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
回复

使用道具 举报

7#
发表于 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
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2025-2-23 04:39

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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