dpkg和apt
文章目录
Ubuntu软件安装
Linux有很多种发行版本,各种发行版本之间安装软件方式和命令不一样,同一个版本之间安装软件也有不同的方法。但是,大体来说,Linux有两大派系,一个是红帽派系,包含Redhat、Centos、Fedora等。还有一个是Debian派系,包含Kali、Ubuntu等。
这里主要介绍Debian派系的软件安装方式
Deb包安装
Deb包简介
Deb是Debian软件包格式的文件扩展名,Debian包是Unixar的标准归档,将包文件信息以及包内容,经过gzip和tar打包而成。处理这些包的经典程序是dpkg,经常是通过Debian的apt-get来运作。deb 格式是 Debian 系统(包含 Debian 和 Ubuntu )专属安装包格式,配合 APT 软件管理系统,成为了当前在 Linux 下非常流行的一种安装包。
dpkg常用命令
“dpkg ”是“Debian Packager ”的简写。为 “Debian” 专门开发的套件管理系统,方便软件的安装、更新及移除。
dpkg指令用法:
-
安装相关命令
dpkg -i <package-name.deb>
#–install, 安装软件包,必须是deb包的完整名称。(软件的安装可被拆分为两个对立的过程“解包”和“配置”)dpkg --unpack <package-name.deb>
# “解包”:解开软件包到系统目录但不配置,如果和-R一起使用,参数可以是一个目录dpkg --configure <package-name.deb>
#“配置”:配置软件包dpkg -c <package-name.deb>
#列出 deb 包的内容 -
移除安装包
dpkg -r <package-name>
# --remove, 移除软件包,但保留其配置文件dpkg -P <package-name>
# --purge, 清除软件包的所有文件(removes everything, including conffiles) -
查询
dpkg -l <package-name-pattern>
# --list, 查看系统中软件包名符合pattern模式的软件包(即显示已安装软件包列表)dpkg -L <package-name>
# --listfiles, 查看package-name对应的软件包安装的文件及目录(即显示与软件包关联的文件)dpkg -p <package-name>
# --print-avail, 显示包的具体信息dpkg -s <package-name>
# --status, 查看package-name(已安装)对应的软件包信息dpkg -S <filename-search-pattern>
# --search, 从已经安装的软件包中查找包含filename的软件包名称
apt-get源安装
apt-get简介
Advanced Packaging Tool(apt)是Linux下的一款安装包管理工具,是一个客户/服务器系统。
虽然我们在使用dpkg时,已经解决掉了 软件安装过程中的大量问题,但是当依赖关系不满足时,仍然需要手动解决,而apt这个工具解决了这样的问题,linux distribution 先将软件放置到对应的服务器中,然后分析软件的依赖关系,并且记录下来,然后当客户端有安装软件需求时,通过清单列表与本地的dpkg以存在的软件数据相比较,就能从网络端获取所有需要的具有依赖属性的软件了。
通常 apt-get 都和网上的压缩包一起出没,从互联网上下载或是安装。全世界有超过200个Debian官方镜像,还有繁多的非官方软件包提供网站。你所使用的基于Debian的发布版不同,你所使用的软件仓库可能需要手工选择或是可以自动设置。你能从Debian官方网站得到完整的镜像列表。而很多非官方网站提供各种特殊用途的非官方软件包,当然,使用非官方软件包会有更多风险了。
软件包都是为某一个基本的Debian发布版所准备的(从unstable到stable),并且划分到不同类别中(如 main contrib nonfree),这个是依据 Debian 自由软件纲领而划分的(也就是常说的dfsg),因为美国限制加密软件出口,还有一个non-us类别。
apt工作原理
Ubuntu采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。然后,将软件仓库置于许许多多的镜像服务器中,并保持基本一致。这样,所有的Ubuntu用户随时都能获得最新版本的安装软件包。因此,对于用户,这些镜像服务器就是他们的软件源(Reposity)。
然而,由于每位用户所处的网络环境不同,不可能随意地访问各镜像站点。为了能够有选择地访问,在Ubuntu系统中,使用软件源配置文件/etc/apt/sources.list列出最合适访问的镜像站点地址。
例1:apt-get的更新过程:
1)执行apt-get update
2)程序分析/etc/apt/sources.list
3)自动连网寻找list中对应的Packages/Sources/Release列表文件,如果有更新则下载之,存入/var/lib/apt/lists/目录
4)然后 apt-get install 相应的包 ,下载并安装。
即使这样,软件源配置文件只是告知Ubuntu系统可以访问的镜像站点地址,但那些镜像站点具体都拥有什么软件资源并不清楚。若每安装一个软件包,就在服务器上寻找一遍,效率是很低的。因而,就有必要为这些软件资源列个清单(建立索引文件),以便本地主机查询。
用户可以使用“apt-get update”命令刷新软件源,建立更新软件包列表。在Ubuntu Linux中,“apt-get update”命令会扫描每一个软件源服务器,并为该服务器所具有软件包资源建立索引文件,存放在本地的/var/lib/apt/lists/目录中。 使用apt-get执行安装、更新操作时,都将依据这些索引文件,向软件源服务器申请资源。因此,在计算机设备空闲时,经常使用“apt-get update”命令刷新软件源,是一个好的习惯。
例2:apt-get install原理图
apt相关文件
var/lib/dpkg/available
文件的内容是软件包的描述信息, 该软件包括当前系统所使用的Debian 安装源中的所有软件包,其中包括当前系统中已安装的和未安装的软件包.
/etc/apt/sources.list
记录软件源的地址(当你执行 sudo apt-get install xxx 时,Ubuntu 就去这些站点下载软件包到本地并执行安装)
/var/cache/apt/archives
已经下载到的软件包都放在这里(用 apt-get install 安装软件时,软件包的临时存放路径)
/var/lib/apt/lists
使用apt-get update命令会从/etc/apt/sources.list中下载软件列表,并保存到该目录
常用的apt命令参数
apt-get
apt-get 是一个下载安装软件包的简单命令行接口。最常用的命令是update(更新)和install(安装)。
用法:apt-get [选项] 命令
常用选项:
-h 本帮助文件。
-q 输出到日志 - 无进展指示
-qq 不输出信息,错误除外
-d 仅下载 - 不安装或解压归档文件
-s 不实际安装。模拟执行命令
-y 假定对所有的询问选是,不提示
-f 尝试修正系统依赖损坏处
-m 如果归档无法定位,尝试继续
-u 同时显示更新软件包的列表
-b 获取源码包后编译
-V 显示详细的版本号
-c=? 阅读此配置文件
-o=? 设置自定的配置选项,如 -o dir::cache=/tmp
常用命令:sudo apt-get install <package-name>
安装软件sudo apt-get install <package-name> -- reinstall
重新安装包sudo apt-get -f install
修复安装"-f = --fix-missing"sudo apt-get remove <package-name>
卸载软件sudo apt-get remove <package-name>
删除包,包括删除配置文件等sudo apt-get update
更新源sudo apt-get upgrade
更新所有已经安装的软件包sudo apt-get dist-upgrade
升级系统sudo apt-get dselect-upgrade
使用 dselect 升级sudo apt-get build-dep package
安装相关的编译环境apt-get source package
下载该包的源代码sudo apt-get clean && sudo apt-get autoclean
清理无用的包sudo apt-get check
检查是否有损坏的依赖
apt-cache
apt-cache depends package
了解使用依赖apt-cache rdepends package
查看该包被哪些包依赖apt-cache search <package-name>
搜索包apt-cache show <package-name>
获取包的相关信息,如说明、大小、版本等apt-cache showpkg <package-name>
显示软件包的大致信息
dpkg和apt-get的区别
- dpkg绕过apt-get包管理数据库直接对软件包进行操作
所以用dpkg安装过的软件包可以用apt-get可以再安装一遍,系统不知道之前已经安装过了,将会覆盖之前dpkg的安装。 - dpkg: 用来安装.deb文件时,不会解决模块的依赖关系,且不会关心ubuntu的软件仓库内的软件,可以用于安装本地的deb文件。
- apt-get: 会解决和安装模块的依赖问题,并会咨询软件仓库,但不会安装本地的deb文件,apt-get是建立在dpkg之上的软件管理工具。
参考资料:
Linux系统中安装软件的几种方式
dpkg和apt-get区别
Linux软件安装管理之——dpkg与apt-*详解