嵌入式操作系统第4章LINUX软件管理1.LINUX系统软件管理机制2.APT高级软件包的管理工具最初,基于Linux系统的开发者在完成应用程序开发后,将很多二进制文件发给用户,用户使用之前需要将很多程序逐个安装。DebianLinux首先提出“软件包”的管理机制——Deb软件包,将应用程序的二进制文件、配置文档、man/info帮助页面等文件合并打包在一个文件中,用户使用软件包管理器直接操作软件包,完成获取、安装、卸载、查询等操作。3流行的两种软件包管理机制RedhatLinux基于这个理念推出了自己的软件包管理机制——Rpm软件包。Redhat采用了自己的打包格式生成Rpm包文件,由Rpm包管理器负责安装、维护、查询,甚至是软件包版本管理。不过,由于RedhatLinux系统的普及,Rpm软件包被广泛使用。甚至出现第三方开发的软件管理工具,专门管理Rpm格式的软件包。4流行的两种软件包管理机制随着Linux操作系统规模的不断扩大,系统中软件包间复杂的依赖关系,导致Linux用户麻烦不断。DebianLinux开发出了APT软件包管理器。检查和修复软件包依赖关系利用Internet网络帮助用户主动获取软件包APT工具再次促进了Deb软件包更为广泛地使用,成为DebianLinux的一个无法替代的亮点。5流行的两种软件包管理机制Debian包文件包含了二进制可执行文件、库文件、配置文件和man/info帮助页面等文档。通常Debian包文件的后缀为“.deb”,因此称为“Deb软件包”。Ubuntu有两种类型的软件包:二进制软件包(deb)和源码包(deb-src)。二进制软件包(BinaryPackages):它包含可执行文件、库文件、配置文件、man/info页面、版权声明和其它文档。源码包(SourcePackages):包含软件源代码、版本修改说明、构建指令以及编译工具等。先由tar工具归档为.tar.gz文件,然后再打包成.dsc文件。软件包的类型在用户不确定一个软件包类型时,可以使用file命令查看文件类型。例如下面命令用于证实一个软件包的文件类型是否是Deb软件包文件。@UbuntuFisher:~$fileg++_4.1.2-9ubuntu2_i386.debg++_4.1.2-9ubuntu2_i386:Debianbinarypackage(format2.0)软件包的命名遵循以下约定:通常,修订版本号是由Ubuntu开发者或创建这个软件包的人指定。在软件包被修改过之后,将修改版本号加一。8软件包的命名Filename_Version-Reversion_Architecture.deb软件包名称软件版本修订版本体系架构g++_4.1.2-9ubuntu2_i386.deb????Linux为每个软件包指定了一个优先级,作为软件包管理器选择安装和卸载的一个依据。下表列出定义的所有软件包优先级描述。9软件包的优先级级别含义补充说明Required(必须)该级别软件包是保证系统正常运行所必须的包含所有必要的系统工具。尽管Require级别的软件不能满足整个系统的服务,但至少能够保证系统正常启动。如果删除其中一个软件包,系统将受到损坏而无法恢复。例如bash、mount、upstart。Important(重要)若缺少该级别软件包,系统会运行困难或不好操作该级别软件包是一些实现系统底层功能的程序。例如,aptitude、ubuntu-keyring、cpio。Standard(基本)该级别软件包是任何Linux系统的标准件该级别的软件包可以支撑命令行控制台系统运行。通常作为默认安装选项。例如,memtest86、telnet、pppconfig、ed。Optional(可选)该级别软件包是否安装不影响系统的正常运行该级别的软件包用于满足用户特定的需求或服务。它们不会影响系统的正常运行。例如,X11、mysql、openoffic.org。Extra(额外)该级别软件包可能与其它高级别软件包存在冲突在Ubuntu系统中规定,任何高优先级的软件包都不能依赖于低优先级的软件包。这样可以实现按照优先级一层层冻结系统。在新版本发布准备阶段,优先级的作用就显得更为重要。基本系统由Required级和Important级软件包组成,属于这类优先级的软件包首先被冻结。由于这些软件包是其它软件包所依赖的,它们能保证整个系统的稳定,这是Ubuntu发布新版本所必需的。然后,冻结Standard级软件包,紧接着,在发布新版本之前对Optional级和Extra级软件包进行冻结。10软件包的优先级在使用系统过程中,用户会不断的安装、卸载软件包。为了记录用户的安装行为,Ubuntu对软件包定义了以下两种状态,如表所示。期望状态:标记用户希望将某个软件包处于的状态。当前状态:标记用户操作该软件包后的最终状态。11软件包的状态12软件包的状态类别状态状态符描述期望状态未知(unknown)u用户并没描述他想对软件包进行什么操作已安装(install)i该软件包已安装或升级删除(remove)r软件包已删除,但不想删除任何配置文件清除(purge)p用户希望完全删除软件包,包括配置文件保持(hold)h用户希望软件包保持现状,例如,用户希望保持当前的版本,当前的状态当前状态未安装(Not)n该软件包描述信息已知,但仍未在系统中安装已安装(installed)i已完全安装和配置了该软件包仅存配置(config-file)c软件包已删除,但配置文件仍保留在系统中仅解压缩(Unpacked)U已将软件包中的所有文件释放,但尚未执行安装和配置配置失败(Failed-config)F曾尝试安装该软件包,但由于错误没有完成安装不完全安装(Half-installed)H已开始进行提取后的配置工作,但由于错误没有完成安装Linux操作系统是一个复杂系统。若要求它们能够成为一个有机整体,支撑Linux系统的正常运转,就必须要求各个组件密切配合。尽可能提高软件系统内部的耦合度。换句话说,某个软件组件是否能够正常运行或运行的更好,依赖于其他一些软件组件的存在。这样做的好处是,使系统更加致密、紧凑,减少中间环节可能引发的错误。然而,随即带来的两个负面问题是,软件组件依赖和软件组件冲突问题。软件包的依赖性关系为了解决这个问题,Debian提出了程序依赖性机制,并做详细的定义。程序依赖性是用来描述独立运行程序与当前系统中程序之间存在的关联程度。14软件包的依赖性关系软件包管理器将依据软件包“依赖关系”完成组件的安装或卸载。例如,包含GNUC编译器(gcc)的软件包依赖于包含链接器和汇编器的binutils软件包。如果用户试图在没有安装binutils的情况下安装gcc,软件包管理器将会中止安装,并出现错误提示,要求用户事先安装binutils。软件包依赖关系依赖关系关系描述依赖(depends)要运行软件包A必须安装软件包B,甚至还依赖于B的特定版本,通常版本依赖有最低版本限制推荐(recommends)软件包维护者认为所有用户都不会喜欢缺少软件包A的某些功能,而这些功能需要B来提供建议(suggests)软件包B能够增强软件包A的功能替换(replaces)软件包B安装的文件被软件包A中的文件删除或复盖了冲突(conflicts)如果系统中安装了软件包B,那么软件包A将无法运行。“Conflicts”常和“replaces”同时出现提供(provides)软件包A中包含了软件包B中的所有文件和功能Deb软件包将二进制应用程序、配置文档、帮助页面都整合在一个文件中,便于传递、安装、升级和备份。显然,Deb软件包的管理不能单纯依靠用户手工来完成。Linux为用户提供了不同层次和类型的软件包管理工具,根据用户交互方式的不同,可以将常见的软件包管理工具分为三类。、dpkg、apt在命令行模式下完成软件包管理任务。为完成软件包的获取、查询、软件包依赖性检查、安装、卸载等任务,需要使用各自不同的命令文本窗口界面dselect、aptitude、tasksel在文本窗口模式中,使用窗口和菜单可以完成软件包管理任务图形界面synaptic在X-Window图形桌面环境中运行,具有更好的交互性、可读性、易用性等特点使用软件包管理工具能够实现以下功能:从Ubuntu软件源的镜像站点自动获取与安装软件相关的所有软件包将应用软件的相关文档打包成Deb软件包查询和检索Deb软件包信息检查当前操作系统中软件包的依赖关系安装和卸载Deb软件包软件包管理工具功能文本窗口管理工具实质是将命令行工具作为底层,在上层包装了一个文本界面的实用工具。它为用户提供了窗口、菜单、快捷键等操作手段,以方便完成软件包的管理工作,而无需再记忆大量复杂的命令。文本窗口管理工具aptitude提供了用户所需的大部分包管理功能,界面操作简单,可以使用鼠标和键盘打开菜单,执行各种动作。在命令行执行以下命令,启动aptitude,aptitude的界面十分友好,用户可以在上方区域中的树形列表中选择软件包,同时,在窗口下方区域中显示相应的软件包描述信息。20aptitudewdl@UbuntuFisher:~$sudoaptitude21aptitudedselectdselect是Deb软件包管理工具的元老级工具,功能比aptitude强大的多。只是作为文本窗口的管理工具,它缺少aptitude的简洁性、易用性。比如dselect仅使用数字菜单,不支持鼠标操作。当然,对于Ubuntu服务器用户,在文本终端环境下工作,使用dselect是最好的选择。由于dselect的底层实质就是调用了APT、dpkg等工具.tasksel有时为了完成某个安装任务,需要安装的软件包非常多。可以按照一个大的任务来规划需要安装的软件包。默认情况下,tasksel会列出几个典型的安装任务供选择,用户可以不用顾及其中需要安装哪些软件包了。使用tasksel特别适用于首次安装和大面积升级。24tasksel在命令行执行“tasksel--list”命令也可显示tasksel的任务列表。在执行结果中,“i”表示该任务组件已安装,“u”表示该任务组件未安装。@UbuntuFisher:~$tasksel--listidns-serverDNSserveruedubuntu-serverEdubuntuserverulamp-serverLAMPserveruedubuntu-desktopEdubuntudesktopukubuntu-desktopKubuntudesktopiubuntu-desktopUbuntudesktopuxubuntu-desktopXubuntudesktopuedubuntu-liveEdubuntuliveCDukubuntu-liveKubuntuliveCDuubuntu-liveUbuntuliveCDuxubuntu-liveXubuntuliveCD@UbuntuFisher:~$sudotaskselinstalledubuntu-server在命令行执行“taskselinstall”命令,可以开始安装指定任务组件Synapt