可以看 概览里面的开发说明。
它的整个安装过程大概是这样的:
编译 anaconda之后,可以得到 init 、loader和一个stage2.img , init 和loader 是两个静态编译的程序,不依赖其他库了,就是编译anaconda源代码目录下的loader目录下的C代码得到。 这两个程序放在最后用来启动安装时的Linux系统的initrd image里面。 anaconda的其他部分代码主要是 python 写的都是放到stage2.img里面去了。
其实就是用个Linux内核和个简单的initrd image来启动系统,如果可以采用PXE网络启动方式安装的话,可以采用 mknbi这个命令(一个脚本)来把Linux内核文件 bzimage 和initrd image文件打包成一个叫做 tagged image简单格式的tftp image里面去,不过好像各种网络启动的所用的格式稍稍有点不同,自己搜索ethboot 等,可以看到相关说明。
通过修改initrd 的init文件,可以做些初始化比如加载必须的驱动等工作,然后 在调用 anaconda的init程序,init程序会初始化console ,/dev文件系统,mount相应的目录等等。然后init程序会调用loader程序,就开始了安装过程。loader程序中会进行网络接口network interface 的配置等相关工作,如果指定了网络上的kickstart文件,他也会下载下来保存为/tmp/ks.cfg ,然后从kickstart 配置文件中获取到stage2.img 所在的位置。如果stage2.img实在nfs服务器上的话,(stage2.img和其他系统安装需要的文件是放在一起的),他就把这个目录nfsmount到/mnt/runtime /mnt/source 目录下。stage2.img里面的anaconda的程序运行所需要的很多比如python的支持库啊等很多*.so文件也都是在这时mount过来之后,好像是复制到/lib 目录下,然后配置好LD_LIBRARY_PATH环境变量,然后等会stage2.img里面的程序运行时候就可以找的库到了。当然还有最后系统到底目录啊,这时也mount到一个目录下,比如说要安装系统到磁盘上,就是把这个盘先mount到一个目录下吧,再在state2.img 里面的程序把系统安装的配置都写到这个目录去吧。
最后,loader程序调用 /tmp/updates/anaconda 这个shell脚本,/tmp/updates/anaconda 再调用 state2.img里面(这时已经被mount出来了,好像还复制到/usr/bin了,没仔细看)的anaconda程序,这个anaconda就是anaconda源代码根目录下的python写anaconda那个。然后安装完重启系统就装完了。
那个loader程序测试的时候,也可以在机器上直接运行的,指定一个--test参数给他就可以了。如果想调试init和loader程序,可以看他生成的/tmp/anaconda.log文件,可以修改一下/tmp/updates/anaconda ,让他不系统stage2的 anaconda程序,就会自动进入sh终端,就可以检查/tmp/anaconda.log里面的内容了。代码里面用logMessage函数打印的东西都会放到/tmp/anaconda.log里面去的。系统安装完成后,在/var/log目录下也可以找到这个anaconda.log文件。
安装哪个版本的系统,由initrd image根目录下的.buildstamp 文件确定