|
|
portage确实好用,一个emerge ABC就搞定了,但在使用的过程中我发现还有些不太舒服的地方,初步想了想,应该可以改进的:
1:单任务模式的downloading->building改进成并行进行的同步机制.因为emerge的时候往往需要安装的不止一个软件,所以现在的这种先下载这个,然后编译这个,然后下载下一个,然后编译下一个的方式显得很消耗时间.我平时都是开两个终端,最大限度的保证下载和编译同时运行的.因为这两个任务消耗的资源不一样,一个是cpu的计算资源,另一个是网络带宽资源.
具体可以这样实现:先找出需要安装的软件包:按安装顺序:S1,S2....Sn,然后开两个进程,一个下载进程,一个编译进程.下载进程按顺序下载S1,S2...Sn,下个不停,知道所有软件都下载完成为止,另一个编译进程只管编译,如果需要编译的包还没下载完成,就等待,下载完成时下载进程给编译进程发送一个信号唤醒编译进程即可.这样可以最大程度让下载和编译的并行程度.假设最简单的情况,这n个软件的下载时间都等于编译时间,那么整个安装过程可以节省一半的时间.
2:多线程的下载工具,我不知道gentoo中的wget是不是默认开启了多线程下载的,如果不是,可以考虑默认开启,或更换支持多线程甚至可以查找多个资源的下载工具,比如说axel.不过我512k的网速来看,对一个软件来说,通常是编译时间大于下载时间,这样的做法实际意义不是很大.
3:充分利用历史编译成果,就是每个软件的编译都首先要checking一大堆的条件,装10个软件就需要checking10次,虽然每次的checking肯定有不同的地方,但有些checking是共同的,比如说gcc版本之类的.我没有对共同部分的量上做比较,但我估计不少,如果能拿出一个公共区域来记录历史的检查记录,如果遇到一个新的检查记录就放进去,如果是已经有的就不需要检查了(因为这个公共记录存放的是检查没问题的记录),这样应该也能节省一些时间(这事我特爱干,经常申明一个map来存储工作成果,呵呵).这个可能需要编译器的支持,不会很简单的.
4:其他一些小想法:比如编译时可以把当前软件的tar包放在tmpfs分区上,等一个个都输出了(就是make完毕了)然后再拷贝到它应该取的地方.
5:这个比较不现实:弄个类似SETI@home的东东来安装在电脑上,接收计算请求,并把计算结果返回给请求发起者.充分利用因特网上的每一台gentoo机器的计算资源.比如在安装的时候从stage1安装时的两次大的编译,如果在编译前指定使用基于因特网的分布式编译的话能大大减少编译时间.反正我的电脑不是总在安装软件的.
这些需要都是由于gentoo的portage机制引发的,如果像其他版本一样手工来安装软件,自己下载,自己解包config,make ,install的话,这些问题也不怎么显现出来,正是由于portage一次性要安装好几个软件才会有改进的现实意义的.
暂时只想到这么多,希望多指教. |
|