LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: 没本

有办法把Gentoo系统安装成一个文件吗?非虚拟机!

[复制链接]
 楼主| 发表于 2011-12-8 19:10:50 | 显示全部楼层
其实是.VHD还是别的.IMG格式都差不多,.VHD也就是在文件尾加了一些虚拟硬盘的不是必须的参数什么的。
微软win7/2008r2的VHD引导不是公开源码,这里我就不讨论了。
GURB4DOS+Firadisk/WinVBlock方案既支持Windows XP/2003,也支持Windows 7家庭版一类没有内置VHD引导支持的系统,我写一下吧。
一般引导顺序是:
BIOS->BootLoader(GRUB or NTLDR or WIN7Bootmgr)->GRUB4DOS->Windows XP/2003/vista/7
至于具体用哪个BootLoader交权给GRUB4DOS,可以根据各自的软硬件环境灵活掌握。当GRUB4DOS拿到控制权后,会找所在硬盘能支持的所有格式的各分区,读分区中第一个被找到的/menu.lst。要支持.VHD/.IMG文件方式启动系统,menu.lst设置示例如下:
  1. title VHD file XP
  2. find --set-root /VHDs/xpram.vhd
  3. map --heads=2 --sectors-per-track=18 --mem (md)0x800+4 (99)
  4. map /VHDs/xpram.vhd (hd0)
  5. map (hd0) (hd1)
  6. map --hook
  7. write (99) [FiraDisk]\nStartOptions=disk,vmem=find:/VHDs/xpram.vhd;\n\0
  8. root (hd0,0)
  9. chainloader /ntldr
复制代码
其中第一个map --heads只是在内存里分配一个空间以便把参数传给操作系统的.VHD支持驱动程序Firadisk.sys。那个write (99)行就是写参数进前面分配的内存。当这个title被用户选定后,GRUB4DOS接管了原来由BIOS处理的磁盘(硬盘)处理调用(中断调用号13H)部分。在Windows的前引导部分,还是用的这个BIOS调用把NT内核及相关文件由硬盘加载进内存的。所有读hd0的操作,都被GRUB4DOS处理为对xpram.vhd文件的操作了(当然GRUB4DOS还可以利用这个功能实现.ISO文件映射成光驱以及.IMG映射成软驱)。
Windows引导模块向Windows内核交权后,磁盘控制被Firadisk.sys驱动接管了,Firadisk根据GRUB4DOS传来的参数,得到了xpram.vhd的位置。firadisk->SATA/SCSI/IDE driver->物理硬盘的调用顺序,实现了基于.VHD的硬盘驱动。注意这里没有依赖NTFS文件系统或者FAT文件系统,因为磁盘驱动比文件系统要底层。
那么firadisk是怎么实现C:\VHDs\xpram.vhd文件映射成硬盘的呢?在xpram.vhd存储时,要求这个文件是连续的,文件也不能有NTFS空白空洞。可以通过sysinternal提供的contig.exe工具程序来将单个文件转为连续。文件连续了,知道文件头在硬盘上的柱面、扇区号,以及文件长度,firadisk就可以直接操纵底层磁盘驱动来读写这个文件磁盘了,而不用通过文件系统。也正是因为这样,用这种文件磁盘时文件系统的性能下降很微小。
操作系统向UI程序交权时,其他物理硬盘,甚至包括xpram.vhd所在的磁盘分区,都可以被操作系统加载。在这里firadisk会对NTFS文件系统hack对vxpram.vhd进行保护,以保证没有任何其他程序能操作此文件,这个文件硬盘只有firadisk能访问。
题外话,firadisk还支持内存磁盘,xpram.vhd文件不变,直接在GRUB4DOS的menu.lst里加一个启动项:
  1. title 4GB Ram XP
  2. find --set-root /VHDs/xpram.vhd
  3. map --mem --top /VHDs/xpram.vhd (hd0)
  4. map (hd0) (hd1)
  5. map --hook
  6. root (hd0,0)
  7. chainloader /ntldr
复制代码
GRUB4DOS就可以把xpram.vhd复制到4GB到8GB的高位内存(假设机器一共有8GB内存),由于XP不会使用这部分内存,拿来做ramdisk并引导系统正是再适合不过了。而且在Windows启动时,firadisk.sys会自动识别并接管这个ramdisk文件硬盘。这就实现了Windows XP在内存引导并运行,如果在GRUB4DOS将xpram.vhd读入内存后加一个按键确认,此时将所有硬盘拔掉,也能引导进系统,因为这是全RAM XP系统。

至于Linux内核,我不知道有没有这样的驱动支持,或者有别的实现机制。但单独的/boot分区放kernel和initrd,再另外找个目录放两个loop文件,我认为不是很适合的做法,这些分离的文件很不方便备份和转移,还是一个.IMG/.VHD文件的方式更好,通过GRUB4DOS,显然已经能够支持Linux的.VHD了,也能正常的读出其中的kernel和initrd文件。但是就象Windows系统引导那样,Linux不可能一直BIOS 13H中断来操作磁盘(或者GRUB加载kernel和initrd之后,Linux内核在磁盘驱动初始化前,不再读盘),总是会替换为系统本身的驱动程序。只要Linux能提供一个类似firadisk的磁盘驱动,就能支持.IMG/.VHD这类的文件磁盘了吧。或者还要有ext3/ext4的文件连续工具,来保证.VHD文件在磁盘上连续。
回复 支持 反对

使用道具 举报

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

本版积分规则

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