查看“Linux包管理:dpkg与apt”的源代码
←
Linux包管理:dpkg与apt
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:Linux]] == dpkg == dpkg,即package manager for Debian(debian系统的包管理工具)。“dpkg is a tool to install, build, remove and manage Debian packages”,dpkg是Debian的一个底层包管理工具,主要用于对已下载到本地和已安装的软件包进行管理。<br/> 这个机制最早由Debian Linux社区所开发出来的,通过dpkg的机制,Debian提供的软件就能够简单的安装起来,同时能提供安装后的软件信息。派生于Debian的其它Linux distributions大多使用dpkg这个机制来管理,包括B2D,Ubuntu等。 === deb软件包名规则 === 格式:“Package_Version-Build_Architecture.deb”。<br/> 如:nano_1.3.10-2_i386.deb # 软件包名称(Package Name): nano # 版本(Version Number):1.3.10 # 修订号(Build Number):2 # 平台(Architecture):i386 === 相关文件 === {| class="wikitable" ! 文件 !! 说明 |- | /etc/dpkg/dpkg.cfg | dpkg的配置文件 |- | /var/log/dpkg.log | dpkg的日志文件 |- | /var/lib/dpkg/available | 存放系统所有安装过的软件包信息 |- | /var/lib/dpkg/status | 存放系统现在所有安装软件的状态信息 |- | /var/lib/dpkg/info | 存放安装软件包控制目录的控制信息文件 |} === dpkg数据库 === * dpkg 使用文本文件作为数据库来维护系统中软件,包括文件清单、依赖关系、软件状态等详细的内容; 相关文本文件通常在“/var/lib/dpkg 目录下,通常在: # “status”文件中存储软件状态和控制信息 # “info/”目录下备份控制文件,并在其下的; #: “.list”文件中记录安装文件清单; #: “.md5sums”保存文件的 MD5 编码。 [[File:dpkg数据库文本.png|800px]] ==== 查询dpkg数据库 ==== 显示所有已安装的Deb包“dpkg -l”: : [[File:dpkg查看数据库.png|800px]] 每条记录的前三个字符为软件包的状态标识(Desired|Status|Err),后边依此是软件包名称、版本号、硬件平台和简单描述,其中 # 第一字符,为期望值(Desired=Unknown/Install/Remove/Purge/Hold),它包括: #: u Unknown状态未知,这意味着软件包未安装,并且用户也未发出安装请求. #: i Install用户请求安装软件包. #: r Remove用户请求卸载软件包. #: p Purge用户请求清除软件包. #: h Hold用户请求保持软件包版本锁定. # 第二列,为软件包的当前状态(Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend): #: n Not软件包未安装. #: i Inst软件包安装并完成配置. #: c Conf-files软件包以前安装过,现在删除了,但是它的配置文件还留在系统中. #: u Unpacked软件包被解包,但还未配置. #: f halF-conf试图配置软件包,但是失败了. #: h Half-inst软件包安装,但是但是没有成功. #: w trig-aWait触发器等待 #: t Trig-pend触发器未决 # 第三列标识错误状态,第一种状态标识“(none)”表示没有问题,其它符号则标识相应问题(Err?=(none)/Reinst-required (Status,Err: uppercase=bad)) #: h 软件包被强制保持,因为有其它软件包依赖需求,无法升级. #: r Reinst-required,软件包被破坏,可能需要重新安装才能正常使用(包括删除). #: x 软包件被破坏,并且被强制保持. === dpkg 子命令 === 为了方便用户使用,dpkg不仅提供了大量的参数选项,同时也提供了许多子命令。比如: <syntaxhighlight lang="bash"> dpkg-deb、dpkg-divert、dpkg-query、dpkg-split、dpkg-statoverride、start-stop-daemon </syntaxhighlight> === dpkg 使用 === ==== 安装 ==== 命令: # dpkg -i package-name.deb:安装软件包,必须是deb包的完整名称(软件的安装可被拆分为两个对立的过程“解包”和“配置”); #: dpkg --unpack package-name.deb:解开软件包到系统目录但不配置;(“解包”) #: dpkg --configure package-name.deb:配置软件包;(“配置”) # dpkg -c package-name.deb:列出 deb 包的内容 选项: # -R,--recursive:递归地处理在指定目录中的指向特定目录中所匹配的所有安装包; #: 可以和 -i, -A, --install, --unpack 与--avail一起使用 ==== 移除 ==== # dpkg -r package-name:移除软件包,但保留其配置文件 # dpkg -P package-name:清除软件包的所有文件 ==== 查询 ==== # dpkg -l package-name-pattern:查看系统中软件包名符合pattern模式的软件包 # dpkg -L package-name:查看package-name对应的软件包安装的文件及目录 # dpkg -p package-name:显示包的具体信息 # dpkg -s package-name:查看package-name(已安装)对应的软件包信息 # dpkg -S filename-search-pattern:从已经安装的软件包中查找包含filename的软件包名称 *(也可使用子命令dpkg-query来进行查询操作) == apt == dpkg时,已经解决掉了软件安装过程中的大量问题,但是当依赖关系不满足时,仍然需要手动解决,而apt这个工具解决了这样的问题。 linux distribution 先将软件放置到对应的服务器中,然后分析软件的依赖关系,并且记录下来,然后当客户端有安装软件需求时,通过清单列表与本地的dpkg以存在的软件数据相比较,就能从网络端获取所有需要的具有依赖属性的软件了。 === 原理 === dpkg 采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。然后,将软件仓库置于许许多多的镜像服务器中,并保持基本一致。这样,所有的Ubuntu用户随时都能获得最新版本的安装软件包。因此,对于用户,这些镜像服务器就是他们的软件源。<br/> 然而,由于每位用户所处的网络环境不同,不可能随意地访问各镜像站点。为了能够有选择地访问,在Debian系统中,使用软件源配置文件“/etc/apt/sources.list”列出最合适访问的镜像站点地址。 ==== apt-get update的过程 ==== # 执行“apt-get update” # 程序分析“/etc/apt/sources.list” # 自动连网寻找list中对应的“Packages/Sources/Release”列表文件,如果有更新则下载之,存入“/var/lib/apt/lists/”目录 # 然后“apt-get install”相应的包 ,下载并安装 * “apt-get update”命令会扫描每一个软件源服务器,并为该服务器所具有软件包资源建立索引文件,存放在本地的/var/lib/apt/lists/目录中。 * 使用apt-get执行安装、更新操作时,都将依据这些索引文件,向软件源服务器申请资源。 * 因此,在计算机设备空闲时,经常使用“apt-get update”命令刷新软件源,是一个好的习惯。【?服务器呢?也需要?任务?】 ==== apt-get install的过程 ==== [[File:apt-get install原理图.png|400px]] === apt 相关文件 === {| class="wikitable" ! 命令 !! 说明 |- | var/lib/dpkg/available | 存放系统所有安装过的软件包信息 |- | /etc/apt/sources.list | 记录软件源的地址 (执行“sudo apt-get install xxx”时,系统就去这些站点下载软件包到本地并执行安装) |- | /var/cache/apt/archives | 已经下载到的软件包 (用“apt-get install”安装软件时,软件包的临时存放路径) |- | /var/lib/apt/lists | 使用“apt-get update”命令会从“/etc/apt/sources.list”中下载软件列表,并保存到该目录 |} === 更新源 === apt的源文件由配置文件“/etc/apt/sources.list”指定:<br/> [[File:apt源文件的配置.png|800px]]<br/> * 在“[http://.../Ubantu/dists/trusty/main/binary-all/ http://.../Ubantu/dists/trusty/main/binary-all/]”的“Packages.gz”中,包含所有所依赖的软件及其版本信息、以及下载地址。 源内容分为四部分,分别为(非上图例): <syntaxhighlight lang="properties"> deb ### 镜像地址 ### 版本代号 ### 限定词 deb ### http://mirrors.163.com/debian/ ### wheezy ### main non-free contrib </syntaxhighlight> # deb 表示软件的位置,deb-src 代表软件的源代码的位置; # 镜像地址,其目录结构如下: #: [[File:镜像url的内容.png|800px]] #: /dists/:目录包含“发行版”(distributions); #: /pool/:目录为软件包的物理地址;软件包均放进一个巨大的 “池子(pool)”,按照源码包名称分类存放; #:: 为了方便管理,pool 目录下按属性再分类("main", "contrib" 和 "non-free"),分类下面再按源码包名称的首字母归档; #: /tools/:用于创建启动盘、磁盘分区、压缩/解压文件,启动Linux的DOS下小工具等; #: /doc/:基本的 Debian 文档, 如 FAQ, 错误报告系统指导等; #: /indices/:维护人员文件和重载文件; #: /project/:大部分为开发人员的资源; # 版本号 #: oldstable:以前的稳定发行版 #: stable:现在的稳定发行版 #:: 对于每个debian来说,每个稳定发行版都会有一个代号,如debian 6叫做squeeze,debian 7叫做wheezy #: testing:处于测试阶段的发行版 #: unstable:不稳定版本 # 限定词 #: main:Debian 里最基本及主要且符合自由软件规范的软件 #: contrib:自由软件(相对于non-free) #: non-free:不属于自由软件范畴的软件 === apt使用 === ==== apt-get ==== <pre> apt-get is the command-line tool for handling packages, and may be considered the user's "back-end" to other tools using the APT library. Several "front-end" interfaces exist, such as dselect(?), aptitude(?), synaptic(?) and wajig(?). </pre> apt-get 是一个下载安装软件包的简单命令行接口。最常用的命令是update(更新)和install(安装)。<br/> 用法: <syntaxhighlight lang="bash"> apt-get [选项] 命令 </syntaxhighlight> 选项: # -h:显示帮助信息; # -q:输出到日志,不显示进展; # -qq:不输出信息,错误除外; # -d:仅下载软件包,不执行安装操作; # -P:每一步操作都要求确认; # -s:模拟执行命令,不实际安装; # -y:所有问题都回答“yes”; # -v:显示附加信息; # -u:启动时下载新的软件包列表。 # # -c=?:阅读配置文件?; # -o=?:设置自定的配置选项,如“-o dir::cache=/tmp”; 常用命令: {| class="wikitable" ! 命令 !! 说明 |- | apt-get update | 更新源 (“aptitude update”) |- | apt-get dist-upgrade | 升级系统到相应的发行版(根据 source.list 的配置) (“aptitude dist-upgrade”) |- | apt-get upgrade | 更新所有已经安装的软件包 (“aptitude upgrade”) |- | apt-get install package_name | 安装软件包 (“aptitude install package_name”) # 参数“--reinstall”用于重新安装 # “apt-get install package_name=version”:安装指定版本的软件包 |- | apt-get remove package_name | 卸载一个已安装的软件包(保留配置文件) (“aptitude remove package_name”) |- | apt-get purge package_name | 移除软件包(删除配置信息) (“aptitude purge package_name”) # 或“apt-get --purge remove packagename” |- | apt-get check | 检查是否有损坏的依赖 |- | apt-get autoclean | 清理已删除软件的.deb文件 (“aptitude autoclean”) * 定期清理,可以释放的磁盘空间 |- | apt-get clean | 清理已安装软件的备份(不影响软件使用) (“aptitude clean”) |} ==== apt-cache ==== <pre> apt-cache performs a variety of operations on APT's package cache. apt-cache does not manipulate the state of the system but does provide operations to search and generate interesting output from the package metadata. </pre> apt-cache:用于对apt的包缓存执行各种操作: # “apt-cache depends packagename”:了解使用依赖 # “apt-cache rdepends packagename”:是查看该包被哪些包依赖 # “apt-cache search packagename”:搜索包 #: 【aptitude search packagename】 # “apt-cache show packagename”:获取包的相关信息,如说明、大小、版本等 #: 【aptitude show packagename】 # “apt-cache showpkg packagename”:显示软件包的大致信息
返回至“
Linux包管理:dpkg与apt
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息