本文介紹Linux開發板文件系統打包及鏡像制作的方法,演示Linux文件系統打包及鏡像制作,適用于想將配置好的系統環境打包成鏡像批量燒錄。觸覺智能RK3562開發板演示,搭載4核A53處理器,主頻高達2.0GHz;內置獨立1Tops算力NPU,可應用于物聯網網關、平板電腦、智能家居、教育電子、工業顯示與控制等行業。
工具獲取
本文所介紹的方法需要使用到Linux環境下的一些工具。工具可聯系觸覺智能客服或留言獲取。下載Ubuntu PC環境后,需要解包后使用,解包方法如下:
$ tar -vxf ido-pack-tools.tar -C ./
解包后的文件內容如下:

工具包腳本默認芯片信息是rk3562,如果使用其他芯片,則需要修改芯片信息,對應路徑ido-pack-tools/mkupdate.sh。

文件系統打包及文件系統鏡像制作
- 從開發板中打包出文件系統
先在開發板中插入U盤或TF卡,然后通過mount命令查看文件系統分區節點,如下所示:
root@ido:/# mount /dev/mmcblk2p8 on / type ext4 (rw,relatime) devtmpfs on /dev type devtmpfs (rw,relatime,size=996844k,nr_inodes=249211,mode=755) sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime) tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,size=1008396k,nr_inodes=252099) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,nodev,size=201680k,nr_inodes=252099,mode=755) tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k,nr_inodes=252099) tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,size=1008396k,nr_inodes=252099,mode=755) cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate) cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd) pstore on /sys/fs/pstore type pstore (rw,relatime) cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct) cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset) cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer) debugfs on /sys/kernel/debug type debugfs (rw,relatime) tracefs on /sys/kernel/tracing type tracefs (rw,nosuid,nodev,noexec,relatime) configfs on /sys/kernel/config type configfs (rw,nosuid,nodev,noexec,relatime) fusectl on /sys/fs/fuse/connections type fusectl (rw,nosuid,nodev,noexec,relatime) adb on /dev/usb-ffs/adb type functionfs (rw,relatime) tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=201676k,nr_inodes=252099,mode=700) tmpfs on /run/user/1001 type tmpfs (rw,nosuid,nodev,relatime,size=201676k,nr_inodes=252099,mode=700,uid=1001,gid=1001) gvfsd-fuse on /run/user/1001/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1001,group_id=1001) /dev/mmcblk2p7 on /media/ido/oem type ext4 (rw,nosuid,nodev,relatime,uhelper=udisks2) /dev/mmcblk2p6 on /media/ido/userdata type ext4 (rw,nosuid,nodev,relatime,uhelper=udisks2) /dev/sda1 on /media/ido/U type vfat (rw,nosuid,nodev,relatime,uid=1001,gid=1001,fmask=0022,dmask=0022,codepage=936,iocharset=utf8,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)
由上面命令第2和29行可以看到
/dev/mmcblk2p8 on/type ext4 (rw,relatime),/dev/mmcblk2p8
掛載到根目錄,/dev/mmcblk2p8就是我們需要的節點。U盤掛載目錄為/media/ido/U。
# 掛載根文件目錄 $ sudo mount /dev/mmcblk2p8 /mnt # 進入掛載文件夾 $ cd /mnt $ rm var/lib/misc/firstrun $ sudo tar -czf /media/ido/U/ido-rootfs.tar.gz ./* $ sync
注意:打包使用tar命令需要用sudo權限。
- 壓縮包解壓
將打包出的壓縮包,解壓至Ubuntu PC端環境,命令如下:
$ mkdir -p your/target/path/ $ sudo tar -xzf ido-rootfs.tar.gz -C your/target/path/
- 文件系統鏡像制作
查看文件系統大小,如下所示:
$ sudo du -sh your/target/path/
制作鏡像需要的腳本文件mk-rootfs-image.sh,文件位于工具包的pack-tools/roofs_mk/目錄。根據系統大小修改 mk-rootfs-image.sh 腳本第25行的參數,默認鏡像大小設置為4096MB。
dd if=/dev/zero of=${ROOTFSIMAGE} bs=1M count=0 seek=4096
注意:一般腳本中設置的鏡像大小需要大于 du 返回值。
$ sudo cd pack-tools/roofs_mk/ $ sudo ./mk-rootfs-image.sh ../../your/target/path/
腳本正常運行退出后,可在目錄得到rootfs.img的文件系統鏡像。
制作整包固件update.img
前面文章得到了rootfs.img散包固件,接下來我們制作update.img整包固件。
此處分兩種情況:
1. 只修改文件系統,只需將原本燒錄的update.img鏡像解包后,替換新制作的rootfs.img。
2. 如果除了文件系統外還有其他修改,則可以修改sdk源碼編譯腳本,編譯的時候使用自定義的文件系統。
- 只修改文件系統的情況
將需要解包的完整鏡像文件拷貝到工具包 pack-tools 目錄下,此處以完整鏡像 IDO-EVB3562-V1B_MIPI-800x1280_Ubuntu20_QT5_240719.img為例。

執行解包腳本,將update鏡像按照分區拆分出分區鏡像。
$ ./unpack.sh IDO-EVB3562-V1B_MIPI-800x1280_Ubuntu20_QT5_240719.img
執行結果如下:

分區文件解包存放到./output/目錄。

將文章第2節中打包好的文件系統鏡像復制替換到./output/rootfs.img,文件名稱必須為rootfs.img。
最后執行./mkupdate.sh腳本將分區鏡像合并為一個完整的鏡像update.img。

腳本運行成功后,將會產生新的整包文件./output/update.img。
- 除了文件系統外還有其他修改的情況
不同SDK修改的地方不一致,在sdk中新建自定義目錄myrootfs,把rootfs.img放入其中(myrootfs和build.sh同級目錄)。
mkdir myrootfs #將rootfs.img放入myrootfs中 ls myrootfs/rootfs.img
情況一:直接修改build.sh,使其編譯時使用我們的rootfs.img打包。在build.sh的function build_rootfs()函數中,添加24-27行代碼。
function build_rootfs(){ check_config RK_ROOTFS_IMG || return 0 RK_ROOTFS_DIR=.rootfs ROOTFS_IMG=${RK_ROOTFS_IMG##*/} rm -rf $RK_ROOTFS_IMG $RK_ROOTFS_DIR mkdir -p ${RK_ROOTFS_IMG%/*} $RK_ROOTFS_DIR case "$1" in yocto) build_yocto ln -rsf yocto/build/latest/rootfs.img \ $RK_ROOTFS_DIR/rootfs.ext4 ;; debian) build_debian ln -rsf debian/linaro-rootfs.img \ $RK_ROOTFS_DIR/rootfs.ext4 ;; distro) build_distro for f in $(ls distro/output/images/rootfs.*);do ln -rsf $f $RK_ROOTFS_DIR/ done ;; myrootfs) ln -rsf myrootfs/rootfs.img \ $RK_ROOTFS_DIR/rootfs.ext4 ;; *) build_buildroot for f in $(ls buildroot/output/$RK_CFG_BUILDROOT/images/rootfs.*);do ln -rsf $f $RK_ROOTFS_DIR/ done ;; esac
在執行build.sh lunch后,執行以下命令:
export RK_ROOTFS_SYSTEM=myrootfs
最后執行build.sh即可生成包含了rootfs.img的update.img整包固件。
./build.sh
rockdev/update.img即為我們所需的完整固件。
情況二:如果build.sh腳本中沒有function build_rootfs()函數,則修改
./device/rockchip/common/scripts/mk-rootfs.sh,添加以下8-12行與35行代碼:
....省略部分代碼........ build_ubuntu20() { ln -rsf "$PWD/ubuntu/rootfs-ubuntu20.04-desktop.img" $ROOTFS_DIR/rootfs.ext4 finish_build build_ubuntu20 $@ } build_myrootfs() { ln -rsf "$PWD/myrootfs/rootfs.img" $ROOTFS_DIR/rootfs.ext4 finish_build build_myrootfs $@ } ....省略部分代碼........ build_hook() { check_config RK_ROOTFS_TYPE || return 0 if [ -z "$1" -o "$1" = rootfs ]; then ROOTFS=${RK_ROOTFS_SYSTEM:-buildroot} else ROOTFS=$1 fi ROOTFS_IMG=rootfs.${RK_ROOTFS_TYPE} ROOTFS_DIR="$RK_OUTDIR/rootfs" echo "==========================================" echo " Start building rootfs($ROOTFS)" echo "==========================================" rm -rf "$ROOTFS_DIR" mkdir -p "$ROOTFS_DIR" case "$ROOTFS" in yocto) build_yocto "$ROOTFS_DIR" ;; debian) build_debian "$ROOTFS_DIR" ;; buildroot) build_buildroot "$ROOTFS_DIR" ;; ubuntu) build_ubuntu20 "$ROOTFS_DIR" ;; myrootfs)build_myrootfs "$ROOTFS_DIR" ;; *) usage ;; esac
修改
./device/rockchip/common/configs/Config.in.rootfs,添加以下7、20、21行代碼:
config RK_ROOTFS_SYSTEM string default "buildroot" if RK_ROOTFS_SYSTEM_BUILDROOT default "debian" if RK_ROOTFS_SYSTEM_DEBIAN default "yocto" if RK_ROOTFS_SYSTEM_YOCTO default "ubuntu" if RK_ROOTFS_SYSTEM_UBUNTU default "myrootfs" if RK_ROOTFS_SYSTEM_MYROOTFS choice prompt "default rootfs system" help Default rootfs system. config RK_ROOTFS_SYSTEM_BUILDROOT bool "buildroot" depends on RK_BUILDROOT_BASE_CFG != "" config RK_ROOTFS_SYSTEM_DEBIAN bool "debian" depends on RK_DEBIAN_VERSION != "" config RK_ROOTFS_SYSTEM_UBUNTU bool "ubuntu" config RK_ROOTFS_SYSTEM_MYROOTFS bool "myrootfs"
在執行build.sh lunch命令后,執行以下命令:
export RK_ROOTFS_SYSTEM=myrootfs
最后執行build.sh命令,即可生成包含了rootfs.img的update.img整包固件。
./build.sh
rockdev/update.img即為我們所需的完整固件。
-
開發板
+關注
關注
25文章
5389瀏覽量
100979 -
Linux開發
+關注
關注
0文章
36瀏覽量
7192 -
RK3568
+關注
關注
5文章
562瀏覽量
5931 -
RK3588
+關注
關注
7文章
393瀏覽量
5395 -
RK3566
+關注
關注
0文章
155瀏覽量
5453
發布評論請先 登錄
相關推薦
從EVB3568開發板打包備份Debian文件系統的方法
RK3562開發板:安卓Linux開發從入門到精通(一)

RK3562開發板:安卓Linux開發從入門到精通(二)

Linux查看觸摸坐標點的方法,觸覺智能RK3562開發板,瑞芯微、全志等通用

評論