一、前言
初始镜像一般都比较空,当费劲八嘞的装了一堆环境之后,得知设备还要在做n套,想想每一套都要无穷的调试配置和在线更新一堆安装包,是不是脑壳痛,所以导出文件系统的功能就有需求了,本文介绍如何导出配置好的文件系统rootfs.img,可用于重新放在源码中打包
二、环境
RK3588(linux5.10.66+debian/ubuntu/麒麟是桌面文件系统)
调试笔记本window10,安装常用工具winscp,xshell,finalshell,secureRTP等等
VMware17+Ubuntu20.04源码开发环境(这里就依赖于各个硬件平台的厂家提供资料了)
三、正文
确保笔记本电脑与目标设备网口连接,确保ssh可正常登录
本地电脑IP:192.168.1.21
目标设备IP:192.168.1.101
将rsync软件拷贝到目标设备/usr/bin路径下,并赋予权限。执行rsync,确保没有问题
(rsync方式不好使,总是环境不匹配,glibc版本不匹配,厂家提供的rsync要求目标机环境为glibc2.33和2.34版本,实际麒麟系统glibc是2.31版本)
大佬可以自行AI或者使用rsync方法,这里我感觉不好用,还是使用通用的压缩包方法
目标设备要有root账户,密码我设置为123
之后打开虚拟机,必须用虚拟机,在window下无法执行一些命令。
确保虚拟机网络能够ping通目标设备IP,虚拟机使用网络桥接模式与笔记本电脑相连
使用命令:
ssh root@192.168.1.101 "tar czf - --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run /" > rootfs.tar.gz
打包时排除更多目录(不可行,会少拷贝一些环境,导致redis功能不正常)
ssh root@192.168.1.101 "tar czf - --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/tmp --exclude=/var/cache --exclude=/var/log /" > rootfs.tar.gz
输入yes,在输入密码123,之后就是漫长的等待,压缩并传输回打包的文件系统信息
ls -lh rootfs.tar.gz # 查看文件大小(通常几百MB到几GB)
tar -tzf rootfs.tar.gz | head -n 10 # 查看压缩包内容(前10个文件)如果输出正常(如显示 /bin、/etc 等关键目录),则打包成功。
继续制作 update.img
(标黄这些应该放在传输文件之前)
# 创建空白镜像(假设6GB)(这里可以调整看之前的文件系统是占用多少G)
在目标设备中使用df -Th查看大概占用空间
在目标设备上清理无用文件(如缓存、日志):
sudo apt clean # 清理 apt 缓存
sudo journalctl --vacuum-size=50M # 限制日志大小
rm -rf /var/log/*.gz # 删除旧日志
在目标设备上运行以下命令,获取 排除虚拟文件系统后的真实占用
sudo du -shx / 2>/dev/null
最后预留10%~20%空间,我是5.4G,最终申请6.5G
dd if=/dev/zero of=rk3588.img bs=1M count=6500
# 格式化为 ext4
sudo mkfs.ext4 -F -L linuxroot rk3588.img
# 挂载并解压文件系统
mkdir ubuntu-mount
sudo mount rk3588.img ubuntu-mount
sudo tar -xzf rootfs.tar.gz -C ubuntu-mount
# 替换附件文件(如 rc.local、Init.sh)
sudo cp rc.local ubuntu-mount/etc/
sudo cp Init.sh ubuntu-mount/etc/init.d/
sudo chmod +x ubuntu-mount/etc/rc.local ubuntu-mount/etc/init.d/Init.sh
# 卸载并检查镜像
sudo umount ubuntu-mount
sudo e2fsck -p -f rk3588.img #检查并修复rk3588.img镜像的文件系统
sudo resize2fs -M rk3588.img #精简rk3588.img镜像文件的大小
完成后,用 ls -lh rk3588.img 查看实际大小
最终生成了一个rk3588.img的文件系统
之后可以放在源码包中,重新整体编译打包成updata.img文件,也可以单独烧录更新文件系统,建议前者方法
相关问题说明:
1、用此方法烧录镜像硬盘挂载点应选择/dev/sda5的方式去切换挂载点,不能使用硬盘UUID了,要不然每一个设备烧录镜像之后都要重新修改fatab硬盘挂载点文件
2、之后不需要的自启程序和服务要关掉,否则会占用内存
3、之后桌面显示还是使用uboot控制,强制显示基本也不接mipi,有的不接edp导致显示异常,镜像固定,通过uboot动态配置灵活一些
四、结语
学习了此方法,节省了很多调试和配置时间,开心!