Linux服务器离线编译安装Python及配置本地yum源教程

半杯拿铁
半杯拿铁
发布时间:2026-11-07 | 8人浏览过
原创

针对无外网连接的Linux生产服务器,系统讲解如何利用系统安装镜像配置本地yum源解决GCC等基础编译依赖,并完整演示Python源码离线编译、安装与环境验证的实用操作教程。

在企业生产网、专有云或金融等安全敏感区域中,Linux 服务器通常与公网完全物理隔离。在没有外网访问权限的环境下,直接运行 yum install 或下载预编译二进制包往往行不通,而直接编译 Python 源码又会因为缺少 GCC、Make 以及各类底层开发库而频繁中断。本文的核心任务就是利用该系统原本的 ISO 安装镜像构建一个本地 yum 源,借此补齐编译所需的 C/C++ 工具链与依赖头文件,随后通过纯离线方式完成 Python 的源码编译、安装及多版本共存配置。

一、整体实施逻辑与架构关系

在离线环境下解决“缺少编译工具”的问题,最规范且零成本的做法是利用操作系统自身的安装镜像文件(如 CentOS/RHEL ISO 镜像)。系统 ISO 内自带了与当前内核及运行时完全一致的核心 RPM 软件包(包含 GCC、GLIBC 开发头文件、Make 等),并且自带完整的依赖元数据目录(repodata)。

通过将 ISO 挂载到本地目录,并配置一个指向该本地路径的 .repo 源配置文件,yum 工具就能直接读取本地介质进行依赖解析与批量安装。一旦底层开发工具链完备,Python 源码编译就能顺利进行,最终安装到独立目录下,既不破坏系统底层依赖,又能提供完整的 Python 运行环境。

Linux服务器离线编译安装Python及配置本地yum源教程
图 1:离线安装中的介质、yum 管理器与源码编译关系图

二、前期离线物料准备

在开始操作前,需要在有公网连接的办公机上预先下载好所需介质,并通过 U 盘、移动硬盘或内网跳板机(SFTP/SCP)拷贝到目标 Linux 服务器的 /root/packages/ 目录下。

  • 操作系统的完整 ISO 镜像:例如 CentOS-7-x86_64-DVD-2009.iso 或对应版本的 RHEL 安装盘。请确保镜像版本与目标服务器当前的系统大版本严格一致。
  • Python 官方源码包:前往 Python 官网下载 Gzipped/XZ 压缩的源码归档包,例如 Python-3.10.13.tar.xz。

三、配置本地 yum 源解决编译依赖

Linux 系统(尤其是 CentOS/RHEL 系列)自带的 Python 2.7 或 3.6 通常深度嵌入在系统守护进程(如 yum 自身或 firewalld)中。编译新 Python 时,不能破坏系统的核心运行时,必须通过独立的编译器在非系统目录下重新构建。构建前需要安装 gcc、make 及必要的头文件。

1. 挂载系统 ISO 镜像

先在系统中创建一个空挂载点,然后将保存在服务器本地的 ISO 镜像以只读和回环设备(loop)方式挂载到该目录。

# 创建挂载目标目录
mkdir -p /mnt/cdrom

# 挂载 ISO 镜像文件
mount -o loop /root/packages/CentOS-7-x86_64-DVD-2009.iso /mnt/cdrom

执行完成后,使用 df -h 验证挂载状态。若看到类似下方包含 /mnt/cdrom 且使用率为 100% 的条目,即说明只读挂载成功。

# 示例输出
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop0      4.5G  4.5G     0 100% /mnt/cdrom

2. 备份原有网络 repo 配置

系统默认的 repo 文件存放在 /etc/yum.repos.d/ 目录下,里面指向的都是互联网镜像站点。由于当前处于离线状态,保留这些配置会导致 yum 持续尝试联网探测,超时报错。因此需要先将原有的配置归档。

mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/

3. 创建本地 repo 配置文件

在 /etc/yum.repos.d/ 目录下创建一个名为 local.repo 的全新文件:

vi /etc/yum.repos.d/local.repo

在该文件中写入如下具体参数(CentOS 7 环境):

[local-media]
name=CentOS-$releasever - Local Media
baseurl=file:///mnt/cdrom
gpgcheck=0
enabled=1
参数具体解释:
  • baseurl=file:///mnt/cdrom:协议为 file://,后接刚才挂载的绝对路径 /mnt/cdrom(注意是三个斜杠)。
  • gpgcheck=0:离线环境下关闭 GPG 签名校验,避免因缺少导入的 GPG Key 而中断安装。
  • enabled=1:明确声明启用该仓库。

注:针对 CentOS 8 / RHEL 8 及以上系统:ISO 内部将软件源拆分成了两个子目录,需要配置两个条目,分别为 baseurl=file:///mnt/cdrom/BaseOS 和 baseurl=file:///mnt/cdrom/AppStream。

4. 清理并重建 yum 缓存

告知 yum 放弃原有的网络元数据,直接从本地挂载路径读取软件包索引:

yum clean all
yum makecache

终端显示 Metadata cache created 即表示本地源配置成功,系统已建立针对 ISO 内部 RPM 的索引。

5. 一键安装 Python 编译所需依赖

利用刚刚配置的本地源,直接通过 yum 安装 GCC 编译器以及构建 Python 所必需的基础开发包:

yum install -y gcc make zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
为什么必须装这些 devel 库?
Python 在编译时通过动态探测(Autoconf)判断系统环境。若缺少 zlib-devel,后续通过 pip 安装解压缩轮子包会直接报错;缺少 openssl-devel,则内置的 _ssl 模块无法构建,导致无法建立安全套接字连接;缺少 libffi-devel,则 ctypes 模块将编译失败。在离线阶段将这些开发头文件一次性装齐,可以彻底规避安装后的功能缺失。

四、配置永久挂载(可选但推荐)

使用 mount 命令进行的挂载在服务器重启后会失效。如果后续还有维护或通过本地源安装其他基础工具的需求,建议将挂载信息写入 /etc/fstab:

# 向 /etc/fstab 追加挂载规则
echo "/root/packages/CentOS-7-x86_64-DVD-2009.iso /mnt/cdrom iso9660 defaults,loop,ro 0 0" >> /etc/fstab

# 测试配置是否生效(不报错即正确)
mount -a

五、离线解压与编译安装 Python

有了本地源提供的 GCC 与核心头文件后,服务器已经具备标准的 C 语言编译环境。接下来开始对 Python 源码进行配置与编译。

Linux服务器离线编译安装Python及配置本地yum源教程
图 2:Python 编译构建标准步骤拆解

1. 解压源码

cd /root/packages/
tar -xf Python-3.10.13.tar.xz
cd Python-3.10.13

2. 生成 Makefile 配置文件

执行 configure 脚本。必须指定 --prefix 参数将 Python 安装到一个独立的空目录中(如 /usr/local/python3),这有助于在离线生产环境中进行整洁的版本隔离和随时迁移;同时添加 --enable-optimizations 开启编译优化(通过 PGO 进行性能优化),并带上 --with-ensurepip=install。

./configure --prefix=/usr/local/python3 --enable-optimizations --with-ensurepip=install

脚本会逐项检查系统头文件和编译器环境。输出末尾如果显示 creating Makefile 且无 error 退出,则表明配置阶段通过。

3. 执行多线程编译

使用 nproc 命令获取服务器当前可用的 CPU 核心数,并传递给 make 启用并发编译,加快编译速度:

make -j $(nproc)

4. 安装二进制文件(必须使用 altinstall)

make altinstall
为什么绝不能执行 make install?
如果在 Linux 系统下直接执行 make install,编译机制会默认创建名为 python 的软链接指向该新版本,从而替换系统路径 /usr/bin/python。在 CentOS/RHEL 中,系统底层关键工具 yum 强依赖于原本的系统 Python 解释器(例如 2.7.5),一旦解释器被替换为 Python 3.x,yum 及其关联工具会全线崩溃。采用 make altinstall 可以跳过创建通用软连接的步骤,只生成 python3.10 这样带有明确版本后缀的文件,实现完全共存。

六、环境变量配置与结果验证

安装完成后,新 Python 位于 /usr/local/python3/bin,尚未加入系统环境变量。为了方便全局调用,有两种常见的环境暴露方式:建立软链接或配置 PATH。

方案对比与操作

配置方案 具体做法 适用场景
创建显式软链接 在 /usr/bin/ 创建名为 python3 和 pip3 的符号链接 适合多数标准业务脚本,不改变 PATH 优先级,安全性最高。
追加 PATH 变量 在 /etc/profile.d/ 中将 /usr/local/python3/bin 加入 PATH 适合需要直接调用带版本号命令或配套第三方工具的环境。

这里推荐采用第一种方式:针对性建立专属软链接,既清晰又不会误伤原有全局命令:

# 创建软链接到系统 bin 目录
ln -sf /usr/local/python3/bin/python3.10 /usr/bin/python3
ln -sf /usr/local/python3/bin/pip3.10 /usr/bin/pip3
Linux服务器离线编译安装Python及配置本地yum源教程
图 3:系统命令目录软链接映射与隔离设计

验证运行状态

验证 Python 解析器及其关键内置模块(SSL、SQLite3、CTypes)是否完全正常:

# 1. 验证基础版本
python3 -V

# 2. 验证包管理器
pip3 -V

# 3. 验证关键头文件是否编译成功(未报错即成功)
python3 -c "import ssl; import sqlite3; import ctypes; print('All core modules loaded successfully!')"

终端返回如下结果,说明安装彻底成功:

# 示例输出
Python 3.10.13
pip 23.2.1 from /usr/local/python3/lib/python3.10/site-packages/pip (python 3.10)
All core modules loaded successfully!

七、常见离线编译问题与排查

  • 问题 1:执行 yum makecache 报错 Cannot find a valid baseurl for repo
    原因与对策:检查 /etc/yum.repos.d/ 目录下是否还残留未移走的 .repo 文件,yum 仍在尝试连接外网;或检查 local.repo 中的 baseurl 是否拼错。注意本地路径必须遵循 file:///绝对路径 格式。
  • 问题 2:编译后 import ssl 报错 No module named '_ssl'
    原因与对策:在最初配置本地 yum 源后,没有成功安装 openssl-devel。需要确认挂载点正常,执行 yum install -y openssl-devel 重新安装,然后回到 Python 源码目录,重新执行 ./configure、make 和 make altinstall。
  • 问题 3:离线环境下 pip 如何安装第三方依赖库(Wheel 包)?
    解决方案:离线服务器无法通过 pip 联网下载。需在外网环境通过相同版本的 Python 执行 pip download -r requirements.txt -d ./packages 下载好 .whl 文件,拷贝到离线服务器后,使用 pip3 install --no-index --find-links=/path/to/packages -r requirements.txt 完成离线部署。

八、全流程总结与维护准则

整套离线交付逻辑的核心在于“就地取材”与“隔离安装”:利用原本随操作系统交付的完整镜像解决编译依赖链,利用 --prefix 和 altinstall 确保新运行环境不与操作系统的原有环境产生冲突。

Linux服务器离线编译安装Python及配置本地yum源教程
图 4:离线编译与环境维护全生命周期自检清单

只要严格按照规范执行挂载、隔离安装与软链接映射,即便是完全隔离的内网服务器,也能兼顾底层系统的绝对稳定与上层业务运行时的平滑升级。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表