内容纲要

本文为《Linux & Debian》专栏系列


Linux 中常用包管理器、源代码编译等方式进行安装、卸载软件。

包管理器

包管理器的作用是方便软件的安装和卸载,解决软件依赖关系的工具。

常见的包管理器如 Debian 系的发行版使用的 apt(软件包格式为 deb)和 Redhat 系的发行版使用的 dnf / yum(软件包格式为 rpm)

deb / rpm 软件包有点类似于 Windows 上的 exe 软件包,一般一个软件支持 Linux 版就会提供 deb / rpm 这样的软件包,可以在网上或是发行版的安装光盘内找到它。

deb

以 VirtualBox 虚拟机为例,我在官网上找到相对应的软件版本下载

# wget 是一个从网上下载文件的工具
wget https://download.virtualbox.org/virtualbox/6.1.4/virtualbox-6.1_6.1.4-136177~Ubuntu~bionic_amd64.deb

virtualbox-6.1_6.1.4-136177~Ubuntu~bionic_amd64.deb 文件名拆解来看:

  • virtualbox 软件名
  • 6.1_6.1.4-136177 软件版本
  • Ubuntu~bionic Linux 发行版
  • amd64 系统架构
  • deb 软件包管理格式

软件包名也是有所需要注意的地方,如上需要最注意后两位也就是 amd64debamd64 适用于 x86 架构的 64 位系统,也就是不能安装在其他架构比如 ARM 上,而 deb 如前所述目前 Linux 两大派系 Debian(包括 Ubuntu、Mint、Deep 等)和 Redhat (包括 Fedora、CentOS 等)是分别使用 deb 和 rpm 的软件包格式,默认是不包含另一套包管理工具的,也就是说不能把 deb 软件包拿到默认情况下使用 rpm 包管理的发行版上使用,反之亦然。

在确定了软件包获取正确后开始安装软件:

# 使用 dpkg 命令,-i 参数表示 install 安装
dpkg -i virtualbox-6.1_6.1.4-136177~Ubuntu~bionic_amd64.deb

⚠️ 注意:但有时候你可能会遇上依赖问题,如下类似的报错:

dpkg: 依赖关系问题使得 virtualbox-6.1 的配置工作不能继续:
 virtualbox-6.1 依赖于 libcurl4 (>= 7.16.2);然而:
  未安装软件包 libcurl4。
 virtualbox-6.1 依赖于 libqt5core5a (>= 5.9.0~beta);然而:
  未安装软件包 libqt5core5a。
 virtualbox-6.1 依赖于 libqt5gui5 (>= 5.4.0);然而:
  未安装软件包 libqt5gui5。
 virtualbox-6.1 依赖于 libqt5opengl5 (>= 5.0.2);然而:
  未安装软件包 libqt5opengl5。
 virtualbox-6.1 依赖于 libqt5printsupport5 (>= 5.0.2);然而:
  未安装软件包 libqt5printsupport5。
 virtualbox-6.1 依赖于 libqt5widgets5 (>= 5.7.0);然而:
  未安装软件包 libqt5widgets5。
 virtualbox-6.1 依赖于 libqt5x11extras5 (>= 5.6.0);然而:
  未安装软件包 libqt5x11extras5。
 virtualbox-6.1 依赖于 libsdl1.2debian (>= 1.2.11);然而:
  未安装软件包 libsdl1.2debian。
dpkg: 处理软件包 virtualbox-6.1 (--install)时出错:
 依赖关系问题 - 仍未被配置
正在处理用于 systemd (237-3ubuntu10.39) 的触发器 ...
正在处理用于 ureadahead (0.100.0-21) 的触发器 ...
正在处理用于 gnome-menus (3.13.3-11ubuntu1.1) 的触发器 ...
正在处理用于 desktop-file-utils (0.23-1ubuntu3.18.04.2) 的触发器 ...
正在处理用于 mime-support (3.60ubuntu1) 的触发器 ...
正在处理用于 hicolor-icon-theme (0.17-2) 的触发器 ...
正在处理用于 shared-mime-info (1.9-2) 的触发器 ...
在处理时有错误发生:
 virtualbox-6.1

这个时候可以先解决依赖问题后再次安装即可

# 补齐依赖
apt-get install -f

# 再次安装
dpkg -i virtualbox-6.1_6.1.4-136177~Ubuntu~bionic_amd64.deb

可以通过 -l 参数查询是否安装了某个软件

# -l 表示 list
dpkg -l virtualbox
# 或是
dpkg -l | grep virtualbox

可以通过 -r 参数删除指定软件

# -r 表示 remove
dpkg -r virtualbox-6.1
# -P 表示 pure 删除软件及其配置文件
dpkg -P virtualbox-6.1

⚠️ 注意:在输入到 dpkg -r virtualbox 时你可能会不知道具体版本号或更具体的包名,这时可以使用 Tab 按键列出可选项(如果只有一项时会自动使用)来补全结果。

小结

在遇到需要处理安装或卸载多个软件包时,使用空格将每个软件包名隔开即可使用一条命令处理多个软件包。

# 使用 -i 安装指定软件
dpkg -i [软件包名]
# 如果遇上依赖缺失
apt-get install -f

# 使用 -l 查询安装的某个软件包
dpkg -l [软件包名]
# 或是
dpkg -l | grep [软件包名]

# 使用 -r 卸载指定软件
dpkg -r [软件包名]

# 使用 -P 卸载软件及删除其配置文件
dpkg -P [软件包名]

rpm

和 deb 类似,rpm 的具体过程就不赘述了,且和 deb 类似,在处理多个软件包时可以使用空格将每个软件包名隔开即可在一条命令操作。

# 使用 -i 安装指定软件
rpm -i  [软件包名]

# 使用 -q 查询指定软件
rpm -q  [软件包名]

# 使用 -e 卸载指定软件
rpm -e  [软件包名]

apt

但目前软件管理的方式还有些问题,从软件官网、网上搜索或是光盘镜像内获取软件包还是有些繁琐,特别对于服务器系统来说使用网上来路不明的软件包还有安全隐患。

如果可以使用类似软件商店的工具,来完成软件包的查找,从可信的软件服务器上获取安装、更新、卸载及解决依赖等操作是再好不过的,而 apt 等工具就是解决这些问题的。

在这里就不得不提使用这一类工具如 apt 时 apt 所使用的「软件源」也叫做「源服务器」,是 Linux 系统的应用程序安装仓库,仓库里的软件经过了开发人员和软件包维护人员的认可可以放心使用。

一般 Linux 发行版都使用自己的官方源服务器,但网络情况的复杂情况导致速度不理想,这时候就可以使用「镜像源服务器」,所谓镜像就是与官方服务器同步,比如国内的一些大学和互联网公司如阿里云都有开源镜像站,使用知名的开源镜像站是有保障的。

先来看 apt 的使用方法

# 刷新软件源
apt update
# 不安装新软件包的情况下下载和安装更新
apt upgrade # 更新系统中所有可以更新的软件包
apt upgrade firefox # 更新指定的软件包
# 下载并安装更新并安装新的必要软件包(推荐)
apt dist-upgrade

# 可以使用 & 符号将多条命令一起执行
# 刷新软件源并更新需要更新的软件
apt update & apt dist-upgrade

你可能不理解什么是「刷新软件源」,简单来说「刷新软件源」是更新本地对于软件仓库的信息,以此得知软件仓库有什么东西以及对应系统本地的软件有什么可以更新了。

软件查找以及软件信息查看

# 查找某个软件包
apt search bash

# 显示某个软件的信息
apt show bash

# 列出指定(含已安装)的软件包
apt list -a bash
apt list nginx* # 可以使用通配符查找包含该名字的包

软件安装及卸载

# 安装某个软件包
apt install nginx

# 卸载某个软件包
apt remove nginx
# 卸载某个软件包及其配置文件
apt-get purge nginx # 或 apt remove --pure nginx

# 卸载不需要的包
apt autoremove

dnf

和 apt 类似的 dnf 也不赘述了,下面列出一些 dnf 常用操作,另外目前新的 Redhat 系发行版已用 dnf 替换 yum 所以 yum 相关操作略过。

# 检查可以更新的软件包
dnf check-update

# 更新可以升级的软件包
dnf update # 或 dnf upgrade,更新系统中所有可以更新的软件包
dnf update firefox # 更新指定的软件包

# 查找某个软件包
dnf search bash
# 显示某个软件包信息
dnf info bash
# 列出指定已安装的软件包
dnf list bash

# 安装某个软件包
dnf install nginx
# 卸载某个软件包
dnf remove nginx  # 或 dnf erase nginx

# 卸载不需要的包
dnf autoremove

源代码编译

除了使用包管理比较常见的还有直接使用源代码进行编译安装,一般的步骤为:

  1. 使用 wget 下载源代码压缩包
  2. 解压压缩包
  3. 进入目录
  4. 使用 ./configure 生成配置文件 Makefile
  5. 使用 make 根据 Makefile 进行编译
  6. 使用 make install 安装

关于 ./configure 是个安装配置,比如使用 --prefix 可以指定到指定目录,可以使用命令参数 ./configure --help | more 查看支持的其他参数。

以编译安装 iPerf3 为例:

# 下载源代码压缩包
wget https://iperf.fr/download/source/iperf-3.1.3-source.tar.gz

# 解压缩
tar -xaf iperf-3.1.3-source.tar.gz

# 进入目录
cd iperf-3.1.3/

# 配置 Makefile
./configure

# 编译及安装
make && make install

./configuremake 的过程中有可能出现报错,这时候就需要根据报错信息排查解决问题:

如报错 configure: error: no acceptable C compiler found in $PATH,解决方法为安装 C 语言的编译器:

apt install gcc

如报错 -bash: make: command not found,解决方法为安装 make

apt install make make-guile

报错日志很重要,通过报错日志解决问题也是一个良好习惯,如果你不知道报错信息是什么意思就复制它到搜索引擎搜一下吧。

另外,以上只是一些通用步骤,在实际安装不同软件时最好查看软件的官方使用说明,比如开源在 Github 的软件都会有一份 README.md 说明指导使用,一些软件可能还需要一些第三方依赖库,阅读使用说明是一个良好习惯并因此可少走不少弯路。

在编译安装成功后可以使用命令查看软件的版本以此查看是否安装成功:

# -v 等同于 --version 用于查看软件的版本号,大部分软件都有该参数
iperf -v

返回:iperf 3.1.3

能看到版本号则表示安装成功了。

⚠️注意:使用 iPerf3 时可能会运行报错:iperf3: error while loading shared libraries: libiperf.so.0: cannot open shared object file: No such file or directory,此时先运行 sudo /sbin/ldconfig 再运行 iPerf3 即可。

编译安装相比包管理安装是比较麻烦的,后续升级也是一个问题(因此还有安全隐患),个人建议在能用包管理的情况下就别用编译安装了,在软件作者只提供源代码或是源服务器上的包的版本不够新而你需要最新版时再使用编译安装吧。