ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Kylin V10离线安装ffmpeg:本地yum源与源码编译全攻略

Kylin V10离线安装ffmpeg:本地yum源与源码编译全攻略 前几天有同事跑过来找我说手里有一台Kylin V10的服务器放在内网环境里机房是彻底断网的他们想在机器上转一段监控视频结果发现ffmpeg根本没装yum install也直接失败。这种情况如果没处理过第一次遇到确实会卡很久但离线装ffmpeg这件事本质上就两条路一是把rpm包连同依赖一次性搬过去用本地yum源安装二是干脆从源码编译。两条路我都搭过不少次这篇就把Kylin V10离线安装ffmpeg的完整过程、依赖处理、踩坑点一次说清楚适合负责内网服务器运维、项目实施部署或者刚接触国产Linux系统没多久的同学参考。先给结论Kylin V10服务器版大多走的是rpm/yum这套包管理体系和CentOS/RHEL的兼容度很高所以离线安装ffmpeg优先级最高的方案是“在联网的同类系统上把ffmpeg和它的所有依赖包拉下来做成本地源拿到目标机器上装”。这套方案可控、可卸载、可重复执行比拿着源码到现场编译要稳得多。本文也会把源码编译作为备选路线完整讲掉防止你遇到“官方仓库里根本没有ffmpeg包”这种尴尬情况。1. 动手之前先把系统底细摸清楚1.1 Kylin V10的包管理体系银河麒麟V10不是一个单一的发行版它有服务器版、桌面版、云计算版等多个形态底层包管理也不一样。服务器版大部分采用rpm/yum/dnf体系和RHEL系高度同源桌面版则有些基于Debian/Ubuntu体系走的是apt。两者在离线安装上的思路差异很大rpm系的可以用yum本地源deb系的要用dpkg/apt离线包不能一概而论。所以你拿到一台“Kylin V10”机器第一步不是急着搜安装包而是先确认它到底是哪一套体系。执行这几条命令看输出cat /etc/os-release cat /etc/redhat-release 2/dev/null which yum dnf apt dpkg 2/dev/null如果输出里能看到ID: kylin、ID_LIKE: rhel或centos这类信息并且which yum能返回路径那你就放心把它当成CentOS/RHEL的亲戚来对待后面所有的yum/repotrack/createrepo操作都可以直接套用。如果输出里出现的是ID_LIKE: debian那就别按本文的rpm思路做要去找deb包和apt-offline方案不然第一步方向就错了。1.2 架构识别aarch64和x86_64完全不是一回事架构这个问题在离线安装里是重灾区。ffmpeg是个底层依赖很多的软件它的rpm包、动态库文件都跟着架构走x86_64的包装到aarch64机器上会出现Exec format error或者rpm安装时直接拒绝“wrong ELF class”。用下面这条命令看架构uname -m正常会输出两类输出结果架构说明x86_64Intel/AMD 64位主流服务器rpm包最多第三方源最全aarch64ARM 64位麒麟V10在信创/国产硬件上很常见rpm包相对难找这里强调一下uname -m输出的aarch64和操作系统内核、glibc版本一样会直接影响你下载哪个rpm包。准备离线安装包时一定、必须、只能从和离线机器同架构的同系列系统上抓包。宁可在准备阶段多花十分钟确认也别把一堆包拷过去后发现全是白费工夫。1.3 三条路线怎么选离线装ffmpeg我总结下来有三条路线各有各的适用场景本地yum源方式推荐在联网机器上把ffmpeg及其所有依赖rpm包全部下载到本地目录拷到离线机器建一个本地yum源然后用yum安装。优点是依赖自动处理、可卸载、可批量部署缺点是准备阶段需要花心思拉全依赖。源码编译方式在离线机器上装好编译器、nasm、各种编解码库的devel包然后源码configure、make、make install。优点是能自定义编译选项、用最新版本缺点是耗时长、中间报错多对新手不友好。静态编译二进制方式网上有别人编译好的静态ffmpeg单文件拷过去就能跑。优点是最省事缺点是静态包的宿主系统glibc版本、架构如果和你的系统差异大跑起来会报错而且很多静态包不带x264、x265这些常用编码器实用性打折。我只把它当成临时应急手段不推荐作为生产环境的方案。2. 准备离线安装包在联网机器上把包抓全2.1 首选repotrack而不是yumdownloader既然确定了走本地yum源的路线接下来最关键的一步就是在联网机器上把ffmpeg和它依赖的所有rpm包完整地下载下来。这一步做不好后面离线机器上安装时会连环报错。很多教程会让你用yumdownloader --resolve但我实际用下来更推荐repotrack。先说区别。yumdownloader --resolve只会下载当前系统没装的依赖如果准备机器上某个依赖包已经装过了它就不会下载。问题是准备机器和目标机器不可能软件环境完全一样你很难保证目标机器上那个依赖包也存在。一旦缺装的时候就抓瞎。repotrack则是把包的全部依赖链整体拉下来——不管当前机器装没装过它都会全部下载到指定目录。这样虽然包数量会多一些但胜在省心、齐全。对离线部署来说“宁可多带不可漏带”是铁律。在联网机器上执行yum install -y yum-utils dnf-utils # 不同系统二选一RHEL8/CentOS8用dnf-utils mkdir -p /opt/ffmpeg_rpms repotrack ffmpeg -p /opt/ffmpeg_rpms如果repotrack这条命令报“Unable to find a match: ffmpeg”说明当前系统启用的仓库列表里根本没有ffmpeg这个包。这时候不要急着换工具而是先解决“仓库里有没有ffmpeg”这个问题具体见2.2。2.2 ffmpeg包宁可从官方/兼容源找别病急乱投医在RHEL系生态里ffmpeg这个包不一定在默认的BaseOS/AppStream仓库里。CentOS 7时代一般要从EPEL或者nux-dextop这种第三方仓库装RHEL 8/9和对应的衍生系统上EPEL里倒是提供了ffmpeg但前提是系统本身能用EPEL的包。麒麟V10虽然有兼容RHEL的基因第三方源的rpm能不能直接装上还是要试了才知道千万不要默认“一定能用”。我的建议搜索顺序是这样的先看麒麟官方软件仓库里有没有ffmpeg。不同版本、不同架构的V10软件仓库里的包不一样先搜官方源。再到EPEL对应的版本仓库里找。比如你的V10底层接近RHEL 8就去EPEL 8的仓库列表里翻ffmpeg包和它的依赖。最后才考虑rpmfind这类RPM搜索网站手工找。手工找包最累因为ffmpeg的依赖很多你光靠“缺什么搜什么”一个个点人会疯掉。无论从哪个源下载都要留个心眼看清楚rpm包对应的操作系统、版本和架构并核对一下包的签名或校验和。离线环境里没有自动校验的机制而ffmpeg这种系统级软件是要以root权限装的来源不明很容易埋雷。如果麒麟官方仓库里压根没有ffmpeg而EPEL也装不上那就别硬磕rpm路线了直接跳到第4章走源码编译更省力两条路我都写清楚了。2.3 源码编译路线的依赖包也要提前准备源码编译不是到了离线机器上才想起来缺什么。我在实操中通常会在联网准备机上一次性把所有编译工具和第三方库的devel包全部拉下来一起带过去repotrack gcc gcc-c make pkgconfig nasm yasm \ libx264-devel libx265-devel libvpx-devel \ libmp3lame-devel opus-devel libtheora-devel \ libvorbis-devel zlib-devel bzip2-devel -p /opt/ffmpeg_build_deps这样在离线机器上先把这些rpm文件拷过去用同样的建源方式安装之后源码编译时就不会因为找不到头文件、找不到库而中断。如果你不需要某个编码器对应的devel包可以少拉一点但gcc、make、pkgconfig、nasm这四个几乎是跑不掉的尤其是nasm版本还不能太低老版本在编译x264时会直接报错。3. 离线上机实操本地yum源安装最稳3.1 拷贝和目录规划在联网机器上抓完包之后把/opt/ffmpeg_rpms整个目录拷到离线机器上。拷贝方式可以是U盘、移动硬盘、内网scp怎么方便怎么来关键是目录里要干净只放rpm文件不要混入其他文件。在离线机器上我给这个目录取名为/opt/ffmpeg_rpms与准备机器保持一致方便后面写repo文件时路径统一。如果你的内网有多台相同类型的机器建议目录命名时带上前缀标识比如/opt/rpms_ffmpeg_aarch64不然过几个月再看你根本想不起来这个目录里是什么架构的包。3.2 createrepo建源是核心关键到了离线机器上进入目录后第一件事不是直接rpm -Uvh而是建本地源createrepo /opt/ffmpeg_rpms如果系统没有createrepo命令说明这台机器连createrepo这个工具都没装。方法也很简单在准备机器上执行repotrack createrepo -p /opt/createrepo_rpms把它和它的依赖一起带过去先rpm安装再继续。小坑提醒一下createrepo依赖的包不多基本就是libxml2和python-deltarpm这些带上就完事。建源成功后会看到目录下多了一个repodata文件夹里面是元数据信息。接下来写一个本地repo文件vi /etc/yum.repos.d/ffmpeg-local.repo内容如下[ffmpeg-local] nameFFmpeg Local Repository baseurlfile:///opt/ffmpeg_rpms enabled1 gpgcheck0然后清理yum缓存并验证yum clean all yum repolist这里有一个很多新手容易忽略的点本地源的gpgcheck必须设为0。因为你的rpm包是从其他机器上带过来的本地目录里没有对应的GPG公钥如果保留gpgcheck1yum会在安装时卡在GPG校验这一步然后报“GPG key retrieval failed”。设成0不是什么“不安全”的操作而是明确告诉yum“这些包的来源我们自己控制”在隔离内网里这是常规做法。3.3 锁定本地源安装并验证本地源配好后执行安装命令时要显式禁止一切网络源yum install -y ffmpeg --disablerepo* --enablerepoffmpeg-local加--disablerepo*这个参数非常关键。如果离线机器上残留了系统原来的网络仓库配置yum会先去请求这些网络源然后因为连不上网络而长时间卡住最后才回落到本地源白白浪费几分钟时间。你直接让它只用本地源安装过程会飞快。安装完成后验证ffmpeg -version ffmpeg -encoders | grep 264 ffmpeg -decoders | grep 264ffmpeg -version能看到版本号、编译配置、库版本-encoders能看到系统支持哪些编码器。如果之前拉包时带了libx264-devel这里应该能看到libx264编码器说明转码能力是完整的。还可以顺手做一个最小转码测试验证它不是“装上了但跑不了”ffmpeg -f lavfi -i testsrcduration1:size1280x720:rate30 -f null -这条命令用ffmpeg内置的测试源生成一段1秒视频并解码输出到空设备整个过程不依赖真实视频文件快速验证安装是否可用。3.4 建不了源时的rpm硬装兜底方案如果目标机器上没有createrepo而且你去准备机器上拉createrepo也不方便还有一个兜底办法直接rpm -Uvh硬装rpm包。但这里有个讲究。不要一上来就rpm -Uvh *.rpm --nodeps--nodeps会把所有依赖检查全部跳过装完当时看着没事等到实际运行ffmpeg时报一堆libavcodec.so.58: cannot open shared object file那时候再回头排查痛苦程度翻倍。正确做法是先试一次不带--nodeps的安装cd /opt/ffmpeg_rpms rpm -Uvh *.rpm如果有依赖缺失rpm会报类似“xxx is needed by ffmpeg-xxx.rpm”的信息。看到缺哪个包就到目录里找到对应rpm包先单独装它装完再重试全量安装。这个过程多来一两轮依赖就理顺了。虽然手动但至少每个包都是经过校验的不会留下“装上了但库缺失”的暗病。如果目录里确实缺某个依赖rpm又不想回联网机器重新拉包还有一种取巧方式看这台机器上是不是已经存在这个软件的老版本或者相近版本用yum localinstall有时能借助系统已装包解决实在没有还是要回去补包没有更好的捷径。4. 没有现成rpm时源码编译的完整路线4.1 什么时候必须走源码编译rpm路线虽好但并不是所有环境都有现成的ffmpeg rpm包。我遇到过几种情况离线机是aarch64架构第三方官方仓库里只有x86_64的ffmpeg包麒麟官方源里的ffmpeg版本太老项目需要较新版本特性需要开启特定的编译选项比如自定义编码器、硬件加速支持分发版默认包满足不了。这些情况下源码编译从“备选方案”变成了“必走之路”。好在你已经把编译工具和依赖库的devel包都准备好了见2.3所以现场不会太痛苦。4.2 源码编译的依赖是绕不开的坎编译ffmpeg不像装个普通软件那么简单它本质上是在组装一条音视频处理的工具链。最常用的编码器库有这些库名称作用对应devel包x264H.264视频编码libx264-develx265H.265/HEVC视频编码libx265-develvpxVP8/VP9视频编码libvpx-develmp3lameMP3音频编码libmp3lame-developusOpus音频编码opus-develtheora/vorbis老牌音视频编码libtheora-devel / libvorbis-devel源码编译过程中最烦的报错就是ERROR: libx264 not found。这不一定是你没装libx264-devel更常见的是pkg-config找不到它——库装了但PKG_CONFIG_PATH没有指向正确的目录。解决方式是把相关路径加进环境变量再重新configureexport PKG_CONFIG_PATH/usr/local/lib/pkgconfig:/usr/lib/pkgconfig:$PKG_CONFIG_PATH export PATH/usr/local/bin:$PATH另外如果configure时看到nasm版本过低直接去准备机器上拉一个高版本的nasm rpm包带过来比在离线机器上手编nasm要快得多。我见过有人因为nasm版本卡了一整天其实换个包几分钟就完事。4.3 configure、make、install现场实录完整流程整理如下tar xf ffmpeg-6.1.tar.xz cd ffmpeg-6.1 PKG_CONFIG_PATH/usr/local/lib/pkgconfig:/usr/lib/pkgconfig:$PKG_CONFIG_PATH \ ./configure \ --prefix/usr/local/ffmpeg \ --enable-gpl \ --enable-libx264 \ --enable-libx265 \ --enable-libvpx \ --enable-libmp3lame \ --enable-libopus \ --disable-doc \ --disable-debug make -j$(nproc) make install ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/local/bin/ffmpegmake -j$(nproc)会根据CPU核数并发编译能大幅缩短编译时间。我见过有人在4核机器上只敲make等了半小时才编译完加-j4后七八分钟就搞定。编译完成后ffmpeg会安装在/usr/local/ffmpeg目录下软链接做不做取决于你的PATH里有没有这个目录。我个人习惯软链到/usr/local/bin因为这个路径在所有用户的PATH里默认都有省得再改环境变量。注意软链接要用绝对路径不要用相对路径否则挪动目录后链接会失效。4.4 编译版本的卸载和管理源码编译安装的软件没有rpm包的卸载体系管理方式全靠自己。你唯一要记住的就是--prefix指定的安装目录比如/usr/local/ffmpeg想卸载时直接删这个目录再删掉软链接就干净了。所以这里再次强调configure时--prefix一定要按自己的习惯写清楚不要用默认的/usr/local。如果用了默认路径ffmpeg的可执行文件、库文件、头文件会分散到/usr/local/bin、/usr/local/lib、/usr/local/include各个地方将来想清理根本没法清干净。指定独立目录是自我管理的基本功。5. 离线安装ffmpeg常见问题排查速查5.1 高频报错对照表我把这几年遇到的高频问题做了一个速查表算是整个离线安装流程的最实用部分报错信息原因解决方式No package ffmpeg available当前仓库没有ffmpeg包启用EPEL/第三方源或改用源码编译Failed to download packages联网机器和目标机器网络环境不一致确认联网机可以访问所需仓库先yum makecachePublic key for xxx.rpm is not installed本地源gpgcheck未关闭把repo配置里的gpgcheck改为0Exec format error下载的包架构不对用uname -m确认真实架构重新拉包libavcodec.so.58: cannot open shared object file动态库缺失检查依赖是否装全用ldd $(which ffmpeg)查缺库ERROR: libx264 not found编译时找不到x264头文件确认libx264-devel已装检查PKG_CONFIG_PATHERROR: assembler not found (nasm)nasm没装或版本过低安装新版本nasm包不建议源码手编make: command not found基础编译工具缺失安装gcc、make相关的rpm包5.2 装完能用但运行时报动态库缺失这是离线安装最阴险的问题yum装的时候不报错你执行ffmpeg --version也能看到版本但真到转码的时候系统告诉你找不到某个.so文件。排查思路固定三步ldd $(which ffmpeg) | grep not found find /usr -name libavcodec.so* 2/dev/null ldconfig第一步ldd会列出ffmpeg运行时依赖的所有动态库标出哪些找不到。缺库就两步排查如果这个库应该由某个rpm包提供回去补装那个包如果库已经在系统里但路径不对用find找到真实路径确认后执行ldconfig刷新动态库缓存。绝大多数情况是第一步——yum源建的时候漏了某个依赖或者准备机器上已装了某个库目标机器上没有所以又被绕回到“依赖要拉全”这个老生常谈上。5.3 多台机器批量部署的收尾建议如果内网环境里不止一台Kylin V10机器要装ffmpeg第一台装好只是开了个头。装好第一台后我会做三件事第一把/opt/ffmpeg_rpms目录原封不动拷贝到一个所有机器都能访问的内网共享目录或文件服务器上后面每台新机器装的时候拷过去直接用不用再回到联网机器重新拉包第二把建好的/etc/yum.repos.d/ffmpeg-local.repo文件也存一份每台机器上复制过去路径保持一致第三在部署文档里写清楚这批rpm包的来源、版本、架构和拉包日期。这个习惯看着不起眼但过三个月你再回头看能省掉大量回忆成本。5.4 离线环境里最常见的“习惯性翻车”最后我想专门说说yum本地源的路径问题。很多人建了本地源后死活用不了一看日志baseurl写的是file:///opt/ffmpeg_rpms这个写法没错但经常有人少写一个/或者多写了一层路径比如file://opt/ffmpeg_rpms结果是无效路径。判断方式很朴素在浏览器或者文件管理器里能不能打开这个路径打不开yum一定也打不开。另外拷贝rpm包到目标机器时我发现过有人用U盘拷贝后目录里多了一堆.rpm.1、.rpm~这样的后缀这些都是编辑器或中断拷贝留下的备份文件。给yum建源时源目录里出现非标准后缀的文件虽然大部分情况下不影响使用但建议还是清理干净再建源省得以后排查问题时被误导。如果你是要在aarch64的麒麟V10上离线装ffmpeg我个人的实际体会是不要指望能找到完全匹配的现成rpm包老老实实准备一台同架构的联网机把编译工具、nasm、libx264-devel这一整串依赖全拉过去走源码编译路线。表面上看编译过程多花了半小时实际上比在离线机器上东拼西凑找rpm再修复依赖冲突要快得多。至于x86_64的环境优先尝试官方仓库和EPEL能走本地yum源就走本地yum源rpm包能被yum管理对后续运维来说都是加分项。这套离线安装的思路也不是ffmpeg专用nginx、node、postgresql这些常用软件在一个隔离环境里第一次部署时套路完全一样联网准备机器上拉全依赖、离线机器上建本地源、锁定源安装、验证结果。把这条方法论吃透以后遇到任何离线部署需求你都不会再心里发怵。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进