Linux服务器离线编译安装Python及配置本地yum源教程
针对无外网连接的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 运行环境。
二、前期离线物料准备
在开始操作前,需要在有公网连接的办公机上预先下载好所需介质,并通过 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
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 源码进行配置与编译。
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
验证运行状态
验证 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 确保新运行环境不与操作系统的原有环境产生冲突。
只要严格按照规范执行挂载、隔离安装与软链接映射,即便是完全隔离的内网服务器,也能兼顾底层系统的绝对稳定与上层业务运行时的平滑升级。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













