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权限)。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容