I.MX8QM创建wic镜像文件
1.说明
在使用imx8的yocto编译镜像时,最后会生成wic或wic.bz2(经解压会得到wic文件)后缀的文件。wic文件包含了bootloader、kernel镜像以及文件系统。它们会以和实际存储介质相同的方式分布在wic文件中,并包含分区情况。下面是imx8qm的分区情况,我们也将以这个为例来手动创建一个wic镜像文件。
# ---------------- -------------- --------------
# | | imx-boot | boot | rootfs |
# ----------------- -------------- --------------
# ^ ^ ^ ^ ^
# | | | | |
# 0 32kiB 8MiB 72MiB end
#
# imx-boot:bootloader
# boot:dtb文件、kernel镜像等。第一个分区,文件系统格式fat16。
# rootfs:文件系统存放位置。第二个分区,文件系统格式ext4。
# 8M以后的空间可以根据自己的需要进行调整或增加分区。
2.创建bootloader
采用下面的命令可以将bootloader写到wic文件的32kiB开始的区域。
dd of=rootfs.wic if=imx-boot-imx8qmmek.bin-flash bs=1k seek=32
# of指定输出的文件
# if指定输入的文件,这里输入文件是yocto编译uboot时生成的bin-flash。
3.创建boot和rootfs存放的空间
# 命令会在rootfs.wic文件8M向后在创建一个5G的空间,这个大小可以根据boot+rootfs的总和进行调整。
dd of=rootfs.wic if=/dev/zero bs=1M seek=8 count=5000
4.创建boot和rootfs分区
交互式创建
sudo parted rootfs.wic(parted) mklabel msdos # 设置格式类型为msdos
(parted) mkpart p1 8M 80M #创建p1分区/boot分区,指定开始和结束位置,所以这个分配了72M空间
(parted) set 1 boot on
(parted) mkpart p2 80M -1 #创建p2分区/rootfs分区,-1指剩下所有的空间。
(parted) print #打印查看分区
(parted) quit #退出
命令创建
parted -s rootfs.wic mklabel msdos
parted -s rootfs.wic unit MB mkpart primary fat16 -- 8 80
parted -s rootfs.wic set 1 boot on
parted -s rootfs.wic unit MB mkpart primary ext4 -- 80 -2
5.将镜像文件虚拟成块设备并挂载虚拟文件系统
sudo losetup -f --show rootfs.wic #镜像文件虚拟成块设备
sudo kpartx -av /dev/loop31 #挂载虚拟文件系统
注意:第二条命令的设备节点“/dev/loop31”是第一条命令的输出结果,需要根据自己的实际情况。
执行完上面的命令后就能看到这个虚拟块设备的分区情况。
6.对分区进行格式化。
下面对这两个分区进行格式化,这里格式化第一分区为fat16,第二分区为ext4。
sudo mkfs.msdos /dev/mapper/loop31p1
sudo mkfs.ext4 /dev/mapper/loop31p2
7.copy内容到各自的分区中
# copy to boot part
sudo mount /dev/mapper/loop31p1 /mnt
sudo cp * /mnt //*代表Image/dtb等文件
sudo umount /mnt# copy to rootfs part
sudo mount /dev/mapper/loop31p2 /mnt
sudo cp 文件系统 /mnt
sudo umount /mnt
注意:文件系统如果是tarball可以通过'-C'参数直接解压到挂载的目录中,如果是镜像文件可直接通过dd命令烧写"/dev/mapper/loop31p2"
8.结束
通过下面的命令想挂载和虚拟的块设备进行删除。wic镜像就完成了,可以通过uuu工具烧录到板子上验证系统是否正常启动。
sudo kpartx -d /dev/loop31
sudo losetup -d /dev/loop31
另外yocto编译生成的wic镜像文件也可以通过这种方式进行修改,步骤参见5-8。这种方式不提供修改bootloader,只能对可挂载分区里的内容就行修改,但是uuu中提供了单烧bootloader的功能,如果有修改bootloader的需求,直接通过uuu烧写bootloader即可。
9.问题
镜像烧写到板子上后通过“df -h”查看空间大小,发现最后一个存放文件系统的分区并没有完全占用剩下的磁盘,整个空间只占用了当时dd命令创建的大小,可以通过下面命令扩充分区空间让其占满整个剩余磁盘空间。注意:下面方法在"parted"命令下"mklabel"是"msdos"分区时有效。
parted -s /dev/mmcblk0 resizepart 2 -- 100% #2代表的是分区号
resize2fs /dev/mmcblk0p2