1. 离线环境搭建:为什么你需要这份指南
如果你正在负责一个内部服务器集群的维护,或者是在一个与互联网物理隔离的嵌入式实验室里搞开发,那你肯定对“离线安装”这四个字又爱又恨。爱的是,它意味着环境安全、可控;恨的是,当你想装个软件,发现它依赖另一个,另一个又依赖下一个,像俄罗斯套娃一样没完没了时,那种抓狂的感觉。我经历过太多次了,抱着一堆U盘和移动硬盘,在一台台“裸机”服务器上手动传包、编译,一个环节出错,就得从头再来。
今天要聊的,就是从 M4 到 sysbench 这一串经典开发工具链的离线搭建。这套组合拳在编译安装很多开源软件时几乎是标配,尤其是当你需要从源码构建数据库、中间件或者性能测试时,autoconf、automake、libtool 这些工具就是背后的“脚手架”。网上教程很多,但大多假设你的机器能畅通无阻地 yum install 或 apt-get。离线环境下,每一步都得靠自己。
这份指南就是为你准备的。我会假设你手头有一台能上网的“跳板机”(比如你自己的笔记本电脑),以及一个U盘(或者共享目录),目标是一台完全离线的Linux服务器。我们将一步步把所需的源码包、依赖库全部“搬运”过去,并完成编译安装。整个过程我会穿插我踩过的坑和验证过的技巧,目标是让你一次成功,不再为“依赖地狱”头疼。
2. 战前准备:理清依赖关系与获取源码包
在离线环境下干活,最忌讳的就是“走一步看一步”。你必须像将军制定作战计划一样,提前把所有的“粮草”(源码包)和“行军路线”(依赖顺序)规划清楚。这套工具链的依赖关系是环环相扣的,顺序错了,就会编译失败。
核心依赖链条是这样的:
- M4:这是一个宏处理器,是很多古老但重要的GNU工具的基础。autoconf 在生成配置脚本时就需要它。所以,它必须是第一个安装的。
- Perl:autoconf 和后续很多配置脚本都是用Perl写的。虽然有些系统自带Perl,但版本可能太旧或路径不对,为了保险起见,我习惯自己装一个指定版本。
- autoconf:用于生成可移植的、自动配置软件源代码的shell脚本(就是那个经典的
./configure)。它依赖M4和Perl。 - automake:配合autoconf使用,从
Makefile.am文件生成符合GNU规范的Makefile.in模板。它必须在autoconf之后安装。 - libtool:一个管理库的编译、链接、安装的通用脚本。它用来解决不同系统下库文件的命名差异和共享库的创建问题。它通常依赖一个可用的autoconf/automake环境。
- sysbench:一个模块化、跨平台的多线程性能基准测试工具,常用来测试数据库、CPU、内存、文件I/O等。它的编译依赖于前面搭建好的整个autotools(autoconf/automake/libtool)环境。
明白了顺序,接下来就是在有网的机器上,把所有这些软件的源码包下载下来。我强烈建议你建立一个清晰的目录结构,比如:
~/offline_packages/
├── m4/
├── perl/
├── autoconf/
├── automake/
├── libtool/
└── sysbench/
每个目录里放对应的 tar.gz 源码包。版本选择上,我推荐使用比较稳定、经典的版本,避免最新版可能带来的未知兼容性问题。下面是我实测过能顺利搭配的版本组合及下载命令(在你的跳板机上执行):
# 创建总目录
mkdir -p ~/offline_packages
cd ~/offline_packages
# 下载 M4 (1.4.13 是一个广泛兼容的稳定版)
wget http://mirrors.kernel.org/gnu/m4/m4-1.4.13.tar.gz -O m4/m4-1.4.13.tar.gz
# 下载 Perl (5.28.1 是一个长期支持版本,兼容性好)
wget https://www.cpan.org/src/5.0/perl-5.28.1.tar.gz -O perl/perl-5.28.1.tar.gz
# 下载 autoconf (2.65 版本与后续工具兼容性极佳)
wget http://mirrors.kernel.org/gnu/autoconf/autoconf-2.65.tar.gz -O autoconf/autoconf-2.65.tar.gz
# 下载 automake (1.11 版本稳定可靠)
wget http://mirrors.kernel.org/gnu/automake/automake-1.11.tar.gz -O automake/automake-1.11.tar.gz
# 下载 libtool (2.2.6b 是经典版本)
wget http://mirrors.kernel.org/gnu/libtool/libtool-2.2.6b.tar.gz -O libtool/libtool-2.2.6b.tar.gz
# 下载 sysbench (以1.0.20为例,注意从GitHub release下载)
wget https://github.com/akopytov/sysbench/archive/refs/tags/1.0.20.tar.gz -O sysbench/sysbench-1.0.20.tar.gz
注意:软件源地址可能会变化。如果上述链接失效,去 GNU 官网或项目的官方发布页面寻找即可。全部下载完成后,用U盘或
scp命令(如果网络可达)将整个offline_packages目录拷贝到离线服务器的某个工作目录,例如/opt/packages。
3. 基础奠基:安装M4与Perl解释器
现在,我们正式登录到那台离线的Linux服务器。假设你已经把 offline_packages 目录放在了 /opt 下。我们首先安装两个基础依赖:M4和Perl。
3.1 安装M4宏处理器
M4的安装过程非常标准,是经典的GNU软件“三板斧”:configure, make, make install。但离线环境下,我们尤其要注意安装路径。
# 切换到包目录并解压
cd /opt/packages/m4
tar -xzvf m4-1.4.13.tar.gz
cd m4-1.4.13
# 配置安装路径。我习惯装在 /usr/local 下,这是存放本地安装软件的标准位置。
# `--prefix` 参数至关重要,它决定了软件安装到哪里。
./configure --prefix=/usr/local
# 编译。如果机器核心数多,可以用 `make -j4` 加速,但离线环境首次编译建议单线程,方便排错。
make
# 安装。这一步需要root权限,因为它要向 /usr/local 写文件。
sudo make install
安装完成后,可以验证一下:
which m4
# 应该输出 /usr/local/bin/m4
m4 --version
# 应该显示 m4 (GNU M4) 1.4.13
如果 which m4 没找到,可能是因为 /usr/local/bin 不在你的 PATH 环境变量里。可以执行 export PATH=/usr/local/bin:$PATH 临时添加,或者将其添加到 ~/.bashrc 中永久生效。这是离线环境常见问题,务必检查。
3.2 安装Perl解释器
系统可能自带Perl,但自带的版本和模块可能不满足autoconf等工具的要求。自己编译安装一个独立版本是最稳妥的做法,我们可以把它安装到用户目录,避免影响系统自带的Perl。
cd /opt/packages/perl
tar -xzf perl-5.28.1.tar.gz
cd perl-5.28.1
Perl的配置脚本不是 configure,而是 Configure。我们用 -des 参数进行非交互式的默认配置,并指定安装到用户家目录下的 localperl 文件夹,这样完全独立。
./Configure -des -Dprefix=$HOME/localperl
接下来是编译、测试和安装。make test 会运行一整套测试用例,时间比较长,但在离线环境下,我强烈建议你跑一遍,确保编译出的Perl解释器是健康可用的,避免后续工具链因Perl问题而报一些晦涩难懂的错。
make
make test # 耐心等待,如果看到“All tests successful.”就很好。
make install
安装后,你需要把这个自定义的Perl加入到环境变量最前面:
echo 'export PATH=$HOME/localperl/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
which perl
# 应该输出 /home/你的用户名/localperl/bin/perl
perl -v
# 应该显示版本为 v5.28.1
4. 构建核心工具链:autoconf, automake, libtool
有了M4和Perl,我们就可以开始构建核心的GNU构建系统了。这里的安装顺序必须遵守:autoconf -> automake -> libtool。
4.1 安装autoconf
autoconf的作用是探测系统特性,并生成那个万能的 configure 脚本。安装它需要用到我们刚装好的M4和Perl。
cd /opt/packages/autoconf
tar -xzvf autoconf-2.65.tar.gz
cd autoconf-2.65
./configure --prefix=/usr/local
make
sudo make install
验证安装:
autoconf --version
# 应输出 autoconf (GNU Autoconf) 2.65
如果报错找不到命令,同样检查 /usr/local/bin 是否在 PATH 中。
4.2 安装automake
automake负责把高级别的 Makefile.am 转换成标准的 Makefile.in。它依赖于autoconf。
cd /opt/packages/automake
tar xzvf automake-1.11.tar.gz
cd automake-1.11
./configure --prefix=/usr/local
make
sudo make install
验证安装:
automake --version
# 应输出 automake (GNU automake) 1.11
4.3 安装libtool
libtool封装了不同Unix系统(如Linux, Solaris, macOS)上创建共享库(.so, .dylib)的复杂细节。它的安装过程类似。
cd /opt/packages/libtool
tar xzvf libtool-2.2.6b.tar.gz
cd libtool-2.2.6b
./configure --prefix=/usr/local
make
sudo make install
验证安装:
libtool --version
# 应输出 libtool (GNU libtool) 2.2.6b
到这里,GNU构建工具链就齐活了。 你可以尝试找一个简单的开源软件源码包(比如 hello world 程序),在离线环境下运行 ./configure && make,感受一下这套工具链是如何工作的。这能帮你确认环境是否真的搭建成功。
5. 实战应用:编译安装sysbench进行性能测试
sysbench是我们搭建这套工具链的一个典型应用场景。它是一个用C++写的性能基准测试工具,其编译过程正是依赖我们刚刚安装的autoconf、automake和libtool。
5.1 解压与生成配置脚本
sysbench的源码包通常不包含直接可用的 configure 脚本,而是包含一个叫 autogen.sh 的脚本。这个脚本的作用就是调用autoconf、automake等工具,生成 configure 脚本。
cd /opt/packages/sysbench
tar -xzf sysbench-1.0.20.tar.gz
cd sysbench-1.0.20
在运行 autogen.sh 之前,有个大坑需要注意:它默认会尝试从网络下载依赖(如luajit)。这在离线环境下是致命的。我们必须让它“闭嘴”,强制使用本地已有的工具链。
# 首先,检查并确保 autogen.sh 脚本有执行权限
chmod +x autogen.sh
# 关键一步:设置环境变量,禁止自动下载
export WITHOUT_LUAJIT=1
然后运行 autogen.sh:
./autogen.sh
这个脚本会执行一系列命令,最终在目录下生成 configure 脚本。如果过程中没有报错,看到 configure 文件生成,就成功了一大半。
5.2 配置、编译与安装
接下来就是熟悉的流程了。sysbench有一些依赖库,比如用于MySQL测试的 mysql-devel 或 libmysqlclient-dev,用于POSIX线程的 pthread 库等。在离线环境下,你需要确保这些开发库已经通过系统安装盘或其他离线方式安装好了。我们这里以编译一个不依赖MySQL的基础版本为例。
# 配置,指定安装路径
./configure --prefix=/usr/local --with-mysql=no
# 编译
make
# 安装
sudo make install
--with-mysql=no 参数明确告诉它不要编译MySQL测试模块,避免因为找不到MySQL客户端库而编译失败。如果你确实需要MySQL测试功能,就必须提前离线安装好 mysql-devel 包,并在configure时指定 --with-mysql 的路径。
5.3 验证与简单测试
安装完成后,验证一下:
sysbench --version
# 应输出 sysbench 1.0.20
现在,你可以用sysbench做一些简单的性能摸底了,比如测试一下CPU的质数计算能力:
sysbench cpu --cpu-max-prime=20000 run
这个命令会启动计算,并最终输出事件耗时、每秒请求数等指标。看到这些数字正常输出,就证明你的整个离线工具链和sysbench都工作正常了。
6. 避坑指南与进阶技巧
走完整个流程,你可能已经成功了,但也可能遇到了各种各样的问题。这里我分享几个最常见的坑和解决办法。
坑1:make install 时提示权限不足。
这是最常遇到的。解决方案就是加 sudo。但更规范的做法是,在 configure 时就用 --prefix 指定一个你有写权限的路径,比如 $HOME/local。这样就不需要root权限,也更安全。但缺点是,这个软件就只有你这个用户能用了。
坑2:编译过程中报错,提示缺少某个头文件(.h文件)或库文件(.so文件)。
这通常是缺少开发包(-devel或-dev包)导致的。例如,编译sysbench时如果报错 fatal error: mysql.h: No such file or directory,就是缺MySQL开发库。离线环境下,你需要找到对应系统(CentOS/RHEL用rpm包,Ubuntu/Debian用deb包)的开发包,通过U盘拷贝过来安装。可以使用 yum install --downloadonly 或 apt-get download 命令在有网机器上提前下载好这些依赖包。
坑3:新安装的命令找不到(command not found)。
根本原因是环境变量 PATH 没有包含安装目录(如 /usr/local/bin)。每次登录后手动 export 太麻烦。务必把 export PATH=/usr/local/bin:$HOME/localperl/bin:$PATH 这样的语句添加到你的 ~/.bashrc 文件末尾,然后执行 source ~/.bashrc 使其生效。
坑4:版本兼容性问题。
这是最棘手的。比如,用高版本的autoconf生成的 configure 脚本,可能包含旧版本 make 不认识的语法。我的经验是,在离线环境这种追求稳定的地方,尽量使用较旧但广泛验证过的版本组合,就像本文推荐的这一套。不要盲目追新。
进阶技巧:制作本地YUM/DNF仓库。
如果你需要频繁地在多台离线服务器上部署相同的环境,每次都拷贝源码编译效率太低。一个高级做法是,在一台有网的机器上,利用 yumdownloader 或 createrepo 命令,将所有需要的rpm包(包括开发工具链和依赖库)下载下来,创建一个本地的软件仓库镜像。然后把这个镜像目录拷贝到离线环境,修改服务器的 repo 配置指向这个本地目录。这样,你就可以在离线服务器上用 yum install 直接安装二进制包,速度快且一致性好。这比源码编译要省事得多,但前期搭建本地仓库的工作量稍大。
整个离线工具链搭建的过程,本质上是一次对软件依赖关系的深度梳理。虽然过程繁琐,但一旦做通,你对Linux软件安装的理解会上一个台阶。下次再遇到离线环境,你就能从容地制定计划,准备“粮草”,一步步地把需要的环境构建起来。
1709



被折叠的 条评论
为什么被折叠?



