Packages CollectionFreeBSD中提供了上G字节大小的预编译并打好包的二进制应用软件包,这些软件包能够立即安装使用。在软件包中不但记录了二进制软件的内容,还包括这些软件的安装位置、软件包的描述信息,以及软件包之间的依赖关系,这种管理软件的机制称为Packages Collection。通常安装介质提供的这些Packages位于安装介质中的packages目录下,使用安装程序sysinstall就能够很容易的安装和卸载这些安装好的软件包。(由于空间的限制,安装光盘上并不能包括所有的软件包,可以从Internet上下载,在Walnet Creek发布的FreeBSD光盘中的第三张也包括了大量预编译好的软件包)。
在FreeBSD下,每个预编译的软件包是使用tar和gzip进行打包压缩后的文件,其文件名中的前面为这个Package的名字(包括版本号),并使用tgz后缀,例如navigator浏览器的Package文件为netscape-navigator-4.07.tgz。。
使用root权限执行sysinstall,然后选择Configure菜单项中的Packages选项,系统将按不同的应用软件的类别,显示出相应的菜单选项,每个选项对应一类应用软件,其中All项中包括所有可用的应用软件。
这些软件也被放置到安装介质中的packages目录下对应的不同存储子目录中,子目录和菜单选项是一一对应的。
# ls -l /cdrom/packages
All converters kde print x11
INDEX databases lang security x11-fonts
Latest deskutils mail shells x11-toolkits
archivers devel math sysutils x11-wm
audio editors misc tcl81
benchmarks emulators net textproc
chinese gnome news tk81
comms graphics perl5 www
如果进入了一个种类的子菜单,那么就可以看到,已经安装的软件有一个 “X” 标记,可使用空格键反选择这个已安装的软件,系统将立即卸载这个软件。或者选择一个未安装软件,然而此时并没有立即进行这个软件的安装,而是要等到全部选择了所有想要安装的软件包之后,再回到上级菜单,选择 “Install” 按钮才开始进行安装。
Packages的相互依赖关系
各个软件包之间并不是孤立的,而是在相互之间存在一定的依赖关系。例如,所有的X Window应用软件都在X Window下运行,那么如果没有安装X Window服务器软件,也不能正确安装这些应用软件。此外,Packages中也并不全是应用软件,它也包括各种函数库及其他种类的支持文件,那么有的应用软件包就依赖于这些库文件和支持文件。
由于存在各种相互依赖关系,必然对软件包的安装和卸载发生影响。当安装一个软件包时,FreeBSD将会首先安装这个软件包依赖的其他软件包,然后才能安装这个软件包本身。如果没有安装它所依赖的软件包,则就不能正常安装这个软件包本身。同时,当删除一个软件包时,必须预先删除依赖这个软件包的所有其他软件包,否则就不能正常完成删除任务。FreeBSD对这个依赖关系限制比较严格,即使是同一个软件,但版本不同,依赖于这个软件另一个版本的其他软件包也不能正确安装,必须保证版本的一致性。
使用Packages Collection来安装和管理应用软件,可以维持软件安装文件结构的一致性,因为Packages Collection安装的软件其文件目录结构符合FreeBSD的习惯,清晰明了。此外软件包之间的依赖关系对于同时维护多种软件也很有效,因此最好不要绕过Packages Collection手工安装软件。当需要重新定制软件的时候,可以通过Ports Collection来完成,它在编译好软件之后,可以使用软件包的方式安装和维护软件。
每个软件包的安装信息被放置在/var/db/pkg目录下维护,这个目录下的每个子目录都对应于一个安装过的软件包,如果某个子目录被破坏,那么相应的软件包的信息就不复存在了。
管理Packages
虽然使用sysinstall来管理软件比较直观,但是这需要一个标准的安装介质,适合大量安装软件包时使用。而在不使用安装介质的时候,仅仅需要添加某个独立的软件包或进行维护时,sysinstall就不适合了。FreeBSD提供了十分简单的几个管理命令来完成这个任务。
pkg_add安装一个Package,其参数为要安装Package的文件名或获得这个文件的URL。当使用URL来指定Package的位置时,pkg_add首先使用fetch程序下载该软件包,然后进行安装。通常可以使用 “-v” 参数,使pkg_add显示出进行的操作过程。
pkg_delete 删除一个软件包,其参数为软件包的名字,由于此时软件包已经被安装到系统中了,因此名字中不必使用tgz后缀。同样也可以使用 “-v” 参数。
pkg_info获取一个软件包的安装信息和简短描述,参数为软件包名字时,将参看当前已安装的软件包中是否存在它,当使用的参数为带tgz后缀的文件名时,将查看当前目录中是否存在这个软件包文件。或者可以使用-a参数列出当前安装的所有软件包的信息:
# pkg_add netscape-communicator-4.5.tgz
# pkg_delete netscape-communicator-4.5
但在实际应用的过程中,值得注意的问题常常发生在升级软件包时。由于同一软件的不同版本通常使用同样的文件名,因此在安装一个版本时将覆盖掉另一个版本的文件,但是同时新版本的Packages并不会自动删除老版本Packages的安装信息。因此如果再一次卸载旧版本时就会将新版本中具有同样文件名的文件删除掉。解决问题的方法是先卸载老版本,再安装版本的Packages。一旦出现问题,可以再次将新版本Packages重新安装一次即可。
未完,待续。。。