编译与安装软件¶
软件安装¶
使用包管系统安装¶
软件包管理器是一系列工具的集合,他自动化地完成软件的安装、更新、配置和移除功能。
在 Linux 下,相比起使用应用商店安装软件,包管理系统的使用要更加广泛,许多软件均可以通过一行命令完成其安装,优雅而快速。
软件包管理器一个十分重要的部分是软件仓库。软件仓库是收藏了互联网上可用软件包(应用程序)的图书馆,里面往往包含了数万个可供下载和安装的可用软件包。1
有了软件仓库这个部分,使得我们不需要手动下载大量的软件包到本地再通过包管理器进行安装。通过软件仓库的方法,我们只需要知道软件再软件仓库中的包名,即可让包管理器从网络中抓取到相应的软件包到本地,自动地进行安装。
但是相比起使用应用商店的方法,使用这个软件仓库的方法需要预先知道所要的软件在软件仓库中的具体包名,没有应用商店帮助模糊搜索的功能。
包管理系统有很多,比如管理 deb
软件包的 dpkg
以及它的前端 apt
(使用于 Debian
系的系统);rpm
包管理器以及它的前端 dnf
(用于 Fedora
)、前端 yum
(用于 RedHat 系)等等。
为了方便讲述,本章下文中我们都将以 apt 作为典型实例进行讲解。
apt 的全称是 Advance Package Tool,是一个处理在 Debian、Ubuntu 或者其他衍生发行版的 Linux 上安装和移除软件的自由软件。
apt 可以自动下载、配置和安装二进制或者源代码格式的软件包,简化了在这些发行版上管理软件的流程。因此,它常常用来安装软件、处理软件包之间的依赖关系、升级软件包乃至可以升级发行版,自动处理升级发行版所需的依赖关系等等。
此外,由于可以自定义软件源,因此自由地添加第三方源可以达到安装官方软件源中没有的软件或者安装特定版本的目的。
搜索¶
在安装前,使用 apt search
命令搜索软件仓库,查看对应的包名是否在软件仓库中。使用方法:apt search 搜索内容
。
下面是 apt search firefox
搜索火狐浏览器的输出结果示例,由于输出结果过多,去除了无用的其他软件包:
$ apt search firefox
Sorting... Done
Full Text Search... Done
(Output omitted)
firefox/bionic-updates,bionic-security,now 72.0.2+build1-0ubuntu0.18.04.1 amd64
Safe and easy web browser from Mozilla
(Output omitted)
中间两行每个字段的含义:
样例中的字段 | 含义 |
---|---|
firefox |
即为在软件仓库中的包名 |
bionic-updates,bionic-security,now |
为包含这个软件包的仓库源 |
72.0.2+build1-0ubuntu0.18.04.1 |
为软件包的版本 |
amd64 |
软件包的架构;还可能为i386 、all 等 |
Safe and easy web browser from Mozilla |
在软件仓库中对这个软件包的描述 |
安装¶
在确定了软件包的包名后,可以通过 apt install 包名
进行安装。
下面是 apt install firefox
安装火狐浏览器的输出结果示例。
# apt install firefox
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
adwaita-icon-theme at-spi2-core dconf-gsettings-backend dconf-service fontconfig
(Output omitted)
Suggested packages:
fonts-lyx libasound2-plugins alsa-utils libcanberra-gtk0 libcanberra-pulse colord cups-common
gvfs liblcms2-utils librsvg2-bin
The following NEW packages will be installed:
adwaita-icon-theme at-spi2-core dconf-gsettings-backend dconf-service firefox fontconfig
(Output omitted)
0 upgraded, 87 newly installed, 0 to remove and 1 not upgraded.
Need to get 64.5 MB of archives.
After this operation, 264 MB of additional disk space will be used.
Do you want to continue? [Y/n]
在运行结果中,会给出将会安装的软件包、下载大小以及安装后占用的大小。输入 Y
后回车确定进行安装。
可能会出现的权限问题
在一般情况下,如果直接运行 apt install
命令,会输出
$ apt install firefox
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
这是由于当前用户的权限无法满足安装软件所需的权限。修正方法:在命令前面添加 sudo
。
即使用 sudo apt install firefox
。
在输入之后,终端显示:
[sudo] password for ubuntu:
这里提示的是需要用户输入密码,以提升权限来执行命令。
当然,在用户输入密码的过程中,为了安全,终端是不会进行密码的回显的,即终端不会将用户的输入内容打印在屏幕上。
因此当你发现自己输入了很多内容也没有什么反应的时候,不用惊慌,只需要像平常一样输入正确的密码、回车,即可完成密码的正确性的鉴定。
如果密码输入正确,那么就可以正常地执行命令。
否则,则需要再次尝试:
Sorry, try again.
[sudo] password for ubuntu:
官方软件源镜像¶
通过 apt 安装的软件都来源于相对应的软件源,每个 Linux 发行版一般都带有官方的软件源,在官方的软件源中已经包含了相当数量的软件,apt 的软件源列表在 /etc/apt/sources.list
下。
查看本地的软件源列表
$ cat /etc/apt/sources.list | grep -v "#"
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic universe
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates universe
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ bionic-security main restricted
deb http://security.ubuntu.com/ubuntu/ bionic-security universe
deb http://security.ubuntu.com/ubuntu/ bionic-security multiverse
每一个条目都遵循如下的格式:
deb http://site.example.com/ubuntu/ distribution component1 component2 component3
deb-src http://site.example.com/ubuntu/ distribution component1 component2 component3
分别是 Archive type、Repository URL、Distribution 和 Component。
在 Ubuntu 下,Component 可以为如下几个1:
类型 | 含义 |
---|---|
Main | 包含自由软件的软件包 |
Restricted | 包含通常使用的软件,由 Ubuntu 团队支持,但不是完全的自由软件许可授权 |
Universe | 包含了数千个不由 Canonical 官方支持的软件包。授权于各种自由软件许可协议,来自各种公共来源。 |
Multiverse | 包含非自由软件的软件包 |
具体的含义见 Source List
官方源由于在国外,往往会有速度与延迟上的限制,通常可以通过修改官方源为其镜像实现更快的下载速度。
镜像缓存了官方源中的软件列表,与官方源基本一致。
修改官方源为镜像,加快更新速度
本例以修改官方源为 USTC Mirror 为例2。注意:在操作前请做好备份。
一般情况下,/etc/apt/sources.list
下的官方源地址为 http://archive.ubuntu.com/
,我们只需要将其替换为 http://mirrors.ustc.edu.cn
即可。
如果你在安装时选择的语言不是英语,默认的源地址通常不是 http://archive.ubuntu.com/
, 而是 http://<country-code>.archive.ubuntu.com/ubuntu/
,如 http://cn.archive.ubuntu.com/ubuntu/
, 此时只需将上面的命令进行相应的替换即可,即 sudo sed -i 's/cn.archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
。
可以使用如下命令:
sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
当然也可以直接使用 vim、nano 等文本编辑器进行修改。
第三方软件源¶
有时候,由于种种原因,官方软件源中并没有提供我们需要的软件,但是软件提供商可以提供自己的软件源,在将第三方软件源添加到 /etc/apt/sources.list
中之后,就可以从第三方的服务器上获取到新的软件列表,这时候,我们就可以通过 apt install package-name
安装我们需要的软件。
通过添加 Docker 软件源安装 Docker
Docker 是一个十分流行的容器实现,常见于开发、交付、运行应用,极大地简化了部署应用的流程。关于 Docker 将在本书第八章进行专门的介绍。
在各大软件源中已经提供了 Docker,在 Ubuntu/Debian 下的包名为 docker.io
。
Docker 官方也提供了自己的软件源,包名为 docker-ce
,它的版本会稍微更新一些。我们可以通过添加 Docker 的软件源到 /etc/apt/sources.list
中来进行安装。以下安装流程按照 Docker 官方文档展开。
-
安装需要的的软件包
$ sudo apt-get update $ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common
-
添加 Docker 软件源的 GPG Key
这一步,是为了将 Docker 软件源添加到信任的软件源中,与服务器进行通信、下载文件时,可以建立更加安全的连接。
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
-
添加 Docker 软件源到
/etc/apt/sources.list
中在这里,我么通过
add-apt-repository
作为代理,帮助我们编辑系统中的软件源列表。# 此为 Ubuntu amd64 的命令 $ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
当然直接编辑
/etc/apt/sources.list
文件也是可以的。对于 Ubuntu 18.04 amd64,在/etc/apt/sources.list
最后添加:deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable
-
使用 apt 安装 Docker
首先需要从第三方源更新软件列表。
apt update
之后便是直接安装 docker-ce。
apt install docker-ce
-
检查安装情况并确认启动
Docker 是作为一个服务运行在系统的后台的,要查看 Docker 是否安装完成并确定 Docker 已经启动,可以通过如下方式:
systemctl status docker
如果 Docker 已经在后台启动了,则会输出与下面相似的内容:
● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2020-04-10 20:55:27 CST; 18h ago Docs: https://docs.docker.com Main PID: 1115 (dockerd) Tasks: 18 CGroup: /system.slice/docker.service └─1115 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
如果没有启动,则会输出类似于这样的结果:
● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: inactive (dead) since Sat 2020-04-11 15:43:02 CST; 4s ago Docs: https://docs.docker.com Process: 1115 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=0/ Main PID: 1115 (code=exited, status=0/SUCCESS)
这时候,我们可以通过
systemctl
以启动 Docker:systemctl start docker
再次检查 Docker 运行情况,即应该可以得到期望的结果。
更新软件列表与更新软件¶
在计算机本地,系统会维护一个包列表,在这个列表里面,包含了软件信息以及软件包的依赖关系,在执行 apt install
命令时,会从这个列表中读取出想要安装的软件信息,包括下载地址、软件版本、依赖的包,同时 apt 会对依赖的包递归执行如上操作,直到不再有新的依赖包。如上得到的所有包,将会是在 apt install some-package
时安装的。
更新软件列表¶
为了将这个列表进行更新,就会用到 apt update
命令。获取到新的软件版本、软件依赖关系。
在 apt 的配置中,有许多的软件源,每一个软件源都会提供一定数量的包列表。通过增添软件源,即可实现通过 apt 安装官方源中并不提供的软件或版本。
apt update 输出样例
$ sudo apt update
[sudo] password for ubuntu:
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:2 https://cli-assets.heroku.com/apt ./ InRelease [2533 B]
Get:5 http://mirrors.ustc.edu.cn/ubuntu bionic-updates InRelease [88.7 kB]
Get:6 http://mirrors.ustc.edu.cn/ubuntu bionic-backports InRelease [74.6 kB]
Get:7 http://mirrors.ustc.edu.cn/ubuntu bionic-updates/main amd64 Packages [853 kB]
Get:8 http://mirrors.ustc.edu.cn/ubuntu bionic-updates/main Translation-en [298 kB]
(Output ommitted)
Reading package lists... Done
Building dependency tree
Reading state information... Done
158 packages can be upgraded. Run 'apt list --upgradable' to see them.
每一行对应获取一个软件源。
在最后,158 packages can be upgraded
表示了可以被更新的软件包的数量。
更新软件¶
在获取到了新的软件列表后,可以进行软件更新,这时候使用的是 apt upgrade
命令。
apt upgrade
会根据软件列表中的版本信息与当前安装的版本进行对比,解决新的依赖关系,完成升级。
apt upgrade 输出样例
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
apport dmidecode landscape-common libnss-systemd libpam-systemd libsystemd0 libudev1
python3-apport python3-problem-report sosreport systemd systemd-sysv udev unattended-upgrades
14 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 5062 kB of archives.
After this operation, 236 kB of additional disk space will be used.
Do you want to continue? [Y/n]
在里面,会提到将会升级的包、需要下载的大小以及升级这些包需要消耗的磁盘空间。
安装预编译可执行文件¶
对于用户数量较多的发行版,软件提供商还可能提供预编译好的二进制文件,可以直接运行。对于没有在软件仓库中提供的软件,免去了从源码编译安装的麻烦。
安装预编译的 bat
下面我们以 bat 为例作介绍。bat 可以看作是一个增强版的 cat,支持语法高亮等实用功能。
# 下载二进制的压缩文件存档
wget https://github.com/sharkdp/bat/releases/download/v0.18.0/bat-v0.18.0-x86_64-unknown-linux-musl.tar.gz
# 将下载得到的压缩文件解压到当前目录
tar xf bat-v0.18.0-x86_64-unknown-linux-musl.tar.gz
cd bat-v0.18.0-x86_64-unknown-linux-musl
在进入解压得到的目录后,可以查看当前的目录下有什么内容:
$ ls
autocomplete bat bat.1 CHANGELOG.md LICENSE-APACHE LICENSE-MIT README.md
bat
就是可以直接运行进行编译源代码的可执行文件。
当然,我们希望能够像 apt
那样在任何地方都可以直接运行,不用输入这么长的路径
我们可以这样做:
sudo cp bat /usr/local/bin
为什么是 /usr/local
呢?因为这个目录下的 bin
目录是处在 PATH 环境变量下的。当我们在终端输入命令时,终端会判断是否为终端的内置命令,如果不是,则会在 $PATH 环境变量中包含的目录下进行查找。因此,只要我们将一个可执行文件放入了 $PATH 中的目录下面,我们就可以像 apt
一样,在任意地方调用我们的程序。
通过这个命令可以看到当前的 PATH 环境变量有哪些目录。
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
使用源代码编译安装¶
下面以 cURL
为例介绍编译安装的方法。
# 下载源代码的压缩文件存档
wget https://dl.cra.moe/download/Others/curl-7.76.1.tar.xz
# 将下载得到的压缩文件解压到当前目录
tar xf curl-7.76.1.tar.xz
cd curl-7.76.1
cURL 支持两种构建工具—— configure 脚本和 CMake。
使用 configure 脚本
# 配置
./configure
# (并行)编译
make -j
# 安装
sudo make install
使用 CMake
# 创建并进入编译产物目录
mkdir build
cd build
sudo apt install cmake libssl-dev
# 配置
cmake ..
# (并行)编译
make -j
# 安装
sudo make install