兄弟们,今天聊一个不太“时髦”但绝对刚需的话题:openSUSE Leap 15.0 x86_64 的离线安装。
为什么要聊这个?因为我最近在两个完全隔离的内网项目里折腾了这套系统。你可能觉得2024年聊一个快五年前发布的发行版有点过时,但现实是,很多政企单位、军工院所、电厂机房、教育机房里,跑着的就是这些“老古董”。它们的业务系统只认证过特定版本,一旦上线就不能随便升级,而物理环境又是断网的。这时候,“离线安装”就不是一个可选技能,而是一个保命的技能。
这篇文章我不打算给你念官方文档,而是把我实操过程中踩过的坑、验证过的方法、以及那些文档里不会写清楚的细节,全部摊开来讲。文章会以 openSUSE Leap 15.0 DVD x86_64 安装包为基础,从下载镜像、制作启动盘、安装配置、再到离线环境的软件源搭建,一条龙讲完。如果你正要在隔离网络里部署这套系统,或者只是好奇离线安装和在线安装到底差在哪,这篇内容都能给你一个直接的参考答案。
1. 版本选型与离线场景分析
1.1 为什么是 Leap 15.0 而不是 Tumbleweed
这是很多人容易忽略的一个点。openSUSE 有两个大版本线:一个是滚动更新的 Tumbleweed,一个是固定版本的 Leap。如果你正准备在离线环境下部署,Tumbleweed 基本可以直接放弃了——它没有“版本”的概念,所有软件包每天都在变,你根本无法锁定一个稳定的软件集合,也无法保证半年后还能拿到同样的包。而 Leap 就是 openSUSE 面向稳定场景的版本线,其中 15.0 又是整个 15 系列的开山之作,它在底层兼容了当时 SUSE Linux Enterprise(SLES)15 的企业级特性,这意味着它的内核、glibc、systemd 这些核心组件经过了相对严格的测试,适合当底座。
从离线安装的角度看,Leap 15.0 的 DVD ISO 镜像自带了完整的 YaST 安装器和数以千计的 RPM 包,覆盖桌面环境、开发工具、服务器组件。你不需要在安装过程中联网去拉取额外的包,只要镜像完整,就能装出一个可用的系统。这一点和 Net Install 镜像形成鲜明对比:Net Install 镜像只有几百 MB,安装过程中会尝试连接 openSUSE 软件源,一旦没有网络,安装程序直接卡死在“配置安装源”这一步。很多新手第一次离线装 openSUSE 失败,就是下了 Network Install 镜像而不是 DVD 镜像。
1.2 离线安装的核心矛盾:你要解决什么问题
离线安装听上去就是个“没网也能装”的简单需求,但如果再往下拆,其实分好几种场景:
- 场景A:安装过程不能联网,但装完可以联网。 这种情况相对好办,你只需要一个完整的 DVD 镜像做安装介质,装完之后再配置网络源,正常使用。文章里的安装步骤完全适用于这个场景。
- 场景B:整个环境长期断网,但内网有软件仓库镜像。 这需要额外准备一套离线仓库搭建方案,比如用 rsync 从外网同步一个仓库到内网服务器,或者直接把 DVD 里的包导入到内网 HTTP 服务里。后面章节的“本地源配置”会详解。
- 场景C:彻底物理隔离,只能靠 U 盘/光盘拷贝软件包。 这种情况下安装系统只是第一步,真正的痛点是后续依赖软件的获取。比如我这次要在一台机器上离线装一套 Java 中间件,光依赖就牵扯到十几个 rpm 包,全得在能上网的机器上先把依赖下载好,再搬进内网。这部分我也会在软件源配置章节展开。
搞清楚你是哪种场景,再决定安装策略,会省掉后面一大半的折腾时间。我见过有人在内网环境里下了 Net Install 镜像,结果安装程序一连网失败就直接退出,反复试到怀疑人生,其实就是没搞清楚“离线安装需要用 DVD 镜像”这个最基本的事。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装包获取与启动介质制作
2.1 ISO镜像下载与校验
安装包的获取渠道不复杂,openSUSE 官方提供了所有版本的镜像下载,国内也有一些高校开源镜像站做同步。但这里有一个很多新手会忽略的重点:你在选择下载链接的时候,一定要看清楚文件名。就拿 openSUSE-Leap-15.0-DVD-x86_64.iso 来说,这个文件名包含了几个关键信息:
- Leap 15.0:版本号,对应稳定发布线
- DVD:意味着这是一个完整的安装介质,内含所有安装所需软件包
- x86_64:架构,适用于 Intel/AMD 64 位处理器
- iso:光盘镜像格式,既可以烧录到光盘,也可以写入 U 盘
镜像文件的大小通常在 4GB 左右。下载完成后,强烈建议做一步校验。openSUSE 官网和镜像站都会提供一个对应的 sha256 校验文件(XX.sha256 这样的文件),你在终端里执行 sha256sum openSUSE-Leap-15.0-DVD-x86_64.iso 计算出一个哈希值,然后和官方文件里的值比对。这一步不是走过场——我遇到过下载工具把 ISO 文件“切割”得支离破碎的情况,如果不对照哈希值,后面写 U 盘也好、安装也罢,全都会莫名其妙失败。
提示:如果镜像站同时提供
openSUSE-Leap-15.0-DVD-x86_64.iso和openSUSE-Leap-15.0-Addon-NonOSS-Media-x86_64.iso这样的附加包,建议主 DVD 镜像就够用了。Addon 里面通常是非开源组件(如一些解码器),普通服务器部署用不上,离线环境里越少依赖越好。
2.2 制作U盘启动盘的两种方式
拿到 ISO 之后,接下来就是把它变成可引导介质。现在的服务器和台式机基本都有 USB 接口,用 U 盘启动比刻光盘省事太多。
方式一:Linux 系统下用 dd 命令
如果你手上有一台 Linux 机器,在终端里执行:
bash复制sudo dd if=openSUSE-Leap-15.0-DVD-x86_64.iso of=/dev/sdX bs=4M status=progress && sync
注意这里的 /dev/sdX 是你 U 盘对应的设备名,不是分区名。比如 U 盘显示为 /dev/sdb,那你写的是 /dev/sdb,千万别写成 /dev/sdb1。判断设备名可以用 lsblk 命令,看容量大小来确认。dd 命令的写入原理是把 ISO 文件按字节原样写入 U 盘的物理扇区,所以写完之后 U 盘在文件管理器里看可能会“变样”或者提示无法识别,这是正常的,不要格式化它。
方式二:Windows 系统下用 Rufus 或 Etcher
如果只有 Windows 电脑,推荐用 Rufus 或者 balenaEtcher。Rufus 在写入 openSUSE 的 ISO 时,会询问写入模式,这里一定要选择“DD 镜像模式”,而不是“ISO 镜像模式”。原因在于 openSUSE 的 DVD ISO 是一个混合 ISO(Hybrid ISO),它内部已经包含了适合 U 盘启动的引导逻辑,Rufus 如果按传统的 ISO 模式解包再写入,反而会破坏引导结构,导致 U 盘无法启动。Etcher 则没有这种问题,它默认就是按原始镜像写入的,对新手更友好。
这里额外说一句:U 盘质量也很关键。我试过用劣质 U 盘写入时速度忽快忽慢,安装过程中出现 I/O 错误,换了张口碑好的 U 盘就顺利通过了。如果条件允许,别在介质上省钱。
2.3 UEFI 与 Legacy 引导的选择
现在的电脑主要分为两种引导模式:UEFI 和传统的 Legacy BIOS(MBR)。openSUSE Leap 15.0 的 DVD 镜像同时支持两种模式,启动时会自动进入对应的引导界面。但如果你在安装时遇到“无法引导”的情况,第一件事不是怀疑镜像坏了,而是检查 BIOS 设置:
- 安装前进入 BIOS(开机按 Del、F2、F10 或 Esc,不同品牌不一样),确认启动模式
- 如果目标是新硬件,用 UEFI 模式 + 安全启动(Secure Boot)通常没问题,openSUSE 对 Secure Boot 的支持比较成熟
- 如果目标是非常老的机器(2012 年前后的),建议直接切 Legacy 模式
我在实践中的经验是:如果你的安装环境有明确的操作系统镜像规范,最好提前确认是 UEFI 还是 Legacy,因为这两种模式下硬盘分区表格式不一样(GPT vs MBR),后面对不上会有额外的麻烦。启动成功后会看到 openSUSE 的引导菜单,这时候就可以放心进入安装了。
3. 安装过程中的关键环节与离线配置细节
3.1 安装时语言选择与断网处理
从 U 盘启动进入 YaST 安装器后,第一步是选择语言、键盘布局。这里有个实用建议:如果这台机器将来是给自己管理,选“简体中文”完全没有问题;如果是给公司项目用、以后可能要长期 SSH 上去敲命令,建议装系统时用 English(关键是系统语言影响编码习惯和日志输出),后期维护时遇到英文报错也更好搜索答案。语言选项不会决定系统底层功能,但会影响 YaST 在安装过程中的默认配置路径,慎重选择能省点麻烦。
另一个重要操作:如果这台机器虽然目标环境是内网,但你安装时网络其实连通了,建议在安装开始前就断开网线或关闭无线开关。这不是手误,而是为了避免安装器自动探测到网络源后,在“软件选择”步骤尝试读取在线仓库。一旦它优先使用了在线源,安装过程就可能因为远程仓库速度慢或者网络抖动而中断,或者把在线源写进系统配置,导致后面离线环境启动时报错。离线安装,就要让安装器老老实实只用 DVD 里的内容。
3.2 分区方案设计与 Swap 大小
分区是安装过程中最容易让新手心里发怵的环节。YaST 默认提供的方案通常是“基于新建分区的建议”,它会自动规划 /、/home、swap 等分区。如果你对这块没有特别需求,直接用默认建议没有问题。但如果是要部署生产服务,我建议手动分区,心里更有数。
我常用的一个分区方案参考如下(假设一块 500GB 硬盘,主机内存 16GB):
| 分区 | 大小 | 类型 | 挂载点 | 说明 |
|---|---|---|---|---|
| /dev/sda1 | 1GB | ext4 | /boot | 单独分出来,避免 bootloader 和根分区相互影响 |
| /dev/sda2 | 16GB | swap | swap | 与内存等大,用于休眠和内存溢出兜底 |
| /dev/sda3 | 100GB | ext4 | / | 系统本身足够用 |
| /dev/sda4 | 剩余空间 | ext4 | /data | 业务数据单独放,重装系统不丢数据 |
关于 swap 大小,网上争论很多。我的建议是:物理内存在 8GB 以内,swap 给到内存的 1.5~2 倍;物理内存 16GB 以上,swap 给 16~32GB 就足够了。如果你要跑数据库或 Java 服务,swap 可以留得宽松一些,防止内存尖峰直接把进程 OOM 掉。
分区时还有一个小技巧:确认一下磁盘是 MBR 还是 GPT 分区表。如果 BIOS 用的 Legacy 模式,那磁盘控制在 2TB 以内用 MBR 没问题;如果超过 2TB 或目标机器是 UEFI,那必须用 GPT。YaST 在分区界面会让你选“磁盘标签”,选错了后续引导会失败,这是一个非常隐蔽的坑。
3.3 软件选择:“最小化安装”还是“带桌面”
Leap 15.0 的 DVD 镜像自带了很多软件包分组,YaST 的“软件选择”界面会列出不同的系统角色:带 GNOME 桌面、带 KDE 桌面、带 XFCE 桌面、服务器、最小化系统等。
离线环境下,我的建议是:如果目标是当服务器用,直接选“Minimal System(最小系统)”或者“Server with 基础软件”。原因很直接——DVD 里的桌面组件确实能装上,但在内网环境里,你几乎不可能靠 GUI 做日常维护,SSH 进去敲命令才是常态。而且包装得越多,以后离线环境里补安全补丁的负担越大。
如果你非要带桌面(比如这台机器要当内网的图形工作站),那 DVD 镜像里也有完整的 GNOME/KDE 包组,直接勾选即可,不用额外联网。不过要注意:带桌面的安装时间会比最小化安装多出一倍不止,安装时耐心等即可。
另外,在“安装设置”界面里有一个“软件源”区域。默认情况下,YaST 除了 DVD 源之外,可能还会自动探测到在线源。这一步在离线环境里必须处理干净:把检测到的在线源统统删除或取消勾选,只保留 DVD 源。否则安装过程结束时,YaST 会尝试重新读取所有激活的软件源来重建 RPM 数据库,在线源不可达就会报一个“Cannot find a valid baseurl”或者仓库读取失败的错误。这个我们下一章还会详细说。
3.4 用户、网络与安全相关设置
安装过程的最后阶段,会要求设置 root 密码和创建普通用户。这里有两个实操习惯供参考:
- root 密码一定要复杂度够高,尤其这种内网环境,虽然外网访问不到,但内网内部攻击仍然是真实存在的风险,弱密码等于门户大开
- 普通用户的 UID/GID 如果你不打算特别处理,用默认即可;但如果这台机器将来要挂载 NFS 或接入统一身份认证,那 UID 最好和公司规范对齐
在“网络配置”这块,离线安装时可以先不配置 IP,等系统起来之后再通过 YaST 或命令行配置。原因之一是安装程序阶段如果配错了静态 IP,后面登录排查反而不方便。系统装完首次启动后,直接编辑 /etc/sysconfig/network/ifcfg-eth0 这类配置文件或者运行 yast2 lan,把静态 IP、子网掩码、网关、DNS 一次性配好。
注意:openSUSE Leap 15.0 默认的网络管理工具是 Wicked,不是 NetworkManager(桌面版可能默认 NetworkManager)。两种工具管理的配置不能随意混用。如果你习惯了 NetworkManager 的
nmcli,在服务器上要么手动启用 NetworkManager,要么就用 wicked 的命令行工具,否则会出现“配置明明写了但不生效”的诡异问题。
4. 离线环境下的软件源配置与依赖处理
4.1 用 DVD 镜像建立本地软件源
系统装好之后,第一件重要的事就是解决“后续装软件怎么办”。既然内网没有外网,那你手头的 DVD 就是一个现成的软件源宝库。把 DVD 里的软件源挂载到系统里,能让 zypper install 直接复用系统盘里的软件包。步骤如下:
bash复制# 创建挂载点
mkdir -p /mnt/iso
# 如果光驱里有 DVD 光盘
mount /dev/sr0 /mnt/iso
# 如果是 ISO 文件放在硬盘某个目录下(比如 /data/os/openSUSE-Leap-15.0-DVD-x86_64.iso)
mount -o loop /data/os/openSUSE-Leap-15.0-DVD-x86_64.iso /mnt/iso
挂载完成之后,先把原有的在线源禁用,避免 zypper 每次刷新都去连外网等超时:
bash复制# 列出所有软件源
zypper repos
# 禁用所有源(或者指定源编号)
zypper mr -d --all
# 添加本地 DVD 源
zypper ar /mnt/iso local-dvd
# 刷新软件源缓存
zypper --gpg-auto-import-keys refresh
注意 zypper ar 后面跟的路径是仓库根目录,openSUSE 的 DVD 镜像里通常会有一个 media.1 目录和 repodata 目录,告诉 zypper 这是一个可以用 repomd.xml 元数据识别的仓库。刷新完成之后,zypper install nginx 这种命令就能直接从本地源里找包了。
如果你想让局域网里的其他机器也能共用这个 DVD 源,可以把 /mnt/iso 通过 NFS 共享出去,或者在能跑 HTTP 服务的机器上把该目录发布成一个静态站点,其他机器 zypper ar http://192.168.1.10/iso local-dvd 指向它即可。这也是内网环境里比较常见的做法。
4.2 获取离线依赖包的通用思路
但 DVD 源里的软件包终究是有限的。openSUSE 的仓库分成 oss、non-oss、update 等多个部分,DVD 只是截取了其中一个快照。如果你需要在离线环境里装一个特定版本的软件,比如 nginx 1.20 或某个内部开发的 rpm,那就得在外网机器上先把依赖包下载好,再搬进内网。这里我分享一个我实践过多次的方法:
第一步,在能联网的同版本 openSUSE 机器上,用 zypper 模拟安装拉取依赖:
bash复制# 只下载不安装,下载到 /tmp/pkg
zypper install --download-only --downloaddir /tmp/pkg nginx
这个命令会把 nginx 以及它依赖的所有 rpm 都下载到 /tmp/pkg 目录,不进行实际安装。然后把整个目录打包,拷到内网机器上。
第二步,在内网机器上用 rpm 手动安装:
bash复制cd /tmp/pkg
rpm -ivh *.rpm
rpm 命令会按包名排序依次安装,但依赖顺序不总是自动满足。如果提示某个依赖缺失,实际原因是下载打包的依赖不全,需要回到外网机器上再补下。更稳妥的方式是用 zypper install /tmp/pkg/*.rpm,让 zypper 来解析依赖关系:
bash复制zypper --no-gpg-checks install /tmp/pkg/*.rpm
这里有一个经验之谈:下载依赖包的时候,别偷懒省掉 --downloaddir 参数。很多新手直接用 zypper install nginx 发现无法安装,就是因为忽略了下载依赖的逻辑。
第三步,制作离线包清单。
这一点长期维护内网环境非常有用。每次在能上网的机器上下载完包,我会顺手生成一份清单,记录包名、版本、来源、下载日期:
bash复制rpm -qp --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' /tmp/pkg/*.rpm > package-list.txt
这样内网机器上装了什么、依赖来自哪里,都清清楚楚。等下次要重复搭建环境时,直接按清单下载部署,效率翻倍。
4.3 “Cannot find a valid baseurl”这类报错的本质
文章开头提到热词里有一堆什么 “cannot find a valid baseurl for repo: centos-*” 之类的问题,虽然那是 CentOS 环境的报错,但背后的思路在 openSUSE 下完全一致——系统里配置的某个软件源地址不可达了。
openSUSE 里,zypper 的源配置存放在 /etc/zypp/repos.d/ 目录下,每个 .repo 文件对应一个源。如果你在安装时没有清理在线源,那安装完成之后,这个目录里可能还残留着指向 https://download.opensuse.org/... 的仓库配置。在内网环境里,每次执行 zypper refresh 都会去尝试连接外网,结果当然是超时,然后给你抛出一大段仓库定位失败的错误。
排查思路如下:
bash复制# 查看所有源的详细信息,重点是 URL
zypper repos -d
# 紧急情况下直接禁用掉所有不可达的源(只要保留本地源)
zypper mr -d --all
zypper ar /mnt/iso local-dvd
zypper refresh
网络超时导致的报错通常都是上面这句 “Cannot find a valid baseurl for repo”。这句话的“valid”其实是指 zypper 在配置的 URL 下找不到 repodata/repomd.xml 这个文件。要么是 URL 本身不通,要么是 URL 没问题但目录里根本没有仓库元数据。你按上面的步骤把源切换到本地 DVD 挂载点之后,这个问题就自然消失了。
另外顺便提一句:如果你的内网里已经搭了 HTTP 仓库服务器(比如用 nginx 或者 createrepo 重新生成了元数据),那 zypper ar http://192.168.1.100/opensuse/ local-repo 的写法也是一样的,只要 URL 路径准确指向 repodata 所在目录即可。
5. 高频问题与排查速查表
5.1 安装过程中的引导与识别问题
离线安装 openSUSE Leap 15.0 时,我见过比较多的问题集中在引导环节。这里挑几个典型的列出来:
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| U 盘启动后黑屏/直接跳过引导 | U 盘写入模式不对,或者 BIOS 的 UEFI/Legacy 设置不匹配 | 用 Rufus 重新写入时选 DD 镜像模式;进 BIOS 切换 UEFI/Legacy,再试 |
| 安装界面出现但键盘/鼠标失灵 | 极老的主板缺少 USB 驱动 | 换 PS/2 接口键鼠,或者升级 BIOS |
| 提示 “No bootable device” | 写入的 U 盘分区表被破坏或 U 盘质量问题 | 重做 U 盘;在另一台机器测试 U 盘引导,确认是盘的问题还是机器的问题 |
| 安装器进度条卡住不动 | 硬盘控制器模式不兼容(IDE/AHCI/RAID 切换) | 进 BIOS 把 SATA 模式改成 AHCI 再试 |
一个通用建议:如果拿不准 U 盘有没有写对,先在虚拟机软件(比如 VMware Workstation 或 VirtualBox)里挂载这个 ISO 镜像跑一遍安装流程,确认 ISO 本身没有问题,再去物理机上折腾。这样可以把变量缩小到“机器硬件”这个层面。
5.2 安装后软件源与仓库元数据报错
安装完成进入系统之后的各种仓库类报错,是离线环境里最让人头疼的问题。汇总如下:
| 报错关键字 | 含义 | 处理 |
|---|---|---|
Cannot find a valid baseurl for repo |
仓库 URL 不可达或缺少 repodata | 删除/禁用该 repo,改用本地源或内网源 |
repomd.xml: No such file or directory |
URL 路径不对 | 检查仓库路径是否真正指向含 repodata 的目录 |
GPG key retrieval failed |
公钥未导入或离线无法获取 | 用 zypper --gpg-auto-import-keys refresh 自动导入;或临时用 --no-gpg-checks |
The repository ... is not valid |
元数据与系统版本不匹配 | 确认仓库 URL 对应的发行版是否同为 Leap 15.0 |
处理“GPG key”问题时,要注意安全边界。离线环境里没有外网,zypper 默认会尝试从软件源所在位置获取 GPG 公钥,如果拿不到就会报错。--gpg-auto-import-keys 能自动导入本地源里的 key,--no-gpg-checks 则是不做校验。对于已经用 sha256 校验过完整性的本地 DVD 源,临时用 --no-gpg-checks 并不会带来多大的实际风险,但在公网上这是绝对不能做的操作。
5.3 网络与系统服务启动类问题
装完系统之后,几个容易出现的问题在这里也记录一下:
问题一:开机很久才进入登录界面,日志里有 “A start job is running for wait for network”
这是 systemd 在等待网络配置完成。服务器上如果用 DHCP,但内网没有 DHCP 服务,就会一直等到超时。解决方法是给网卡配置静态 IP,或者在 /etc/sysconfig/network/config 里把 WAIT_FOR_NETWORK_TIMEOUT 调小。
问题二:配置了静态 IP 但不生效
如果你是用 yast2 lan 配置的,确认默认网络管理工具是否切换过。Leap 15.0 里 wicked 和 NetworkManager 不能同时启用,检查当前使用的是哪个服务:
bash复制systemctl status network
systemctl status NetworkManager
如果网络服务没起来,手动执行 systemctl start network 或 systemctl start NetworkManager 启动,并设置开机自启。
问题三:开机直接进入 emergency mode
这种通常是 /etc/fstab 里的挂载项有问题,比如某个分区 UUID 写错了,或者对应磁盘不存在。在紧急模式里执行 mount -a 查看具体报错,注释掉有问题的行再重启。如果磁盘还在但 UUID 变了,用 blkid 重新获取 UUID 并修正 fstab。
写在最后的实操体会
这套 openSUSE Leap 15.0 离线安装流程,说实话,我在第一次操作时也栽过跟头。最让我印象深刻的是“安装过程看似成功,但重启之后 zypper 疯狂报错”的那次——后来发现就是安装了带桌面版本之后,系统里残留了在线源配置,每次执行命令都先去外网碰运气,白白浪费了半个多小时定位问题。所以,如果你只记住这篇文章的一句话,那我就说这句:离线环境里一切问题优先检查软件源配没配干净。
另外,每次在内网机器上安装系统前,我强烈建议你在虚拟机上先用同一份 ISO 完整跑一遍安装和配置流程,把分区方案、软件源设置、网络配置都验证好,再拿到物理机上去操作。同时,装完系统、配好所有服务之后,有条件的话用 tar 或者 dd 做一个系统备份,这种灾难恢复的手段在隔离环境里非常实用。
从更长远的角度看,离线运维的核心不在于装系统本身,而在于建立起一套“软件包台账”机制:什么机器上装了什么软件、依赖是什么、从哪来的,都要有据可查。只有这样,当内网环境里某台机器需要扩容、迁移或重建时,你才能做到心里有数、手上不慌。openSUSE Leap 15.0 虽然已经不是最新版本,但它的稳定性和 YaST 工具链的成熟度,决定了它还会在很多隔离机房里继续服役很多年。希望这篇内容能帮你在面对这种“落后”但坚挺的系统时,少走一些弯路。
