前言
在我们做过根文件系统精简以后,我们需要将目前精简过的根文件系统导出,制成镜像文件,方便生产烧录。
一、准备工作
一台运行着精简根文件系统的RK3588开发板,一台Ubuntu主机(或者虚拟机),两者可以相互ping通,或者都连接到了公网。
二、文件系统镜像制作
将该脚本复制到ubuntu主机,赋予可执行权限,然后执行
chmod a+x generate_rootfs_img.sh
./generate_rootfs_img.sh
然后根据提示,输入RK3588开发板的用户名和ip。即可在ubuntu根目录下生成rootfs.img根文件系统镜像。
脚本如下:
#! /bin/bash
# acquire root privilege
if [ ! "$UID" -eq 0 ]; then
echo "This script require root privilege."
exit 0
fi
function check_ip()
{
local IP=$1
VALID_CHECK=$(echo $IP|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
if echo $IP|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then
if [ $VALID_CHECK == "yes" ]; then
echo "IP $IP available!"
return 0
else
echo "IP $IP not available!"
return 1
fi
else
echo "IP format error!"
return 1
fi
}
while true ;do
read -p "Enter your username and ip:" userName IP
check_ip $IP
[ $? -eq 0 ] && break
done
# Install the rsync
if ! type rsync >/dev/null 2>&1; then
echo 'rsync did not install,Now we will intall rsync!'
apt update
apt install rsync
fi
# Test ip
if ping -c 2 ${IP} >/dev/null ; then
echo 'The IP is conneted!'
else
echo 'The IP can not conneted! '
exit 0
fi
# New path
rm -rf /root/rootfs
if [ ! -d "/root/rootfs" ]; then
mkdir /root/rootfs
fi
# Download rootfs
rsync -avx $userName@$IP:/ /root/rootfs
# Creat new img by dd
dd if=/dev/zero of=rootfs.img bs=1M count=15000
mkfs.ext4 -F -L linuxroot rootfs.img
if [ ! -d "/ubuntu-mount" ]; then
mkdir /ubuntu-mount
fi
mount rootfs.img /ubuntu-mount
cp -rfp /root/rootfs/* /ubuntu-mount
umount /ubuntu-mount
e2fsck -p -f rootfs.img
resize2fs -M rootfs.img
exit 0
三、完整镜像制作
通过上述的文件系统制作流程,我们得到了一个rootfs.img镜像,该镜像可以直接通过rockchip提供的工具进行烧录,如果需要制作一个完整的镜像包含uboot、kernel和rootfs,需要将rootfs.img放
/sdk/rk3588_repo_sdk_v1.0.2a/ubuntu_rootfs
目录下(firefly开发板),运行指令:
./build.sh
即可在目录/sdk/rk3588_repo_sdk_v1.0.2a/rockdev/pack
下看到名为ITX-3588J_Ubuntu_*.img
文件即完整的镜像文件,使用rockchip的烧录工具进行完整烧录。
在目录/rk3588_repo_sdk_v1.0.2a/rockdev
下有一个 名字为 parameter.txt
的软连接文件,其中描述了各个分区的地址和大小,如下所示:
FIRMWARE_VER: 1.0
MACHINE_MODEL: RK3588
MACHINE_ID: 007
MANUFACTURER: RK3588
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 0xffffffff
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE: mtdparts=rk29xxnand:0x00004000@0x00004000(uboot),0x00002000@0x00008000(misc),0x00080000@0x0000a000(boot:bootable),0x00040000@0x0008a000(recovery),0x00010000@0x000ca000(backup),0x00c00000@0x000da000(rootfs),-@0x00cda000(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
uboot的起始地址在0x00004000,大小为0x00004000=8M,其他部分的大小:
uboot 4000= 8M
misc 0x00002000=4M
boot 0x00080000 = 256M
recovery 0x00040000=128M
backup 0x00010000 = 32m
rootfs 0x00c00000 =6G
userData =
我们自己制作的根文件系统大小可能超过了6G,那么我们需要修改rootfs和userdata的大小和起始地址,例如,如果我们的根文件系统大小为8G多,那么可以指定rootfs大小为9G,那么 parameter.txt
就应该如下所示:
FIRMWARE_VER: 1.0
MACHINE_MODEL: RK3588
MACHINE_ID: 007
MANUFACTURER: RK3588
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 0xffffffff
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE: mtdparts=rk29xxnand:0x00004000@0x00004000(uboot),0x00002000@0x00008000(misc),0x00080000@0x0000a000(boot:bootable),0x00040000@0x0008a000(recovery),0x00010000@0x000ca000(backup),0x001200000@0x000da000(rootfs),-@0x0012da000(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
同步修改了rootfs的大小和userdata的起始地址。