14. Rootfs 导出与固件打包
本文档主要介绍如何将配置修改好的Rootfs根文件系统导出并二次打包完整固件。打包后的完整固件就可以用于批量部署了。
14.1 一键导出 Rootfs
获取自动化导出rootfs的脚本:xniupi_auto_output_rootfs_v10
准备一个剩余容量至少大于根文件系统占用空间2倍大小的U盘(建议使用空U盘),并将脚本
xniupi_auto_output_rootfs_v10
拷贝到该U盘根目录将该U盘插入到目标设备,并进入U盘目录
# 第一步:给脚本赋予777权限
sudo chmod 777 xniupi_auto_output_rootfs_v10
# 第二笔:运行脚本
./xniupi_auto_output_rootfs_v10
等待一段时间,目标设备的根文件系统Rootfs就会被导出到U盘根目录。
警告
请确保U盘剩余空间足够,否则可能导致 rootfs 导出失败!
rootfs 导出期间禁止操作目标设备,禁止中途断电,否则可能导致 rootfs 导出失败!
14.2 手动导出 Rootfs
如果一键导出Rootfs失败,您也可以尝试通过以下方式手动导出Rootfs。
步骤一:确定固件大小
首先执行df -h 查看当前系统占用的大小 注意:在打包的时候把外接的存储盘去掉。否则会将存储盘一起打进固件
如下图 的为6.1G
步骤二:打包根文件系统所有文件
通过ls查看根目录下的文件
这里除了dev 和sys可以不理会,其他全部要打进去tar包,如上的打包指令则为:
tar -zcvf rootfs.tar.gz bin boot etc home lib lost+found mnt opt proc root run sbin snap srv system tmp usr var vencd
打包完后会提示一个如下错误,这个属于正常现象可以忽略!
步骤三:创建空文件系统并格式化为EXT4文件系统
创建rootfs空文件
dd if=/dev/zero of=/mnt/rootfs.img bs=2K count=2M
注意:rootfs.img的大小为:7000为7000M 在上图中计算根文件系统大小为6.1G,则大于向上取整为7000,实际操作中请根据实际根文件系统大小确定。
格式化为ext4文件系统
sudo mkfs.ext4 rootfs.img
步骤四:挂载空文件系统到/rootfs目录
mkdir /rootfs
mount /mnt/rootfs.img /rootfs
步骤五:解压打包文件到/rootfs目录
解压rootfs.tar.gz到mnt
sudo tar zxvf rootfs.tar.gz -C mnt
步骤六:卸载rootfs
sudo umount mnt
步骤七:检查镜像文件并瘦身
sudo e2fsck -p -f rootfs.img
sudo resize2fs -M rootfs.img
sudo du -sh rootfs.img
步骤八:拷贝Rootfs
将rootfs.img 通过 或者u盘等手段拷出即可
14.3 二次打包完整固件
注解
注意以下操作均在x86-64架构服务器主机
上完成!
14.3.1 安装必要的软件包
sudo apt-get install lib32stdc++6
14.3.2 下载二次打包工具
网盘地址:xniupi-linux-repack(提取码:xniupi)
14.3.3 解压二次打包工具
tar -xzf xniupi-linux-repack.tgz
cd xniupi-linux-repack
xniupi-linux-repack 目录结构如下;
xniupi-linux-repack
├── bin
│ ├── afptool
│ └── rkImageMaker
├── pack.sh # 打包脚本
├── Readme_en.md
├── Readme.md
└── unpack.sh # 解包脚本
14.3.4 解包原固件
把官方发布的 Ubuntu 固件拷贝到 xniupi-linux-repack 根目录,重命名为 update.img,执行解包脚本 unpack.sh。解包完成后,各分区文件在 output 目录下。
mv /path/to/xxx_update.img update.img #xxx_update.img 为待解包的原固件
./unpack.sh
14.3.5 重新打包新固件
保持当前目录结构,文件名等不变,接入移动硬盘到 PC 机,把前面导出的 Ubuntu rootfs 替换 output/Image/rootfs.img,然后执行打包脚本 pack.sh。
cp xxx_rootfs.img /path/to/xniupi-linux-repack/output/Image/rootfs.img
./pack.sh
小技巧
新的完整固件:当前目录下的new_update.img