zy_sunshine 发表于 2010-6-17 14:34:39

MagicInstaller加载过程和系统安装过程分析

本文依照MagicInstaller源代码阐述了iso加载的全过程,过程中每个地方的硬件识别情况,以及MagicInstaller主程序各个页面的功能。

因为前阵子看了一些MI的源码,发现现在的MI有好多便利的功能没有被完全的利用,普通用户对每一步的加载过程也不是很明确,所以在这里分析了一下MI安装的全部过程便于MagicInstaller的用户参考。

MagicInstaller分为MagicBooter和MagicInstaller主程序两部分

MagicBooter就是mbinitrd-hd.gz ,这个压缩包是一个小型的Linux嵌入式系统,相当于Linux系统的initrd功能,(initrd的主要功能是加载必要的内核模块以获得文件系统或硬件支持)
但是这里加入的内核模块是不会被加载的,因为在处理内核模块加载之前系统环境就已经 chroot 进 MI主文件系统 了,因此需加载的内核模块应该储存于MI主系统文件中。

由于以上原因,如果进行硬盘安装的话,则必须要在仅加载内核的情况下就能识别你的磁盘和你的文件系统。
文件系统好说,大多数的文件系统都支持包括(ext2/3/4 vfat ntfs...)
而磁盘识别的驱动却不全是编译进内核的,因此这一步就有可能不能驱动你的磁盘,不能加载iso文件,也就不能加载iso中的MI主文件系统了。

识别磁盘分两个大部分,一部分是IDE,一部分是SCSI,这里对PCI转接口的没有多考虑。我们的MI内核中集成了通用IDE和通用SCSI驱动支持。(记得当时自己鼓捣MI内核编译的时候发现不是所有的IDE驱动都编译进内核的,有一些不常用的老驱动就没编译进去)

说明一下,Linux提供了IDE设备对SCSI的模拟(ide-scsi.o模块),我们通常会就把IDE光驱模拟为SCSI光驱进行访问。通常我们的USB存储设备,也模拟为SCSI硬盘来进行访问。

而普通光驱是很容易识别的,这也给光盘用户几乎100%的可能性加载下一步的MagicInstaller主文件系统。

接下来分析加载MI主文件系统的过程。(MI主文件系统就是miinitrd文件)

首先是miinitrd文件的搜寻:MB可以搜索到iso从而在iso中进一步加载miinitrd,也可以直接在所有可识别文件系统中寻找miinitrd文件。
寻找miinitrd的依据是下面这个xml文件。
内置 mb-config.xml 的内容如下:

<?xml version="1.0"?>
<MagicBooter>
    <probes>
      <probe pathspec="/">usb-storage</probe>
      <probe pathspec="/miimages">ide-cdrom</probe>
      <probe>ide-harddisk</probe>
      <probe pathspec="/miimages">scsi-cdrom</probe>
      <probe>scsi-harddisk</probe>
    </probes>
    <pathspec>
      <path>/boot</path>
      <path>/MagicLinux</path>
      <path>/usr/share/MagicInstaller</path>
      <path>/</path>
      <path>/tmp</path>
    </pathspec>
</MagicBooter>
也就是按照usb, ide 光盘, ide 硬盘 , scsi 光驱,scsi 硬盘的次序
而在这些磁盘中所有识别的文件系统中的查询路径依次是 /boot, /MagicLinux, /usr/share/MagicInstaller, /, /tmp
加载MI主文件系统后会继续启动过程,包括/etc/inittab /etc/init.d 启动环境变量设置 以及内核模块的加载。
加载MI主文件系统完成后就会直接运行magic.toplevel启动MI主程序了。这就是我们看到的图形安装界面:)


下面是MI主程序每个页面的功能分析:

第一步是同意开源协议

第二步是SCSI驱动加载,在这里可以加载需要的SCSI模块
此时MI会在/lib/modules/%{kernelver}kernel/drivers/scsi中查找所有的SCSI模块,显示在列表框中,选择后则会加载。
(这里有一点我不明白,因为内核模块是按需加载的,在启动的时候不就已经把所有需要的模块加载了吗?难道是第三方模块?因此我认为这一步几乎是不常用的)

第三步是磁盘分区

第四步是选择grub引导以及查找Windows分区位置。并配置Grub选项。

第五步是"包源"选择,呵呵相信大家对这里可能不很清楚。
在这个页面开始的时候MI会查找所有可识别盘符并按照以下顺序搜索

光盘的搜寻路径则是
/MagicLinux/base

其他盘符的搜索路径是:
/boot
/distname(此处为发行版本名称MagicLinux)
/usr/share/MagicInstaller
/
/tmp

在这些路径中搜寻pkgarrr.py文件
pkgarr.py中存储的是rpm包依赖列表,是在MI制作iso时生成的。
而列表中的所有rpm包的默认地址为pkgarr.py同目录下的packages文件夹。
如果制作的光盘有多个则可以将每个光盘中的rpm包放在packages-1 packages-2依次类推。
当然我们把所有光盘的包都放在packages中就可以。

例如pkgarr.py放在 /MagicLinux下,我们的所有包就可以放在/MagicLinux/packages下。

这就是所谓的"包源",是以pkgarr.py来标识的,而rpm包所在路径是相对于pkgarr.py文件的。
(对于光盘盘符,包路径就只有一个了 /MagicLinux/packages)

第六步执行操作
确认你的操作并执行以下操作:
磁盘格式化操作,
向目标系统中安装rpm包,
目标系统Grub的安装,
制作目标系统的initrd。

(这个"目标系统"就是我们做的新系统了)
大家发现了吗1-5步的所有操作,包括磁盘的分区都不是真正意义上的操作,只是一个配置,第六步才会根据前几步的配置进行实际操作。

剩下的操作就是对目标系统的配置,包括
账户配置
Xwindow检测和配置
系统安装后期脚本执行(主要是修复一些不可预料的bug)

第七步一个开始配置界面
(这步在以前的发行版中都会自动跳过...因此你得往回点才能看到,但是这步没有任何操作,因此就忽略了吧)

*额外说明,在下一个发行版中如果使用了新版本的MI,这里会有一个选项选择是否需要手工配置下面的Xwindow配置,默认是跳过。
如果你对你的硬件比较清楚,就可以选择配置Xwindow界面。
如果在这里选择跳过Xwindow配置,就不会在目标系统中生成/etc/X11/XF86Config和/etc/X11/xorg.conf配置文件,在新系统启动的时候就会完全靠X自行检测来达到驱动识别的目的,这样会使X启动成功率加大,几乎不会因为X配置的问题黑屏。

第八步用户配置
这里必须要设置root的密码,并可以选择添加用户。
(推荐这里配置一个你的常用用户,在大家日常使用的时候最好用普通用户,执行root操作时最好是用sudo来提权。关于sudo提权是需要配置的,这个可以google:)很简单 )

第九步配置Xwindow
(就如上面的第七步所说,如果你选择了配置Xwindow,这步就需要你来手动配置)
配置Xwindow其实也很简单,
1、配置你的显示器(选择一个大体的型号就可以,关键是水平和垂直刷新率不要设置的太高就行,否则花屏)
2、配置你的显卡驱动(如果不知道是什么型号就可以先配置为vesa,如果知道什么型号就在下面选择)
3、配置你的鼠标(usb或者ps/2口)
4、配置显示屏的分辨率。
5、点击X测试来确定你的X配置是否正确
在新版本MI中会开启原来屏蔽掉的Xwindow检测,点击检测X后会出现一个可视对话框,如果你点击了确定按钮则代表你的X配置完全正确(显示屏,显卡驱动,鼠标,分辨率)
如果X测试失败怎么办?别着急,慢慢来,点击上一步看看前面的X配置是否有错误,改正后再来测试,直到你的X测试正常为止,这里要反复测试的...如果在这里测试正常,那么你新安装的系统99.987654...% 的概率会正常启动X :)。
如果X测试一直都是失败的怎么办,那就不要点击X测试了,直接下一步继续剩余的系统安装操作。
如果新安装的系统不能启动X,那你可以在启动时进入single模式,执行rm /etc/X11/XF86Config /etc/X11/xorg.conf ,使系统启动时让Xorg自动检测硬件。

现在点击下一步,MI会在目标系统中根据以上配置生成/etc/X11/XF86Config和/etc/X11/xorg.conf配置文件。
并配置目标系统中的/etc/inittab,使你的系统自动启动X。

第十步执行所有的设置操作
会根据用户配置信息,添加root密码,添加普通用户。
并会chroot进入目标系,统执行post_install.sh文件
post_install.sh文件是安装系统后期的批处理操作,位于MI文件系统中的/root下,用于修复一些rpm安装时的不可控制的bug。
为什么有的同学在新安装的系统中用之前设置的密码不能正常登陆?原因是在这一步没有完成账户设置,可能是你等不及强行启动了吧...
如果不能正常登陆可以进入single模式,执行passwd 来设置你的root密码。

最后就是点击"完成"重启啦 :)

以上是MI的执行过程分析,如果大家有什么疑问可以提问,我会尽量解答。

[ 本帖最后由 zy_sunshine 于 2010-6-21 14:42 编辑 ]

dgy18787 发表于 2010-6-18 08:11:12

SCSI的驱动可不可以自动加载?那一步手动加载驱动的过程有点恼人。。

sejishikong 发表于 2010-6-18 09:18:11

scsi驱动本来就是自动加载的,那一步只是怕有些特殊情况,不能自动加载的时候才用的。

dgy18787 发表于 2010-6-18 10:51:54

:shock: 无知了,我一直以为那个步骤是必须手动的
页: [1]
查看完整版本: MagicInstaller加载过程和系统安装过程分析