|
本帖最后由 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仍然可以整体启动。
|
|