13. Linux 软件包管理

[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 软件包管理

  1. 安装一个 rpm 包:

    rpm -ivh alacarte-0.10.0-1.fc6.noarch.rpm
    
    rpm 安装参数 含义
    -i 安装
    -v 显示 rmp正在执行的工作
    -h 显示安装进度
    --force 强制安装,即使覆盖属于其他包的文件也要安装
    —nodeps 当要安装的 rpm 包依赖其他包时,即使其他包没有安装,也要安装这个包
  2. 升级一个 rpm 包

    rpm -Uvh filename    ## 更新一个软件包
    
  3. 卸载一个 rpm 包

    rmp -e filename
    
    $ sudo rpm -e -vv --test xorg-xll-devel  ## 模拟卸载
    #
    # 因为单纯的卸载可能存在软件包的相互依赖问题
    # --test: 模拟删除软件包的全过程,但并不是真的卸载
    # -VV:    要求 RPM 输出完整的调试信息
    #
    
  4. 查询一个包是否安装

    rpm -q rpm 包名(这里的包名,是不带有平台信息以及后缀名的)
    
  5. 得到一个 rpm 包的相关信息

    rpm -qi 包名(同样不需要加平台信息与后缀名)
    
  6. 列出一个 rpm 包安装的文件

    rpm -ql 包名
    
  7. 列出某一个文件属于哪个 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权限)。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容