ARTICLE DETAIL

资讯详情

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

RK3568麒麟系统rootfs定制实战:从挂载到打包全流程解析

RK3568麒麟系统rootfs定制实战:从挂载到打包全流程解析 做嵌入式Linux开发尤其是RK3568这类国产平台最绕不开的一件事就是rootfs。瑞芯微SDK默认给的rootfs能用但真拿到项目里用你会发现各种不合适麒麟系统要激活授权、要预装中文字体和输入法、要接国产打印机、要改摄像头型号、要让触摸屏方向正确……这些需求没有一条是刷个官方镜像就能解决的。这篇文章我直接从实际项目出发把更新制作RK3568平台麒麟系统rootfs的完整流程、踩坑记录和常用定制手段一次说透适合刚接手RK3568项目、或者正准备在麒麟系统上做系统定制的人参考。1. 更新制作麒麟rootfs之前先想清楚这三件事1.1 为什么要动rootfs而不是直接烧官方镜像很多刚接触RK3568的人会问官方SDK解压出来就有rootfs.img直接烧录不就行了硬件正常的情况下确实能开机但嵌入式产品的量产从来不是“能开机”就完事。我见过太多项目卡在这一步客户要求系统里预装某个行业软件外接设备需要额外驱动系统默认字体显示中文乱码输入法缺失导致业务系统没法用现场设备的root密码要统一改掉……这些需求通通要改rootfs内部的文件只烧官方镜像毫无办法。更深一层的原因是RK3568的rootfs和PC上的发行版不太一样。它没有CDC/CDE那种在线安装系统的流程开发阶段基本是把整个文件系统做成一个镜像再配合parameter分区表烧到板子上的eMMC或SD卡里。所以一旦要定制你只能“先挂载、再修改、后打包”这条路。与其每次手动改完板子再从开发板拷出来当备份不如把“制作rootfs”本身变成一个可重复的、有流程的工序。1.2 RK3568平台Linux和麒麟rootfs的特殊性RK3568是ARM64架构aarch64在这点上跟树莓派、大部分工控机的ARM开发板没有本质区别。但它有自己的一套启动流程Loader引导U-BootU-Boot读取kernel和dtbkernel再挂载rootfs。这意味着rootfs不只要能跑起来还要跟parameter分区表、U-Boot的环境变量、内核cmdline里的root参数严格对应。改动rootfs之前你得先弄清rootfs在eMMC里到底分在第几个分区因为不同SDK版本的分区表差异很大有的rootfs在mmcblk0p6有的在p7甚至p8。麒麟系统跟通用Debian/Ubuntu系Linux最大的不同是它带有授权和激活机制还预装了商业化的桌面环境、输入法和安全组件。制作麒麟rootfs时如果你只是机械地把文件删了改、改了打包很容易把授权信息弄丢开机后直接变成未激活状态。所以流程上我强烈建议开工之前先把板子原厂rootfs完整备份原始镜像后面的每一步修改都在副本上进行别把原始备份搞脏。1.3 先区分两种常见场景离线修改还是从头构建实际项目中制作麒麟rootfs基本分两条路。一条是“离线修改”拿一个已经能开机的rootfs镜像或分区挂载到PC上chroot进去装软件、改配置再打包回去。另一条是“从头构建”用debootstrap或cdebootstrap配合麒麟的软件源从零搭出一个最小系统再装桌面和业务软件。我个人建议能用离线修改就别从头构建因为麒麟的商业组件、桌面环境和预装应用你用debootstrap不一定能全部组装还原折腾半天不如直接在原厂镜像基础上递进修改稳定可控效率也高。下面整个实操流程都围绕“离线修改”展开这也是我实际做项目时最常用的方式。2. 环境准备和基础概念不搞清楚这些后面必踩坑2.1 制作rootfs需要准备哪些工具工欲善其事必先利其器。我常用的环境是一台x86_64的Ubuntu 20.04/22.04机器装上这些基础工具sudo apt update sudo apt install -y qemu-user-static binfmt-support \ debootstrap parted e2fsprogs \ device-tree-compiler \ android-tools-fsutils rsync \ lz4 lzop simg2img img2simg这几个工具各有用途qemu-user-static和binfmt-support解决在x86机器上chroot进入ARM64 rootfs的跨架构问题simg2img用于把部分厂商提供的sparse格式rootfs转换成raw格式后挂载e2fsprogs用来检查和调整ext4文件系统rsync用于目录同步备份。如果你经常做瑞芯微平台建议再装一个SDK环境里的make_ext4fs它是AOSP工具链里的很多RK SDK会自带。2.2 认识rootfs镜像的几种常见格式瑞芯微平台的rootfs常见有三种形态处理方式完全不同。第一种是raw ext4镜像比如rootfs.img可以直接用mount -o loop挂载。第二种是sparse镜像常见于官方release包特点是文件实际大小比显示大小小很多需要先转raw。第三种是分区形式——设备上运行的状态也就是/dev/mmcblk0pX这样的分区通常用dd或rsync备份。拿到一个镜像不要急着挂先file一下file rootfs.img看到Android sparse image就执行sim2img rootfs.img rootfs_raw.img看到Linux rev 1.0 ext4 filesystem data才能直接挂载。这个判断能省下很多无谓的报错。2.3 RK3568器件的启动流程与rootfs分区接线RK3568开机启动时芯片先从BootROM执行加载U-Boot然后U-Boot根据环境变量里的bootcmd去找内核和dtb最后把root指定的分区作为根文件系统挂载。开发中我经常在串口里敲命令通过查看U-Boot环境变量确认rootfs挂载在哪个分区printenv bootargs一般会看到类似consolettyS2,1500000 root/dev/mmcblk0p7 rootwait rw这说明rootfs在mmcblk0p7。平时我在PC上做镜像时常用的是loop挂载但在板端诊断、或想把板端当前系统备份出来时理解“root分区是谁”就特别重要。一旦误操作烧错分区轻则系统起不来重则把uboot或kernel覆盖掉变砖后还得走MaskRom模式恢复浪费的时间远超预期。3. 完整实操挂载、chroot、修改、打包3.1 第一步备份原始镜像挂载rootfs无论你手里是镜像文件还是板子现成的系统我都建议先做一次原始备份。板端备份最直接的方式是用dd把整个root分区拉出来# 在板子上执行查看分区 lsblk # 假设rootfs在 /dev/mmcblk0p7 sudo dd if/dev/mmcblk0p7 ofrootfs_backup.img bs4M statusprogress如果你是PC上拿到了官方rootfs.img可以直接跳过dd这一步。不管哪种方式备份的原始镜像都存到单独的目录里打上日期标签别动它。然后开始挂载sudo mkdir -p /mnt/rk_rootfs # 如果是sparse镜像先转raw # simg2img rootfs.img rootfs_raw.img sudo mount -o loop rootfs_raw.img /mnt/rk_rootfs3.2 第二步用qemu-user-static跨架构chroot进入系统这一步是整个流程的核心也是在x86 PC上操作ARM64 rootfs的关键。因为ROOTFS里所有二进制都是aarch64架构直接chroot会在执行/bin/bash时报“Exec format error”。解决办法是注册一个跨架构模拟器sudo cp /usr/bin/qemu-aarch64-static /mnt/rk_rootfs/usr/bin/ # 挂载必要的虚拟文件系统 sudo mount --bind /dev /mnt/rk_rootfs/dev sudo mount --bind /proc /mnt/rk_rootfs/proc sudo mount --bind /sys /mnt/rk_rootfs/sys # 拷贝DNS配置chroot后apt update才有效果 sudo cp /etc/resolv.conf /mnt/rk_rootfs/etc/resolv.conf sudo chroot /mnt/rk_rootfs /bin/bash进到chroot以后你会看到shell提示符变成rootfs里的环境。先用arch和cat /etc/os-release确认一下对不对。如果是麒麟系统应该能看到类似Kylin或openeuler相关的版本信息。这里我遇到过个别版本需要先挂载/run或/dev/pts才能跑桌面组件建议一并执行sudo mount --bind /dev/pts /mnt/rk_rootfs/dev/pts3.3 第三步修改源、更新系统、安装中文字体和输入法在chroot环境里先配置好麒麟的软件源。麒麟系统的源配置在/etc/apt/sources.list或/etc/apt/sources.list.d/下不同版本结构不太一样。建议先备份原始源文件然后再编辑。如果你需要换成清华镜像这类国内源具体路径是https://mirrors.tuna.tsinghua.edu.cn/下面的麒麟仓库目录但这里我要提醒一点官方源和镜像源混用时要谨慎麒麟商业版如果用了不匹配的源可能拉取到不兼容的包严重时能把桌面环境搞坏。更新完源之后我通常会先做一轮系统更新export DEBIAN_FRONTENDnoninteractive apt update apt upgrade -y然后安装中文环境相关的包。麒麟系统本身自带部分中文字体但实际工程中还是常遇到字体缺失导致界面乱码。我建议预装这两个开源字体包apt install -y fonts-wqy-zenhei fonts-wqy-microhei输入法方面麒麟自带的输入法在部分轻量化定制rootfs里可能没有预装。如果需要预装fcitx5和中文输入插件可以执行apt install -y fcitx5 fcitx5-chinese-addons fcitx5-configtool装完后设置一下环境变量在/etc/environment里加入以下内容避免重启后输入法不生效。GTK_IM_MODULEfcitx QT_IM_MODULEfcitx XMODIFIERSimfcitx3.4 第四步修改系统配置、用户密码等安全项系统定制里改默认密码、关掉不用的服务、禁用危险端口都是常见操作。麒麟系统修改普通用户密码很简单chroot进去直接passwd kylin如果忘了用户名可以用cat /etc/passwd查看当前系统有哪些用户一般麒麟默认有kylin、user等账号。还有一个常见需求是把root密码也修改一下方便现场调试。U-Boot引导进不去系统时用root密码进单用户模式救援会省很多事。关闭137、139端口这类操作本质是禁用Samba相关服务systemctl disable --now nmb smbd如果只是临时过滤也可以用iptables但这个不是持久化方案重启后丢失。另外麒麟系统里systemctl disable偶尔提示“unit file not found”大部分时候是因为服务名写得不对先systemctl list-unit-files | grep samba查一下准确服务名再执行。3.5 第五步卸载分区并重新打包rootfs修改完成后千万不要在chroot环境里直接退出就以为大功告成。先退出chroot然后卸载文件系统exit sudo rm -f /mnt/rk_rootfs/usr/bin/qemu-aarch64-static sudo umount /mnt/rk_rootfs/dev/pts sudo umount /mnt/rk_rootfs/dev sudo umount /mnt/rk_rootfs/proc sudo umount /mnt/rk_rootfs/sys sudo umount /mnt/rk_rootfs卸载结束后做一下文件系统完整性检查sudo e2fsck -f rootfs_raw.img如果镜像确定不需要保留原本的稀疏格式通常重新做成raw ext4或ext4 sparse都行。但我个人在项目里更常用的做法是把rootfs目录直接用tar打包之后再用mkfs.ext4生成新分区这样既便于版本存档也方便后续把同样的tar解到不同分区大小下。sudo tar --numeric-owner -zcpf rootfs_modified.tar.gz -C /mnt/rk_rootfs . # 需要生成ext4镜像时 dd if/dev/zero ofrootfs_new.img bs1M count2048 mkfs.ext4 -L rootfs rootfs_new.img mkdir -p /mnt/rootfs_new mount -o loop rootfs_new.img /mnt/rootfs_new tar --numeric-owner -xzf rootfs_modified.tar.gz -C /mnt/rootfs_new umount /mnt/rootfs_new e2fsck -f rootfs_new.img注意tar解包时一定要带--numeric-owner否则特殊设备文件和属主信息会丢失。这是很多人制作镜像后系统起不来或权限混乱的头号原因。3.6 第六步烧录到RK3568并验证制作好的镜像烧录方式两种一种用瑞芯微的RKDevTool工具在Windows下烧另一种用Linux下的upgrade_tool。如果你只想更新rootfs分区可以在RKDevTool里单独指定rootfs分区的文件不要勾选其他分区。烧录后开机建议依次检查这些项# 确认rootfs挂载正常 mount | grep / # 查看版本 cat /etc/os-release # 确认字体和输入法存在 fc-list | grep WQY如果开机直接进不去串口看内核日志最常见的问题要么是rootfs文件系统损坏要么是内核cmdline里的root分区和实际烧录分区不符。前者重新烧录并检查e2fsck结果后者在U-Boot下重新setenv bootargs即可。4. 麒麟rootfs系统定制外设驱动、设备树和应用预装4.1 摄像头、BT1120和常见外设的调试配置RK3568项目里改rootfs通常不只是“软件安装”很多时候还要配合设备树和内核驱动。比如rk3568上调试OV5695摄像头——MIPI CSI接口的500万像素模组。设备树里主要检查三个部分I2C控制通路、MIPI DPHY/CIF通路和ISP通路。典型的dts片段要有类似这样的节点ov5695 { status okay; rockchip,camera-module-index 0; rockchip,camera-module-facing back; }; csi2_dphy0 { status okay; }; mipi_dphy0 { status okay; }; rkisp0 { status okay; };调试时先在系统里看I2C上有没有设备地址用i2cdetect -y 0如果挂在I2C0上确认OV5695的7bit地址是否出现在总线上。如果检测不到优先查供电、复位引脚和I2C地址配置而不是怀疑驱动代码。很多时候设备树里地址写了0x36实际模组是0x10一对不上就整半天。BT1120输出则常见于高清视频输出或采集方案设备树相关节点一般叫bt1120或bt1120_out。要注意的是BT1120的引脚和UART等外设经常有mux冲突需要精确配置pinctrl不然症状非常诡异有时能看到波形但没有数据有时单端能通但差分不行。这种问题用示波器看pin mux比单纯review代码高效得多。EBTHERCAT这类实时工业总线的应用则更多考验内核实时性和主站配置。正点原子RK3568板子上跑EtherCAT需要内核开启PREEMPT_RT相关配置再编译EtherCAT主站驱动rootfs里装好主站工具然后按从站厂商的ESI文件配置。这里我不展开细节但强调一点这类实时应用尽量不要在麒麟桌面系统上直接跑因为桌面环境的调度延迟太大建议做一个精简的实时rootfs专门跑主站。4.2 触摸屏方向和竖屏横屏切换的设备树修改嵌入式设备里触摸方向不对是特别常见的抱怨。RK3568的触摸屏设备和普通手机一样一般通过I2C接GT911/GT928、FT5x06等控制器。要在麒麟系统里改触摸方向核心是设备树里的touchscreen参数。比如用GT9xx系列常见的做法是在i2c节点下增加i2c3 { gt9xx5d { status okay; reg 0x5d; touchscreen-inverted-x; touchscreen-inverted-y; touchscreen-swapped-x-y; }; };inverted-x和inverted-y分别代表X轴/Y轴反向swapped-x-y代表XY交换。竖屏改横屏时通常要把这三个flag组合测试一遍直到触摸方向和显示方向完全一致。注意有些触摸驱动对touchscreen-swapped-x-y支持不完整改完没反应时也可以直接改驱动里计算坐标的宏。实际调试时我建议用系统自带触屏校准工具或写一个简单的test app打点验证比统观drivers千万行代码快得多。内核里还有一个RK3568项目经常碰到的问题改了屏参或触摸后rootfs完全没变但进系统触摸没反应。这种情况先确认dts有没有编进boot.img因为RK3568的dtb是放在boot分区或者单独resource分区的只改rootfs里的dts文件在大多数情况下不起作用。要改设备树正确姿势是修改SDK里的dtsi/dts文件重新编译kernel生成boot.img再烧录。4.3 网卡驱动合入、开机动画和应用预装新硬件接入RK3568平台时rootfs定制往往会涉及驱动合入。就以yt6801裕太微的以太网PHY/网卡芯片为例它常见于国产化替换场景。这类网卡经常需要厂商提供驱动源码或ko编译时要注意内核版本和麒麟系统的内核头文件是否匹配。合入方式一般两种一是把驱动源码打进内核重新编译生成boot.img二是做成独立ko放到rootfs的/lib/modules/$(uname -r)/extra/目录然后用depmod更新模块依赖cp yt6801.ko /mnt/rk_rootfs/lib/modules/$(uname -r)/extra/ chroot /mnt/rk_rootfs /bin/bash -c depmod -a开机动画也是经常被问到的问题。RK3568的U-Boot开机动画一般放在uboot代码里或者用专门的logo资源和rootfs关系不大。如果你想改的是Kernel启动后、桌面起来前的开机画面则要配置plymouth。在麒麟rootfs里apt install plymouth plymouth-themes plymouth-set-default-theme -R solar记得保证initramfs里有对应主题否则花屏或黑屏。这是一个看起来简单但细节非常多的事谁做谁知道。应用预装方面麒麟系统比普通Linux发行版更有“桌面操作系统”属性所以预装企业微信、豆包Linux客户端、输入法这类软件反而成了刚需。企业微信Linux版在麒麟上跑常规路径是直接下载deb包安装apt install -y ./WXWork_*.deb这里有个坑麒麟系统有些版本用的软件源和基础库与Ubuntu不同直接装Ubuntu的deb包可能缺依赖。缺什么就补什么别硬来。还有一类应用是“明明装了但启动不了”常见原因是缺少libgtk、libnss3等运行库用ldd定位缺库就能解决。5. 从热搜问题里整理出来的踩坑实录5.1 麒麟系统重置密码和系统修复日常使用麒麟系统的朋友最常搜的问题就是“怎么重置密码”。RK3568开发板上重置root或者kylin用户密码不一定要重刷整个rootfs。简单且不破坏系统的做法是修改U-Boot启动参数临时把init改成/bin/bashsetenv bootargs consolettyS2,1500000 root/dev/mmcblk0p7 rootwait init/bin/bash saveenv boot系统启动后会直接进入bash但此时根文件系统是只读的需要先重新挂载mount -o remount,rw / passwd kylin改完密码后记得恢复bootargs不然之后每次开机都会进单用户bash而不是完整的麒麟桌面。这类方法只适用于你手头有串口和U-Boot操作权的情况。如果连uboot都进不去就只能用瑞芯微的MaskRom模式重新烧loader了。另外麒麟系统自带的“修复助手”在部分桌面版本里有图形化救援入口其实实现原理也是进入急救模式挂载文件系统逻辑跟上面一样。5.2 文件系统空间不释放、大容量U盘打不开等周边问题在rootfs制作和实际使用中经常遇到“删除文件后空间没释放”的问题。在WSL、虚拟机或开发板上都一样第一反应是查有没有进程还占着被删文件sudo lsof L1有输出就说明某个进程仍然打开着这个已删除的文件把对应进程重启或者kill掉空间就出来了。还有一个常见场景是日志文件被logrotate删了但syslog还握着句柄systemctl restart rsyslog通常能解决。大容量U盘在麒麟系统打不开99%是因为U盘是exFAT格式。老内核/精简rootfs不带exfat内核模块或exfat-fuse用户态驱动装上即可apt install exfat-fuse exfatprogs装完重新插拔U盘一般就能正常挂载了。如果你做出来的rootfs要给客户量产用这类小驱动尽量预装能省掉现场一大半抱怨。5.3 DNS配置总是丢、Python环境装不上的细节开发中DNS配置失效也频繁出现。麒麟系统现在默认用NetworkManager管理网络手动改/etc/resolv.conf往往过一会儿就被覆盖。正确姿势是nmcli con mod eth0 ipv4.dns 223.5.5.5 114.114.114.114 nmcli con up eth0如果压根没有NetworkManager或者想用纯静态配置可以在/etc/network/interfaces.d/下写配置文件同时把它设成manual模式避免混淆。制作rootfs时我经常需要在chroot里提前确认网络服务配置不然烧到板子上一联网就出幺蛾子。至于“Linux系统安装Python”在麒麟rootfs里不建议用系统自带的编排工具去下载源码编译直接apt install python3 python3-pip最省事。如果业务需要特定Python版本用pyenv或conda管理别手工覆盖系统python不然把桌面组件依赖的python路径搞坏系统会变得异常不稳定。6. 一点经验心得这些内容里我最想强调的还是“备份”二字。制作RK3568的麒麟rootfs绝大多数人出问题都不是因为不会敲命令而是太自信原厂rootfs没备份、改到一半发现装崩了想还原又还原不了、打包时忘了带属主信息导致系统起来权限错乱。我自己现在养成的习惯是每一步操作执行前先cp一个阶段快照每完成一个定制点写一行markdown备注最后生成版本化存档。虽然听起来麻烦但产品出问题需要回溯时这些备注和快照能帮你把损失控制在分钟级别而不是重头再来一遍。另外一个容易忽略的点是定制rootfs不应该只在开发机上做一次。版本管理、差异对比、自动构建这三个动作在项目中期以后会变得比“会挂载、会chroot”更重要。你可以用git管理整个定制脚本每次从原始镜像出发反复构建保证过程可重复。这样做下来后续客户提出新需求你只需在脚本里加一行再跑一遍流程而不是默默祈祷自己还记得上一次是怎么改的。希望这篇实操复盘能帮正在RK3568和麒麟系统里挣扎的朋友少走几步弯路。有问题欢迎在评论区交流尤其是设备树、驱动合入这些外设细节我对每个坑都还记忆犹新。
返回列表