• 正文
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

Linux文件系統(tǒng)打包及鏡像制作,觸覺(jué)智能RK3562開(kāi)發(fā)板演示

04/27 17:00
170
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

本文介紹Linux開(kāi)發(fā)板文件系統(tǒng)打包及鏡像制作的方法,演示Linux文件系統(tǒng)打包及鏡像制作,適用于想將配置好的系統(tǒng)環(huán)境打包成鏡像批量燒錄。觸覺(jué)智能RK3562開(kāi)發(fā)板演示,搭載4核A53處理器,主頻高達(dá)2.0GHz;內(nèi)置獨(dú)立1Tops算力NPU,可應(yīng)用于物聯(lián)網(wǎng)網(wǎng)關(guān)、平板電腦、智能家居、教育電子、工業(yè)顯示與控制等行業(yè)。

工具獲取

本文所介紹的方法需要使用到Linux環(huán)境下的一些工具。工具可聯(lián)系觸覺(jué)智能客服或留言獲取。下載Ubuntu PC環(huán)境后,需要解包后使用,解包方法如下:

$ tar -vxf ido-pack-tools.tar -C ./

解包后的文件內(nèi)容如下:

工具包腳本默認(rèn)芯片信息是rk3562,如果使用其他芯片,則需要修改芯片信息,對(duì)應(yīng)路徑ido-pack-tools/mkupdate.sh。

文件系統(tǒng)打包及文件系統(tǒng)鏡像制作

  • 從開(kāi)發(fā)板中打包出文件系統(tǒng)

先在開(kāi)發(fā)板中插入U(xiǎn)盤(pán)或TF卡,然后通過(guò)mount命令查看文件系統(tǒng)分區(qū)節(jié)點(diǎn),如下所示:

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就是我們需要的節(jié)點(diǎn)。U盤(pán)掛載目錄為/media/ido/U。

# 掛載根文件目錄

$ sudo mount /dev/mmcblk2p8 /mnt

# 進(jìn)入掛載文件夾

$ cd /mnt

$ rm var/lib/misc/firstrun

$ sudo tar -czf /media/ido/U/ido-rootfs.tar.gz ./*

$ sync

注意:打包使用tar命令需要用sudo權(quán)限。

  • 壓縮包解壓

將打包出的壓縮包,解壓至Ubuntu PC端環(huán)境,命令如下:

$ mkdir -p your/target/path/

$ sudo tar -xzf ido-rootfs.tar.gz -C your/target/path/

  • 文件系統(tǒng)鏡像制作

查看文件系統(tǒng)大小,如下所示:

$ sudo du -sh your/target/path/

制作鏡像需要的腳本文件mk-rootfs-image.sh,文件位于工具包的pack-tools/roofs_mk/目錄。根據(jù)系統(tǒng)大小修改 mk-rootfs-image.sh 腳本第25行的參數(shù),默認(rèn)鏡像大小設(shè)置為4096MB。

dd if=/dev/zero of=${ROOTFSIMAGE} bs=1M count=0 seek=4096

注意:一般腳本中設(shè)置的鏡像大小需要大于 du 返回值。

$ sudo cd pack-tools/roofs_mk/

$ sudo ./mk-rootfs-image.sh ../../your/target/path/

腳本正常運(yùn)行退出后,可在目錄得到rootfs.img的文件系統(tǒng)鏡像。

制作整包固件update.img

前面文章得到了rootfs.img散包固件,接下來(lái)我們制作update.img整包固件。

此處分兩種情況:

1. 只修改文件系統(tǒng),只需將原本燒錄的update.img鏡像解包后,替換新制作的rootfs.img。

2. 如果除了文件系統(tǒng)外還有其他修改,則可以修改sdk源碼編譯腳本,編譯的時(shí)候使用自定義的文件系統(tǒng)。

  • 只修改文件系統(tǒng)的情況

將需要解包的完整鏡像文件拷貝到工具包 pack-tools 目錄下,此處以完整鏡像 IDO-EVB3562-V1B_MIPI-800x1280_Ubuntu20_QT5_240719.img為例。

執(zhí)行解包腳本,將update鏡像按照分區(qū)拆分出分區(qū)鏡像。

$ ./unpack.sh IDO-EVB3562-V1B_MIPI-800x1280_Ubuntu20_QT5_240719.img

執(zhí)行結(jié)果如下:

分區(qū)文件解包存放到./output/目錄。

將文章第2節(jié)中打包好的文件系統(tǒng)鏡像復(fù)制替換到./output/rootfs.img,文件名稱必須為rootfs.img。

最后執(zhí)行./mkupdate.sh腳本將分區(qū)鏡像合并為一個(gè)完整的鏡像update.img。

腳本運(yùn)行成功后,將會(huì)產(chǎn)生新的整包文件./output/update.img。

  • 除了文件系統(tǒng)外還有其他修改的情況

不同SDK修改的地方不一致,在sdk中新建自定義目錄myrootfs,把rootfs.img放入其中(myrootfs和build.sh同級(jí)目錄)。

mkdir myrootfs

#將rootfs.img放入myrootfs中

ls myrootfs/rootfs.img

情況一:直接修改build.sh,使其編譯時(shí)使用我們的rootfs.img打包。在build.sh的function build_rootfs()函數(shù)中,添加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

在執(zhí)行build.sh lunch后,執(zhí)行以下命令:

export RK_ROOTFS_SYSTEM=myrootfs

最后執(zhí)行build.sh即可生成包含了rootfs.img的update.img整包固件。

./build.sh

rockdev/update.img即為我們所需的完整固件。

情況二:如果build.sh腳本中沒(méi)有function build_rootfs()函數(shù),則修改

./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"

在執(zhí)行build.sh lunch命令后,執(zhí)行以下命令:

export RK_ROOTFS_SYSTEM=myrootfs

最后執(zhí)行build.sh命令,即可生成包含了rootfs.img的update.img整包固件。

./build.sh

rockdev/update.img即為我們所需的完整固件。

相關(guān)推薦