红联Linux门户
Linux帮助

Linux下绿色RPM包集合专用贴

发布时间:2007-09-23 11:06:48来源:红联作者:lfedorax
  刚装好一个linux系统,想装个mplayer,gcc,kdevelop,wxWidget之类的,但是突然发现,要安装这些软件是如何的困难,现在手里只有magiclinux安装盘(注意我装的mandriva one 2006!)。里面有我需要的软件,但是用rpm安装里面的软件的时候,发现依赖太多,要安装里面的mplayer,除了要安装光盘里的几个相关包外,居然还要卸掉某些mandriva的包。让我卸openoffice!一个mpalyer尚且如此,就不要想gcc,kdevelop之类了。

  这个linux可怎么用啊,所以就想到了绿色软件!linux下应该也可以用绿色软件。只要一解压,双击就可以使用,这是多么惬意啊~~~ 所以现在决定自己做绿色软件,做无须安装即可使用的linux软件。

  预备知识:
  rpm解压命令:"rpm2cpio|cpio -id" 大概是这个。
  查看binary依赖的动态库 ldd
  rpm 包依赖检测rpm -ivh (其实这个是安装命令)

  考虑到linux与windows的不同,linux下软件会分别放在几个目录,所以可能绿色和windows不同,需要写个脚本将绿色软件拷贝到相关目录,尽量避免拷贝。

  由于没有直接做绿色的工具,现在只能手工制作,等经验成熟之后,可开发集成环境,加速制作过程,达到批量绿色。

  做linux绿色软件目的就是让Linux下安装软件更简单,更快捷。不管是对于新用户,还是有经验的开发者,软件安装将是一件非常惬意的事!

  好,从现在开始做起吧!做inux绿色软件!继续发扬linux 自由,分享的精神!如果有共同志向的朋友看到此日志,欢迎和我交流(pgy5@163。com),讨论制作linux绿色软件问题。有什么想法的话,也可以在这跟贴,我会定期查看。同时如果有制作好的或者网上流传的linux绿色软件,也会在这里发布。

  毕竟做绿色包不是完整解决办法,所以现在开始做绿色rpm包,基本一包搞定,方便安装使用!(做rpm绿色版,rpm的绿色版,绿色rpm安装包,绿色版rpm安装包)(这里没什么意思,就是让google能搜到本页)

  Firefox 算一个,非常好用的浏览器,下载地址:http://www.mozilla.com/

  火狐应该算绿色软件,现在已经不在讨论之列,我们要做绿色rpm包,还是做rpm包比较好,但是要自带依赖库,除了系统的一些全带上!

  通过尝试在MagicLinux下装Anjuta发现,一般的rpm包在制作的时候,会指定我需要哪些包,如果你的系统没有那些包,就会显示,你的系统没有装 xxx-lib>2.0 needed by anjuta。所以必须安装xxx-lib才能装,这是一个显式的依赖!

  而且大部分时候,还会提示xxx.so.0 needed by anjuta,这又是为什么呢?这是在制作包的时候由find-required和fin-provider脚本自动检测出来的依赖!他们是怎么工作的呢?很简单,anjuta里包含一些bin,和一些lib,find-required 会找这些bin需要依赖那些lib(ldd),列出一个依赖表,find-provider会找anjuta的lib,发现anjuta提供了那些可用 lib.这是一个提供表。

  这2张表在安装的时候就要发挥大作用了,rpm首先找依赖表的lib,然后在提供表里找,如果找到了,说明依赖解决,继续下一个,如果依赖表里的lib没有在提供表里找到,系统里也没有,那么就会提示xxx.so.2没有找到,needed by anjuta。

  然后才是提供表的处理,如果提供表里发现系统中也有一样的lib(不管是自己拷贝的还是其他包安装的),但是文件大小不一样,就会提示XXX.so.2 is confict with xxxx.mdk包。

  所以,做绿色的rpm该怎么做呢?首先显式依赖要去除!即把需要的包和anjuta包合并在一起,一起安装,这样显式依赖就不需要写了。

  然后的麻烦就是隐式以来的问题。通过find-requie 和 find-provide可以得到2张表,然后把2张表比较一下,可以知道现在还需要哪些库。(这个功能最好可以用个脚本做出来)。然后把需要的所有库都复制到包里,就可以解决隐式依赖问题。这样这个包就是完全自主包,不依赖任何其他东西,但是提供了很多功能,被别人依赖。

  注意这里的库指的是动态库,其他还有一些程序需要的静态库,配置文件,资源文件也要包在里面。否则程序可以运行,但是会提示少配置或资源之类的信息。

  这样,安装的时候就不会依赖任何库了,但是现在有个问题,就是这样的包如何卸载呢?不知道会不会有问题,等回去把做好的包测试一下。

  还要做一个依赖检查脚本,把所有依赖的包,和提供的包都查出来,然后看依赖的包有没有不在提供包里面的,列出一个表格。

  查找脚本基本作好,其实只要稍微修改一下rpm自带的find-requres和find- providers就可以了,现在就是对结果进行比较的问题了,学学shell如何操作吧。同时看到资料说,写载的时候如果这个库文件同时也由其他包提供的话,就不会被删除,所以这样的安装包可以放心卸载!

  看来越来月顺利了,下一步做一个绿色rpm制作工具,等。还没有经过全面测试呢!制作工具现在列入计划,以后实施。

  现在已经做好2个脚本:
  1,可以自动根据依赖将所需的库拷贝到anjuta/usr/lib下
  2,自动分析依赖和提供库,给出还缺少哪些库的信息

  可以开始大规模的做绿色rpm包了。

  当前问题:如何给目标系统加菜单和桌面快捷链接?因为kde和gnome是2个完全不同的环境,桌面的好做一点,菜单就麻烦了,找资料!

  桌面路径和菜单路径各发行版不同,但是标准的kde,gnome应该是固定的。还发现一个比较严重的问题,就是有些程序,即使依赖的包全部都有,但是运行的时候会发生段错误,这是什么原因呢?可能是小版本不同造成的,这不是打包的问题,而是程序本身的问题!查!也许是还需要动态加载的so,看它有没有用到libdl.so就知道了(里面包含dlopen的定义)

  rpmbuild的影响太大了!它在打包过程中会去掉可执行文件的多余符号,和debug信息!首先去掉多余符号有时会导致断错误!所以这个要先禁用。去掉debug信息会导致另一个问题,就是一般confilict的问题,文件大小不同就会提示 confilict!!这个问题不能根本解决,因为编译器不同文件大小则不同,所以为什么rpm把这个算在里面呢?那样的话基本上这个平台的 libsome.so.2和另一个平台的libsome.so.2是不一样的,能不能跳过confilict检测呢?

  看来rpm跨平台还是不可行啊,不同发行版之间很难兼容,如果是这样的话,每个发行版发行自己的rpm这样也不错。有个想法:就是把发行的包都防在web上,就像deb一样,这样输入一个包名就自动下载安装(包括其依赖的包),这样极大方便用户,不用到处找包,yum是不是就这样的呢?
文章评论

共有 0 条评论