什么是软件包管理
可以近似的理解为Windows系统或Android系统中的应用商店.
是Linux中安装(获取)软件的途径.
如果你在阅读文章前学过任意一门编程语言, 那么对这个概念应该不会陌生;
如Python中的pip, Java中的ant、Maven、Gradle, Js的npm, C#的NuGet等, 它们无一例外都做着包管理的工作.
为什么需要软件包管理
在第0章中我们提到过除了文中所使用的Ubuntu系统外, 还有其他Linux发行版.
或许你会有疑问: 他们的区别在哪里呢? 在不同方面又分别具有什么优势呢?
其实, 不同的Linux发行版除了UI界面(是的, Linux也有UI界面)、稳定性、更新频率等区别外, 还有至关重要的一点便是社区活跃度;
随着Linux版本的快速迭代, 不同的发行版迫切需要社区中的开发者为它们提供持续支持. 如果失去了社区支持, Linux中的软件流通性将大打折扣.
而软件包的支持也是社区支持的一部分.
在实际生产中, 一款软件软件很少会"特立独行", 更常见的情况是多个软件互相依赖、环环相扣最终实现一个又一个解决方案;
设想一下, 如果在A发行版上编译运行的软件到了B发行版上却因某一个依赖不支持B发行版而无法运行, 这不仅大大增加了开发者的工作量并且着实令人沮丧.
得益于目前主流发行版活跃的社区, 包括跨发行版在内的问题往往都得到了解决, 社区中受雇与软件开发商的维护者们对症下药, 使软件的跨发行版支持不再是开发者的噩梦.
因此, 选择一个好的发行版可以使你节省很多后期工作量.
Linux的包管理系统
在Linux中, 目前主流的包管理系统分为两大阵营 -- deb(Debian) 和 rpm(RedHat), 采用他们的发行版也有所不同, 如下表:
包管理系统 | 发行版 (部分列表) |
---|---|
Debian (.deb) | Debian, Ubuntu, Xandros, Linspire |
Red Hat (.rpm) | Fedora, CentOS, Red Hat Enterprise Linux, OpenSUSE, Mandriva, PCLinuxOS |
此处我们将使用国内主流的Ubuntu和CentOS进行举例:
Ubuntu | CentOS |
基于Debian | 基于RHEL |
更新频繁 | 除重大发布外基本不更新 |
国外更大活跃的社区与开发人员 | 相对较小的社区 |
网络资料丰富 | 网上可查阅信息较少 |
使用apt-get包管理器安装的.deb包 | 使用yum包管理器安装的.rpm包 |
说人话:
Ubuntu | CentOS |
基于Debian | 基于RHEL |
更活跃 | 更稳定 |
搞开发 | 搞运维 |
资料多 | 资料少 |
安装包是.deb格式 | 安装包是.rpm格式 |
国内用户少 | 国内用户相对多得多 |
软件包管理工具
deb和rpm之间的差异早已不是单纯的打包格式不同, 它们拥有不一样的规范, 是完全独立的两套依赖系统, 虽然它们的格式可以互相转换, 但处理其中的依赖关系仍是非常繁琐的一件事情. 因此deb和rpm这类软件包的底层支持也被称为底层工具.
而有底层工具就有与之相对应的上层工具, 也就是我们所使用的包管理工具, 你也可以把它看做软件包的管理员, 当我们需要查找、安装、卸载、更新软件包时就会用到它, 上层工具基于底层工具进行了封装, 并添加了许多实用的功能, 使包管理工作变得简洁明了且高效;
发行版 | 底层工具 | 上层工具 |
---|---|---|
Ubuntu等基于Debian的发行版 | dpkg(.deb) | apt-get, aptitude |
CentOS等基于Red Hat Enterprise Linux(RHEL)的发行版 | rpm(.rpm) | yum |
从库中查找一个软件包
假设我们需要查找一个软件包, 名为"emacs", 它是Linux中被公认为最受专业程序员喜爱的代码编辑器之一.
如果你是用的是Ubuntu:
apt-get update
apt-cache search emacs
若update命令无法正常执行, 请使用sudo或切换root账户.
如果你使用的是CentOS:
yum search emacs
从库中安装一个软件
从库中安装是如今Linux中主流的软件安装方式之一, 它方便快捷且易于版本管理, 开发者们将各版本的软件发布到资源库以供下载, 依旧拿"emacs"举例:
如果你使用的是Ubuntu:
apt-get update apt-get install emacs
如果你使用的是CentOS:
yum install emacs
从本地安装软件
在资源库还未普及的年代, 人们想要在Linux中安装一个软件往往需要在自己的系统中将软件再编译一遍才能运行(也有可能不需要重新编译, 但仍需要将对的东西放到对的地方, 如Windows中选择安装路径一样.), 同时这也是最原始的Linux软件安装方式.
虽然如今资源库已经相对完善, 但我们仍需清楚如何从本地安装一个软件, 因为如果不巧系统中没有网络或有其他稀奇古怪的问题, 那么我们便不得不从选择从本地安装软件.
从本地安装软件可以直接使用底层工具实现.
在安装软件前, 我们需要通过除库以外的其他途径获取我们需要的软件包;
如果你使用的是Ubuntu(假设我们已经下载好了软件包"emacs-xx.x-x.xxx.deb"并放在了当前目录下):
dpkg --install emacs-xx.x-x.xxx.deb
如果你使用的是CentOS(假设我们已经下载好了软件包"emacs-xx.x-x.xxx.rpm"并放在了当前目录下):
rpm -i emacs-xx.x-x.xxx.rpm
卸载已安装的软件
当我们想要卸载一个已安装的软件时上层工具或底层工具都可以实现.
此处以上层工具为例
如果你使用的是Ubuntu:
apt-get remove emacs
如果你使用的是CentOS:
yum erase emacs
通过库更新软件
在能够正常使用资源库的前提下, 如果我们想更新已安装软件的版本并不需要将其卸载后再安装, 可以直接通过以下命令将所有软件更新至最新版本:
如果你使用的是Ubuntu:
apt-get update
apt-get upgrade
如果你使用的是CentOS:
yum update
通过库安装指定版本的软件
有时候最新版本的软件未必使我们所需要的, 这时我们可以通过资源库很方便的获取并安装软件的历史版本.
首先我们需要获取我们所需软件在仓库中有哪些版本, 其次在安装时指定完整的版本号:
如果你使用的是Ubuntu:
apt-cache madison emacs
apt-get install emacs=26.3+1-1ubuntu2
如果你使用的是CentOS:
yum list | grep emacs yum install emacs-26.3-7.fc7-i386
从本地更新或安装特定版本的软件
并不是所有时候我们都能通过上层工具顺利的从库中获得我们所需的版本, 因此我们还需要掌握如何通过底层工具更新或安装特定版本的软件.
假设我们已安装emacs, 此时我们下载了一个另外版本的软件包并放在目录下:
如果你使用的是Ubuntu, 这将与从本地安装软件没有区别, dpkg会将已安装内容覆盖(假设包为emacs-xx.x-x.xxx.deb):
dpkg --install emacs-xx.x-x.xxx.deb
如果你使用的是CentOS(假设包为emacs-xx.x-x.xxx.rpm):
yum -U emacs-xx.x-x.xxx.rpm
查看所有已安装的软件
如果你使用的是Ubuntu:
dpkg --list
如果你使用的是CentOS:
rpm -qa
查看是否已安装了同名的软件
假设我们需要查询的软件名为"emacs"
如果你使用的是Ubuntu:
dpkg --status emacs
如果你使用的是CentOS:
rpm -q emacs
查看已安装软件的详细信息
有时我们需要了解我们系统中某个已安装的软件是什么版本、源于哪里、何时安装可以使用下述命令.
假设我们已安装"emacs"并且现在想要查询它的详细信息.
如果你使用的是Ubuntu:
apt-cache show emacs
如果你使用的是CentOS:
yum info emacs
查询某个文件所属的软件包
随着安装的软件越来越多, 在/usr/bin目录下有可能出现一些我们并不清楚属于什么软件的文件, 此时我们的底层工具可以为我们查询到它属于哪一个软件包.
假设我们的/usr/bin目录下有一文件"tencen_tt", 我们想要查询他所属的软件包;
如果你使用的是Ubuntu:
dpkg --search /usr/bin/tencent_tt
如果你使用的是CentOS:
rpm -qf /usr/bin/tencent_tt
这时, 终端中的信息就会告诉我们是哪一个软件包安装或使用时产生了该文件.