前言
在开发的过程中,我们经常会在开发板上安装了很多程序,配置了复杂的环境,配置系统之后我如果要在另外一块开发板配置同样的环境,这个时候会发现很麻烦,费时又费力,还容易出错。这里提供一种方法从开发板中导出文件系统,并重新打包为根文件系统镜像。
二、文件同步
这里要借助rsync
把roorfs的所有文件拷贝到另一台linux服务器,rsync 是一个强大的文件同步工具,用于在本地或者通过SSH等远程协议之间同步文件和目录。它比常规的 cp 命令更加灵活和高效,特别适合大量数据或者需要定期备份的场景。
注意:这里是在 PC 机中同步开发板的文件系统,需要开发板和 PC 机置于同一局域网内。
2.1 开发板上的操作
2.1.1 安装ssh、rsync
sudo apt-get install ssh
sudo apt-get install rsync
2.1.2 设置root用户密码
sudo passwd root
#如果当前用户已经是root用户,可以直接运行
passwd
2.1.3 设定root登录
编辑SSH配置文件检查 PermitRootLogin
选项的设置。确保允许 root
用户登录:
vi /etc/ssh/sshd_config
-#PermitRootLogin prohibit-password
+PermitRootLogin yes
PermitRootLogin是sshd服务的配置项之一,它决定了是否允许root用户通过SSH登录到系统。PermitRootLogin有以下几种取值:
- yes:允许root用户通过SSH登录。
- no:禁止root用户通过SSH登录。
- without-password:只允许使用公钥进行身份验证的root用户通过SSH登录。
- forced-commands-only:只允许通过强制命令(比如scp)进行身份验证的root用户通过SSH登录。
保存文件后,重启SSH服务:
sudo systemctl restart sshd
2.1.4 清除系统多余文件
配置开发板环境的时候会出现很多残余的缓存或者临时文件,可以先把板子上的空间清理一下。
首先,使用命令查看磁盘空间的使用情况
du -sh /*
清理系统生成的临时文件和缓存
sudo rm -rf /tmp/*
sudo rm -rf /var/tmp/*
sudo rm -rf /var/cache/
这一步对固件大小没有要求的话也可以忽略
2.2 Ubuntu主机上的操作
2.2.1 安装ssh、rsync
sudo apt-get install ssh
sudo apt-get install rsync
2.2.2 同步开发板文件
ping一下开发板,确保ubuntu主机和开发板能够ping通。
接着在Ubuntu主机上创建一个目录,用于存放导出的开发板文件系统。
lhd@lhd:~/rootfs_test$ mkdir rootfs
使用以下命令同步RK3576开发板上的文件系统
sudo rsync -avx root@192.168.100.123:/ rootfs
其中:
- root为开发板的用户名
- 192.168.100.123为开发板的ip地址,这个按照自己板子的实际情况定
- /:根目录是开发板的根目录
- rootfs:这里是ubuntu主机上创建的rootfs文件夹的路径
执行这一步一定需要root用户才行,前面也有讲到怎么配置root用户用于ssh登录。
同步的过程需要点时间,执行完命令后可以将开发板的文件系统同步到ubuntu主机上。
2.2.3 创建镜像文件
先使用dd命令创建一个空镜像文件。
lhd@lhd:~/rootfs_test$ dd if=/dev/zero of=rootfs.img bs=1M count=7168
其中:
- /dev/zero:特殊的设备文件,用来生成一个指定大小且内容为零的文件
- rootfs.img:要创建的镜像文件
- bs=1M :表示每块读写1M数据
- count=7168:拷贝块的数量
这里count的实际大小可以根据开发板的系统大小调整,在开发板下执行df -h
计算得到系统的大小。
2.2.4 格式化镜像文件
使用以下命令格式化镜像文件,并加入linuxroot卷标
sudo mkfs.ext4 -F -L linuxroot rootfs.img
这条命令将会在 rootfs.img
文件上创建一个 ext4 文件系统,这个文件系统可以用于存储数据或者作为一个磁盘镜像文件。
2.2.5 填充镜像文件
挂载根文件镜像、并往里面拷入修改后的文件系统,使用以下命令完成操作:
mkdir rootfs_mount
sudo mount rootfs.img rootfs_mount
sudo cp -rfp rootfs/* rootfs_mount
这里如果报错cp:写入出错;设备上没有空间
,那就是前面执行dd
命令的时候count的大小设置小了
执行完前面的命令之后需要卸载镜像
sudo umount rootfs_mount
2.2.6 精简镜像文件
经过前面的流程rootfs.img镜像文件里就有开发板的文件系统了,但rootfs.img文件大小不是文件系统的实际大小,还要经过处理才能使用。
检查镜像文件完整性以及精简文件大小
lhd@armsom:~/rootfs_test$ sudo e2fsck -p -f rootfs.img
linuxroot: 97295/655360 文件(0.1% 不连续),1442978/2621440 块
lhd@armsom:~/3576_rootfs_test$ sudo resize2fs -M rootfs.img
resize2fs 1.46.5 (30-Dec-2021)
将rootfs.img 上的文件系统调整为 1556652 个块(每块 4k)。
rootfs.img 上的文件系统大小已经调整为 1556652 个块(每块 4k)。
至此,得到了一个包含完整原开发板的系统镜像。
三、部署固件
1.烧录没有部署应用的开发板固件
2.给开发板上电,让开发板进入LOADER模式,使用瑞芯微RKDevToolv3.28烧录工具,勾选rootfs 分区,点击设备分区表确定一下分区位置。
3.进系统确定之前部署的文件是否存在