RK3568麒麟系统rootfs提取定制与重打包完整实战指南 搞嵌入式国产化平台这一年多我绝大部分时间都耗在“如何让设备上的系统真正跑起来”这件事上。就拿手里的RK3568核心板来说出厂预装的麒麟系统看着挺完整可真到了项目落地阶段问题全冒出来了客户要的定制服务装不进去、系统日志分区动不动就满、外设驱动跟内核版本对不上甚至有时候只想给系统瘦个身都无从下手。折腾过几轮之后我算是想明白了与其每次求着厂商改镜像不如自己学会制作和更新麒麟rootfs把系统的最终控制权拿回自己手里。这篇文章我把整个流程完整梳理一遍从官方固件中拆出rootfs、挂载修改、实际定制、重新打包到烧录验证每一步都给出我实测过的命令和参数也会把踩过的一些坑单独列出来讲。不管你是刚开始接触RK3568平台还是已经在做麒麟系统适配这篇文章应该都能帮你少走不少弯路。1. 为什么必须自己掌握麒麟rootfs的更新制作三个绕不过去的现实问题先说个基本概念rootfs就是根文件系统对Linux系统来说它就是“/”目录所对应的那套完整文件集合。麒麟系统、Ubuntu、Debian甚至你手机上跑的Android本质上都离不开rootfs。在RK3568平台上rootfs通常是一个独立的镜像文件内核启动后把它挂载为根目录然后systemd开始拉起来整套用户态服务。理解了这层关系你就能明白我们做系统定制绝大部分工作其实都是在改rootfs。1.1 客户现场的定制需求永远比出厂镜像快一步做行业项目的朋友应该深有体会厂商出厂的系统镜像往往只保证“能开机”根本不会管你实际业务怎么跑。我接过一个自助终端项目设备是RK3568系统是银河麒麟桌面版。客户要求预装他们的QT应用、配置好开机自启、还要把系统自带的一堆用不上的办公软件全清掉。我登录进系统折腾了半天发现麒麟自带的软件包管理虽然能卸载部分应用但系统里残留的配置、依赖库、服务脚本依然占着空间而且出于系统保护机制很多关键目录根本不让动。这时候唯一的出路就是直接把rootfs镜像拿过来在宿主机上完成定制后再烧回去。1.2 裁剪和扩容出厂分区对实际业务的约束另一个高频问题就是分区大小。瑞芯微官方发布的固件一般会给rootfs分个4GB、6GB或者8GB的空间看着挺够用。可真当你往里面塞业务程序、缓存数据、日志文件的时候很快就顶满了。尤其是麒麟系统本身比较大基础安装就占好几个GB留给你的余量并不多。有一回我在做边缘网关项目设备需要本地缓存一周的视频数据出厂rootfs分区根本放不下。厂商说“换个Flash更大”的型号可客户那边硬件已经定死了最后只能靠重新制作rootfs配合修改parameter分区表把系统空间重新规划一遍才解决的。1.3 驱动合入单独编内核模块解决不了全部问题做RK3568开发驱动适配是绕不开的活儿。但很多人有个误区以为把内核编出来烧进去就完事了。实际上现在不少方案商提供的驱动都是内核模块比如某些加密芯片、特定型号的触摸屏、4G模组拨号工具这些模块需要“放进”系统里生效。怎么放直接拷到运行中的系统里当然也可以但下次系统升级、分区被覆盖一切归零。正确做法是把模块、对应的配置文件、firmware固件全都集成到rootfs里连同系统一起打包烧录。另外还有些场景需要改系统级配置比如调试OV5695摄像头时设备树里要调I2C地址和复位脚产生的新dtb要么放boot分区要么就得在rootfs里做同步更新这些环节全都绕不开对rootfs的制作能力。2. 动手前必须搞清楚的家底RK3568的分区规划与配套工具选择在开始拆镜像之前有几个前置知识需要先理清。很多新手上来就急着敲命令结果连自己烧的是哪个分区都搞不清楚出了问题根本无从排查。2.1 RK3568的启动链路与parameter分区表RK3568开机后芯片内部固化ROM会从存储介质读取IDB也就是loader然后由loader引导ubootuboot再根据parameter分区表找到boot分区里的内核和设备树最后内核挂载rootfs完成启动。整条链路里parameter分区表是决定“系统怎么摆盘”的关键。它通常在烧录工具里以parameter.txt文件的形式存在内容大致长这样FIRMWARE_VER: 1.0 MACHINE: 3568 TYPE: GPT CMDLINE: mtdpartsrk29xxnand:0x000020000x00004000(uboot),0x000020000x00006000(misc),0x000100000x00008000(boot),0x000100000x00018000(recovery),0x000200000x00028000(backup),0x000400000x00048000(cache),0x004000000x00088000(rootfs),0x000380000x00488000(userdata),-0x004c08000(user)这里每个分区的名称、起始位置、大小都写得很清楚。rootfs分区在实际固件里一般就叫rootfs大小用十六进制扇区数表示。一个扇区是512字节0x00400000个扇区换算出来就是2GB。如果你要扩rootfs就得调整这个数字同时注意不要跟后面的userdata、user分区重叠。这块我建议用gdisk或者parted先规划好别靠肉眼去算很容易算错。2.2 Linux主机端工具链准备制作rootfs全程在Windows下操作会很别扭虽然也有可视化工具但效率和可重复性很差。我的习惯是在Ubuntu 20.04或者22.04主机上完成所有操作。需要准备的东西如下工具/软件用途安装方式RKDevToolWindows下烧录工具Linux下可以使用upgrade_tool官方或开发板资料包upgrade_toolLinux环境下的RK烧录工具命令行操作解压即用imgReMaker或瑞芯微固件解包脚本从update.img中拆出各分区镜像GitHub或网盘资料gdisk / parted查看和修改分区表apt install gdisk partedmount / losetup挂载rootfs镜像系统自带qemu-aarch64-static在x86主机上chroot到aarch64系统时使用apt install qemu-user-staticdebootstrap可选从零构建rootfs时使用apt install debootstrap其中qemu-aarch64-static容易被忽略但它是整个流程里特别关键的一个工具。因为麒麟系统是aarch64架构你在x86的Ubuntu主机上chroot进去执行apt安装命令时系统会去执行arm64的二进制程序没有qemu的模拟层跑不起来。装好qemu-user-static之后把它拷贝到rootfs的usr/bin目录下再配合binfmt_misc就能在x86主机上相对流畅地操作arm64的rootfs。2.3 确认麒麟系统的发行版基线麒麟系统并不只有一种桌面版、服务器版、以及不同CPU架构适配版的内部实现有差异。拿到rootfs之后第一步就是要搞清楚它的包管理体系和版本基线。较新的银河麒麟桌面版是基于Ubuntu的底层使用apt/dpkg部分服务器版走的是CentOS/RHEL分支使用yum/dnf还有早期一些版本基于Debian。这个直接决定了你后续装软件时要配哪个源、用哪个包管理器。麒麟版本特征包管理器系统初始化基于Ubuntu/Debianapt / dpkgsystemd基于CentOS/RHELyum / dnfsystemd判断方法很简单chroot进去之后执行cat /etc/os-release看ID和VERSION_ID再看有没有/etc/apt或/etc/yum.repos.d目录。千万不能想当然地用apt去操作一个基于yum的系统否则你会陷入依赖地狱。3. 提取麒麟rootfs从官方update.img到可挂载的文件系统镜像拿到厂商提供的update.img之后第一步是把里面的rootfs分区镜像提取出来。这一步方法有好几种我分别说下你可以根据手头资料灵活选择。3.1 两种解包方式方式一是用Windows下的瑞芯微开发工具界面上可以加载update.img并解析出各个分区镜像然后单独导出rootfs.img。这种方式简单直观不需要研究脚本但问题是不方便自动化。方式二是在Linux主机上用脚本解包这也是我推荐的方式因为可以写进脚本重复执行。网上的瑞芯微固件解包脚本核心逻辑其实是解析update.img的文件头把里面的固件块按分区名拆出来。update.img本身有一套固定的打包格式头部记录了固件名、版本、分区偏移等元信息。常见的工具有瑞芯微官方的imgReMaker还有GitHub上一些第三方风格的Ruby脚本。我自己常用一条命令直接解包./rkImageMaker -unpack update.img ./output_dir解包完成后输出目录里会出现boot.img、rootfs.img、parameter.txt、uboot.bin等一堆文件。这里要注意部分固件里rootfs可能叫rootfs.img也可能叫rootfs.ext4或者kylin.img之类的名字具体看固件打包方的命名习惯。3.2 挂载rootfs.img这一步有很多讲究拿到rootfs.img之后下一步就是把它挂载到宿主机的一个目录里。这一步看起来简单但里面有几个容易翻车的细节。先创建一个挂载点然后用mount命令直接挂载sudo mkdir -p /mnt/kylin_rootfs sudo mount -o loop rootfs.img /mnt/kylin_rootfs如果这个rootfs.img是ext4格式这条命令基本都能成功。但有两个意外情况一是镜像文件本身可能包含多个分区直接用-o loop挂载只能挂上第一个分区。遇到这种情况需要先用fdisk -l rootfs.img查看分区情况再用losetup配合-partscan参数处理。二是文件系统损坏。曾经有次我拿到的rootfs.img挂载时提示“wrong fs type, bad option, bad superblock”先跑一遍fscksudo fsck.ext4 rootfs.img修复之后基本就能正常挂载了。这里提醒一句fsck之前最好把镜像文件复制一份因为fsck修改文件系统是有风险的。还有一点值得专门说一下为什么要尽量避免直接修改原厂rootfs.img而是复制一份再改。因为后续你很可能需要反复对比原厂镜像和定制镜像的差异留一份原始底稿在排错时非常有用。我的习惯是cp rootfs.img rootfs_org.img cp rootfs.img rootfs_custom.img # 以后只操作rootfs_custom.img3.3 检查rootfs内部结构快速判断系统类型挂载成功后不要急着改东西先看一下内部结构。进入挂载目录重点检查下面几个路径这些信息会直接影响后续操作ls /mnt/kylin_rootfs/etc/ cat /mnt/kylin_rootfs/etc/os-release ls /mnt/kylin_rootfs/etc/apt/ 2/dev/null || ls /mnt/kylin_rootfs/etc/yum.repos.d/ 2/dev/null file /mnt/kylin_rootfs/bin/bash ldd /mnt/kylin_rootfs/bin/bash | head -20第一个命令看etc下的目录结构第二个确认系统版本第三个确认包管理配置第四个和第五个则是确认系统的动态链接器类型和依赖库情况。如果file命令显示bin/bash是aarch64架构那就说明必须准备qemu环境才行。这套检查流程我建议养成习惯每次拿到新镜像都先过一遍后面能省很多事。4. chroot进入麒麟系统rootfs内部定制的核心操作场景现在rootfs已经躺在宿主机目录里了接下来要进入它内部做各种定制操作。直接mount上去改文件虽然可行但很多操作做不了比如安装软件包、运行系统命令、启用服务等因为这些操作需要实际执行arm64的二进制程序。这时候就得靠chroot把当前进程的根目录切换到rootfs挂载点相当于在宿主机上“模拟”进入了那套麒麟系统。4.1 完整chroot环境搭建chroot不是简单地执行一条命令就完事需要先准备好几样东西。首先要把关键虚拟文件系统挂载进去sudo mount --bind /dev /mnt/kylin_rootfs/dev sudo mount --bind /dev/pts /mnt/kylin_rootfs/dev/pts sudo mount -t proc /proc /mnt/kylin_rootfs/proc sudo mount -t sysfs /sys /mnt/kylin_rootfs/sys sudo mount --bind /run /mnt/kylin_rootfs/run然后拷贝DNS配置保证chroot环境里有网络解析能力sudo cp /etc/resolv.conf /mnt/kylin_rootfs/etc/resolv.conf接下来是qemu环境。如果你是在x86主机上操作aarch64的rootfs必须执行sudo cp /usr/bin/qemu-aarch64-static /mnt/kylin_rootfs/usr/bin/然后就能正式chroot进去了sudo chroot /mnt/kylin_rootfs /bin/bash进入之后你会发现命令行提示符变了你敲的命令已经是在麒麟系统的环境里执行了。这个环境下可以正常使用apt安装软件前提是镜像基于Debian/Ubuntu分支可以修改系统配置可以添加用户可以做任何你想做的系统级定制。值得留意的是chroot进去之后宿主机当前Shell的环境变量可能还在但系统的挂载点、进程列表已经变成了rootfs内部的状态。你感觉好像在一台arm64机器上操作实际底层指令全靠在qemu里模拟执行的。这意味着某些对CPU特性有强依赖的程序可能运行异常比如某些GPU相关的初始化工具这属于正常现象不用太纠结。4.2 在chroot中安装软件包源配置与依赖问题麒麟系统的源配置是一个特别容易踩坑的环节。麒麟默认的源指向的是麒麟自己的软件仓库速度在国内一般都能接受但有时候源地址失效或者需要登录认证。chroot进去之后可以先更新源apt update如果遇到公钥错误导入密钥apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 你的KEY值或者使用麒麟系统自带的apt-key管理方式。这里提醒一点在改源之前最好先备份原厂sources.list避免定制之后无法恢复原始状态。我的做法是cp /etc/apt/sources.list /etc/apt/sources.list.bak安装软件时有一些特殊情况。比如麒麟桌面版默认带了很多办公软件和图形界面组件体积很大。如果你做的是嵌入式无头设备可以卸载这些组件。卸载之前先查看一下包依赖关系apt remove --dry-run libreoffice*这个命令会列出所有会被牵连卸载的软件包方便你评估影响范围。注意不要随便卸载系统关键组件尤其不要卸载内核、initramfs相关的包否则做完的rootfs很可能起不来。4.3 系统配置与安全加固这部分往往决定项目成败在很多行业项目里系统配置和安全加固要求在招标文件里就写明了比如关闭不用的端口、修改默认密码策略、设置远程管理白名单等。这些配置全部可以在chroot里面完成。以关闭端口为例麒麟系统上常见的监听端口有22SSH和5355系统解析服务。如果不需要远程管理直接停掉并禁用它systemctl disable sshd systemctl stop sshd如果只是关闭特定端口而保留SSH配合firewalld或者iptables做规则控制。SSH配置也建议做一些加固比如禁止root直接登录、启用密钥登录。修改/etc/ssh/sshd_configPermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes然后把你客户的公钥写入/root/.ssh/authorized_keys或者对应用户的~/.ssh/authorized_keys。这个操作在chroot环境里特别方便因为你可以直接在宿主机上用ssh-keygen生成密钥对然后把公钥复制进rootfs不用额外搭环境。再比如修改用户密码。初始镜像里root密码往往是不公开的或者统一的一套为了安全必须改成自己的。chroot之后直接执行echo root:你的新密码 | chpasswd这条命令会在麒麟系统的用户数据库里完成密码更新。如果后面你在系统里新加了一个业务账号也可以用同样的方式设置密码。加用户的操作也很常用比如给客户创建一个专用的运维账号useradd -m -s /bin/bash opsadmin usermod -aG sudo opsadmin这里把opsadmin加进了sudo组后面用它登录之后就能执行特权命令了。4.4 中文字体与应用运行库的补齐做国产化设备经常会遇到一个尴尬系统跑起来了但业务软件界面的中文全部显示成方块和乱码。原因很简单系统里缺少中文字体。加载字体的问题在麒麟桌面版上常见特别是更新过rootfs之后。解决办法是安装字体包apt install fonts-noto-cjk fonts-wqy-zenhei或者在基于yum/dnf的版本里执行dnf install wqy-zenhei-fonts具体的包名以你实际连接到的软件源为准但这两组是几家常见发行版里相对通用的。装完之后验证一下字体目录ls /usr/share/fonts/ fc-cache -fv这两条命令会重建字体缓存确保应用运行时可以顺利检索到中文字体。另外如果你的业务应用是QT开发的建议把QT运行库相关依赖一次性在chroot里装好。麒麟桌面版一般自带QT环境但如果做的是精简过的rootfs就得手动补齐。用ldd命令检查你的业务可执行文件的依赖ldd /your_app_path/your_app根据输出结果缺哪个库就装哪个库。这个过程看起来繁琐但相信我把依赖问题提前在rootfs阶段解决掉比设备到现场之后再排查省心太多。5. 重新打包rootfs大小计算、格式参数与分区对齐那些坑定制完成后就可以卸载rootfs并重新打包了。但这一步才是真正的分水岭很多人前面的定制都很顺利偏偏在打包环节翻了车做完的镜像烧进去起不来。原因大部分是文件系统大小和格式参数处理不当。5.1 计算rootfs镜像大小别拍脑袋给数字打包前先看一下当前rootfs实际占用了多少空间df -h /mnt/kylin_rootfs比如输出显示已用5.2G那么新的镜像文件至少应该大于这个数值。我一般会在已用空间基础上额外留出15%到20%的余量比如5.2G就创建6.5G左右的镜像dd if/dev/zero ofrootfs_new.img bs1M count6656dd命令会生成一个全零的镜像文件大小就是6656MB。这里注意不要为了省钱把镜像建得刚好多一点因为后续进入系统运行之后软件包缓存、日志、临时文件都会持续增长。rootfs空间太小设备用几天就会出现磁盘满的问题我之前在日志分区上吃过这个亏。5.2 mkfs.ext4参数与目录内容复制镜像文件创建好之后需要格式化出ext4文件系统。这里有几个参数很关键mkfs.ext4 -L rootfs -d /mnt/kylin_rootfs rootfs_new.img其中-L rootfs设置卷标有些系统的/etc/fstab会按卷标挂载根分区卷标不对可能导致挂载失败-d /mnt/kylin_rootfs则是直接把目录内容写入镜像相当于一步完成格式化和文件拷贝。如果你用的e2fsprogs版本比较老不支持-d参数可以用传统方式手动做mkfs.ext4 -L rootfs -b 4096 -m 2 rootfs_new.img sudo mount -o loop rootfs_new.img /mnt/new_rootfs sudo cp -a /mnt/kylin_rootfs/* /mnt/new_rootfs/ sudo umount /mnt/new_rootfs这里-b 4096把块大小设为4KB是嵌入式文件系统比较常用的配置-m 2把预留给root用户的块比例从默认的5%降到2%能多出来一些可用空间。cp的时候务必用-a参数保留文件权限、属主、软链接等属性否则系统里一堆symlink会全部失效起机必挂。5.3 e2fsck检查与分区对齐打包完成后一定要做文件系统一致性检查这一步不能省e2fsck -f rootfs_new.img如果检查报错多半是前面cp或者mkfs过程出了问题按提示修复或者从头再来。没问题的话再确认一下文件系统的块数量是否正常tune2fs -l rootfs_new.img | grep -E Block count|Block size做成嵌入式烧录镜像还有一个对齐问题容易被忽略。RK3568的烧录工具在写分区时对起始偏移有扇区对齐要求虽然工具本身一般会自动处理但如果你的分区起始地址没对齐到2MB边界偶尔会出现烧录后启动异常的情况。建议制作镜像时就让文件系统本身对齐mkfs.ext4默认的布局本身就是对齐到块组边界的只要保证dd出来的镜像大小是2MB的整数倍基本不会出问题。5.4 生成新的update.img还是直接烧分区打包完成之后有两种烧录路线。一种是直接把rootfs_new.img通过RKDevTool或者upgrade_tool单独烧到rootfs分区这种方式最灵活适合正在调试阶段频繁改动的场景。另一种是把所有分区重新打包成update.img用整包烧录的方式发布给产线或者现场。单独烧rootfs分区的命令Linux主机大概是sudo upgrade_tool di -rf rootfs_new.img其中di是烧写指定镜像的命令-rf表示烧到rootfs分区。如果你不确定分区名先执行sudo upgrade_tool pl查看设备分区列表确认rootfs分区的确切名称。重新打包成update.img的话不同版本的工具命令略有差异思路都是用前面解包时得到的其他分区文件加上新的rootfs_new.img一起打包。打包时注意parameter.txt要跟你要烧录的分区方案保持一致尤其如果你调整了rootfs分区大小parameter.txt必须同步更新否则工具按老分区表烧录时可能越界。6. 烧录验证与启动排错几个我反复遇到的疑难问题做完的rootfs烧进设备后能不能一次点亮说实话一次成功的概率不大大多数时候还是要经历几轮“烧录-启动-排错-修改-重烧”的循环。下面整理几个我在RK3568上调试麒麟rootfs特别容易遇到的故障和解决过程。6.1 RKDevTool与upgrade_tool的烧录注意事项先说正常流程设备进入Loader模式后Windows下打开RKDevTool选择对应的loader文件然后在分区表里找到rootfs一行把镜像路径换成你制作好的rootfs_new.img执行烧录就行。Linux下用upgrade_tool则要先把设备切成Loader模式。如果你在系统里能执行命令sudo reboot loader或者按住设备上的recovery键上电让芯片进入maskrom模式。进入之后sudo upgrade_tool ld确认设备已连接再执行烧写sudo upgrade_tool di -rf rootfs_new.img整个烧录过程一般需要一两分钟取决于镜像大小和USB传输速度。烧录完成后重启设备建议用串口观察启动日志串口是最低成本的排错手段。RK3568的调试串口一般默认输出在UART2上波特率15000001.5Mbps这个波特率很特殊终端工具要提前设置好。6.2 启动卡死在“Waiting for root device”的解决思路这是rootfs定制后最常遇到的启动报错之一。内核启动过程中会尝试挂载根文件系统如果挂不上就会一直打印“Waiting for root device”最后进入initramfs的紧急shell。排查步骤按优先级来第一确认rootfs分区确实烧录成功了。可以用uboot命令行执行part list查看分区确认rootfs分区存在且大小正确。第二确认内核cmdline里的root参数指向的分区与parameter分区表一致。有些固件用root/dev/mmcblk0p9这种形似绝对设备节点的写法有些用rootPARTUUID。如果你改了分区表设备节点序号或者PARTUUID都会变那root参数也得跟着改。第三确认文件系统格式正确。如果内核编译时没把ext4驱动编进去或者编成了模块但没放进initramfs也会导致挂载失败。这种情况需要在boot分区或者initramfs里补齐ext4驱动。6.3 systemd启动超时与网络服务问题rootfs能挂载了系统也进入systemd阶段了但可能卡在某个服务上迟迟起不来。最常见的是网络服务尝试获取DHCP地址超时或者某个依赖硬件设备初始化的服务在等待设备。这类问题一般在启动日志里能看到明确的报错比如[FAILED] Failed to start Network Manager. [TIME] Timed out waiting for device dev-ttyS4.device.处理方式上如果是网络服务问题可以在chroot环境里把对应的服务配置成静态IP或者把NetworkManager换成systemd-networkd后者在嵌入式环境里更轻量也更可控。如果是等待device超时多半是设备树里声明的某个外设不存在但服务还在等它可以在systemd服务里把对应的udev规则和依赖去掉或者修改设备的dts重新编译dtb。这部分调试需要一些耐心但好消息是rootfs阶段做错的事几乎都可以通过重新修改rootfs再烧录来修正不像uboot或者内核出问题那么棘手。6.4 磁盘空间异常与文件系统自动扩展还有一种情况很迷惑新烧录的rootfs启动后系统里看到的根分区容量跟镜像大小对不上。比如你做了6.5GB的镜像进去看df只有2GB。原因很可能是系统里带了growpart或者resize2fs相关的服务启动时尝试将rootfs扩展到整块Flash但扩展逻辑在某种异常情况下提前中断了。或者反过来麒麟系统某些版本的初始化脚本会根据分区表强制重设文件系统大小。解决方案是登录系统手动执行一次扩展resize2fs /dev/mmcblk0p9这里设备节点根据你的实际分区序号来写。如果你不希望系统每次都自动扩展可以找到对应的systemd服务或rc.local脚本并禁用它。总体来说这个现象不算致命但容易让人误以为镜像做小了排查起来也浪费时间提前了解会有帮助。7. 收尾经验从“能开机的镜像”到“能交付的系统”中间还差这一步文章写到最后我还是想分享一点自己的体会。做rootfs这件事技术上并不算特别高深解包、挂载、修改、重打包每一步都有明确的命令和操作路径。但真正决定项目顺不顺利的往往是一些“走一步看一步”之外的细节。我的习惯是在每一次定制之后都完整记录一份变更清单包括改了什么配置、装了哪些包、卸载了哪些组件、调整了哪个分区参数。这不光是为了自己回头排查方便更是为了项目交接的时候能跟运维同事说清楚这套系统跟出厂镜像相比到底动了哪些地方。毕竟嵌入式设备投入现场运行之后你再去远程改文件系统的成本会成倍增加一步到位才是最佳选择。另外制作rootfs一定要保持可重复性。我现在习惯把整套操作写成一个Shell脚本从解包固定版本固件开始到chroot里执行定制命令再到重新打包生成镜像全部自动化。下次客户说“能不能再出一个不带办公软件的版本”的时候我只要改两条配置脚本重新跑一遍新镜像很快就出来了不用再手工敲一遍所有命令。RK3568的生态这些年已经成熟不少麒麟系统在国产化设备里的应用也越来越广掌握rootfs的制作和更新确实能让你在这个领域里的主动权大很多。希望这篇内容能帮你少踩几个坑顺利做出自己想要的系统镜像。