一個典型的嵌入式系統是由uboot+kernel+rootfs組成的,其中uboot和kernel都是二進制,rootfs存在文件系統。
二進制在燒錄的時候比較簡單,將二進制數據寫入存儲設備固定地址;rootfs存在文件系統,所以需要對存儲設備進行分區,然后在分區上建立文件系統。
對存儲介質分區可以直接掛載,進行分區、掛載,然后將rootfs內容寫入,即完成了rootfs更新。
或者創建一個普通image文件,然后將文件當成一個分區,在其上創建rootfs。創建的普通image文件,可以使raw image也可以是sparse image。
1. 二進制文件燒錄
二進制文件更新比較簡單,直接使用DD即可。
dd if=spl.bin of=/dev/sdc bs=1024 seek=33
2. fdisk創建分區
通過fdisk可以在一個物理設備上創建分區表,也可以在一個image文件上創建分區。
fdisk -l device將輸出指定設備的分區信息,不指定device則顯示系統所有設備的分區信息。
AME fdisk - manipulate disk partition table SYNOPSIS fdisk [options] device fdisk -l [device...]
fdisk device之后,輸入m顯示幫助信息。n新增一個分區表,p顯示分區信息,w保存分區信息,q退出。
可以將分區命令輸入到一個fdisk_input文件中,然后fdisk <fdisk_input讀取分區命令並執行生成分區表。
cat > fdisk_input <<EOF n p 1 61440 p w EOF fdisk -u ${ALL_IN_ONE} <fdisk_input
退出后即可看到創建的分區。
3. 創建ext4的raw image文件系統
首先創建一個空白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
即完成了文件系統創建。
4.創建ext4的sparse image文件系統
工具make_ext4fs可以創建稀疏ext4文件系統,制作出來的文件尺寸較小。
make_ext4fs -l 2018M -s rootfs.sparse ../target/
即可創建完成2018M大小的rootfs.spare image文件,文件來源於../target/目錄。
5. sparse image和raw image互轉
通過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)