ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

信创服务器麒麟操作系统配置与管理实战经验

信创服务器麒麟操作系统配置与管理实战经验 开头部分这两年做信创项目我算是把“磕磕绊绊”四个字体会得淋漓尽致。从最开始拿到一台预装麒麟操作系统的服务器连关机命令都要翻半天手册到后来能在信创环境里装Node、调Java Web应用、排查fastjson乱码问题中间踩过的坑一个接一个。回头看看这些坑本身其实是宝贵的经验积累。如果你也在做信创相关的工作或者即将接一个和信创沾边的项目这篇文章应该能帮你少走不少弯路。我会把自己在信创服务器操作系统配置与管理麒麟版上的完整经历、遇到的典型问题、排查思路和最终解法原原本本记录下来包括那些看起来不起眼但特别耽误事的细节。内容不搞虚的全是实操。我没有按“教科书”的方式去写而是按时间线和问题类型混排。先讲环境认知和系统安装阶段的事再讲日常配置和开发环境搭建然后把fastjson乱码这种让人头秃的问题单独拿出来复盘最后把证书、名录、比赛这些和信创项目深度绑定但又容易被忽视的事情说清楚。1. 从接到项目到摸清家底信创环境的整体认知1.1 信创项目到底是什么上手前先想清楚这几点信创全称是信息技术应用创新本质上就是在一套国产化的软硬件栈上把业务跑起来。过去我们写代码、部署服务默认都是在某个固定的芯片架构和操作系统组合上做到了信创项目里从底层芯片到操作系统、中间件、数据库甚至终端设备全都可能换成国产方案。这意味着很多以前“理所当然”的操作在信创环境里都需要重新验证一遍。我接手的第一个信创项目目标很明确把一套原有的Java Web系统迁移到国产服务器上跑通。听起来不复杂但真做起来问题一个接一个。操作系统用的是麒麟V10CPU是ARM架构aarch64这和以前惯用的x86_64 CentOS组合完全不一样。最直接的感受就是安装软件时不再是无脑下载一个安装包就完事得先确认包是不是支持当前架构系统自带的仓库里到底有没有这个软件版本够不够新。上手之前我建议你先花半天时间把所有信息收集齐。包括服务器的CPU型号、操作系统具体版本是麒麟10还是麒麟10 SP132位还是64位、内核版本、系统盘大小、网络环境、是否有外网权限等。这些信息直接决定了后面每一步的做法。有一个小命令可以一口气看大部分信息hostnamectl uname -a cat /etc/os-release lscpu1.2 硬件与系统版本盘点先确认架构再谈安装在信创项目里芯片架构是个绕不开的话题。目前常见的国产CPU有ARM架构的也有x86架构的还有少数其他自研架构。不同架构的软件包完全不通用装错了一律报错而且报错信息往往让人摸不着头脑。第一次在一台国产服务器上执行./install.sh时脚本直接告诉我“cannot execute binary file”当时第一反应是权限问题后来仔细一看是二进制文件的架构和本机CPU对不上。判断系统架构最简单的方式是执行uname -m。如果是aarch64就说明这是ARM 64位架构如果是x86_64那就是常见的Intel或AMD兼容架构。拿到这个结果之后所有下载的软件包都要去找对应的版本。比如Oracle JDK、Node.js、Tomcat都有专门的Linux ARM64版本千万不能贪方便拿x86的包凑合用。还有一个小细节lscpu里会显示CPU厂商和型号很多国产CPU在型号上会显示“Kunpeng”或“Phytium”之类的字样方便你确认具体是哪家芯片后面适配的时候用得上。系统版本方面麒麟V10有基于openEuler维护的版本也有基于CentOS衍生出来的版本。不同维护线路的软件管理方式和目录结构略有差异但大体上遵循Linux的习惯。可以用cat /etc/os-release看ID和VERSION_ID再确认系统用的是yum还是dnf还是apt。麒麟多数场景用的是yum或dnf但也要看具体分支用which yum dnf apt一次性试探。1.3 双系统引导那些事把启动顺序调顺再干活我在这台服务器上先装了麒麟系统后面为了对比测试又装了另一个Linux发行版结果开机默认进了新系统每次想回麒麟都得手动重启选引导项相当烦人。双系统或多系统共存时默认IP地址、网络服务和业务服务全都依赖开机进入正确的系统启动顺序问题必须提前解决。解决的方式很直接改GRUB引导配置。麒麟系统默认使用GRUB2作为引导管理器配置写在/boot/grub2/grub.cfg也可能是/boot/grub/grub.cfg视具体引导方式而定但日常我们不会直接改这个编译出来的文件而是改/etc/default/grub。要让麒麟系统作为默认启动项先找到它对应的菜单条目。执行grep -E ^menuentry /boot/grub2/grub.cfg可以看到系统里所有的启动项名称。找到包含“Kylin”的那一行记录下完整的菜单名字。然后把GRUB_DEFAULT从原来的数字改成菜单名称的字符串形式GRUB_DEFAULTKylin Linux V10改完保存重新生成GRUB配置grub2-mkconfig -o /boot/grub2/grub.cfg有些基于Debian风格的麒麟版本会用update-grub但为了保险我用grub2-mkconfig指定输出路径。执行完成后重启默认就会进入麒麟系统了。这里有个实操中容易踩的坑如果GRUB菜单里同时存在“高级选项”、“救援模式”之类的子菜单直接用名称匹配可能选错最好先用grubby --infoALL查看每个内核的索引信息确认index后再用数字指定。比如GRUB_DEFAULT0表示第一个菜单项。数字指定法在系统更新内核后可能漂移名称指定法更稳定但名称需要与grub.cfg中完全一致包括引号不能有多余空格。2. 麒麟系统基础配置网络、仓库与常用命令2.1 用nmcli一行行配网络比点界面靠谱拿到一台新服务器第一件事是配网络。麒麟系统自带图形化网络配置工具但服务器环境往往没有显示器我只能通过SSH或者直接在本地终端操作。很多同事习惯直接编辑网络配置文件但在麒麟上我更推荐用nmcli因为NetworkManager是默认的网络管理服务通过它修改配置能自动生效不需要记忆太多配置文件路径。先看一下当前网卡的状态nmcli device status ip addr show假设我的网卡名是ens33要配置静态IP为192.168.1.100/24、网关192.168.1.1、DNS为8.8.8.8可以这样操作sudo nmcli connection modify ens33 ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns 8.8.8.8 8.8.4.4 sudo nmcli connection up ens33注意ipv4.addresses后面必须带子网掩码也就是/24这种格式如果漏了NetworkManager会认为你要配置一个不带掩码的地址导致路由异常。还有ipv4.dns多个DNS之间用空格分隔整段加引号。如果改了连接配置没有生效先执行nmcli connection reload再执行up。有些麒麟版本重启网络服务用的是systemctl restart NetworkManager这个不影响已配置的连接信息可以放心用。还有一种情况是服务器只有DHCP分配的内网IP但业务需要固定IP和网络管理员沟通时必须问清楚是不是所有IP都由MAC绑定自动分配。如果交换机上做了端口安全你手动改成静态IP可能导致直接断网。我遇到过一改IP就失联的情况最后发现是接入交换机的策略只允许特定MAC的IP分配。从操作层面来说配网络前先ip link查MAC地址交给网络管理员比对比盲配靠谱得多。2.2 镜像源替换与基础软件安装麒麟系统自带的软件源在国外但部分版本的源也在国内。为了让yum install速度更快通常需要换成国内开源镜像站。这里有一个注意事项不同版本对应的源路径可能不同直接照搬网上的配置可能匹配不上。我的做法是搜索“麒麟V10 yum源”或“Kylin V10 repo配置”找到对应版本和架构的repo文件放到/etc/yum.repos.d/目录然后执行yum clean all yum makecache。如果系统是APT系就直接改/etc/apt/sources.list。装上基础软件这件事看起来简单却经常在国产系统上卡住。举几个常见例子想安装gcc、make这些编译工具可能发现源里没有某个依赖包想安装zip、unzip可能仓库里只有zip没有unzip。我的习惯是先把yum groupinstall Development Tools装上然后再按需安装其他软件。对于没有现成包的情况就只能从开发者网站下载源码在本地编译。源码编译是信创环境里非常重要的基础技能尤其是系统自带gcc版本旧时很多新代码编译不过去可能需要额外安装高版本gcc或利用Software CollectionsSCL工具集。还有一个小技巧尽量安装net-tools、lsof、strace这些排查类工具。信创系统为了精简很多都默认不自带netstat和lsof等到排查问题时才发现没有工具会很尴尬。提前把yum install net-tools lsof strace tcpdump装上。2.3 关机重启这些“小操作”也要重新适应在信创项目里连关机命令都算是一个值得记录的“坑”。别笑最初我确实在使用习惯了CentOS的init 0和shutdown -h now之后在麒麟系统上执行shutdown -h now结果发现机器没有关机而是进入了待机或某种低功耗状态。后来确认不同的电源管理策略下shutdown -h的行为会有差异推荐使用systemctl poweroff或者systemctl halt来彻底断电。麒麟基于systemd所以所有systemd命令都能用。日常工作里我用得最多的几个命令是systemctl poweroff # 关机 systemctl reboot # 重启 systemctl halt # 停机不切断电源 init 0 # 传统关机方式兼容性尚可如果你遇到关机命令无效或者关机很慢先检查一下是不是有用户未退出导致systemd等待。执行who查看当前登录用户把会话正常注销后再关机。还有systemd-logind在某些版本上对非root用户的关机权限控制比较严格如果systemctl poweroff提示权限不够可以试试poweroff命令或者sudo systemctl poweroff。这类问题在服务器上看似小题大做但如果是无人值守机房一个不彻底的关机可能导致后续远程开启失败。3. 装Node、装JDK国产系统上的开发环境折腾记3.1 确认架构后选对Node.js安装包信创项目的应用层往往需要部署Node.js服务。我的第一个目标是搭建一个Node.js环境用来跑一个前端资源构建服务。原本以为curl -sL https://deb.nodesource.com/setup_16.x | bash -一把梭就行结果麒麟系统上既不是Debian也不是标准CentOS这个脚本根本没法用。正确做法是先确认架构然后下载对应的tar.xz包。以Node.js 16.20.2为例wget https://mirrors.huaweicloud.com/nodejs/v16.20.2/node-v16.20.2-linux-arm64.tar.xz tar -xJf node-v16.20.2-linux-arm64.tar.xz mv node-v16.20.2-linux-arm64 /usr/local/nodejs然后添加环境变量。编辑/etc/profile.d/nodejs.sh写入export NODE_HOME/usr/local/nodejs export PATH$PATH:$NODE_HOME/bin执行source /etc/profile.d/nodejs.sh后用node -v验证。如果提示cannot execute binary file多半是下载成了linux-x64版本用uname -m再确认一遍。另外提醒一点Node.js的版本选择要考虑下面要运行的框架或工具。信创环境里我倾向于选择偶数版本比如14、16、18因为这些版本生命周期更长社区里针对国产系统踩坑的案例也更多遇到问题容易搜到解决方案。如果用太新的奇数版本可能在某个依赖上卡半天。3.2 JDK与Tomcat的部署细节Java服务在信创环境里同样需要特别小心。先看一个常识Oracle JDK和OpenJDK都有专门的linux-aarch64版本如果你下载的是linux-x64的JDK或者linux-i586的老JDK直接无法运行。安装JDK的方式多种多样最简单的是直接用麒麟自带的包管理器安装OpenJDKyum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel检查版本java -version javac -versionjava-1.8.0-openjdk-devel这个包必须装否则只有jre没有javac后面想编译Java程序会提示找不到命令。Tomcat方面直接下载apache-tomcat-9.0.x.tar.gz解压后就能用。注意Tomcat也会区分linux-aarch64的压缩包吗其实Tomcat是纯Java写的它的压缩包不区分CPU架构只要JDK能跑它就能跑。这也是Java技术栈在信创环境里的一个优势跨架构能力很强。启动Tomcat之前先配置JAVA_HOME。编辑/etc/profile.d/java.shexport JAVA_HOME$(dirname $(dirname $(readlink -f $(which javac)))) export PATH$PATH:$JAVA_HOME/bin这里我特意用readlink -f去解析javac的真实路径就是为了避免因为软链而拿不到实际安装目录。确认完JAVA_HOME后catalina.sh start启动再检查logs/catalina.out里有没有异常。3.3 环境变量配置与启动脚本优化环境变量是信创项目里最容易出幺蛾子的地方。我见过一个同事把JAVA_HOME直接写死在某个服务的启动脚本里结果系统更新JDK后那个服务怎么都起不来。为了避免这种问题我倾向于把基础环境变量统一放到/etc/profile.d/目录下并把服务脚本里的绝对路径用变量替代。多版本JDK共存时环境变量优先级也很讲究。系统自带的java可能被某个旧的alternatives链点指向老版本用update-alternatives --config java可以切换默认版本。同样update-alternatives --config javac也要看。麒麟系统基于RPM系用的都是alternatives机制这个命令在切换JDK版本时特别好使。另一个容易被忽略的点是启动脚本里的内存参数。国产服务器如果物理内存不大而JVM默认堆内存又按物理内存比例分配会导致启动后系统内存不足。建议在JAVA_OPTS里显式指定初始堆和最大堆比如export JAVA_OPTS-Xms512m -Xmx1024m养成把JAVA_OPTS写进服务脚本的好习惯能省不少运维麻烦。4. Fastjson乱码问题全记录从表象到根因4.1 乱码现象接口返回的中文全变问号信创项目里最让我头疼的不是装系统也不是装环境而是一个看起来是小问题、实际牵扯到整个编码链路的乱码问题。场景是这样的Java后端服务部署到麒麟系统上后通过HTTP接口返回的中文在页面上全部显示成问号。日志里打印出来的中文倒是正常的但接口返回的JSON字符串里中文就变成了“???”前端拿到之后彻底没法看。我当时的第一直觉是Tomcat的URIEncoding配置出了问题但仔细一想POST请求返回体乱码和URI编码关系不大。于是开始一层层排查。先在浏览器直接访问接口看响应头里是否声明了charsetUTF-8。再在服务器上用curl请求接口发现返回的中文在终端里显示为乱码。这就说明问题大概率出在JVM输出数据的环节而不是前端解析。4.2 排查链条从HTTP响应到JVM编码到系统locale排查思路分三步。第一步确认系统的默认编码。在服务器上执行locale如果输出是LANGen_US.UTF-8或LANGzh_CN.UTF-8都算正常。如果输出是LANGC或POSIX那就说明系统locale没有配置好JVM在启动时默认使用的字符集可能是非UTF-8的。我当时执行locale输出就是LANGC.UTF-8看起来似乎没问题但再一看LC_ALL和LC_CTYPE都没有设置。接着执行java -XshowSettings:properties -version在输出的属性里找file.encoding和sun.jnu.encoding发现file.encodingANSI_X3.4-1968也就是ASCII。这就是根因JVM启动时继承了系统环境变量但系统的locale设置不完整导致JVM的默认字符集落到了ASCII于是所有中文字符都被转换成了问号。第二步检查应用代码里是否显式设置了Content-Type的charset。如果代码中使用了response.setCharacterEncoding(UTF-8)或response.setContentType(application/json;charsetUTF-8)一般可以覆盖系统的默认编码。但fastjson在序列化时也可能有自己的一套编码策略。第三步检查fastjson的版本和配置。实际上fastjson 2.0.64这个版本本身是有一些字符编码处理细节的尤其是在JSONObject.toJSONString()时如果使用了SerializeWriter它的默认编码依赖IOUtils.UTF8一般不会出错。但如果你在序列化前对String做了getBytes()操作且没有指定字符集就会按系统默认编码来转这一步最容易出问题。结合上面的排查我锁定了修复方向必须让JVM启动时的file.encoding和sun.jnu.encoding都变成UTF-8同时把所有代码层面未指定字符集的编码转换全部显式声明。4.3 最终修复与代码里的编码规范修复分两部分。第一部分在系统层面把locale彻底设置好。麒麟系统可以通过修改/etc/locale.conf文件增加以下内容LANGzh_CN.UTF-8 LC_ALLzh_CN.UTF-8然后执行localedef -i zh_CN -f UTF-8 zh_CN.UTF-8再执行source /etc/locale.conf。如果系统还没有安装中文语言包先用yum install -y langpacks-zh_CN装好。注意LC_ALL这个变量特别重要很多情况下LANG虽然设置了UTF-8但LC_ALL仍为旧值JVM依然会受影响。第二部分在应用启动脚本中显式指定JVM编码参数。我建议在JAVA_OPTS里加一行export JAVA_OPTS$JAVA_OPTS -Dfile.encodingUTF-8 -Dsun.jnu.encodingUTF-8这样无论系统环境变量怎么变JVM启动时的默认字符集都固定为UTF-8。对于Tomcat还需要在conf/server.xml里给Connector加上URIEncodingUTF-8避免URL参数中的中文出现编码问题。除此之外代码层面的规范也必须跟上所有字符串转字节数组的地方都明确写成str.getBytes(StandardCharsets.UTF_8)不要用无参的getBytes()fastjson序列化之后如果要写入文件或网络流一律指定Charset数据库连接URL里也要带上useUnicodetruecharacterEncodingUTF-8。修复完成后重启服务再测试接口中文就正常了。这个坑之所以花了我大半天时间是因为系统层的乱码、HTTP层的乱码、日志里的乱码混在一起彼此干扰很容易让人误判方向。我的经验是遇到乱码先不要急着改代码第一步永远是确认系统环境和JVM的默认字符集。只有环境层面的编码才是所有编码的“地基”。5. 信创项目里的“隐形门槛”证书、名录与比赛经验5.1 信创工程师认证与能力模型信创项目除了技术本身还隐藏着不少“非技术门槛”这些事看起来和写代码无关但真到项目验收或招标阶段缺一张证书往往比缺一个技术方案还要命。很多信创项目在人员要求里会明确写出“参与人员需具备信创相关工程师认证”之类的条款我一开始觉得这就是形式主义直到有一次项目方检查人员资质我们团队里没有一个人有相关证书差点影响项目进度。常见的信创相关认证包括麒麟操作系统运维工程师认证、麒麟操作系统高级工程师认证类似KCA、KCP这种等级具体名称依发证机构而定。考试内容一般围绕系统安装、服务部署、故障排查、shell编程以及容器集群和数据库等常见应用。备考的过程中我发现自己对麒麟系统的理解比平时零散摸索快得多因为考试大纲把知识点系统性串起来了。如果你有机会参加信创比赛那说明你对这些内容的掌握已经超过大部分人。结合我的经验证书在信创项目里的价值排序大致是基础认证是入场券高级认证和比赛成绩是加分项真正的技术方案才是核心。不要本末倒置也别完全忽略证书两条腿走路最稳。5.2 信创目录在选型时的实际作用信创目录也叫信创产品目录本质上是一个产品入选清单。实际项目里采购的设备或软件尤其是涉及党政、国企、教育、医疗等行业的业务系统基本都要求使用在目录内的产品。做技术方案选型时如果开局就用错了产品后面整个项目都没法验收。因此提前把目录里和自己业务相关的产品类别看一遍能少很多麻烦。我的做法是这样的先梳理当前项目涉及的软硬件栈包括服务器、操作系统、数据库、中间件、浏览器、办公软件等然后逐一在目录里查找对应的产品。如果不幸发现某个商业软件不在目录里尽早和甲方沟通用目录内产品替代免得等开发完成后再推翻重来。这里要提一个比较常被忽视的点目录往往会有更新不同批次的目录会新增或移除一些产品。项目启动时看到的是2023版本可能到了2025年某个产品已经被新增进去或者某个产品被暂停了资格。所以平时要有存档的习惯把项目开始时用的目录版本截个图保留避免后续扯皮。5.3 信创比赛备赛建议实战演练是王道如果工作之余想通过参加信创比赛提升技能我的建议非常明确不要光看理论直接上手折腾环境。信创比赛通常考的就是操作系统安装、环境配置、数据库迁移、Web应用部署、排错优化等真实场景和日常工作高度重合。我的备赛计划大致是每周找一台麒麟系统的虚拟机模拟各种故障场景删除/etc/passwd中的某一行练习用单用户模式修复系统给网卡配置静态IP改坏后恢复SSH访问在aarch64架构上从源码编译Nginx部署一个Java应用并且人为制造Tomcat编码问题练习排查设置错误的GRUB启动项练习进救援模式恢复引导。我正式比赛的时候有一道题是“在国产操作系统上安装配置Node.js环境并运行一个简单的HTTP服务”流程和我平时反复练习的几乎一样所以整体比较从容。这也验证了一个观点所谓的信创技能本质上还是Linux和运维技能只是环境上多了一些适配要求。把基本功打牢再针对麒麟的特性去做大量练习比赛拿奖并不是遥不可及的事。6. 常见问题速查表与经验沉淀6.1 高频问题与排查速查信创项目做到后期我逐渐总结了一份自己的“速查表”遇到问题了直接按图索骥效率提升不少。这张表不一定覆盖所有场景但大部分高频问题都在里面了。问题现象常见原因快速排查方法解决思路执行二进制文件报错架构不匹配uname -m确认架构下载对应aarch64/x86_64版本中文全部显示为问号系统locale/JVM编码问题locale、java -XshowSettings设置LC_ALLUTF-8启动参数加-Dfile.encodingUTF-8网络配置后无法连外网网关或DNS错误ip route、cat /etc/resolv.conf检查默认路由和DNS确保/24参数正确关机命令无效systemd服务状态异常systemctl status systemd-logind使用systemctl poweroff双系统启动项错乱GRUB_DEFAULT设置错误grubby --infoALL查看索引grub2-mkconfig -o /boot/grub2/grub.cfg重建yum安装包找不到源不匹配查看/etc/yum.repos.d/下的配置替换为对应架构和版本的国内镜像服务启动后内存不足JVM堆过小或过大free -h、ps auxgrep javaTomcat中文乱码URIEncoding未配置查看请求参数是否乱码Connector加URIEncodingUTF-8这张表的价值在于它把表面现象和底层原因做了映射。排查问题的核心思路并不是一个个试命令而是从现象出发逆推可能出问题的环节再逐个验证。信创环境变化多但不能什么问题都靠“信创特性”来解释很多故障本质上和普通Linux系统一模一样保持冷静按标准流程走基本上都能解决。6.2 少走弯路的几条信创实操心得做信创项目这会我逐渐积累了一些经验也不是什么高深的东西但每一条都是真金白银换来的。第一写文档和操作记录。信创环境的差异大今天是这个CPU架构明天是那个系统版本靠脑子记肯定不够。我现在习惯每个项目建一个Wiki页面记录设备型号、系统版本、软件包列表、安装命令、踩过的坑时间长了这就是一本专属的适配手册。第二在虚拟机里先做一遍完整演练。拿到新的服务器环境不要直接在生产机上一顿操作。先用虚拟机装一个相同版本的系统按生产环境的样子部署一遍应用把可能遇到的问题全部暴露出来再去生产环境操作。信创软件生态不像老牌系统那样经得起反复折腾一次误操作可能就要重装系统时间成本很高。第三备份工具链。我一般会在母机或者共享存储里准备好一份离线软件包包括JDK、Node、Tomcat、Nginx、编译工具链甚至一些常用的rpm包。信创环境很多地方是内网隔离想临时下载个软件可能连镜像都连不上。提前准备好离线包能救急。第四善于利用线上社区和文档。信创系统虽然年轻但问题并不冷门。很多坑都有同行趟过关键是找到正确的关键词去搜索。和教科书式的搜索不同我会尝试用“国产系统 具体软件名 报错信息”这样的组合方式去搜命中率更高。写到这里这篇文章也该收尾了。信创这条路走下来我最大的感受是技术本身并不神秘神秘的是变化。每一种新环境都会带来新的适配问题但只要方法论不过时核心的耐心、细致和持续学习能力就足够解决大部分困难。希望我的真实记录能对正在信创路上摸索的你有点启发。
返回列表