ARTICLE DETAIL

资讯详情

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

银河麒麟v10 sp2离线安装LibreOffice与中文乱码解决实战

银河麒麟v10 sp2离线安装LibreOffice与中文乱码解决实战 前阵子接手一台银河麒麟服务器v10 sp2任务很明确装LibreOffice。说起来一句话的事真动起手来发现里面藏着不少细节从软件源有没有、机器能不能联网到装完中文乱码、无图形界面下怎么用每一步都可能卡一下。这篇文章就把整个安装过程、踩坑点和最终能落地运行的方案完整写出来给同样要在麒麟系统上装办公套件的朋友做个参考。不管你是刚接触国产服务器的运维新人还是要在内网环境里做文档转换服务的开发这篇都适用。1. 服务器上装办公套件先搞清楚LibreOffice是来干嘛的1.1 后台文档转换和批量处理才是主要场景我见到很多人拿到这种需求第一反应是“服务器上装什么办公软件又没人坐在那里编辑文档”。这个想法没错但恰恰忽略了LibreOffice在服务器上真正的价值它是目前Linux生态里文档转换能力最强的开源套件。典型的场景有这么几类OA系统里预览Word、Excel附件后端调用LibreOffice转PDF再展示。批量把老旧的doc、xls、ppt格式转成docx、xlsx、pptx或者统一转PDF归档。合同、通知这类模板套打用模板填充数据后导出PDF下发。内网邮箱解析带附件的邮件需要提取文档内容做全文检索。某些开发框架比如Java里的JODConverter需要常驻LibreOffice进程提供转换接口。在这些场景里LibreOffice是以无界面“后台服务”的身份存在的不需要键盘、不需要显示器只需要命令行能跑起来就行。这也是我写这篇文章时重点覆盖的方向。1.2 为什么选LibreOffice而不是WPS或者OpenOffice国内用户对WPS很熟OpenOffice也有一定知名度但如果你要部署在服务器上做自动化处理LibreOffice基本是唯一省心的选择。WPS Linux版在桌面环境做得不错但命令行转换能力、headless模式支持、与外部程序的接口都远没有LibreOffice成熟。你很难找到一套干净的WPS批量转PDF方案而且WPS的授权协议在服务器商用场景下还得仔细看条款。OpenOffice的问题更直接项目更新节奏太慢对新版文档格式兼容性跟不上开发社区已经大量转向LibreOffice。LibreOffice从OpenOffice分叉出来之后不管是格式兼容、性能还是API接口都明显更活跃。再加上LibreOffice是自由的LGPL/Mozilla协议服务器上随便装不用担心授权费。所以这个选择题几乎没有悬念银河麒麟v10 sp2上的办公套件LibreOffice就是最优先方案。2. 安装前必须摸清的三件事系统版本、CPU架构、软件源状态2.1 一次查清家底三行命令背后的信息拿到机器先别急着装先花两分钟确认环境。很多安装问题其实都是环境没搞清导致的。cat /etc/os-release cat /etc/kylin-release uname -mos-release和kylin-release会告诉你当前系统是不是v10 sp2。实际生产环境里我也见过打着sp2旗号、实际补丁状态乱七八糟的机器所以别只看标签以系统文件为准。uname -m更关键。银河麒麟v10 sp2支持的架构很多x86_64、aarch64、loongarch64、sw_64都有对应版本。同样叫“LibreOffice”x86_64的rpm包装不到aarch64机器上这是最基础的常识但也是最容易犯的错。下载安装包之前必须确认手里的包和机器架构一致。2.2 软件源和网络边界的判断麒麟v10 sp2虽然拿CentOS的软件包格式和依赖体系做了不少兼容但它用的是自己的一套软件源。装软件之前先看一下源的状态yum repolist如果输出里能看到麒麟的官方源并且状态正常大概率可以直接在线装。如果repolist是空的或者提示找不到repo文件那就得先配源或者干脆走离线包方案。再判断一下机器网络边界curl -I http://archive.kylinos.cn 21 | head -20 ping -c 3 archive.kylinos.cn这一步的目的是搞清楚这台服务器到底能不能连外网。实际运维中很多机ia都在内网隔离区只有内网IP公网流量出不去。这时候就算源配置得再完整也白搭必须换思路。2.3 按网络条件确定安装策略根据上面的检查基本就三种情况情况特征安装策略有外网能访问麒麟源或公网镜像dnF/yum直接在线安装最省事有内网镜像源不能出外网但内网有yum源配置内网repo文件后在线安装完全离线外网、内网源都没有用另一台同架构机器拉取rpm包搬运后离线安装我在实际项目里遇到的服务器三分之二都是最后一种情况。所以第4章我会重点讲离线安装那是真正考验功力的地方。3. 有网环境一条dnf命令装完但别忽略这几个细节3.1 瘦身版安装适合后台文档处理的组件组合如果服务器能正常访问麒麟软件源安装本身并不复杂。但我不建议一上来就dnf install -y libreoffice装全量因为LibreOffice全家桶的依赖非常多可能拖进来几百个包磁盘占用轻松上2GB。很多服务器没必要装全套。我通常会先问自己这台机器要拿LibreOffice干什么如果只是后台转换文档装核心组件加三大件就够了dnf install -y libreoffice-core libreoffice-writer libreoffice-calc libreoffice-impress libreoffice-langpack-zh-CNlibreoffice-core是基础writer、calc、impress分别对应文档、表格、演示。libreoffice-langpack-zh-CN是中文语言包我建议不管有没有图形界面都装上否则后面用命令行转换时某些导出行为和界面语言会变成英文默认排查问题的时候很不方便。这个组合体积小很多依赖也少日常业务里九成以上的转换需求都能覆盖。3.2 完整版安装图形界面用户的场景如果这台机器装了图形桌面或者你希望接一个远程桌面让非技术用户也能点鼠标处理文档那直接装完整版也行dnf install -y libreoffice完整版会带上Base数据库、Draw绘图、Math公式编辑器等组件。虽然看似冗余但好处是格式兼容能力最全。比如Draw可以直接打开PDF做简单编辑Math组件在某些公式转换场景会用到如果不装个别文档里嵌的公式对象可能处理不好。装完之后可以顺手确认一下版本libreoffice --version如果源里版本比较老比如6.x而业务上明确需要更高版本比如别人转给你了一个7.4.7的包先别急着卸载重装参考第7.3节的内容再做决定。3.3 装完的第一轮冒烟测试装完之后不能光看版本号就完事一定要做一次真实的转换测试。我一般这样测mkdir -p /tmp/conv echo 中文测试文档 /tmp/conv/test.txt cd /tmp/conv soffice --headless --convert-to pdf --outdir /tmp/conv /tmp/conv/test.txt ls -lh /tmp/conv/test.pdf如果test.pdf正常生成说明安装没大问题。注意第一条soffice命令首次运行会初始化用户配置目录可能稍慢后面会快很多。这一步有个很容易被忽略的坑中文内容转出来的PDF如果在电脑上打开是乱码或者方块说明系统缺中文字体。处理办法见第5章。4. 无网环境离线RPM包的拉取、搬运与本地仓库搭建4.1 在有网机器上把依赖一次拉全离线安装的核心难点不在“装”而在“怎么把依赖搞全”。LibreOffice的依赖关系用“一串”形容都太保守几十个包很正常手动一个个下根本不现实。我的习惯做法找一台和服务器同架构、能访问外网的机器在上面用dnf把LibreOffice及所有依赖下载到一个目录里。比如要装精简版组件mkdir -p /data/lo-rpms dnf download --resolve --alldeps --destdir /data/lo-rpms \ libreoffice-core libreoffice-writer libreoffice-calc libreoffice-impress libreoffice-langpack-zh-CNdnf download是dnf子命令不在就装一下yum-utils。--resolve参数很关键它会把依赖包一并下载--alldeps则确保不管哪一层依赖都覆盖到。下载完成后检查一下目录里rpm包的数量和总体积ls /data/lo-rpms | wc -l du -sh /data/lo-rpms通常这个目录会有几十上百个包体积几百MB到1GB以上具体取决于系统已有的基础依赖和你选择的组件范围。4.2 搬运到内网后的两种安装姿势把/data/lo-rpms目录打包传到内网服务器接下来有两种安装方式。第一种也是最省事的直接yum localinstall。它能自动识别目录里所有rpm之间的依赖关系比裸用rpm命令友好太多cd /data/lo-rpms yum localinstall -y *.rpm第二种适合内网有多个机器都要装的情况先把目录做成一个本地yum源所有机器统一从源安装。做法是先安装createrepo工具并生成仓库元数据dnf install -y createrepo createrepo /data/lo-rpms然后写一个local.repo文件放到/etc/yum.repos.d/[local-lo] nameLocal LibreOffice RPMs baseurlfile:///data/lo-rpms enabled1 gpgcheck0之后其他机器只要把这个repo文件复制过去就能直接dnf --disablerepo* --enablerepolocal-lo install -y libreoffice-core libreoffice-writer libreoffice-calc libreoffice-impress libreoffice-langpack-zh-CN用localinstall方案装一台机器很快但如果后面还要装第二台又得重新找包、重新传不如一次性把本地源搭好后续只是往目录里放包的问题。4.3 离线安装最容易踩的坑依赖遗漏、时间错乱、架构混用离线安装过程里最常翻车的几个点我一个个说。依赖遗漏是头号问题。有时候你在有网机器上下载时某些共享依赖包由于系统里已有更高版本被dnf跳过但内网机器上偏偏缺这个包导致localinstall时还是报依赖缺失。解决办法很简单装的时候用yum localinstall如果提示缺某个包回到有网机器上单独下载那个rpm再传过来反查依赖命令rpm -qpR 缺的那个包名.rpm第二个坑是系统时间。很多内网机器长时间不和外部时间源同步系统时间可能偏了好几年。rpm包安装时要校验GPG签名签名时间窗口对不上会报类似“key is not trusted”或“timestamp is in the future”的错误。此时先同步时间date -s 2025-01-01 12:00:00或者用内网时间服务器同步。这一步不解决后续每个rpm都要加--nogpgcheck很麻烦也不安全。第三个坑是架构混用。特别是公司内部有多个不同架构的机器时下载目录一定要分架构存放比如/data/lo-rpms/x86_64和/data/lo-rpms/aarch64分开。一旦把x86_64的包传到aarch64机器上rpm命令会直接拒绝安装报“wrong architecture”这时候只能重新拉包浪费时间。5. 中文显示乱码字体的检查、安装与验证清单5.1 先确认是不是缺字体LibreOffice本身对中文文本的处理能力没问题Linux服务器上生成PDF中文乱码九成原因是系统里没有可用中文字体。文本渲染时找不到字体只能显示成方块或空白。排查很简单先用fontconfig工具看系统里有没有中文字体fc-list :langzh如果输出为空或者只有零星一两个生僻字体那基本就是缺字体。顺便看一下系统已有的字体总数fc-list | wc -l正常装了桌面环境的机器这个数字至少几百纯服务器场景几十甚至十几都很正常。5.2 中文字体安装和缓存重建银河麒麟的软件源里一般有文泉驿和Noto CJK字体这几个都是开源可免费使用的。安装命令dnf install -y wqy-microhei-fonts wqy-zenhei-fonts fonts-noto-cjkwqy-microhei是文泉驿微米黑屏幕显示效果不错wqy-zenhei是文泉驿正黑也是经典选择Noto-CJK是Google和Adobe联合推出的开源方案字重多、覆盖全。三个都装上不冲突LibreOffice会自动选择合适的字体。如果服务器完全离线装不上这些字体包也可以从Windows机器复制几个常用中文字体到服务器上。比如把msyh.ttc微软雅黑、simsun.ttc宋体拷贝到/usr/share/fonts/chinese/目录。但这么做要留意字体版权商业用途慎用。我自己的服务器上还是坚持用开源字体省心。字体文件放进去之后重建字体缓存fc-cache -fv然后再次验证fc-list :langzh | head -20看到输出的字体名和路径说明字体已经被系统认到了。5.3 转换测试和PDF内嵌字体验证字体装完不能直接说“行了”要拿真实中文文档测一遍mkdir -p /tmp/conv echo 银河麒麟LibreOffice中文测试 /tmp/conv/test.txt soffice --headless --convert-to pdf --outdir /tmp/conv /tmp/conv/test.txtPDF生成后如果有pdffonts工具可以直接检查PDF用到了哪些字体pdffonts /tmp/conv/test.txt.pdf正常的输出应该能看到类似WenQuanYi Micro Hei或Noto Sans CJK SC这样的字体名。如果显示的是方框说明字体没嵌进去或者压根没生效回到第5.2节再查一遍字体安装步骤。这一步做完LibreOffice中文乱码问题才算真正闭环。6. headless模式服务器上真正好用的LibreOffice用法6.1 无图形界面也能跑的原理服务器上装好LibreOffice之后大部分人第一反应是“装完了然后呢我又没有屏幕上用”。这里的核心答案是--headless参数。LibreOffice底层启动时可以不带图形界面运行它把文件加载、转换这些工作全部放在后台完成。你可以把headless模式理解成“一个不需要显示器的Office员工”你递给它一个docx它默默吐出一个PDF全程没有任何窗口。这个模式在服务器上太重要了。没有图形库依赖不会因为缺GTK/QT环境而报错内存占用也更小。很多自动化脚本和业务系统调用的都是这个模式。6.2 最常用的转换命令和参数最基本的转换命令soffice --headless --convert-to pdf --outdir /data/output /data/input/report.docx参数拆开看--headless指定无界面模式--convert-to pdf表示目标格式是PDF--outdir指定输出目录最后一个参数是源文件路径。除了PDF还可以转成其他格式# 转成Word格式 soffice --headless --convert-to docx --outdir /data/output /data/input/report.odt # 转成Excel格式 soffice --headless --convert-to xlsx --outdir /data/output /data/input/report.ods # 提取文本内容 soffice --headless --convert-to txt:Text --outdir /data/output /data/input/report.docx转换格式后面的:Text这种写法是指定“过滤器”有时候同样的扩展名有不同的过滤方式精确指定可以避免意外结果。6.3 批量处理脚本与用户profile锁冲突批量转换是服务器场景最常见需求。一个朴素而有效的bash循环mkdir -p /data/pdf for f in /data/docs/*.doc /data/docs/*.docx; do if [ -f $f ]; then soffice --headless --convert-to pdf --outdir /data/pdf $f fi done这里有个非常好的坑要提醒LibreOffice默认使用用户profile目录~/.config/libreoffice保存配置和锁文件。如果多个转换任务同时启动或者上一个任务异常退出没删锁后面的任务会卡住或者直接报错。解决方案是给每个任务指定单独的profile目录soffice --headless -env:UserInstallationfile:///tmp/lo_profile_$(date %s%N) \ --convert-to pdf --outdir /data/pdf /data/input/report.docx用-env:UserInstallation参数把用户目录指向临时位置任务之间互不干扰。我在crontab里跑批量转换时永远都会带上这个参数不然每月总会有几次莫名“卡死”。6.4 和Java/Python服务集成的后续方向如果后面业务系统要集成LibreOffice做在线文档转换有几个成熟的方向可以看。Java生态最常用的是JODConverter它通过UNO API连接LibreOffice进程把转换能力封装成Java接口。服务启动时拉起一个LibreOffice常驻进程后续转换请求通过socket发过去性能比每次重新启动soffice好很多时有转换需求时再启动进程。Python生态可以用unoserver或直接调用unoconv。unoserver的思路和JODConverter类似让LibreOffice以服务模式常驻避免频繁启停导致的profile锁和启动开销。当然前提是机器内存足够常驻进程比一次性的soffice占内存大约每进程300-500MB。集成时还要考虑文件并发和内存限制。LibreOffice单进程转换多文件时会串行处理高并发场景最好做任务队列或者启动多个LibreOffice实例配合不同profile目录否则容易出现资源争抢。7. 银河麒麟v10 sp2的坑位记录安全模块、版本残留和升级选择7.1 kysec安全增强导致程序启动异常银河麒麟v10 sp2默认开启了系统安全增强模块kysec。它的作用是对软件做访问控制有些场景下LibreOffice这种大型软件第一次执行时会被它拦截表现为命令行执行soffice毫无报错但图形界面起不来或者日志里出现“permission denied”但文件权限看起来完全正常。如果你确认安装步骤没问题、权限没问题、依赖没问题但LibreOffice就是启动不了优先怀疑这个安全模块。解决办法是到系统的安全中心/控制面板里把LibreOffice相关的可执行文件路径加入信任区。命令行下也可以查看安全状态不过不同小版本的命令和界面位置略有差异图形化工具最稳妥。这个坑不是每个sp2版本都会遇到但遇到一次就够折腾半天所以单独列出来提醒。7.2 旧版本残留导致的依赖错乱银河麒麟服务器里有时候会预装OpenOffice或者老版本LibreOffice。新装的LibreOffice和旧版本混在一起会产生一些奇怪问题菜单是英文、组件版本不一致、某些格式打不开、soffice调用的库文件还是旧的。遇到这种情况最有效的做法是把旧的全部清干净再装dnf remove -y openoffice* libreoffice* rm -rf ~/.config/libreoffice ~/.config/.libreoffice然后重新执行在线或离线安装流程。注意删除之前先看看有没有依赖这些库的业务程序免得连锁卸载把别的组件带崩了。7.3 要不要把LibreOffice升级到新版本银河麒麟官方源里的LibreOffice版本通常比较保守可能是6.x或7.0左右。业务上如果只是做格式转换这个版本完全够用没必要追新。但如果你确实需要7.4.x等高版本比如新格式支持、某些Bug修复我的建议是优先找适配麒麟的离线rpm包。LibreOffice官网提供面向RHEL系和Debian系的包不过那些包是为标准RHEL环境构建的直接拿到银河麒麟上装偶尔会碰到依赖不一致的问题。个人经验是在生产环境里尽量用系统源里的稳定版本而不是从官网强行装新包。LibreOffice的版本号对日常用来说没那么敏感稳定压倒一切。强烈建议先在测试环境验证好再推到生产。7.4 卸载和清理的完整流程最后补一个卸载流程因为升级或者回滚的时候会用到dnf remove -y libreoffice*卸载后检查残留目录ls -a ~/.config | grep -i libreoffice把这些目录删掉rm -rf ~/.config/libreoffice rm -rf /tmp/lo_profile_*如果之前注册过系统服务或者环境变量也要一并清理。这样重装的时候就是干干净净的状态不用担心旧配置影响新版本。按我这几年在国产服务器上折腾的经验说LibreOffice本身不是难点难的是怎么把环境里的各种意外情况都预料到。装一台服务器就顺手记一份部署笔记把版本、rpm包清单、字体、踩过的坑写下来几台机器装完你的离线安装流程会越来越顺。这个习惯比任何一条具体命令都管用。
返回列表