拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

内网离线安装vim:yum/apt依赖拉取与本地源搭建全攻略

内网离线安装vim:yum/apt依赖拉取与本地源搭建全攻略 干活的时候常常会遇到这种尴尬情况内网服务器不联网生产环境出于安全考虑禁了外网但手头又需要装一个命令工具。就拿 vim 来说这东西听起来不是个大事真到了离线环境yum install 或 apt install 直接报“cannot find a valid baseurl”或者“Unable to locate package”瞬间把人卡住。这个场景我处理过不止一次从早期的 CentOS 6/7到后来的 Ubuntu 18.04/20.04/22.04 都踩过坑。这篇文章就把 yum 和 apt 两种包管理体系下离线安装 vim 的完整思路、具体命令、还有各种坑点一次性讲清楚适合运维、DevOps、以及所有要在隔离环境里装软件的开发者。这篇文章会覆盖从“在能联网的机器上把软件包和依赖全部拉下来”到“通过 U 盘/内网传输到目标机器”再到“本地源搭建/dpkg 安装/源码编译”的完整链路。不管你是 CentOS 系还是 Ubuntu/Debian 系都能找到一套能直接照抄的方案。最后还会附上我实际干活时总结的排查表和偷懒技巧这些大多不是官方文档会写的东西全是从报错堆里爬出来的经验。1. 离线安装前必须先理清的三条路线离线安装这件事很多人一上来就搜“如何离线安装 vim”然后照着网上的命令敲结果还是装不上。原因是没搞明白离线环境里软件分发的底层逻辑。在 Linux 世界里软件不是一个大文件夹拷过去就能用的它由程序本体、配置文件、动态链接库、辅助脚本等一堆文件组成这些文件被打包成 rpm 或 deb 格式包之间还有依赖关系。yum 和 apt 之所以好用是因为它们能自动解析依赖一旦脱离了网络这套自动解析就断了你得手动把依赖链补齐。1.1 为什么离线装 vim 会被卡住vim 在 CentOS 上通常对应 vim-enhanced 这个包但安装时依赖 vim-common、vim-filesystem还可能依赖 ncurses-libs、perl、python3-libs 等系统库。Ubuntu 上的 vim 包也类似会依赖 vim-runtime、libtinfo、libgpm2 等。这些依赖本身又有各自的依赖。很多时候你辛辛苦苦把所有 rpm 包下载好传到内网机器上敲 rpm -Uvh *.rpm结果冒出一串“requires xxx”的报错就是因为依赖链没抓完整。另外还有一个容易被忽略的问题系统版本不同包仓库里的软件版本和依赖也不一样。CentOS 7 的 vim-enhanced 依赖的是旧版 ncursesUbuntu 22.04 的 vim 依赖 libtinfo6在 CentOS 7 上去装 Ubuntu 的 deb 包或者反过来永远是行不通的。所以第一步不是想怎么安装而是先确认目标机器的系统版本、架构、以及包管理器类型。1.2 三种主流可行方案的优劣对比针对离线安装 vim 这件事我实践下来有三条路线。第一条路是“在有网的机器上用包管理器下载 rpm/deb 包然后拷贝到内网用 rpm/dpkg 安装”。这条路工作量最小适合包依赖简单、只装一两个软件的场景。但遇到依赖多、依赖套依赖时手动拉依赖很容易漏。第二条路是“在离线机器上搭建一个本地软件源”。先在联网机器上把某个软件及其所有依赖下载到同一个目录然后把整个目录拷进内网用 createrepoCentOS或 dpkg-scanpackagesUbuntu生成仓库索引再在离线机器上配置一个指向本地目录的源。配置好之后yum install vim 或 apt install vim 依然能用依赖解析交给包管理器去做。这条路的初期准备成本高一点但一劳永逸而且后续在内网装别的软件也能复用这个本地源。第三条路是源码编译安装。直接从 vim 官方仓库或镜像站下载源码包在离线机器上编译。这条路不依赖 rpm/deb 依赖解析但需要提前准备好编译工具链和开发库比如 gcc、make、ncurses-devel这些库本身也是依赖大户准备起来并不轻松。| 方案 | 适合场景 | 依赖处理能力 | 门槛 | | --- | --- | --- | --- | | rpm/dpkg 包搬运 | 包少、依赖简单 | 需要手动解析 | 低 | | 本地源搭建 | 内网环境长期使用 | 交给包管理器 | 中 | | 源码编译 | 没有现成二进制包 | 依赖开发库 | 高 |一般情况下我更推荐第二种方案。原因很直接vim 本身依赖的包大概在 5 到 10 个之间手拉也能拉完但一旦哪天你想在内网装 htop、tmux、git同样的离线流程又要重新走一遍。本地源搭好之后这些问题都变成一次性的。2. CentOS/RHEL 系实战用 yum 工具链离线拿包CentOS 和 RHEL 系的离线安装思路核心是借助 yum 的下载工具在有网的机器上把 rpm 包抓下来。常见的工具有 yumdownloader、repotrack以及 yum 自带的 --downloadonly 参数。三种工具各有特点下面逐个说清楚。2.1 用 yumdownloader 下载 vim 主包yumdownloader 是 yum-utils 包提供的工具专门用来只下载不安装。在能联网的 CentOS 机器上先确保 yum-utils 已安装yum install -y yum-utils然后下载 vim-enhanced 主包到指定目录mkdir -p /root/vim-offline yumdownloader vim-enhanced --destdir/root/vim-offline这条命令执行完你会看到 /root/vim-offline 下面多了一个 vim-enhanced-8.x.x-x.el7.x86_64.rpm。注意它只下载这一个 rpm不处理依赖。如果目标机器上的 vim-common、vim-filesystem 等依赖包没有后续 rpm -Uvh 一样会报错。所以 yumdownloader 适合你对目标机器已装的依赖包心里有数的情况否则很容易漏。2.2 用 repotrack 把依赖一网打尽如果你不想手动判断依赖那就用 repotrack。它是 yum-utils 里的另一个工具功能比 yumdownloader 强得多会把指定包以及所有依赖包全部下载下来。repotrack vim-enhanced --destdir/root/vim-offline执行完后你会看到 /root/vim-offline 里不仅有 vim-enhanced还有 vim-common、vim-filesystem、ncurses-libs、perl 等一堆 rpm 包。整个过程相当于在本地把“yum install vim”的依赖计算逻辑完整跑了一遍下载结果直接对应目标机器所需的所有 rpm。这也是我目前最推荐的拉包方式尤其是当你不知道目标机器还缺哪些依赖时一把梭全拉下来最省心。需要注意的是repotrack 默认会下载所有架构的包。如果你的下载机器是 x86_64目标机器也是 x86_64那没问题。如果目标机器是 arm64最好在下载命令里加上 --arch 参数否则可能拉进一堆无关的 i686 包。2.3 离线机器上安装 rpm 包与搭建本地源rpm 包拉回来之后传输到离线机器上最简单的安装方式是rpm -Uvh /path/to/download/*.rpm这个命令会把目录下所有 rpm 一起处理并按依赖关系尝试安装。如果依赖齐全一次就过。如果遇到依赖报错先检查是不是有包没拉全或者用下面的本地源方案。本地源方案的步骤如下。先把 rpm 包都放到一个固定目录比如 /opt/local-repo。然后安装 createrepo 工具在联网机器上提前准备好并用它生成仓库元数据mkdir -p /opt/local-repo cp /root/vim-offline/*.rpm /opt/local-repo/ createrepo /opt/local-repo如果离线机器上没有 createrepo可以在联网机器上把 createrepo 的 rpm 包也一起下载安装后再执行上述命令。生成好 repodata 目录后在离线机器上新建一个 repo 文件cat /etc/yum.repos.d/local.repo EOF [local-repo] nameLocal Repository baseurlfile:///opt/local-repo enabled1 gpgcheck0 EOF然后清理缓存并安装yum clean all yum makecache yum install -y vim-enhanced搭建本地源的好处是yum 自己会处理依赖顺序你再也不用关心 vim-enhanced 先装还是 vim-common 先装。而且这个 local-repo 以后可以一直往里面加包createrepo 重新跑一遍就能继续用算是内网服务器非常实用的基建。3. Ubuntu/Debian 系实战apt 离线下载与安装Ubuntu 和 Debian 系的离线安装思路跟 CentOS 系类似但工具用法完全不同。apt 系没有一个像 repotrack 那么直接的“全量拉依赖”命令好在有几种组合技巧可以达成同样的效果。3.1 apt-get download 只能拉单个包依赖要另想办法apt-get download 是最基础的拉包命令在联网机器的任意目录执行mkdir -p /root/vim-offline cd /root/vim-offline apt-get download vim这样只会把 vim 的 deb 包下载到当前目录依赖依然不管。如果直接拿这些 deb 去内网 dpkg -i大概率会报“dependency problems”。实际工作中我很少单独用它除非我明确知道目标机器上已经有了所有依赖包。3.2 利用 apt-get 缓存目录一次性抓取全部依赖更推荐的思路是利用 apt 的下载缓存机制。在一台与目标机器系统版本一致的联网机器上先更新软件源然后执行apt-get install -y --download-only vim这个命令不会真的安装 vim它会把 vim 以及所有依赖的 deb 文件全部下载到 /var/cache/apt/archives 目录。之后把该目录下的所有 .deb 文件拷贝出来即可。mkdir -p /root/vim-offline cp /var/cache/apt/archives/*.deb /root/vim-offline/需要注意预装系统时可能已经存在一些版本不一致的 deb 缓存最好先清空一下缓存目录避免混入过期或无用的包apt-get clean apt-get install -y --download-only vim这样 /root/vim-offline 里的 deb 包就是 vim 依赖链的完整快照。把整个目录传到离线机器后安装方式有两种。3.3 离线机器上两种安装 deb 的方式第一种是直接 dpkg 安装目录下所有 debdpkg -i /root/vim-offline/*.deb如果依赖完整且顺序没问题一次就能装好。但如果 deb 包的依赖顺序比较乱dpkg 可能报错解决办法是再执行一次apt-get -f install -yapt 会自动根据已下载的 deb 包修复依赖关系前提是这些 deb 文件在 apt 能识别的位置推荐直接放到 /var/cache/apt/archives。这也是一个实际的技巧很多新手遇到依赖报错就以为过程失败了其实执行一遍 fix 就能解决。第二种更优雅的做法是把这些 deb 包做成一个本地 apt 源然后离线机器上 apt install vim 就能直接安装。方法如下mkdir -p /opt/local-apt cp /root/vim-offline/*.deb /opt/local-apt/ cd /opt/local-apt dpkg-scanpackages . /dev/null | gzip Packages.gzdpkg-scanpackages 由 dpkg-dev 包提供如果没有就先安装它。然后把本地源添加到 apt 源列表echo deb [trustedyes] file:/opt/local-apt ./ /etc/apt/sources.list.d/local.list apt-get update apt-get install -y vim这个方案和 CentOS 上搭本地 yum 源是同一个思路配置一次后面想在内网装别的软件往 /opt/local-apt 里丢新 deb重新跑一遍 dpkg-scanpackages 即可。关于版本一致性有一个需要特别注意的地方拉包机器的系统版本必须和离线机器一致否则 deb 依赖的 libc 版本、库文件版本对不上dpkg 装完也可能运行不起来。我建议直接从 Ubuntu 22.04 机器上拉的包只用于另一台 Ubuntu 22.04跨大版本基本不用试。4. 终极兜底方案源码编译安装 vim包管理器这条路走不通时还有一个几乎万能的兜底方案源码编译。vim 的源码包非常轻量编译安装也不复杂难点在于提前准备编译环境。离线机器上通常不会预装 gcc 和一大堆开发库而缺少这些库一样会让你寸步难行。所以源码编译的核心战役还是“离线准备编译依赖”。4.1 编译 vim 前需要准备的依赖库vim 源码编译时最核心的依赖是 ncurses 开发库它提供终端控制能力。如果 configure 阶段报错说找不到 terminal library几乎都是因为缺少 ncurses-develCentOS或 libncurses-devUbuntu。另外如果你想让 vim 支持 python3、lua 等特性还需要对应的开发库。在 CentOS 上联网机器准备这些开发包时可用yum groupinstall -y Development Tools yum install -y ncurses-devel python3-devel然后用 repotrack 把这两个包连同依赖拉下来拷贝到离线机器安装。Ubuntu/Debian 系对应的是apt install -y build-essential libncurses-dev python3-dev同样通过 apt-get install --download-only 提前拉取全部 deb。这个过程准备起来比直接拉一个 vim 的 rpm/deb 要繁琐毕竟 gcc、make 这些工具链依赖的包数量不少。所以我的经验是源码编译是兜底方案不是首选。系统里如果已经有完整开发工具链比如装过数据库或编译过 Nginx那用它完全没问题如果开发工具链也要从零搭建那不如老老实实走本地源路线。4.2 编译选项与常见报错处理源码编译的步骤相对固定tar -xzf vim-9.x.tar.gz cd vim-9.x ./configure --prefix/usr/local \ --with-featureshuge \ --enable-python3interp \ --with-python3-commandpython3 make -j$(nproc) make install这里给两个提示。第一--with-featureshuge 建议保留它决定 vim 的很多高级特性是否启用默认的 small 模式剪掉太多功能。第二如果不需要 GUI 版 vim不要加 --enable-gui免得 configure 阶段去检查 GTK 库在离线环境里平白多出一堆依赖。常见的报错之一是configure: error: no terminal library found原因就是 ncurses-devel/libncurses-dev 没装。CentOS 上检查一下 /usr/include/ncurses.h 是否存在即可Ubuntu 上可以查看 /usr/include/ncurses.h。如果缺就去网上联机环境把对应开发包拉过来再回来重新 configure。另外一个常见报错是 python3 相关如果是 --enable-python3interp 导致的 configure 失败可以先去掉这个选项优先保证 vim 能跑起来之后再补特性。源码编译安装后的 vim 位于 /usr/local/bin/vim而系统可能已经有一个老版本在 /usr/bin/vim输入 vim 时优先调用哪个取决于 PATH 顺序。如果发现敲 vim 还是老版本直接用绝对路径 /usr/local/bin/vim或者去改 PATH 环境变量这个细节容易被忽略。5. 离线安装高频翻车点与排查速查离线安装 vim 这件事说难不难但我在实际过程中确实遇到过不少千奇百怪的问题有些报错甚至能让人怀疑人生。下面把最常见的四类问题整理成一张速查表并且对每个问题补充一些排查思路。| 报错/现象 | 常见原因 | 解决方向 | | --- | --- | --- | | rpm -Uvh 报 requires xxx | 依赖包没拉全 | 用 repotrack 重新拉全部依赖或把 rpm 放入本地源用 yum install 替代 rpm -Uvh | | dpkg -i 报 dependency problems | 依赖缺失或安装顺序不对 | 将 deb 放入 /var/cache/apt/archives 后执行 apt-get -f install | | No package vim-enhanced available | yum 源里没有对应的包或源配置错误 | 更新 repolist 列表检查可用源CentOS 8/9 注意确认 baseos 源没有关闭 | | Unable to locate package vim | apt 源列表中没有满足 sources.list 的源 | 检查 /etc/apt/sources.list 与 /etc/apt/sources.list.d/ 下配置执行 apt update 后再试 | | error: no terminal library found | ncurses 开发库缺失 | 安装 ncurses-develCentOS或 libncurses-devUbuntu | | rpm 包架构 i686 与 x86_64 不匹配 | repotrack 拉取了多架构包 | 下载时加 --arch 参数过滤或只拷贝目标架构 rpm | | gpgcheck 失败 | 本地源未做签名或 GPG key 缺失 | 本地源 repo 文件中设置 gpgcheck0仅限内网信任环境 | | vim 装好后运行报 libtinfo.so.5 找不到 | deb 或 rpm 包版本与系统库版本不匹配 | 确认下载包的机器系统版本与离线机器一致重新拉包 |下面挑几个重点展开因为这几个问题真的能把人卡半天。5.1 依赖包下载不完整是最常见的问题很多用户反映“我明明把 vim 的 rpm 下载过去了怎么安装还报错”原因几乎都是只下载了主包没有下载依赖。CentOS 系用 yumdownloader 只拉主包时最容易触发这个问题。解决方案有两个方向一是改用 repotrack 一次性拉全二是在离线机器上把 rpm 全部放到一个目录配好本地 yum 源后用 yum install 替代 rpm -Uvh让 yum 自己去按依赖安装。Ubuntu 系的 deb 也同理最安稳的还是把 deb 放进本地 apt 源。5.2 本地源配好了却依然找不到包这种情况多发生在 CentOS 环境。检查点有三个第一/etc/yum.repos.d/local.repo 的路径是否写对baseurl 为 file:///opt/local-repo 时目录务必存在且执行过 createrepo第二执行 yum clean all 和 yum makecache 刷新缓存第三用 yum --disablerepo* --enablerepolocal-repo install vim-enhanced 时确认 local-repo 这个名字与配置一致有时是 enabled1 没写导致仓库没生效。Ubuntu 系如果配完 apt 本地源后 apt update 没找到新包多半是 Packages.gz 没有重新生成或者 deb 文件放的位置和 sources.list 里的路径不匹配。此时重新执行 dpkg-scanpackages . /dev/null | gzip Packages.gz然后 apt update基本都能解决。5.3 版本与架构不匹配用一台 CentOS 7.9 的机器拉包装到 CentOS 7.4 的机器上大多数情况没问题因为 7.x 内部兼容性较好。但如果你用 CentOS 8 的包去装 CentOS 7那必然失败因为 libc、库文件差异巨大。Ubuntu 更是如此20.04 的 deb 包和 22.04 的 deb 包最好不要混用。至于架构问题服务器基本都是 x86_64但公司里偶尔会有 arm64 的机器比如华为鲲鹏、飞腾等。下载时注意架构匹配这是离线安装铁律。检查方法很简单在目标机器上执行 uname -m。5.4 离线环境要不要关闭 GPG 校验在搭建本地源时我一般直接把 gpgcheck0 或 apt 的 [trustedyes] 加上。原因很务实内网本地源里的包都是自己从官方源拉下来的校验链本身是可信的。如果不关闭创建仓库时还得额外做本地签名会多出一层并不必要的复杂度。但如果公司安全规范要求开 gpgcheck那就把公钥导入到系统信任链里并确保签名完整不要为了省事绕过安全策略。6. 实操心得内网环境下的搬运技巧与长期维护建议最后分享一点实操中沉淀下来的经验这些细节算不上核心原理但往往能决定一次离线交付是半小时搞定还是折腾一下午。关于文件搬运。rpm/deb 包本身不大vim 依赖全拉下来也就十几到几十兆字节U 盘拷贝足够。但如果是批量给几十台服务器分发建议先把目录打包压缩成一个 tar.gz再用 rsync 或 scp 传到目标机器解压后再建源。千万别一台一台传整个目录效率太低。内网如果开了 HTTP 服务也可以把包目录直接丢到 Nginx/Apache 下局域网内其他机器用 http:// 方式配置 yum/apt 源连 U 盘拷贝都省了。这个技巧在实际批量运维时非常管用。关于长期维护。本地源不是建完就一劳永逸的。随着系统安全补丁更新、软件版本迭代本地源里的包会慢慢过期。我个人的习惯是每隔三个月左右在有网环境重新拉一遍常用工具链的包比如 vim、tmux、htop、git、tree 这类高频工具然后同步进本地源目录重新生成索引。这样离线服务器的运维压力会小很多。关于最小化依赖。如果只是临时用一次 vim 编辑个配置其实不用非得装 vim-enhanced。很多精简系统自带 vi如果你只是改改文件vi 完全够用。还有更轻量的做法是用 busybox 里的 vi或者直接 sed/awk 处理文本。但如果你想在内网长期维护服务器vim 还是值得正经装一下的它在语法高亮、插件生态、批量编辑方面的体验和 vi 完全不是一个量级。在做离线安装这一类事情时我最大的体会是先把目标机器的系统、架构、已有依赖盘清楚再选择方案千万不要一上来就复制粘贴一堆命令。离线环境下的每一步操作成本都比在线环境高所以宁可前面多花十分钟想清楚也不要在装到一半时报错再回头补包。大家如果严格按照文中的方法操作从拉包到安装成功整个过程不会超过半小时。以后碰到其他软件要离线装只要把命令里的包名换掉同一套流程依然能复用。
返回列表