[TOC]
软件包管理
- 软件包管理是指系统中一种安装和维护软件的方法。
- Linux 系统中几乎所有的软件都可以在互联网上找到。
- 不同的 Linux 发行版使用不同的打包系统,一般而言,大多数发行版分别属于两大包管理技术阵营:
包管理系统 | 发行版(部分列表) |
---|---|
Debian Style (.deb) | Debian, Ubuntu, Xandros, Linspire |
Red Hat Style (.rpm) | Fedora, CentOS, Red Hat Enterprise Linux, OpenSUSE, Mandriva, PCLinuxOS |
包文件
在包管理系统中,软件的基本单元是包文件。包文件是一个构成软件包的文件压缩集合。
资源库
- 大多数软件包是由发行商和感兴趣的第三方创建的。系统发行版的用户可以在一个中心资源库中得到这些软件包。
- 因软件开发生命周期不同阶段的需要,一个系统发行版可能维护着几个不同的资源库。
- 一个系统发行版可能也会拥有相关第三方的资源库。
依赖性
现代的软件包管理系统都提供了一些依赖项解析方法,以此来确保当安装软件包时,也安装了其所有的依赖程序。
上层和底层软件包工具
软件包管理系统通常由两种工具类型组成:
- 底层工具用来处理这些任务,比方说安装和删除软件包文件;
- 上层工具,完成元数据搜索和依赖解析;
包管理工具
发行版 | 底层工具 | 上层工具 |
---|---|---|
Debian-Style | dpkg | apt-get, aptitude |
Fedora, Red Hat Enterprise Linux, CentOS | rmp | yum |
查找资源库中的软件包
使用上层工具来搜索资源库元数据,可以根据软件包的名字和说明来定位它。
风格 | 命令 |
---|---|
Debian | apt-get update; apt-cache search search_string |
Red Hat | yum search search_string |
示例:
从资源中安装一个软件包
上层工具允许从一个资源库中下载一个软件包,并经过完全依赖解析来安装它。
风格 | 命令 |
---|---|
Debian | apt-get update; apt-get install package_name |
Red Hat | yum install package_name |
示例:
通过软件包文件来安装软件
如果从某处而不是从资源库中下载了一个软件包文件,可以使用底层工具来直接(没有经过依赖解析)安装它。
风格 | 命令 |
---|---|
Debian | dpkg --install package_file |
Red Hat | rpm -i package_file |
卸载软件
风格 | 命令 |
---|---|
Debian | apt-get remove package_name |
Red Hat | yum erase package_name |
经过资源库来更新软件包
最常见的软件包管理任务是保持系统中的软件包都是最新的。上层工具仅需一步就能完成这个至关重要的任务。
风格 | 命令 |
---|---|
Debian | apt-get update; apt-get upgrade |
Red Hat | yum erase package_name |
经过软件包文件来升级软件
风格 | 命令 |
---|---|
Debian | dpkg --install package_file |
Red Hat | rpm -U package_file |
列出所安装的软件包
风格 | 命令 |
---|---|
Debian | dpkg --list |
Red Hat | rpm -qa |
确定是否安装了一个软件包
风格 | 命令 |
---|---|
Debian | dpkg --status package_name |
Red Hat | rpm -q package_name |
显示所安装的软件包的信息
如果知道了所安装软件包的名字,使用以下命令可以显示这个软件包的说明信息:
风格 | 命令 |
---|---|
Debian | dpkg --status package_name |
Red Hat | rpm -q package_name |
查找安装了某个文件的软件包
确定哪个软件包对所安装的某个特殊文件负责,使用下表中的命令:
风格 | 命令 |
---|---|
Debian | dpkg --search file_name |
Red Hat | rpm -qf file_name |
例如:在 Red Hat 系统中,查看哪个软件包安装了 / usr/bin/vim 这个文件:
$ rpm -qf /usr/bin/vim
DEB 软件包管理
- DEB 软件包管工具主要用于 Debain 和 Ubuntu 版本。
- DEB 格式的软件包通常以 .deb 结尾。
$ dpkg --help ## 帮助文档
$ sudo dpkg --install xxx ## 安装软件包
$ sudo dpkg --remove xxx ## 卸载软件包
RPM 软件包管理
-
安装一个 rpm 包:
rpm -ivh alacarte-0.10.0-1.fc6.noarch.rpm
rpm 安装参数 含义 -i 安装 -v 显示 rmp正在执行的工作 -h 显示安装进度 --force 强制安装,即使覆盖属于其他包的文件也要安装 —nodeps 当要安装的 rpm 包依赖其他包时,即使其他包没有安装,也要安装这个包 -
升级一个 rpm 包
rpm -Uvh filename ## 更新一个软件包
-
卸载一个 rpm 包
rmp -e filename $ sudo rpm -e -vv --test xorg-xll-devel ## 模拟卸载 # # 因为单纯的卸载可能存在软件包的相互依赖问题 # --test: 模拟删除软件包的全过程,但并不是真的卸载 # -VV: 要求 RPM 输出完整的调试信息 #
-
查询一个包是否安装
rpm -q rpm 包名(这里的包名,是不带有平台信息以及后缀名的)
-
得到一个 rpm 包的相关信息
rpm -qi 包名(同样不需要加平台信息与后缀名)
-
列出一个 rpm 包安装的文件
rpm -ql 包名
-
列出某一个文件属于哪个 rpm 包
rpm -qf 文件的绝对路径
APT 软件包管理工具
⭐️⭐️⭐️
高级软件包工具(Advanced Package Tool,APT):自动检测软件依赖问题、自动下载和安装所有文件、自动更新整个系统上所有的软件包。
-
apt-get
: 执行和软件包安装有关的所有操作; -
apt-cahce
: 查找软件包相关信息; - 安装源:所有 apt-get 用于下载软件的地址,目录:/ect/apt/source.list
从 Internet 更新当前系统软件包的信息:
sudo apt-get update # 检查当前 apt-get 缓存中的软件包信息(只检查,不更新)
sudo apt-get -y upgrade # 更新已安装的软件包
sudo apt-get dist-upgrade # Installs updates (new ones)
apt-get 软件包升级命令
update
- 从服务器更新可用的软件包列表。upgrade
- 根据列表,更新已安装的软件包。upgrade 不会删除在列表中已经没有的软件包,也不会安装有依赖需求但尚未安装的软件包。full-upgrade
- 根据列表,更新已安装的软件包。full-upgrade
可能会为了解决软件包冲突而删除一些已安装的软件包。dist-upgrade
- 根据列表,更新已安装的软件包。dist-upgrade
可能会为了解决软件包冲突而删除一些已安装的软件包,也可能会为了解决软件包依赖问题安装新的软件包。
apt-get 常用命令
命令 | 描述 |
---|---|
apt-get install | 下载并安装软件包 |
apt-get upgrade | 下载并安装在本系统上已有的软件包的最新版本 |
apt-get remove | 卸载特定的软件包 |
apt-get source | 下载特定的软件源代码 |
apt-get clean | 删除所有已下载的包文件 |
apt-get -h | 列出 apt-get 的完整用法 |
安全升级 apt/apt-get
# 关闭 HTTP 重定向功能进行安全升级
$ sudo apt update -o Acquire::http::AllowRedirect=false
$ sudo apt upgrade -o Acquire::http::AllowRedirect=false
参考:20190123 - Linux 包管理器 apt/apt-get 发现远程代码执行漏洞
示例:安装 node.js
# 安装 node.js v8.11.2
$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
$ sudo apt-get install -y nodejs
# 要从 npm 编译和安装原生插件,您可能还需要安装构建工具
$ sudo apt-get install -y build-essential
# 检查当前版本
$ nodejs -v
v8.11.2
$ npm -v
5.6.0
# 更新 npm
$ npm i -g npm
$ sudo apt-get upgrade nodejs ## 更新
$ sudo apt-get remove nodejs ## 卸载
nodejs 安装在系统环境 /usr/bin
目录下,之后使用 npm -g
安装其他插件也会安装到 /usr/lib/node_modules
(需要使用sudo权限)。