树莓派镜像备份与恢复文章

来源:互联网 发布:九品网络电视安卓9ptv 编辑:程序博客网 时间:2024/06/06 04:57

在做完下属步骤以后,需要考虑分区表,将分区表复制到镜像里,否则系统无法启动,而且还要回利用gparted  /dev/loop0以及fdisk -l /dev/loop0等命令,查看分区类型,文件系统类型,是否需要修改分区卷标等操作。


往已经做好的镜像添加分区表的命令:


sudo dd if=/dev/sdd of=raspberrypi.img bs=1MB seek=0 count=24 conv=notrunc


在Linux下回复的过程是:

sudo dd bs=1M if=raspberrypi.img of=/dev/sdc

sudo sync




最近一直在折腾树莓派,前几天装了10台设备,最近又来了15台开发板子。基本每台设备都需要进行如下操作:

1.安装树莓派OS,并配置键盘、时区、语言编码格式等;

2.新增组、用户、配置静态IP地址;

3.配置应用,并配置2个自启动的服务;

 

而这些都是重复性配置,工作量巨大;之前采用了一种方式,直接使用树莓派官方的USB工具,采用备份还原的方式,clone镜像;

但存在问题:SD卡为32GB,每次还原得很长时间,所以想减小镜像大小;

参考后文方式,做一个backup.sh文件,然后安装相关工具,并增加可执行权限,并sudo ./backup.sh运行;

安装所需工具组件:

sudo apt-get install dosfstoolssudo apt-get install dumpsudo apt-get install partedsudo apt-get install kpartx

 

内容如下:

复制代码
#!/bin/shsudo dd if=/dev/zero of=raspberrypi.img bs=1MB count=4000sudo parted raspberrypi.img --script -- mklabel msdossudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 2682879ssudo parted raspberrypi.img --script -- mkpart primary ext4 2682880s -1loopdevice=`sudo losetup -f --show raspberrypi.img`device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-15])p.*/\1/g' | head -1`device="/dev/ram${device}"partBoot="${device}p1"partRoot="${device}p2"sudo mkfs.vfat $partBootsudo mkfs.ext4 $partRootsudo mount -t vfat $partBoot /mediasudo cp -rfp /boot/* /media/sudo umount /mediasudo mount -t ext4 $partRoot /media/cd /mediasudo dump -0uaf - / | sudo restore -rf -cdsudo umount /mediasudo kpartx -d $loopdevicesudo losetup -d $loopdevice
复制代码

 

执行之后,等待一段时间,就可以看到相应的镜像文件:

 

 

-------------------------

参考下文:(http://www.fendou.info/raspberry-pi-sd-card-backup-and-recovery/comment-page-1/ )

买树莓派的时候只想到存储空间大能多存的东西于是买了个16GB的SD卡,可实际用了2G空间不到。最开始备份树莓派SD卡是用windwos下的Win32DiskImager,这种备份恢复树莓派的方式最简单,Windows+读卡器+Win32DiskImager 就可以对树莓派的SD做完整的镜像备份,可我的树莓派用的16GB的SD卡,备份还原既浪费空间又浪费时间。

后来发现一种直接用dd备份树莓派的方法,就是先在树莓派上mount一个共享目录(空间大于SD卡的即可),然后用

dd if=/dev/mmcblk0 of=raspberrypi.img bs=1M

备份成raspberrypi.img镜像文件,恢复的方式有两种:一是用Win32DiskImager在windows系统上直接写到SD卡中;二是在Linux系统中用(先fdisk -l查看设备)

dd if=/path/to/image/raspberrypi.img of=/dev/sdx

这种方式要考虑网络环境,如果你的树莓派接的无线网卡,最好放弃这种方式,太慢!

最后介绍最终极的备份还原树莓派的方式,利用dump 和 restore。先说明一下这种备份方式的好处:一是可以像Windows的Ghost只dump有效数据,也就是说可以最有效的节省备份空间,树莓派有多少数据就生成多大的镜像文件;二是可以恢复到比原来SD卡空间的小的SD卡上,我原来用的树莓派是16GB,现在可以把镜像恢复到8GB或者4GB的SD中。下面看详细步骤(不想看可以直接跳到最后的脚本)

一、安装需要的软件

dosfstools:fat32分区格式化工具
dump:dump & restore 备份工具
parted & kpartx:虚拟磁盘工具

执行安装脚本

sudo apt-get install dosfstoolssudo apt-get install dumpsudo apt-get install partedsudo apt-get install kpartx

二、生成新的img文件
先df -h查看下树莓派实际使用空间然后在决定生成文件大小,下面命令生成块大小为1MB总大小为2500MB的镜像文件

sudo dd if=/dev/zero of=raspberrypi.img bs=1MB count=2500

三、分割虚拟磁盘

利用parted将刚才生成的虚拟盘分割成两个分区

  • 第一个分割区采用FAT32格式,由sector 8192开始到sector 12879,约62.9MB
  • 第二个分割区采用EXT4,由sector 122880开始到结束。
sudo parted raspberrypi.img --script -- mklabel msdossudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 122879ssudo 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"

格式化虚拟磁盘分区

sudo mkfs.vfat $partBootsudo mkfs.ext4 $partRoot

五、开始备份
fat32虚拟磁盘分区建立好后直接用cp命令备份文件

  1. sudo mount -t vfat $partBoot /media
  2. sudo cp -rfp /boot/* /media/
  3. sudo umount /media

ext4 linux虚拟磁盘分区用dump & restore 备份

sudo mount -t ext4 $partRoot /media/cd /mediasudo dump -0uaf - / |  sudo restore -rf -cdsudo umount /media

六、卸载虚拟磁盘

sudo kpartx -d $loopdevicesudo losetup -d $loopdevice

经过以上六步树莓派中的数据文件就全部备份到raspberrypi.img中了,你既可以在Windows中用Win32DiskImager将镜像恢复到SD卡,也可以在Linux用dd还原到SD卡,而且不要求恢复SD卡的大小跟原来的一样(不同品牌相同大小的SD卡实际可用空间不一样的,坑!),这样就可以很方便的更换SD卡。当用此SD卡启动树莓派的时候执行raspi-config ->Expand Filesystem 即可扩展未使用的空间。

这里就是最后的脚本,包含了以上六步,只需要编辑sudo vi backup.sh复制以下内容,sudo chmod 777 genimg.sh,然后sudo ./backup.sh就可以在当前脚本目录中生成树莓派的SD卡镜像了。

#!/bin/shsudo dd if=/dev/zero of=raspberrypi.img bs=1MB count=2500sudo parted raspberrypi.img --script -- mklabel msdossudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 122879ssudo parted raspberrypi.img --script -- mkpart primary ext4 122880s -1loopdevice=`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 $partBootsudo mkfs.ext4 $partRootsudo mount -t vfat $partBoot /mediasudo cp -rfp /boot/* /media/sudo umount /mediasudo mount -t ext4 $partRoot /media/cd /mediasudo dump -0uaf - / | sudo restore -rf -cdsudo umount /mediasudo kpartx -d $loopdevicesudo losetup -d $loopdevice

 




制作树莓派镜像,可以参考这篇文章: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 msdossudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 122879ssudo 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 $partBootsudo mkfs.ext4 $partRoot

 

六、开始备份 
boot分区为fat32格式,可以直接利用cp命令直接拷贝

sudo mount -t vfat $partBoot /mediasudo cp -rfp /boot/* /media/sudo umount /media

 

 

 

linux分区为ext4格式,需要利用dump & restore备份

复制代码
#跳过raspberrypi.img不备份sudo chattr +d raspberrypi.imgsudo mount -t ext4 $partRoot /media/cd /mediasudo dump -h 0 -0uaf - / | sudo restore -rf -cdsudo umount /media
复制代码

 

这里原文中也有一点bug,用dump进行磁盘备份时,会将之前创建的空白img一并备份进去,通过chattr跳过raspberrypi.img

七、备份完毕,卸载虚拟磁盘 
此时,已将所有数据备份至空白img,此时就可以卸载虚拟磁盘,将img拷贝出保存了。 
然后利用Win32DiskImager或者df命令即可将该raspberrypi.img恢复至sd卡上。

sudo kpartx -d $loopdevicesudo losetup -d $loopdevice

 

这里是整理后的脚本,编辑sudo vi backup.sh,复制以下内容,sudo chmod 777 backup.sh,然后sudo ./backup.sh就可以在当前脚本目录中生成树莓派的SD卡镜像了。

 

也可以参考如下shell脚本:

复制代码
#!/bin/shsudo apt-get install -y dosfstools parted kpartx rsyncdf=`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=$dfsudo parted raspberrypi.img --script -- mklabel msdosstart=`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 $endsudo parted raspberrypi.img --script -- mkpart primary ext4 $end2 -1loopdevice=`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 $partBootsudo mkfs.ext4 $partRootsudo mount -t vfat $partBoot /mediasudo cp -rfp /boot/* /media/sudo umount /mediasudo mount -t ext4 $partRoot /media/cd /mediasudo rsync -aP --exclude="raspberrypi.img" --exclude=/media/* --exclude=/sys/* --exclude=/proc/*  --exclude=/tmp/* / ./cdsudo umount /mediasudo kpartx -d $loopdevicesudo losetup -d $loopdevice

0 0