为什么需要离线安装?
在企业内网或涉密环境中,服务器通常无法直接连接互联网。如果需要在这样的服务器上搭建 Web 环境(Nginx + PHP + MySQL),常规的在线安装方式(如 yum install)就无法使用。此时,我们需要借助一台能联网的同构机器(相同操作系统架构,如 ARM64 的银河麒麟 V10)提前下载所有软件包及其依赖,然后制作成离线仓库(DVD 光盘或压缩包),再传输到内网服务器上进行安装。
本文提供了一套完整的离线安装方案:在联网机器上使用 yum --downloadonly 下载 Nginx、PHP、MariaDB 及其依赖,创建本地 YUM 仓库,并生成安装脚本;然后将仓库打包,通过光盘或 U 盘转移到内网服务器;最后在内网服务器上通过本地仓库完成安装。
准备环境和工具
1. 系统准备
准备一台可以联网的计算机,其操作系统架构必须与目标内网服务器一致。例如,目标服务器为银河麒麟 V10(ARM64),那么联网机器也应为同版本同架构的系统。
如果没有现成的 ARM64 物理机,可以使用虚拟机模拟。在 Windows 下,默认的 Hyper-V 仅支持 x86 架构,无法安装 ARM64 系统。此时可以使用 QEMU 来模拟 ARM64 环境。
Windows 下安装 QEMU 的方法(安装细节请提问AI):
- 下载 QEMU 的 Windows 安装包(如
qemu-w64-setup-xxxx.exe),安装时勾选添加系统路径。 - 准备银河麒麟 V10 的 ARM64 ISO 镜像。
- 使用 QEMU 创建虚拟硬盘并启动安装:
qemu-img create -f qcow2 kylin-arm64.qcow2 40G qemu-system-aarch64 -m 4096 -cpu cortex-a57 -M virt -drive file=kylin-arm64.qcow2,if=virtio -cdrom Kylin-Server-V10-SP3-ARM64.iso -netdev user,id=net0 -device virtio-net,netdev=net0 -nographic - 安装系统后,即可在该虚拟机中完成后续所有操作。
提示:若已有同构机器,可跳过 QEMU 步骤。
2. 安装必要工具
在联网机器上,创建一个工作目录,并安装后续需要用到的工具。
mkdir -p /opt/dvd-build
cd /opt/dvd-build
# 安装工具(适用于 CentOS/RHEL 系,包括银河麒麟)
yum install -y yum-utils createrepo genisoimage growisofs httpd wget rsync
yum-utils:提供yumdownloader等工具,但此处我们使用yum --downloadonly,需要确保系统已安装yum-plugin-downloadonly(CentOS 7 及以下)或使用dnf(CentOS 8+ 内置--downloadonly)。银河麒麟 V10 基于 CentOS 8,yum是dnf的软链接,已内置--downloadonly,无需额外插件。createrepo:用于创建本地 YUM 仓库元数据。genisoimage和growisofs:用于制作 ISO 镜像(可选,若打算刻录光盘)。httpd:可选,用于测试本地仓库(如果不想刻盘,可通过 HTTP 共享)。wget、rsync:辅助工具。
下载软件包
2.1 创建目录结构
规划仓库目录结构,分别存放 BaseOS、AppStream(模仿 CentOS 标准仓库)以及自定义的 Extra 目录,其中 Extra 下再按组件划分子目录。
mkdir -p dvd-repo/{BaseOS,AppStream,Extra/{nginx,php,mariadb,common},repodata}
说明:
BaseOS和AppStream在此处留空,仅作为占位;实际我们只使用Extra存放所有需要的包。如果你需要系统基础包(如 glibc),也可以从系统 ISO 中复制BaseOS和AppStream进来,但通常目标系统已安装基础环境,只需补充 Web 组件即可。
2.2 下载 Nginx 及相关包
# 创建空目录作为 --installroot 的根,避免污染系统
mkdir -p /tmp/empty
# 下载 nginx 及所有 nginx 模块
yum install --downloadonly --downloaddir=./dvd-repo/Extra/nginx \
nginx nginx-mod-* --installroot=/tmp/empty
2.3 下载 PHP 及相关包
PHP 包通常很多,建议下载全部 php-*(但会包含一些可能不需要的包,也可按需筛选)。
yum install --downloadonly --downloaddir=./dvd-repo/Extra/php \
php php-* --installroot=/tmp/empty
2.4 下载 MySQL/MariaDB 及相关包
# 下载 MariaDB 服务器、客户端及 Perl 绑定(某些应用需要)
yum install --downloadonly --downloaddir=./dvd-repo/Extra/mariadb \
mariadb mariadb-server mariadb-* perl-DBD-MySQL --installroot=/tmp/empty
2.5 下载共享依赖
一些基础库可能被多个组件依赖,单独放入 common 目录,避免重复。
yum install --downloadonly --downloaddir=./dvd-repo/Extra/common \
openssl openssl-devel pcre pcre-devel zlib zlib-devel libxml2 \
libxml2-devel libcurl libcurl-devel gd gd-devel freetype \
freetype-devel libjpeg-turbo libjpeg-turbo-devel libpng \
libpng-devel oniguruma oniguruma-devel
注意:以上依赖列表可能不完整,实际缺失的包会在内网安装时提示,届时可返回联网机器补充下载。建议在下载完成后,使用
yum deplist检查各组件的完整依赖关系。
创建仓库元数据
3.1 为每个目录生成元数据
# 为每个子目录生成 repodata
for dir in nginx php mariadb common; do
if [ -d "dvd-repo/Extra/$dir" ] && [ "$(ls -A dvd-repo/Extra/$dir)" ]; then
echo "正在创建 $dir 仓库元数据..."
createrepo -v dvd-repo/Extra/$dir
# 可选:生成组信息(便于分组安装)
cat > dvd-repo/Extra/$dir/comps.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE comps PUBLIC "-//Red Hat, Inc.//DTD Comps info//EN" "comps.dtd">
<comps>
<group>
<id>webserver-stack</id>
<name>Web Server Stack</name>
<description>Complete web server stack with Nginx, PHP and database</description>
<default>false</default>
<uservisible>true</uservisible>
</group>
</comps>
EOF
# 重新生成带组信息的元数据
createrepo -g comps.xml dvd-repo/Extra/$dir
fi
done
如果某个目录为空(如首次下载失败),可忽略。
创建安装脚本
4.1 编写自动化安装脚本
创建一个交互式脚本,让内网用户可以选择安装组件。
cat > dvd-repo/install.sh << 'EOF'
#!/bin/bash
# Web Server Stack 离线安装脚本
# 适用于 Kylin-Server-V10 / CentOS 8+ ARM64
# 必须以 root 运行
if [ $EUID -ne 0 ]; then
echo "请以 root 权限运行此脚本"
exit 1
fi
echo "======================================"
echo " Web 服务器堆栈离线安装程序"
echo "======================================"
# 默认挂载点(可根据实际情况修改)
MOUNT_POINT="$(cd "$(dirname "$0")" && pwd)"
# 配置本地仓库
echo "正在配置本地仓库..."
cat > /etc/yum.repos.d/dvd-extra.repo << REPOEOF
[dvd-nginx]
name=DVD - Nginx Packages
baseurl=file://$MOUNT_POINT/Extra/nginx
enabled=1
gpgcheck=0
[dvd-php]
name=DVD - PHP Packages
baseurl=file://$MOUNT_POINT/Extra/php
enabled=1
gpgcheck=0
[dvd-mariadb]
name=DVD - MariaDB Packages
baseurl=file://$MOUNT_POINT/Extra/mariadb
enabled=1
gpgcheck=0
[dvd-common]
name=DVD - Common Dependencies
baseurl=file://$MOUNT_POINT/Extra/common
enabled=1
gpgcheck=0
REPOEOF
# 清理并重建缓存
yum clean all
yum makecache
# 安装选项
echo ""
echo "请选择安装选项:"
echo "1. 完整安装 (Nginx + PHP + MariaDB)"
echo "2. 仅安装 Nginx"
echo "3. 仅安装 PHP"
echo "4. 仅安装 MariaDB"
echo "5. 自定义安装 (进入交互式 shell,手动执行 yum install)"
echo ""
read -p "请输入选项 (1-5): " choice
case $choice in
1)
echo "正在安装完整堆栈..."
yum install -y nginx php php-fpm mariadb mariadb-server
;;
2)
echo "正在安装 Nginx..."
yum install -y nginx
;;
3)
echo "正在安装 PHP..."
yum install -y php php-fpm
;;
4)
echo "正在安装 MariaDB..."
yum install -y mariadb mariadb-server
;;
5)
echo "进入自定义安装模式,您可以手动执行 yum install <package>"
echo "例如: yum install nginx php-fpm"
echo "输入 exit 退出"
bash
;;
*)
echo "无效选项,退出。"
exit 1
;;
esac
# 询问是否启动服务
if command -v nginx &>/dev/null; then
read -p "是否启动 Nginx?(y/n): " start_nginx
if [[ "$start_nginx" =~ ^[Yy]$ ]]; then
systemctl start nginx
systemctl enable nginx
echo "Nginx 已启动并设置开机自启"
fi
fi
if command -v php-fpm &>/dev/null; then
read -p "是否启动 PHP-FPM?(y/n): " start_php
if [[ "$start_php" =~ ^[Yy]$ ]]; then
systemctl start php-fpm
systemctl enable php-fpm
echo "PHP-FPM 已启动并设置开机自启"
fi
fi
if systemctl list-unit-files | grep -q mariadb; then
read -p "是否启动 MariaDB?(y/n): " start_db
if [[ "$start_db" =~ ^[Yy]$ ]]; then
systemctl start mariadb
systemctl enable mariadb
echo "MariaDB 已启动并设置开机自启"
echo "建议运行 'mysql_secure_installation' 进行安全配置"
fi
fi
echo ""
echo "安装完成!"
echo "本地仓库位置: $MOUNT_POINT"
echo "如需继续安装其他软件包,可直接使用 yum install <package>"
EOF
chmod +x dvd-repo/install.sh
打包 dvd-repo 目录和刻录光盘
5.1 打包为压缩文件
cd /opt/dvd-build
zip -r dvd-repo.zip dvd-repo
或者制作成 ISO 镜像(便于刻录光盘或虚拟光驱挂载):
mkisofs -R -J -V "WEB_STACK_DVD" -o dvd-repo.iso dvd-repo/
5.2 传输到内网服务器
- 通过 U 盘、光盘或内部网络共享,将
dvd-repo.zip或dvd-repo.iso复制到目标内网服务器。 - 如果使用光盘,直接插入并挂载;如果使用 U 盘,解压到某个目录。
内网使用
6.1 提取仓库
假设将压缩包解压到 /mnt/dvd-repo:
# 创建目标目录
mkdir -p /mnt/dvd-repo
# 解压
unzip dvd-repo.zip -d /mnt/
如果挂载 ISO 镜像:
mount -o loop dvd-repo.iso /mnt/dvd-repo
6.2 处理 yum 配置文件
为了避免与其他仓库冲突,建议先备份并移除原有 .repo 文件(或确保 dvd-extra.repo 优先级足够高)。
# 备份原有仓库配置
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ 2>/dev/null
6.3 运行安装脚本
cd /mnt/dvd-repo
./install.sh
根据提示选择安装选项,脚本会自动配置本地仓库并安装所选组件。
6.4 验证功能
安装完成后,可通过以下方式验证各组件是否正常工作:
Nginx 验证
systemctl status nginx
curl http://localhost
应返回 Nginx 默认欢迎页。
PHP 验证
创建测试文件 /usr/share/nginx/html/info.php:
<?php phpinfo(); ?>
然后通过浏览器访问 http://服务器IP/info.php,应显示 PHP 信息页面。
MariaDB 验证
systemctl status mariadb
mysql -u root -p
若能登录(默认无密码,安装后建议运行 mysql_secure_installation 设置密码),则数据库正常。
常见问题
-
依赖缺失:如果在安装过程中提示缺少某个包,可返回联网机器,用
yum --downloadonly补充下载对应包,放入对应目录(如 common),并重新运行createrepo更新元数据,再重新打包传输。 -
系统版本架构不匹配:确保联网机器与内网服务器架构一致(如均为 aarch64, Kylin v10)。若架构不同,下载的 RPM 包将无法安装,系统版本不同,可能导致一些核心依赖版本不正确。
-
yum 缓存问题:若内网服务器之前配置过其他仓库,可能导致缓存冲突。可先执行
yum clean all并确保/etc/yum.repos.d/下只有 dvd-extra.repo。 -
启动服务失败:检查端口是否被占用,或使用
journalctl -xe查看详细错误。
该方法不仅适用于银河麒麟 V10,也适用于其他基于 RHEL/CentOS 8 的 Linux 发行版。核心思路是利用同构的联网机器下载所有依赖,构建本地 YUM 仓库,再转移到内网使用。这种方法灵活可靠,是内网环境部署软件的通用手段。