当前位置: 首页 > Linux

Linux软件安装管理-dpkg和apt--详解

时间:2023-04-06 05:52:58 Linux

1.前言上一篇《Linux软件安装管理之——源码安装详解》详细介绍了Linux平台下源码包安装的原理,虽然使用源码进行软件编译可以自定义但是,对于Linux发行版发行商来说,软件管理还为时不晚。毕竟不是每个人都能编译源代码。这个问题会严重影响linux平台软件的发布和推广。为了解决上述问题,厂商首先在自己的系统上编译出我们用户需要的软件,然后将编译好的可执行软件直接发布给用户安装。不同的Linux发行版使用不同的打包系统。一般来说,大多数发行版的包管理技术分为两大阵营:Debian的“.deb”和RedHat的“.rpm”。有一些重要的例外,例如Gentoo、Slackware和Foresight,但大多数将使用这两个基本系统之一。这里我将详细介绍Debian系列发行版的dpkg和apt-*的使用方法。如果你需要了解RedHat系列发行版的包管理系统,请参考我的另一篇文章:《Linux软件安装管理之——RPM与YUM详解》。注:我的系统版本[Ubuntu12.04LTS]2.dpkg1,Introductiondpkg-packagemanagerforDebian(debian系统的包管理工具)。dpkg是一个安装、构建、删除和管理Debian包的工具,dpkg是Debian的一个低级包管理工具,主要用来管理下载和安装的软件包。dpkg机制最早是由DebianLinux社区开发的。通过dpkg机制,可以方便的安装Debian提供的软件,同时可以提供安装软件的信息,真是太好了。只要是Debian衍生出来的其他Linux发行版,大多都是使用dpkg机制来管理的,包括B2D、Ubuntu等。2、deb包名规则格式为:Package_Version-Build_Architecture.deb,如:nano_1.3.10-2_i386.deb包名(PackageName):nano版本(VersionNumber):1.3.10修订号(BuildNumber):2Platform(Architecture):i3863,dpkg包相关文件介绍/etc/dpkg/dpkg.cfgdpkg包管理软件配置文件【带默认选项的配置文件】/var/log/dpkg.logdpkg包管理软件日志文件【默认】日志文件(见/etc/dpkg/dpkg.cfg(5)和选项--log)】/var/lib/dpkg/available存放系统中所有已安装的软件包【可用软件包列表】/var/lib/dpkg/status存放系统中所有已安装软件的状态信息/var/lib/dpkg/info记录已安装软件包控制目录的控制信息文件4.dpkg数据库dpkg使用文本文件作为数据库来维护系统中的软件,包括文件列表、依赖关系、软件状态等详细内容,通常在/var/lib/dpkg目录下。软件状态和控制信息通常存储在状态文件中。备份info/目录下的控制文件,在其下的.list文件中记录安装文件列表,其下的.mdasums保存文件的MD5编码。示例:查询dpkg数据库(显示所有已安装的Deb包)如上图,每条记录对应一个软件包,注意每条记录的第一、二、三字符,这是该软件包的状态标识软件包,后面是软件包名称、版本号和简要说明。1)第一个字符为期望值(Desired=Unknown/Install/Remove/Purge/Hold),包括:uUnknown状态未知,表示软件包未安装,用户未发出安装要求。iInstall用户请求安装Package。r删除用户卸载软件包的请求。p清除用户请求以清除包。h保留用户请求以保持包版本锁定。2)第二列是包的当前状态(Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend)nNotpackageisnotinstalled.iInstpackageisinstalledandconfigurationiscomplete.cconf-files包之前安装过,现在删除了,但是它的配置文件还留在系统中。uUnpacked软件包已解压,但尚未配置。fhalF-conf尝试配置包,但失败了。h已安装半安装包,但未成功。wtrig-aWait触发器等待tTrig-pend触发器挂起3)第三列标识错误状态,第一个状态表示没有问题并且为空。其他符号表示相应的问题(Err?=(none)/Reinst-required(Status,Err:uppercase=bad))h软件包强制保留,因为有其他软件包依赖要求,无法升级。).x软件包被破坏并被强制保留。案例描述:ii——表示系统已经正常安装了该软件pn——表示安装了该软件,然后清零un——表示从未安装过该软件iu——表示安装了该软件,但是rc没有已配置——软件已被删除,但配置文件仍然存在子命令。例如:dpkg-deb,dpkg-divert,dpkg-query,dpkg-split,dpkg-statoverride,start-stop-daemon这里就不详细描述dpkg命令了,如果需要了解可以参考资料你自己。三、dpkg手册1、安装1)安装相关命令dpkg-ipackage-name.deb#--install,安装软件包,必须是deb包的完整名称。(软件的安装可以拆分为“解包”和“配置”两个相反的过程)dpkg--unpackpackage-name.deb#“unpacking”:解包到系统目录但不要配置,如果使用带-R,参数可以是一个目录dpkg--configurepackage-name.deb#"Configuration":配置软件包dpkg-cpackage-name.deb#列出deb包的内容2)安装相关选项-R,--recursive递归处理在指定目录找到的所有匹配模式*.deb的常规文件及其所有这可以与-i,-A,--install,--unpack--avail动作一起使用所有安装包都可以组合with-i,-A,--install,--unpackand--avail)2.移除包dpkg-rpackage-name#--remove,移除包,但保留它的配置文件dpkg-Ppackage-name#--purge,清除包的所有文件(removeeverything,includingconffiles)3.查询dpkg-lpackage-name-pattern#--list,检查系统中的包名是否匹配pattern模式下的软件包dpkg-Lpackage-name#--listfiles,查看package-name对应的包安装的文件和目录dpkg-ppackage-name#--print-avail,显示包的具体信息dpkg-spackage-name#--status,查看package-name对应的包信息(已安装)dpkg-Sfilename-search-pattern#--search,从已安装的包中查找包含filename的包名(提示:也可以使用子命令dpkg-querytoquery)例1:列出系统安装的dpkg相关软件包dpkg-l\*dpkg*示例2:查看dpkg包在系统中安装的文件在使用dpkg的时候,软件安装过程中的很多问题都已经解决了,但是当依赖不满足的时候,还是需要手动解决,以及apt工具解决了此类问题,linux发行版首先将软件放到相应的服务器上,然后分析软件的依赖关系,并记录下来,然后在客户端需要安装软件的时候,将列表与已有的软件数据进行比较本地的dpkg,然后就可以从网络上获取所有需要的依赖了。软件。2、工作原理Ubuntu采用集中的软件仓库机制,将各种软件包分类存放在软件仓库中,以进行有效的组织和管理。然后,将软件仓库放置在多台镜像服务器中,并保持基本一致。这样所有的Ubuntu用户都可以随时获得最新版本的安装包。因此,对于用户来说,这些镜像服务器就是他们的软件源(Repository)。但是,由于每个用户的网络环境不同,不可能随意访问每个镜像站点。为了能够选择性访问,在Ubuntu系统中,使用软件源配置文件/etc/apt/sources.list列出最适合访问的镜像站点地址。例1:apt-get的更新过程1)执行apt-getupdate2)程序分析/etc/apt/sources.list3)自动连接网络在列表中找到对应的Packages/Sources/Release列表文件,如果有更新就下载,存放在/var/lib/apt/lists/目录下4)然后apt-getinstall对应的包,下载安装。即便如此,软件源配置文件也只是告诉了Ubuntu系统可以访问的镜像站点地址,并不清楚那些镜像站点有哪些软件资源。每次安装一个软件包都要搜索服务器,效率很低。因此,需要对这些软件资源做一个列表(建立一个索引文件),以便本地主机查询。用户可以使用“apt-getupdate”命令刷新软件源,创建更新软件包列表。在UbuntuLinux中,“apt-getupdate”命令会扫描各个软件源服务器,并为该服务器的软件包资源创建一个索引文件,存放在本地的/var/lib/apt/lists/目录下。使用apt-get进行安装和更新操作时,会根据这些索引文件向软件源服务器申请资源。因此,在电脑设备空闲时经常使用“apt-getupdate”命令刷新软件源是一个好习惯。例2:apt-getinstall示意图3.apt相关文件var/lib/dpkg/available文件内容为软件包的描述信息,包含了apt使用的Debian安装源中的所有软件包当前系统,包括当前系统中安装和卸载的软件包。/etc/apt/sources.list记录软件源地址(当你执行sudoapt-getinstallxxx时,Ubuntu会去这些站点下载软件包到本地并执行安装)/var/cache/apt/archives下载的软件包放在这里(使用apt-getinstall安装软件时,软件包的临时存放路径)/var/lib/apt/lists使用apt-getupdate命令会下载软件列表从/etc/apt/sources.list中保存到该目录下4.apt的源文件由配置文件/etc/apt/sources.list指定,该文件的配置内存如下图所示:镜像服务器的存放位置例如:解压Packages.gz后,我们可以看到所有软件包的基本信息,Packages.gz中已经包含了所有依赖的软件及其版本信息,以及下载地址。4.Apt用户手册1.apt-getapt-get是处理包的命令行工具,可以被认为是用户使用APT库的其他工具的“后端”。存在多个“前端”界面,例如dselect(1)、aptitude(8)、synaptic(8)和wajig(1)。apt-get是一个用于下载和安装包的简单命令行界面。最常用的命令是update(更新)和install(安装)。用法:apt-get[options]命令常用选项:-h这个帮助文件。-q输出到日志-无进度指示-qq不输出任何信息,错误除外-d仅下载-不安装或提取存档-s不实际安装。模拟命令执行-y假设对所有查询都是肯定的,不提示-f尝试修复损坏的系统依赖项-m如果找不到存档,尝试继续-u还显示更新包的列表-b获取源包并编译-V显示详细版本号-c=?读这个配置文件-o=?设置自定义配置选项,如-odir::cache=/tmp常用命令:1)apt-getupdateupdatesource[aptitudeupdate]2)apt-getdist-upgrade将系统升级到对应的release版本(根据到source.list的配置)[aptitudedist-upgrade]3)apt-getupgrade更新所有安装的软件包[aptitudeupgrade]4)apt-getinstallpackage_nameinstallpackage(plus--reinstallreinstall)apt-getinstallpackage_name=versioninstall指定版本的包[aptitudeinstallpackage_name]5)apt-getremovepackage_nameuninstallaninstalledpackage(keeptheconfigurationfile)[aptituderemovepackage_name]6)apt-getpurgepackage_name删除包(删除配置信息)或apt-get--purgeremovepackagename[aptitudepurgepackage_name]7)apt-getcheck以检查损坏的依赖项8)apt-getautoclean删除您已删除的软件(定期运行此命令以清理.deb文件已卸载的软件包。这样,您可以释放大量磁盘空间。如果您的需求非常紧急,您可以使用apt-getclean来释放更多空间。此命令将删除已安装软件包的.deb文件。在大多数情况下,你不会再使用这些.debs文件,所以如果你正在为磁盘空间不足而苦恼,这个方法可能值得一试)[aptitudeautoclean]9)apt-getclean也会备份已安装的软件Delete,但是这不会影响软件的使用[aptitudeclean]2.apt-cacheapt-cache-查询APT的缓存。apt-cache对APT的包缓存进行各种操作。apt-cache不操纵系统的状态,但确实提供了从包元数据中搜索和生成有趣输出的操作。1)apt-cachedependspackagename了解依赖项的使用2)apt-cacherdependspackagename是查看哪个packages包依赖3)apt-cachesearchpackagename搜索包【aptitudesearchpackagename】4)apt-cacheshowpackagename获取包的相关信息,如描述,大小,版本等【aptitudeshowpackagename】5)apt-cacheshowpkgpackagename显示包的一般信息(注:方括号[]里面的aptitude也是类似apt-*的包管理上层工具)参考:阿里云开源镜像站:http://mirrors.aliyun.com/网易开源镜像站:http://mirrors.163.com/图书:《The Linux Command Line》WilliamE.Shotts,Jr.Ubuntu官网:https://www.ubuntu.comDebian官网:https://www.debian.org/doc/us...https://www.debian.org/doc/ma...丢个人博客:http://blog.csdn.net/astrayli...