修改记录
2016年7月28日修改脚本,动态支持树莓派镜像
最近刚做了一套opencv摄像头监控的程序,想将这套程序做一个镜像备份起来,但发现用Win32DiskImager或dd命令来制作镜像,都是将sd卡整盘进行备份,造成了巨大的硬盘浪费,同时,会局限sd卡本身,也就是说32g卡制作的镜像无法恢复到16g或8g的卡上,即便软件没有占用那么大空间,所以希望将镜像瘦身,做一套最小占用空间的镜像,且不损害镜像本身。
前不久在csdn上看到 liuwei000000的博文与我所希望的结果差不多,所以试着进行一次img瘦身。
不过该博文也有缺点“该方法制作的镜像不能用raspi-config扩展分区”所以即便我们能够将img瘦身也不能轻松的利用raspi-config扩展树莓派了,所以我提炼了奋斗博客博文亲身制作了一把img,并把遇到的问题记录了下来
我使用的的是raspberry pi 2+32G高速tf卡,因为全程只在树莓派中操作所以不需要额外的linux系统。
若树莓派所占空间小于sd卡空间的50%即可以使用第一种方法,在树莓派内部直接生成镜像。
若树莓派所占空间大于sd卡空间的50%,可以使用第二种方法,先生成sd卡镜像,然后再其他linux系统中进行裁剪。
在文后,我会提供一键脚本。
树莓派内部生成镜像
一、查看当前系统所占容量
用Win32DiskImager来制作镜像时是将sd卡正卡全部做成镜像,是因为无法读取到linux分区的原因,所以我们在制作镜像前,先要确定我们当前系统所占用了多少系统空间,即备份镜像的大小。
#查看当前系统所占用的空间
df -h
可以看到,树莓派是有两个分区,所以boot 【size】+linux【Used】+分区损耗【因为格式转换,所以会损耗5%~10%】=镜像实际大小,所以若used使用百分比超过50%那么就无法在sd中创建此镜像。
二、安装需要的软件
dosfstools:fat32分区格式化工具
dump:dump & restore 备份工具
parted & kpartx:虚拟磁盘工具
sudo apt-get install dosfstools dump parted kpartx
三、生成空白img
根据一里面系统所占用的空间,生成空白的img。
#df为磁盘占用空间
sudo dd if=/dev/zero of=raspberrypi.img bs=1K count=$df
这也是错误比较多的地方,有人不理解原文中
count=2500
参数的意义,此参数是用dd命令创建一个大约2.5G的空白镜像,若不使用第一步来算出实际镜像大小的话,制作出来的镜像就会出错此处注意
dd命令中【1k=1024b;1KB=1000b;1M=1024kb;1MB=1000kb】
四、分割虚拟磁盘
我们已将空白的img创建完毕,现在需要通过parted将磁盘分为boot与root区
通过sudo fdisk -l /dev/mmcblk0
得知
第一个分区为boot分区,采用FAT32格式,由sector 8192开始到sector 12879
第二个分割区采用EXT4,由sector 122880开始到空白img结尾。
sudo parted