针对一些底层和内核SDK不开源,只提供镜像的开发板,日常学习需要自定义固件的话(比如修改启动参数和脚本,运行自己的程序等等),这里提供Linux下一个类似windows ghost克隆镜像的方法,仅供学习交流使用
首先看下磁盘上的所有分区的尺寸和布局情况,运行命令:
# fdisk -u -l
结果如下(-u,让start和end中数字的单位是512字节,也就是一个sector扇区的大小):
这里使用命令:
# dd if=/dev/sdb > /home/xxx.img
就可以直接备份整个SD卡,但如果SD卡有16G,备份出来的也会有16G,就算用gzip压缩也会太大,所以就要根据实际情况去备份镜像,像这边/dev/sdb5分区虽然有3.4G,但是未使用,所以优化下,使用下列命令重新备份(count=/dev/sdb4的End数+1):
# dd bs=512 count=750080 if=/dev/sdb of=/home/xxx.img
注:如果/dev/sdb5有部分使用,可以先用df --block-size=512来看使用多少,加到count上即可
新备份的镜像只有366MB,如果觉得还是太大,推荐加入gzip参数压缩,详细方法:
# dd bs=512 count=840032 if=/dev/sdb | gzip -9 > /home/xxx.img.gz
实测直接在板卡上进行镜像克隆也是成功的,但是耗时较长。OK,镜像备份好了,如何烧写到SD卡呢?——可以使用Win32DiskImager(或balenaEtcher)工具(网上可以直接免费下载)
烧录到SD卡再放到板卡上就可以正常启动加载,到这里就结束了。
=========================================================================
进阶:
- 恢复镜像
# dd if=xxx.img of=/dev/sda of=/dev/mmcblk0
- 恢复压缩镜像
# gzip -c -d xxx.img.gz | dd of=/dev/mmcblk0
- 查看进度
# watch -n 5 killall -USR1 dd #另开一个终端执行
使用watch查看进度后原进程会多了如下打印(默认无打印):
有需要可自行提取相关字段做成百分比进度条展示。
常见问题:
1.从4G SD卡备份的镜像恢复到更大的SD卡中,可见空间也只有原来4G的大小:
解决方案1)通过parted命令来调整磁盘空间:
其中#resizepart 5 -1表示将第5个分区充满剩余的空间
如果遇到Warning: Partition /dev/sdb5 is being used. Are you sure you want to continue?先umount卸载再操作
2)使用resize2fs扩大文件系统:
# resize2fs /dev/sdb
注:resize2fs只适用于ext2/ext3/ext4 文件系统;
如果是xfs格式的,所以需要使用xfs_growfs命令;