|
|
关于用 grub4dos 加载 iso 启动方式的进一步探讨
完全ISO整体引导:
map --mem (hdX,Y)/home/[MyUserName]/slitaz[Date].iso (0xff)
map --hook
chainloader (0xff)
boot
上述启动方式,会在内存中保留一份 ISO 文件,这对于 Linux 而言,通常是无用的,因为 Linux 通常不在内存中寻找 ISO 的内容。所占用的内存,Linux 是无法回收的,于是浪费了与 ISO 文件长度一样大的内存。
可以考虑如下的加载逻辑:
map --mem (hdX,Y)/home/[MyUserName]/slitaz[Date].iso (rd)
此时仅仅把 ISO 放到内存,并让 rd 指向它。这里的 --mem 参数可以省去,因为 rd 本来就是内存设备。
这不是一个映射,而仅仅让 rd 指向内存中的 ISO 映像文件。因此,不能使用 map --hook 命令。
当然,此时虚拟光盘并未建立,所以,也无法用 chainloader (rd) 命令。
但是,rd 已经指向 ISO,于是,可以访问 (rd)/ 里面的文件(即 ISO 里面的文件):
kernel (rd)/.../vmlinuz .....
initrd (rd)/.../innitrd
boot
这就应该可以启动了。这种启动方式节约了相当于 ISO 文件那么大的内存。
以上方法需要知道 kernel 以及 initrd 的命令行的写法,不利于普及。
下面还有一个方法,或许算是比较 “傻瓜化” 的:- 完全ISO整体引导:
- map --mem (hdX,Y)/home/[MyUserName]/slitaz[Date].iso (0xff)
- map --e820cycles=0
- map --hook
- chainloader (0xff)
- boot
复制代码 增加的 map --e820cycles=0 表示 map 不接管 INT15。这样的话,Linux 就会认为映像文件不占用内存,于是 Linux 就可以回收所有的内存。
这个方法比较简捷,但是有可能失败。如果失败,那就表示发生了内存冲突。于是可以调整 map --mem 参数,让它加载在不同的内存地址处,比如,把 ISO 加载在 64M 处:
map --mem=0x20000 (hdX,Y)/home/[MyUserName]/slitaz[Date].iso (0xff)
如此调整以后,或许可以避免冲突的发生。当然也可以试试别的内存地址。
更新:
我自己测试时,--mem 确实导致死机,换用 --mem=0x100000,即,加载在 512M 处成功。机器总内存是 2G。机器的用户可用内存大约有 1.5G。
- 完全ISO整体引导:
- map --mem=0x100000 (hdX,Y)/home/[MyUserName]/slitaz[Date].iso (0xff)
- map --e820cycles=0
- map --hook
- chainloader (0xff)
- boot
复制代码
至于说加载在 64M、128M、256M 可否成功,我没有试验。
[ 本帖最后由 不点 于 2013-3-17 18:54 编辑 ] |
|