跳转至

软件安装进阶

约 1545 个字 81 行代码 5 张图片 预计阅读时间 6 分钟

Info

如需了解从包管理器安装软件的相关知识,请参阅 软件安装基础

如果要自行安装软件

需要自行安装软件的情况

  • 软件方未提供安装包、软件源等
  • 软件方虽提供软件源,但无法访问
  • 现有软件源的软件包版本不符合要求(比如说版本过低)

安装软件的原则

如果官方提供了软件的安装方法,优先参考。

如果软件方有可访问的软件源,则优先选择软件方提供的软件源。

软件源无法访问时,选择镜像源,或直接从软件源的 URL 下载软件包,手动解决依赖问题。

如果能在二进制包和源码包之间选择,则优先选择前者。

如果你要对软件做定制、修改,则选择源码包。

从已编译的压缩包安装

已编译压缩包

  • 软件提供商已经编译了软件。这类包一般会按照平台、架构分别给出相应的二进制文件压缩包。 如 Node.jsNode.js 的下载页面
  • 一些 Java 开发的软件,其二进制包与平台无关,与 JDK 版本有关。 如 Apache JMeterApache JMeter 的下载页面

基本思路

  1. 检查下载下来的文件是否正确
  2. 将压缩包解压至某个目录(如 /usr/local
  3. 为可执行文件赋予 x 权限
  4. 如果要输入命令直接执行
    • /usr/bin/usr/sbin 创建指向软件的可执行文件的符号链接(推荐,具体看情况)
    • 或将软件的二进制文件所在目录添加到 PATH

检查文件正确性

散列值

软件下载页面一般会同时提供校验方式。

如果提供的是 MD5 / SHA1 / SHA256 / SHA512,可以使用以下方式进行校验:

Linux:

1
2
3
4
md5sum 文件
sha1sum 文件
sha256sum 文件
sha512sum 文件

Windows(PowerShell):

1
2
3
4
Get-FileHash 文件 -Algorithm MD5
Get-FileHash 文件 -Algorithm SHA1
Get-FileHash 文件
Get-FileHash 文件 -Algorithm SHA512

GPG

如果提供 GPG 校验,一般会提供一个签名文件:

1
2
3
4
5
6
7
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEz9yiRbEEPPKl+Xhl/+h0BBaL2EcFAmI7glgACgkQ/+h0BBaL
......
bCCO6JUHFjyUpfb3XMupfMlXmAHlrW3edRdXSiXljyXkggK1rsU=
=TgaN
-----END PGP SIGNATURE-----

可以通过如下方式验证:

gpg --verify 签名文件 要校验的文件

一般会报错:

1
2
3
gpg: Signature made Thu 24 Mar 2022 04:26:00 AM CST
gpg:                using RSA key CFDCA245B1043CF2A5F97865FFE87404168BD847
gpg: Can't check signature: No public key

此时需要先通过提供的 RSA Key 导入公钥(需联网):

gpg [--keyserver 如果提供了keyserver,填到这里] --receive-keys 显示的RSAKey

如果在公司内网,可以从 keyserver(如 https://keys.openpgp.org/)下载公钥。

公钥的格式一般如下:

1
2
3
4
5
6
7
8
-----BEGIN PGP PUBLIC KEY BLOCK-----

xsFNBFq+ToQBEADRYvIVtbK6owynD3j3nxwpW2KEk/p+aDvtXmc2SR2dBcZ8sFW2
R5vEsG8d3/D3wgv5pcL3KfNNXQYUnXVbobrFUUWQYc79qIsE3MgiPf5NVOtwKPUR
......
taQpepQlDyUcvSM2nTw4E6/zkzJKG/7J7f1y3Z1efw==
=9GnV
-----END PGP PUBLIC KEY BLOCK-----

然后离线导入公钥:

gpg --import 公钥文件

验证成功的标志为 Good signature:

1
2
3
4
5
6
7
8
ding@ding-server:~$ gpg --verify Python-3.10.4.tgz.asc Python-3.10.4.tgz
gpg: Signature made Thu 24 Mar 2022 04:26:00 AM CST
gpg:                using RSA key CFDCA245B1043CF2A5F97865FFE87404168BD847
gpg: Good signature from "Pablo Galindo Salgado <pablogsal@gmail.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: A035 C8C1 9219 BA82 1ECE  A86B 64E6 28F8 D684 696D
     Subkey fingerprint: CFDC A245 B104 3CF2 A5F9  7865 FFE8 7404 168B D847

ln - 创建链接

ln [选项] 源文件 要创建的链接文件

选项: - -s:符号链接(默认为硬链接) - -f:如链接文件已存在,则删除再创建

软件安装中,创建的一般是符号链接。

符号链接与硬链接

符号链接

相当于 Windows 中的快捷方式。

实质上是一个文件,记录源文件的路径,故会对 inode 和磁盘空间有影响。

如果源文件被删、改名或移动,则链接会失效,在 ls 加上颜色时会显示出来;恢复源文件,链接恢复正常。

硬链接

虽然在 Windows 中也可创建,但在 Windows 中较少用。

如果用 ls 查看,无法区分硬链接和源文件;对 inode 和磁盘空间几乎无影响。

不能跨文件系统,不能链接目录。

从源代码安装

一些软件提供商只提供源码。如 Python 的官方实现 CPython,官方下载只有 Windows 和 macOS 版本提供二进制包,其他的只提供源码包。

CPython 对 Linux 用户只提供源码包
CPython 对 Linux 用户只提供源码包

准备工作

  • 程序的编译器(如 C 语言通常要用到 GCC)
  • 构建工具(如 make
  • 编译时需要的库(文档会提供,编译时出错也会有提示说没有哪个库)
  • 将系统的软件包更新至最新版

一般的安装方式

如果出错,不可进行下一步,建议处理问题后回退。

  1. 检查下载下来的文件是否正确
  2. 解压源码到 /usr/local/src (一般需 root 权限)
  3. 转到源码目录
  4. ./configure:建立 Makefile
  5. make clean:移除目标文件
  6. make:根据 Makefile 中的默认设置进行编译
  7. make install(一般需 root 权限):将编译内容安装到指定目录

管理多版本:update-alternatives

CentOS 中需要 root 权限,Ubuntu 中部分需要。

实质是改变链接的指向,达到版本切换的目的。不仅可以处理文件,也可以处理目录。

也可以用于默认配置切换,如默认编辑器 editor 的关系图如下:

默认编辑器
默认编辑器

查看

查看全部名称当前指向的位置:

update-alternatives --get-selections

1
2
3
4
5
6
7
8
9
arptables                      auto     /usr/sbin/arptables-nft
awk                            auto     /usr/bin/gawk
builtins.7.gz                  auto     /usr/share/man/man7/bash-builtins.7.gz
c++                            auto     /usr/bin/g++
c89                            auto     /usr/bin/c89-gcc
c99                            auto     /usr/bin/c99-gcc
cc                             auto     /usr/bin/gcc
cpp                            auto     /usr/bin/cpp
...
查看单个名称的可选项:
update-alternatives --list editor
1
2
3
4
/bin/ed
/bin/nano
/usr/bin/vim.basic
/usr/bin/vim.tiny

更改

更改可选项(交互):

ding@ding-server:~$ sudo update-alternatives --config editor
There are 4 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path                Priority   Status
------------------------------------------------------------
  0            /bin/nano            40        auto mode
  1            /bin/ed             -100       manual mode
  2            /bin/nano            40        manual mode
* 3            /usr/bin/vim.basic   30        manual mode
  4            /usr/bin/vim.tiny    15        manual mode

Press <enter> to keep the current choice[*], or type selection number: 0
update-alternatives: using /bin/nano to provide /usr/bin/editor (editor) in auto mode

更改可选项(非交互,需要路径在前面的列表中,否则会报错):

sudo update-alternatives --set editor /usr/bin/vim.basic

新增

选定可选文件

以 Python 为例,先看有哪些命令:

1
2
3
4
ding@ding-server:~$  whereis python
python:  /usr/bin/python3.8 /usr/bin/python3.8-config /usr/bin/python2.7 /usr/bin/python2.7-config /usr/bin/python /usr/lib/python3.8 /usr/lib/python2.7 /usr/lib/python3.9 /etc/python3.8 /etc/python2.7 /usr/local/bin/python3.10-config /usr/local/bin/python3.10 /usr/local/lib/python3.8 /usr/local/lib/python2.7 /usr/local/lib/python3.10 /usr/include/python3.8 /usr/include/python2.7 /usr/share/python /opt/workspace/bin/python3.8 /opt/workspace/bin/python
ding@ding-server:~$ whereis pip
pip: /usr/bin/pip /usr/local/bin/pip3.10 /usr/local/bin/pip /usr/local/bin/pip3.8 /opt/workspace/bin/pip /opt/workspace/bin/pip3.8 /usr/share/man/man1/pip.1.gz

至此我们整理相关文件路径如下:

# python

/usr/bin/python3.8
/usr/bin/python2.7
/usr/local/bin/python3.10

# python-config

/usr/bin/python3.8-config
/usr/bin/python2.7-config
/usr/local/bin/python3.10-config

# pip
/usr/local/bin/pip3.10
/usr/local/bin/pip3.8

设计链接

系统一些功能(如 apt)依赖 3.8,故需要默认为 3.8 版本的。

链接关系图
链接关系图

执行命令

基本格式:

sudo update-alternatives --install 链接路径 名称 指向路径 优先级

本例中执行的命令:

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 100
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 50
sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.10 80
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 100
sudo update-alternatives --install /usr/bin/python2 python2 /usr/bin/python2.7 100
sudo update-alternatives --install /usr/bin/python-config python-config /usr/bin/python3-config 100
sudo update-alternatives --install /usr/bin/python-config python-config /usr/bin/python2-config 50
sudo update-alternatives --install /usr/bin/python3-config python3-config /usr/local/bin/python3.10-config 80
sudo update-alternatives --install /usr/bin/python3-config python3-config /usr/bin/python3.8-config 100
sudo update-alternatives --install /usr/bin/python2-config python2-config /usr/bin/python2.7-config 100
sudo rm /usr/bin/pip3   # 先删除原有的 /usr/bin/pip3
sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 100
sudo update-alternatives --install /usr/bin/pip3 pip3 /usr/local/bin/pip3.10 80
sudo update-alternatives --install /usr/bin/pip3 pip3 /usr/local/bin/pip3.8 100

关于 shebang 的更改

需要更改 /usr/local/bin/pip3.8 的 shebang:从

#!/usr/bin/python3

#!/usr/bin/python3.8

其他一些依赖于 Python 3.8 的程序也可以做此修改,之后可以将前面的 *3 指向到 *3.10

安装脚本

现在很多软件方会提供安装软件需要的命令。以下给一些例子。

这些脚本涉及到外网连接,基本上在公司内网不可用,如果真的要使用,需要变通。

Jenkins

1
2
3
4
5
6
7
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee \
  /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update
sudo apt-get install jenkins

实质上是添加、更新软件源,之后从软件源安装软件。

Docker

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

一键安装脚本,具体行为要看脚本。

参考资料