无忧启动论坛

标题: 关于--in-situ [打印本页]

作者: 2012wuzhong    时间: 2012-11-9 21:35
标题: 关于--in-situ
--in-situ 的映射不会改变真实的分区表,那仿真的分区表在内存里吗?如果在内存,可以修改吗?
请路过的大大给予解答
作者: 不点    时间: 2012-11-10 17:46
是用仿真代码来虚拟分区表的。内存中只有仿真程序代码,没有分区表的备份。既然是代码实现的,你是无法修改的(除非你更改程序代码)。

你可以用 cat --hex (hd0)+1 来访问 MBR 以及分区表。这里的 (hd0) 假定就是你用 --in-situ 虚拟出来的硬盘。
作者: 2012wuzhong    时间: 2012-11-10 20:23
标题: 回复 #2 不点 的帖子
先谢过不点大!看了一下,原来分区1的信息被移到了最后,虚拟的分区信息放到了分区1的位置。
我想要的是只需要将虚拟的分区信息放置在分区1位置,其它分区信息清零。要是能用dd命令写入就灵活了!
作者: 不点    时间: 2012-11-11 21:50
把其他分区信息清除掉,有什么实际用途吗?如果没有用处,那还是留着好。

如果你的理由充足,那么我们可以添加一个开关,让虚拟的分区表只有一个分区。
作者: 2012wuzhong    时间: 2012-11-11 22:43
标题: 回复 #4 不点 的帖子
我的用途比较特别,用于win7系统将差分vhd放入primo内存盘。
分区2上放入子母vhd,使用分区2来启动,但需要修改分区表,让系统"以为"是分区1启动。启动后的系统将通过分区1上junction目录从内存盘上读写子vhd文件。
目前采用的方法是在分区2之前63个扇区处写入修改的mbr(将分区2信息植入到分区1处,其余分区信息清零),然后使用map命令:map (hd0)406455777+61462800 (hd0)
具体看我的qq空间,http://user.qzone.qq.com/1543764927/blog/1351430770
作者: 不点    时间: 2012-11-12 11:24
你没有阐述清楚,其他分区项目的存在,如何影响你的正常使用了?为何只能保留一个分区,而不能有其他分区的存在。

有时候,你需要的不是 map --in-situ , 而是 partnew 命令执行真实的修改分区表的动作。
作者: 2012wuzhong    时间: 2012-11-12 11:40
标题: 回复 #6 不点 的帖子
首先我并不想永久的修改区表,因为进入系统以后所有的分区都应该能显现。
我的目的只是启动的时候map一个分区为硬盘,同时屏蔽掉原来的硬盘。
由于map分区需要分区表,因此想借助--in-situ参数,临时修改一下分区表,但需要屏蔽其他的分区,只有这样做才能够让启动后的系统通过分区1上junction目录链接读写内存盘上的子vhd文件。否则系统启动后仍使用启动分区中的子vhd文件。具体原理我不清楚,但实践的结果就是这样。

[ 本帖最后由 2012wuzhong 于 2012-11-12 12:13 编辑 ]
作者: 不点    时间: 2012-11-12 12:10
map --in-situ 只是用某种逻辑(即算法)修改了分区表,显然,逻辑(算法)本身不是唯一的,可以有无穷多种。

所以,如果要实现不同的逻辑(算法),那也有无穷多种实现。

针对你这个要求,我在想,也许将来能够把硬盘上的某个扇区直接作为 --in-situ 所使用的 MBR,或者在内存中保存这份虚拟的 MBR。如此,也许就可以应付大多数需要了。
作者: 2012wuzhong    时间: 2012-11-12 12:15
标题: 回复 #8 不点 的帖子
是的,正是这样。不知道实现起来是不是很麻烦?
作者: zhaohj    时间: 2012-11-12 15:43
title primo w7636.vhd
map (hd0) (hd1)
map (hd0)406455777+61462800 (hd0)   //这个就是(hd0,4)吧?如逻辑第一分区
map --hook
dd if=(hd1,0)/hd_mbr.BIN of=(hd0)
chainloader (hd0,0)/bootmgr
---------------------------------------
改成下面试试:

title primo w7636.vhd
map --mem=0x20000  (hd0,0)/hd_mbr.bin (rd)
map --in-situ (hd0,4)+1 (hd0)
map --hook
dd if=(rd)+1 of=(hd0)
chainloader (hd0,0)/bootmgr
作者: 2012wuzhong    时间: 2012-11-12 18:51
标题: 回复 #10 zhaohj 的帖子
我这里没有逻辑分区,都是主分区。
请问执行dd命令后,修改的是硬盘的mbr还是虚拟盘的mbr?
作者: 不点    时间: 2012-11-12 21:14
写 --in-situ 的虚拟分区表,如果真的写入成功,那就完蛋了。就是说,那样就写入到真实硬盘的 MBR 上了。因此,千万不要尝试这么做。当然,你可以先用虚拟机来试验,目的是观察操作的结果是怎样的。

--------------------

试试今天编译的版本。增加了 map --in-situ=FLAGS 的用法。目前只有 FLAGS 的最低位是有意义的。

map --in-situ=1 ........

意思是虚拟的分区表只保留 (hdX,0),而把其它分区表项 (hdX,1), (hdX,2), (hdX,3) 都清零。
作者: 2012wuzhong    时间: 2012-11-12 21:21
标题: 回复 #12 不点 的帖子
谢谢不点大给我开小灶了!弱弱的问一下,哪里获取?
作者: 不点    时间: 2012-11-12 21:27
在这个论坛以及时空论坛都能找到。
作者: 2012wuzhong    时间: 2012-11-12 22:24
标题: 回复 #14 不点 的帖子
试一下,其它分区表项确实都清零了;不过最终的目的没有实现。
原因是还需要修改分区信息,除了保留最后4个字节总扇区数不变外,其余12个字节都要改成分区1的信息,这样才能让系统认为启动的vhd位于分区1。
这样的改动已经很不具有通用性了!不好意思让不点大白忙活了。

[ 本帖最后由 2012wuzhong 于 2012-11-12 22:35 编辑 ]
作者: zhaohj    时间: 2012-11-12 22:42
那再dd 12个字节啊,这样问题不就解决了吗?
作者: 2012wuzhong    时间: 2012-11-13 13:16
标题: 回复 #16 zhaohj 的帖子
应该行不通的,--in-situ 的虚拟分区表是用代码模拟出来的!
作者: 不点    时间: 2012-11-13 21:15
标题: 回复 #15 2012wuzhong 的帖子
除了保留最后4个字节总扇区数不变外,其余12个字节都要改成分区1的信息


你的映像没在那个位置,却要改成那个位置,这就有点胡说八道的味道了。
作者: 2012wuzhong    时间: 2012-11-13 21:53
标题: 回复 #18 不点 的帖子
对不住不点大了,这个我确实没有说清楚。
windows是通过硬盘签名和分区的起始扇区号来识别硬盘分区的。
而我需要实现的是,用其它分区来模拟分区1。这样的话,必须修改分区信息使得其它分区和分区1一样(除了分区大小以外),也就是分区信息的前12个字节。
刚开始我并不明白“--in-situ”的虚拟机制。现在我感觉用这个参数实现不了我的需求。修改了分区的起始扇区号,恐怕系统无法通过mbr找到该分区了。
我的方法是在分区2之前植入了一个mbr,然后将此和分区2虚拟了一个硬盘,此时分区2的起始扇区号可以和分区1的一样,因为对于新虚拟的硬盘而言,分区2已经是新的分区1了

[ 本帖最后由 2012wuzhong 于 2012-11-13 22:14 编辑 ]
作者: 不点    时间: 2012-11-14 20:45
标题: 回复 #19 2012wuzhong 的帖子
我是半开玩笑,可别太认真。如果不慎伤害到你,那我还是要道歉的。

in-situ 模式的虚拟,是比较特殊的。它的出现是有背景的。

普通的虚拟,是把硬盘上某一块连续扇区空间仿真为一个硬盘、软盘或光盘。这种虚拟盘,win98 有可能不承认的。后来发现,win98 能够承认 in-situ 模式的虚拟盘。这也就是 in-situ 产生的背景了。普通人一般用不到 in-situ 模式的虚拟。

in-situ 的特殊性就在于,它有一部分是像整盘映射,而另一部分又有点像磁盘仿真。

比如,map (hd0) (hd1) 就是整盘映射。从原点开始就全部映射了,即,从扇区0 ( MBR )开始,(hd0) 的全部扇区都映射为 (hd1) 的扇区,扇区的序号保持完全一致,一一对应:

访问虚拟盘 hd1 的 扇区 0 就等于是在访问真实盘 hd0 的扇区0,
访问虚拟盘 hd1 的 扇区 1 就等于是在访问真实盘 hd0 的扇区1,
访问虚拟盘 hd1 的 扇区 2 就等于是在访问真实盘 hd0 的扇区2,
.......
依次类推。

但磁盘仿真就不同了,比如 map (hd0)100+900 (hd1),它有一个偏移量 100,而不是从原点 0 开始的:

访问虚拟盘 hd1 的 扇区 0 就等于是在访问真实盘 hd0 的扇区100,
访问虚拟盘 hd1 的 扇区 1 就等于是在访问真实盘 hd0 的扇区101,
访问虚拟盘 hd1 的 扇区 2 就等于是在访问真实盘 hd0 的扇区102,
.......
依次类推。


而 in-situ 方式的仿真,map --in-situ (hd0)100+900 (hd1) 是这样的:

访问虚拟盘 hd1 的 扇区 0 就等于是在访问真实盘 hd0 的扇区0,但分区表被修改了。
访问虚拟盘 hd1 的 扇区 1 就等于是在访问真实盘 hd0 的扇区1,
访问虚拟盘 hd1 的 扇区 2 就等于是在访问真实盘 hd0 的扇区2,
.......
依次类推。

也就是说,除了扇区 0 以外,其余的扇区完全像整盘映射那样,一一对应。即使扇区 0 也是对应着的,只不过分区表被虚拟化了。

比较一下,整盘映射的情况是不修改分区表,不修改任何扇区的内容。也就是说,整盘映射只把 BIOS 盘号进行虚拟化,而扇区的内容保持不变,每个扇区的内容是实实在在的,没有被虚拟化,没有被修改。

对于磁盘仿真的情况,不仅盘号被虚拟,而且扇区序号也被虚拟,即,偏移量不是0。但扇区内容也是真实的,没有被修改。

对于 in-situ 的情况,盘号被虚拟,扇区序号是真实的(未被虚拟),但第一扇区 MBR 尾部的分区表被虚拟,即,该扇区的内容被虚拟化代码更改了。其它扇区都是真实的(未被虚拟)。


自己看自己究竟需要哪种方式,作出选择。通常大家都是用普通的虚拟方式,而不是 in-situ 的虚拟方式。
作者: 2012wuzhong    时间: 2012-11-14 21:33
标题: 回复 #20 不点 的帖子
感谢不点大的详解,使我更加了解了 in-situ。
对于这次更改,确有对不住的地方。在需求没有表达清楚就要求更改,有点冒失了。




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