一、Linux程序包管理发展史那点事
Linux上的应用程序被开发出来后,一般以源码形式或者编译后的二进制格式提供给用户使用。对于以源码形式提供的应用程序,用户需要借组编译器,自行编译成二进制格式才能使用。而即便是编译后的二进制包,用户也需要根据安装文档将应用程序的二进制程序、库文件、配置文件和帮助文件复制到指定路径下。这个过程十分繁琐。面对这个恼人的问题,Linux业界人士怎么能忍得下去,千呼万唤始出来,终于诞生了程序包管理器。
有了程序包管理器之后,应用程序提供者可将应用程序的二进制程序、库文件。配置文件、帮助文件等以特定形式组织成一个或有限几个“包”文件(不同程序包管理器的组织形式不同)。用户可下载打包好的程序包文件,然后通过程序包管理器的命令实现应用程序的安装,而不再需要手动的复制程序文件到指定的路径下,这些工作都交由程序包管理器来完成了。
最开始研发出的程序包管理器是Debian的dpt,全名是Debian Package Tool,后更名为dpkg,其程序包的后缀是.deb。后来RedHat也研发出了程序包管理器RedHat Package Manager,简称rpm,其程序包后缀为.rpm。在RedHat的推动下,rpm成为了Linux程序包管理器中的事实上的标准。RedHat对强大后的rpm进行了重新的解释,rpm的全称变为“rpm is Package Manager”。SUSE使用的程序包管理器也是rpm,但它的程序包与RedHat的是不兼容的。此外,Gentoo也有自己的程序包管理器ports。
这里,主要介绍程序管理器rpm的使用。
rpm程序包的命名有一定的规范,如下图所示:
Linux有一条哲学思想是:每一个程序只做一件事,并且把它做好。所以,一个大的应用程序往往会根据其提供的多个功能,被拆分为主包和一个或多个子包,用户可以根据需要的功能安装指定的部分程序包,而不必全部安装。这一点上有点像使用浏览器时,主包相当于浏览器安装包,要想使用浏览器就必须安装这个包,它提供了浏览器浏览网页的基本功能。子包相当于浏览器上的一些插件,如果我们想在浏览器上使用截图功能,或者播放视频,我们必须安装相应的截图插件和flash插件。这些插件必须借助浏览器这个软件才能发挥作用,是寄生在浏览器上的。用户可根据需要安装插件。主包和子包的关系就像浏览器和插件的关系一样。主包的命名方式与前面讲到的程序包命名方式相同,而子包者需在“NAME”后加上一个字段来表示该子包提供的功能。所以,主包命名格式为:NAME-VERSION-release.[os.]arch.rpm;子包命名格式为:NAME-FUNCTION-VERSION-release.[os.]arch.rpm。
zsh的主包名: zsh-5.0.2-7.el7.x86_64.rpm
zsh的某个子包名:zsh-html-5.0.2-7.el7.x86_64.rpm
前面讲到,子包必须寄生在主包上才能发挥作用,这种程序间的依赖关系是很常见的。假设,我们要使用A程序的功能,但A程序依赖于B程序,那么我们需要再安装B程序,而B程序可能也依赖于其他的程序,以此类推,为了安装并使用A程序,我们需要解决一大片的依赖关系,安装很多的其他程序包。可惜,程序包管理器rpm并没有提供很好的解决方案。在自由软件界,有难点痛点,就有人挺身而出。以rpm为基础,人们为它开发了一套前端管理功能yum来解决这个难题。(介于这篇博客以解释rpm为主,yum将在下篇博客中进行解释)
二、rpm的详解
(一)rpm程序管理器的功能
将编译好的应用程序的各组成文件打包成一个或多个程序包文件按,从而更方便的实现程序包的安装、升级、卸载