关键词:dd、fdisk、mkfs.ext四、make_ext4fs、img2simg、simg2img等等。android
一个典型的嵌入式系统是由uboot+kernel+rootfs组成的,其中uboot和kernel都是二进制,rootfs存在文件系统。工具
二进制在烧录的时候比较简单,将二进制数据写入存储设备固定地址;rootfs存在文件系统,因此须要对存储设备进行分区,而后在分区上创建文件系统。spa
对存储介质分区能够直接挂载,进行分区、挂载,而后将rootfs内容写入,即完成了rootfs更新。code
或者建立一个普通image文件,而后将文件当成一个分区,在其上建立rootfs。建立的普通image文件,能够使raw image也能够是sparse image。orm
二进制文件更新比较简单,直接使用DD便可。blog
dd if=spl.bin of=/dev/sdc bs=1024 seek=33
经过fdisk能够在一个物理设备上建立分区表,也能够在一个image文件上建立分区。ip
fdisk -l device将输出指定设备的分区信息,不指定device则显示系统全部设备的分区信息。文档
AME fdisk - manipulate disk partition table SYNOPSIS fdisk [options] device fdisk -l [device...]
fdisk device以后,输入m显示帮助信息。n新增一个分区表,p显示分区信息,w保存分区信息,q退出。get
能够将分区命令输入到一个fdisk_input文件中,而后fdisk <fdisk_input读取分区命令并执行生成分区表。input
cat > fdisk_input <<EOF n p 1 61440 p w EOF fdisk -u ${ALL_IN_ONE} <fdisk_input
退出后便可看到建立的分区。
首先建立一个空白image文件,若是在设备上建立则直接使用。
而后调用mkfs.ext4在文件或者设备上建立ext4文件系统,将建立好的文件系统mount到一个目录。
将rootfs文件写入mount目录,并sync。
最后将文件系统进行umount。
dd if=/dev/zero of=${ROOTFS_EXT4} bs=1M count=${ROOTFS_SIZE} mkfs.ext4 ${ROOTFS_EXT4} -F mkdir -p /tmp/emmc sudo mount -t ext4 ${ROOTFS_EXT4} /tmp/emmc -o data=journal,barrier=1 sudo rm -rf /tmp/emmc/* cd /tmp/emmc sudo cpio -idm < ${ROOTFS_CPIO} sync cd - sudo umount /tmp/emmc
即完成了文件系统建立。
工具make_ext4fs能够建立稀疏ext4文件系统,制做出来的文件尺寸较小。
make_ext4fs -l 2018M -s rootfs.sparse ../target/
便可建立完成2018M大小的rootfs.spare image文件,文件来源于../target/目录。
经过simg2img能够将sparse image转换成raw image,img2simg能够将raw image转换成sparse image。
Usage: simg2img <sparse_image_files> <raw_image_file>
Usage: img2simg <raw_image_file> <sparse_image_file> [<block_size>]
分别执行:
simg2img rootfs.sparse rootfs.sparse2raw
img2simg rootfs.ext4 rootfs.ext42sparse
结果以下:
rootfs.ext4: Linux rev 1.0 ext4 filesystem data, UUID=a8e84664-5362-4ab2-8bd3-bb20ea25e1ee (extents) (large files) (huge files) rootfs.ext4s: Android sparse image, version: 1.0, Total of 516608 4096-byte output blocks in 404 input chunks. rootfs.sparse: Android sparse image, version: 1.0, Total of 516608 4096-byte output blocks in 1187 input chunks. rootfs.sparse2raw: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (extents) (large files)