📄 99.html
字号:
| |----/texttw<br>
| |----*.py<br>
|<br>
|------/share---/anaconda<br>
安装程序资源文件目录<br>
| |----/help<br>
| |----/pixmaps<br>
<br>
<br>
<br>
如上所示,stage2.img映像文件中的主要部分是安装程序anaconda,它的主执行体是/usr/bin下的anaconda,由其调用的大量例程分布在/usr/lib/anaconda下,而安装过程中要用到的资源文件分布在/usr/share/anaconda下。 stage2.img 的解析方法请参考附录B。<br>
<br>
B 行为部分<br>
<br>
RedHat 7.1的安装程序被命名为anaconda。如前所述,当boot.img所代表的启动介质被系统引导之后,在内存中就建立了一个完整的Linux系统(包括Linux内核和一个内存虚拟文件系统),之后便执行文件系统中存在的loader命令,从适当的介质中执行安装程序(例:安装介质是CD- ROM,就解析CD-ROM上的stage2.img,并从中执行安装程序),即执行anaconda,完成Linux系统的安装任务。<br>
<br>
此次利用RedHat 7.1的安装程序源代码的SRPM包形式:anaconda-7.1-5.src.rpm来获得anaconda的源程序,经解包后在/usr/src/redhat/SOURCES/anaconda-7.1形成了源代码树。<br>
<br>
<br>
anaconda-7.1<br>
|-------------------/bootdisk<br>
启动盘目录<br>
|-------------------/docs<br>
文档目录<br>
|-------------------/help<br>
安装过程帮助系统目录<br>
|-------------------/installclasses<br>
安装类型分类目录<br>
|-------------------/iw<br>
安装各步骤响应目录<br>
|-------------------/loader<br>
安装程序装载器目录<br>
|-------------------/pixmap<br>
图形资源目录<br>
|-------------------/utils<br>
工具目录<br>
|-------------------*.py<br>
各Python脚本文件<br>
<br>
<br>
<br>
分析如下:<br>
<br>
anaconda安装程序主要用Python语言写成,它是一种解释性的,面向对象的脚本语言。源文件后缀为.py,也可生成可执行的字节码,后缀为.pyc或.pyo。其中:<br>
<br>
installclasses/ 子目录中各文件定义了在安装过程中用户可选择的安装类型,通常由四个文件workstation.py , server.py , laptop.py和custom.py来描述workstation(工作站)安装类型,server(服务器)安装类型,laptop(膝上型电脑) 安装类型和custom(自定义)安装类型。每个脚本文件的内部,则是根据自己安装类型的特点对安装步骤,分区策略以及包的取舍做出了不同的方案。<br>
<br>
iw/ 子目录中各文件定义了在图形界面安装状态时各步骤对Next(下一步)和Prev(上一步)的响应函数。<br>
<br>
loader/ 安装程序装载器的源代码目录,用C语言写成。<br>
<br>
pixmap/ 图形资源目录,包括安装过程中使用到的所有位图,图标。<br>
<br>
utils/ 安装程序实用工具目录。<br>
<br>
anaconda 是安装程序的主执行文件,它建立了Python语言的运行环境,提供了程序的入口点并以模块的方式将各个子系统结合在一起。<br>
<br>
gui.py 定义了安装程序图形界面使用的各种窗口类,包括MessageWindow,ProgressWindow,WaitWindow, ExeceptWindow等,和控制这些窗口及图形界面行为的InstallInterface, InstallControlWindow, InstallControlState类。总之,控制gui。<br>
<br>
todo.py 定义了安装程序的各种行为函数,它是图形界面背后真正进行各项操作的函数集合。<br>
<br>
harddrive.py 定义了当安装介质为硬盘时,系统该如何找到安装程序的光盘映像,并从中执行程序。<br>
<br>
安装程序源代码的编译由make和make install组成,完成后在/usr/src/RedHat目录下形成了如下目录结构:<br>
<br>
<br>
instimage<br>
|------/etc<br>
|------/usr<br>
|------/bin<br>
|------/sbin<br>
|------/lib<br>
| |------/anaconda<br>
| | |------installclasses<br>
| | |------iw<br>
| | |------texttw<br>
| | |------*.py<br>
| |<br>
| |------/anaconda-runtime<br>
| |------/boot/loader<br>
|<br>
|------/share------/anaconda<br>
|------/help<br>
|------/pixmaps<br>
<br>
<br>
<br>
此目录结构基本与stage2.img的文件结构相同。<br>
<br>
2.2调试环境的建立:<br>
<br>
C 对源程序的修改<br>
<br>
在分析完安装程序的基本构成之后,就要建立相应的调试环境。建立此环境的目的是为了可以方便地对修改过的安装程序及裁减后的RPM包进行随时的确认。显然,可以选用CD-ROM或本地硬盘作为调试介质,下表比较了两者的差别:<br>
<br>
CDROM 硬盘<br>
对应的安装界面 图形界面 菜单界面<br>
对应的映像文件 stage2.img *.iso中的hdstg1.img , hdstg2.img<br>
优点 图形界面,直接使用映像文件stage2.img 随改随调,调试周期短,效率高<br>
缺点 每次改动都要求刻盘,调试效率低 菜单界面,每次调试都要求提供光盘映像文件*.iso,效率上打折扣<br>
<br>
在两者各有优缺点的情况下,考虑折衷的方案,即为了首先保证调试的效率,采用硬盘作为调试介质,但对应的映像文件选取stage2.img,这样能达到效率最大化,同时调试界面采取图形方式。采用此方案时,须修改源代码,以达到预期的效果。<br>
<br>
从前面对安装系统的分析,可以看出在initrd.img中的/sbin/loader程序负责判断安装介质的有效性,并从中执行安装程序。所以要首先修改它的源代码文件loader.c,从中找出硬盘安装时默认读出光盘映像文件*.iso的函数setupIsoImages,并注释掉其中在硬盘目录中寻找映像文件*.iso的相关操作,具体对应Line 582 至 Line590行中包含sprintf和if(){}循环的语句,以避免打开子目录,并在其后加入mountLoopback ("/tmp/hdimage/RedHat/base/stage2.img","/mnt/runtime", "loop0");一句以便实现直接使用stage2.img的目的,并注释掉其后从errno=0开始的代码,经过整个while循环到 closedir(dir),但保留umount(“/tmp/hdimage”);注释掉if(!net) return NULL;一句。以上操作目的是防止程序读出光盘映像文件*.iso。在loader.c的主函数main()中的结尾部分,注释掉if (!FL_TESTING(flags)) { 和 }的条件判断的两条语句,让程序毫无疑问地执行硬盘上的安装程序。至此,对loader.c修改完毕。<br>
<br>
同时还要对Python脚本的一些相关文件进行修改以保证对stage2.img文件的支持。具体的,在harddrive.py的类 class HardDriveInstallMethod中,注释掉函数 mountMedia(self, cdNum)中的所有内容并加Pass语句的方法使此函数失效,同样方法处理umountMedia函数,mountDirectory函数和 umountDirectory函数,为了保险起见,在其他函数中注释掉有关上面函数的调用。并在类的构造函数(初始化)中的# Go ahead…语句之前加self.tree=”/tmp/hdimage/”语句,并注释掉后面的所有语句。这样做仍然是要保证废弃iso映像转而对 stage2.img实现控制。不仅如此,最好还注释掉todo.py中的Line1781至Line1783调用 self.method.systemMounted一段,以确保不出差错。接着进行make和make install,重新编译程序,使修改生效,并把新的loader程序从编译的目标目录中copy到boot.img中initrd.img中的相应目录并覆盖旧的loader文件。为了启动时的快速,修改boot.img中的syslinux.cfg文件,去掉启动提示,延时和其他Linux启动选项,修改后的syslinux.cfg文件,请参考附录F<br>
<br>
最后,把boot.img做成启动盘,方法请参考附录G。<br>
<br>
D 建立硬盘介质中的调试目录<br>
<br>
在硬盘的Linux分区中建立形如RedHat安装光盘目录结构的调试目录及相关文件,如下所示:<br>
|----/images<br>
| |------boot.img<br>
|<br>
|----/RedHat<br>
|----/base<br>
| |------comps , hdlist , hdlist2,stage2.img<br>
|<br>
|----/RPMS<br>
| |----*.rpm<br>
<br>
<br>
<br>
<br>
建立这种目录结构和相关文件的原因是在安装程序中已经以代码的形式确定了它们的命名及结构。其中,对boot.img和stage2.img的相关修改如前所述,而涉及到对comps,hdlist,hdlist2的修改,则需在后续的裁剪过程中确定。<br>
<br>
至此,调试环境建立完毕。现在可以用做好的启动盘来引导系统,并且可以从指定的硬盘上测试安装程序和RPM包的正确性。<br>
<br>
2.3对安装步骤的简化<br>
<br>
在对RPM 包的剪裁进行之前,还要对原有的安装步骤做出简化,去掉一些与系统需求大致无关的项目,使安装者可以集中精力地配置Sensor的主要参数,忽略诸如对键盘,鼠标,和多国语言的配置。具体的如下所示:<br>
<br>
原有的安装步骤有:<br>
<br>
1.安装语言选择<br>
<br>
2.键盘配置<br>
<br>
3.鼠标配置<br>
<br>
4.欢迎信息<br>
<br>
5.安装类型选择(包括安装或升级,安装部分又包括workstation,server,laptop,custom四种类型)<br>
<br>
6.选择分区方式(自动分区,手动分区,专业分区)<br>
<br>
7.选择以上部分或全部分区格式化<br>
<br>
8.Lilo操作系统引导器配置<br>
<br>
9.网卡及网络配置<br>
<br>
10.防火墙配置<br>
<br>
11.语言配置<br>
<br>
12.时区配置<br>
<br>
13.账户配置<br>
<br>
14.认证配置<br>
<br>
15.包组及单RPM包选择<br>
<br>
16.包独立性检查<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -