【树莓派】制作树莓派最小镜像:img裁剪瘦身
制作树莓派镜像,可以参考这篇文章:http://blog.csdn.net/talkxin/article/details/50456282
摘录部分要点内容如下(如果作者不允许转载,请联系即删除):
一、查看当前系统所占容量
用Win32DiskImager来制作镜像时是将sd卡正卡全部做成镜像,是因为无法读取到linux分区的原因,所以我们在制作镜像前,先要确定我们当前系统所占用了多少系统空间,即备份镜像的大小。
#查看当前系统所占用的空间
df -lh
可以看到,树莓派是有两个分区,所以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 raspberrypi.img --script -- mklabel msdos sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 122879s sudo parted raspberrypi.img --script -- mkpart primary ext4 122880s -1
五、挂载虚拟磁盘并格式化
loopdevice:执行 losetup 连接 img 文件的 loop device
device:执行完 kpartx 后,虚拟磁盘代号。
partBoot:由 device 加上 p1 组合而成的 FAT32 虚拟磁盘分区。
partRoot:由 device 加上 p2 组合而成的 EXT4 虚拟磁盘分区。
首先建立虚拟磁盘并分区
loopdevice=`sudo losetup -f --show raspberrypi.img` device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1` device="/dev/mapper/${device}" partBoot="${device}p1" partRoot="${device}p2"
然后格式化虚拟磁盘分区
#boot分区用fat32进行格式化
sudo mkfs.vfat $partBoot
sudo mkfs.ext4 $partRoot
六、开始备份
boot分区为fat32格式,可以直接利用cp命令直接拷贝
sudo mount -t vfat $partBoot /media sudo cp -rfp /boot/* /media/ sudo umount /media
linux分区为ext4格式,需要利用dump & restore备份
#跳过raspberrypi.img不备份 sudo chattr +d raspberrypi.img sudo mount -t ext4 $partRoot /media/ cd /media sudo dump -h 0 -0uaf - / | sudo restore -rf - cd sudo umount /media
这里原文中也有一点bug,用dump进行磁盘备份时,会将之前创建的空白img一并备份进去,通过chattr跳过raspberrypi.img
七、备份完毕,卸载虚拟磁盘
此时,已将所有数据备份至空白img,此时就可以卸载虚拟磁盘,将img拷贝出保存了。
然后利用Win32DiskImager或者df命令即可将该raspberrypi.img恢复至sd卡上。
sudo kpartx -d $loopdevice
sudo losetup -d $loopdevice
这里是整理后的脚本,编辑sudo vi backup.sh,复制以下内容,sudo chmod 777 backup.sh,然后sudo ./backup.sh就可以在当前脚本目录中生成树莓派的SD卡镜像了。
也可以参考如下shell脚本:
#!/bin/sh sudo apt-get install -y dosfstools parted kpartx rsync df=`df -P | grep /dev/root | awk '{print $3}'` dr=`df -P | grep /dev/mmcblk0p1 | awk '{print $2}'` df=`echo $df $dr |awk '{print int(($1+$2)*1.2)}'` sudo dd if=/dev/zero of=raspberrypi.img bs=1K count=$df sudo parted raspberrypi.img --script -- mklabel msdos start=`sudo fdisk -l /dev/mmcblk0| awk 'NR==10 {print $2}'` start=`echo $start's'` end=`sudo fdisk -l /dev/mmcblk0| awk 'NR==10 {print $3}'` end2=$[end+1] end=`echo $end's'` end2=`echo $end2's'` sudo parted raspberrypi.img --script -- mkpart primary fat32 $start $end sudo parted raspberrypi.img --script -- mkpart primary ext4 $end2 -1 loopdevice=`sudo losetup -f --show raspberrypi.img` device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1` device="/dev/mapper/${device}" partBoot="${device}p1" partRoot="${device}p2" sudo mkfs.vfat $partBoot sudo mkfs.ext4 $partRoot sudo mount -t vfat $partBoot /media sudo cp -rfp /boot/* /media/ sudo umount /media sudo mount -t ext4 $partRoot /media/ cd /media sudo rsync -aP --exclude="raspberrypi.img" --exclude=/media/* --exclude=/sys/* --exclude=/proc/* --exclude=/tmp/* / ./ cd sudo umount /media sudo kpartx -d $loopdevice sudo losetup -d $loopdevice
其余参考:
【树莓派】制作树莓派所使用的img镜像(一):http://www.cnblogs.com/haochuang/p/6066532.html
赠人玫瑰
手留余香
我们曾如此渴望命运的波澜,到最后才发现:人生最曼妙的风景,竟是内心的淡定与从容……我们曾如此期盼外界的认可,到最后才知道:世界是自己的,与他人毫无关系!-杨绛先生
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的