说明

整理自:https://blog.csdn.net/zhufu86/article/details/78821056,感谢原作者分享

说明:将树莓派Zero SD卡中的系统在树莓派3 B+上做成img镜像,并使用dd命令将生成的img镜像烧写到新的sd卡中,经测试可以正常使用。

注意:

(1)之前使用CentOS7的PC机按照原作者的方法测试未成功,使用树莓派3 B+测试成功,所以建议使用树莓派环境做img。

(2)新的SD卡使用前要对其格式化,我是用的是“SD Card Formatter”这个软件对其进行格式化的,格式化成功后SD卡只会看到一个盘符。

==========================================

准备

首先在工作平台(树莓派3 B+)上按章必须的工具软件:

pi@raspberrypi:~ $ sudo apt-get install dosfstools dump parted kpartx

建立工作目录:

pi@raspberrypi:~ $ mkdir ~/backupimg

pi@raspberrypi:~ $ cd ~/backupimg

pi@raspberrypi:~/backupimg $

生成空白img文件

插入装有源SD卡的读卡器到USB口后,确定源SD卡对应的设备名

pi@raspberrypi:~/backupimg $ ls /dev/sd*

/dev/sda /dev/sda1 /dev/sda2

如上所示 /dev/sda 为源SD卡, /dev/sda1 为 /boot, /dev/sda2 为 / (根)
不同的系统会有所不同,可能会是sdb… 或其他

【挂载SD卡】

pi@raspberrypi:~/backupimg $ mkdir src_boot src_root

pi@raspberrypi:~/backupimg $ sudo mount -t vfat -o uid=pi,gid=pi,umask=0000 /dev/sda1 ./src_boot/

pi@raspberrypi:~/backupimg $ sudo mount -t ext4 /dev/sda2 ./src_root/

请注意,我用的是另一个raspberry系统做备份操作的,如果是用其他linux系统,例如PC上的Debian,请注意uid和gid的设置

【查看源SD卡已用空间大小】

pi@raspberrypi:~/backupimg $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        59G  6.1G   51G  11% /
devtmpfs        460M     0  460M   0% /dev
tmpfs           464M     0  464M   0% /dev/shm
tmpfs           464M   13M  452M   3% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           464M     0  464M   0% /sys/fs/cgroup
/dev/mmcblk0p1   42M   21M   21M  51% /boot
tmpfs            93M     0   93M   0% /run/user/1000
/dev/sda1        56M   21M   36M  37% /home/pi/backupimg/src_boot
/dev/sda2        15G  4.0G  9.9G  29% /home/pi/backupimg/src_root

如上可以看出/dev/sda已用空间大约4G
建立一个空白的img文件,因为源SD卡已用空间大约4G,那么建立一个4600M的空白img文件应该够了。(安全起见,设定5000会更好)

pi@raspberrypi:~/backupimg $ sudo dd if=/dev/zero of=raspberrypi.img bs=1M count=4600
4600+0 records in
4600+0 records out
4823449600 bytes (4.8 GB, 4.5 GiB) copied, 283.248 s, 17.0 MB/s

完成后,确认一下img文件已经生成,且文件大小正确

pi@raspberrypi:~/backupimg $ ls -l raspberrypi.img
-rw-r--r-- 1 root root 4823449600 Dec 15 22:00 raspberrypi.img

【然后给img文件分区】

pi@raspberrypi:~/backupimg $ sudo parted raspberrypi.img --script -- mklabel msdos
pi@raspberrypi:~/backupimg $ sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 122479s
pi@raspberrypi:~/backupimg $ sudo parted raspberrypi.img --script -- mkpart primary ext4 122880s -1

分区的起始扇区数都是 8192 的倍数【20180716更新】,以保证4k对齐

【检查分区是否成功】

pi@raspberrypi:~/backupimg $ sudo parted raspberrypi.img
GNU Parted 3.2
Using /home/pi/backupimg/raspberrypi.img
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print free                                                       
Model:  (file)
Disk /home/pi/backupimg/raspberrypi.img: 4823MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
        16.4kB  4194kB  4178kB           Free Space
 1      4194kB  62.7MB  58.5MB  primary               lba
        62.7MB  62.9MB  205kB            Free Space
 2      62.9MB  4822MB  4759MB  primary
        4822MB  4823MB  1049kB           Free Space

(parted) quit  

在parted程序中,输入print free命令可以显示分区内容,输入quit退出

【挂载img文件到系统】
img文件对应的Loop device的设置

pi@raspberrypi:~/backupimg $ sudo losetup -f --show raspberrypi.img
/dev/loop0

下面的命令中相应输入/dev/loop0,如果不是 loop0 请做相应调整(以及以后的各个步骤里的loop0都要改变)

pi@raspberrypi:~/backupimg $ sudo kpartx -va /dev/loop0
add map loop0p1 (254:0): 0 114288 linear 7:0 8192
add map loop0p2 (254:1): 0 9295872 linear 7:0 122880

pi@raspberrypi:~/backupimg $ ls /dev/mapper/loop0p*
/dev/mapper/loop0p1  /dev/mapper/loop0p2

此时loop device就设置好了,loop0p1对应的是img文件分区上的 /boot,loop0p2对应的是 /(根)
【接着给img文件中的两个分区格式化】

pi@raspberrypi:~/backupimg $ sudo mkfs.vfat -n boot /dev/mapper/loop0p1
mkfs.fat 4.1 (2017-01-24)
mkfs.fat: warning - lowercase labels might not work properly with DOS or Windows
pi@raspberrypi:~/backupimg $ sudo mkfs.ext4 /dev/mapper/loop0p2
mke2fs 1.43.4 (31-Jan-2017)
Discarding device blocks: done                            
Creating filesystem with 1161984 4k blocks and 290880 inodes
Filesystem UUID: d3e5d272-7752-48b2-a10e-e0e6d217ca7e
Superblock backups stored on blocks: 
32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

【挂载目标img文件loop device】

pi@raspberrypi:~/backupimg $ mkdir tgt_boot tgt_root
pi@raspberrypi:~/backupimg $ sudo mount -t vfat -o uid=pi,gid=pi,umask=0000 /dev/mapper/loop0p1 ./tgt_boot/
pi@raspberrypi:~/backupimg $ sudo mount -t ext4 /dev/mapper/loop0p2 ./tgt_root/

请注意,我用的是另一个raspberry系统做备份操作的,如果是用其他linux系统,请注意uid和gid的设置

【备份/boot】
首先备份/boot,直接拷贝即可

pi@raspberrypi:~/backupimg $ sudo cp -rfp ./src_boot/* ./tgt_boot/

【备份“/”】
备份根文件系统稍微复杂些,可以用两种方法, 我测试时使用了原作者的第一种方法,第二种方法请参看原作者的文章。

dump/restore方法

首先对目标挂载点设置合适的权限,并清空

pi@raspberrypi:~/backupimg $ sudo chmod 777 tgt_root
pi@raspberrypi:~/backupimg $ sudo chown pi.pi tgt_root
pi@raspberrypi:~/backupimg $ sudo rm -rf ./tgt_root/*
pi@raspberrypi:~/backupimg $ cd tgt_root/

请注意,我用的是另一个raspberry系统做备份操作的,如果是用其他linux系统,请注意uid和gid的设置

然后开始备份

pi@raspberrypi:~/backupimg/tgt_root $ sudo dump -0uaf - ../src_root/ | sudo restore -rf -
  DUMP: Date of this level 0 dump: Fri Dec 15 22:22:34 2017
  DUMP: Dumping /dev/sda2 (/home/pi/backupimg/src_root) to standard output
  DUMP: Label: none
  DUMP: Writing 10 Kilobyte records
  DUMP: mapping (Pass I) [regular files]
  DUMP: mapping (Pass II) [directories]
  DUMP: estimated 4241064 blocks.
  DUMP: Volume 1 started with block 1 at: Fri Dec 15 22:22:35 2017
  DUMP: dumping (Pass III) [directories]
  DUMP: dumping (Pass IV) [regular files]
  DUMP: 62.53% done at 8780 kB/s, finished in 0:03
  DUMP: Volume 1 completed at: Fri Dec 15 22:30:36 2017
  DUMP: Volume 1 4242680 blocks (4143.24MB)
  DUMP: Volume 1 took 0:08:01
  DUMP: Volume 1 transfer rate: 8820 kB/s
  DUMP: 4242680 blocks (4143.24MB)
  DUMP: finished in 481 seconds, throughput 8820 kBytes/sec
  DUMP: Date of this level 0 dump: Fri Dec 15 22:22:34 2017
  DUMP: Date this dump completed:  Fri Dec 15 22:30:36 2017
  DUMP: Average transfer rate: 8820 kB/s
  DUMP: DUMP IS DONE

整个dump/restore过程需要几分钟时间,看到 DUMP IS DONE 就说明备份成功了
然后返回上层目录

【---------- 20190522添加 ------------】

在自己的desktop版本的树莓派上运行上述备份命令后,出现如下错误:

DUMP: You can't update the dumpdates file when dumping a subdirectory
  DUMP: The ENTIRE dump is aborted.

在网上找了很多办法都不能解决这个问题,最后将自己执行上述备份操作的树莓派版本换成lite版本(没有desktop),上面的备份操作就可以顺利完成了。

【---------- 20190522 ------------】

pi@raspberrypi:~/backupimg/tgt_root $ cd ..
pi@raspberrypi:~/backupimg $

【相应修改PARTUUID设定】
这时候整个备份就已经完成了。不过此时的img文件即使写入到空白SD卡里面也是无法启动的,因为Raspbian启动要对应分区的PARTUUID,所以我们还要修改目标img文件里的如下两个文件:

./tgt_boot/cmdline.txt 
./tgt_root/etc/fstab

首先查看img文件对应的loop device的两个分区的PARTUUID(经测试使用CentOS7在执行这一步后没有PARTUUID,参考https://www.raspberrypi.org/forums/viewtopic.php?t=105868使用UUID代替,但测试并不成功,所以建议在树莓派环境中操作)

pi@raspberrypi:~/backupimg $ sudo blkid
/dev/mmcblk0p1: LABEL="boot" UUID="E5B7-FEA1" TYPE="vfat" PARTUUID="ddffe93a-01"
/dev/mmcblk0p2: UUID="b4ea8e46-fe87-4ddd-9e94-506c37005ac5" TYPE="ext4" PARTUUID="ddffe93a-02"
/dev/sda2: UUID="9a7608bd-5bff-4dfc-ac1d-63a956744162" TYPE="ext4" PARTUUID="ec04fe79-02"
/dev/loop0: PTUUID="af2f8761" PTTYPE="dos"
/dev/mmcblk0: PTUUID="ddffe93a" PTTYPE="dos"
/dev/sda1: LABEL="boot" UUID="B60A-B262" TYPE="vfat" PARTUUID="ec04fe79-01"
/dev/mapper/loop0p1: SEC_TYPE="msdos" LABEL="boot" UUID="755C-C29C" TYPE="vfat" PARTUUID="af2f8761-01"
/dev/mapper/loop0p2: UUID="a174c97e-049f-4fbd-abb7-0b9098dae24a" TYPE="ext4" PARTUUID="af2f8761-02"

这里可以看到/boot对应的是af2f8761-01 , / 对应的是af2f8761-02
【修改 cmdline.txt 文件】

pi@raspberrypi:~/backupimg $ sudo vi ./tgt_boot/cmdline.txt 
pi@raspberrypi:~/backupimg $ cat ./tgt_boot/cmdline.txt 
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=af2f8761-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

【修改 fstab 文件】

pi@raspberrypi:~/backupimg $ sudo vi ./tgt_root/etc/fstab 
pi@raspberrypi:~/backupimg $ cat ./tgt_root/etc/fstab 
proc            /proc           proc    defaults          0       0
PARTUUID=af2f8761-01  /boot           vfat    defaults          0       2
PARTUUID=af2f8761-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

【卸载各个挂载的分区】

pi@raspberrypi:~/backupimg $ sudo umount src_boot src_root tgt_boot tgt_root

【删除loop device】

pi@raspberrypi:~/backupimg $ sudo kpartx -d /dev/loop0
pi@raspberrypi:~/backupimg $ sudo losetup -d /dev/loop0

【删除挂载点目录】

pi@raspberrypi:~/backupimg $ rmdir src_boot src_root tgt_boot tgt_root

【最后剩下img文件】

pi@raspberrypi:~/backupimg $ ls -l
total 4469676
-rw-r--r-- 1 root root 4823449600 Dec 15 23:10 raspberrypi.img

【将生成的img文件写入新的SD卡中】

烧写img到新的SD卡的命令:

dd if=/path/to/image/raspberrypi.img of=/dev/sda  (注意不同的设备可能是/dev/sdb, /dev/sdc, ...)

【大功告成】
完成之后可以用dd或者Etcher烧写img文件到其他SD卡中,注意烧写到新卡中在树莓派中运行后,要先用raspi-config先把分区空间expand一下,否则可用空间会很小。

(--------------完-------------)

手动一步一步来制作备份Raspberry Pi树莓派SD卡的img映像文件(不用dd命令,已测试通过)相关推荐

  1. 树莓派3b+ CENTOS7 制作备份Raspberry Pi树莓派SD卡的img映像文件(不用dd命令)[转载]...

    2019独角兽企业重金招聘Python工程师标准>>> 之前复制或者备份树莓派的SD卡,都是用dd命令全盘复制,可以用,但是这样有两大缺点: 1. 慢 2. 一个大的SD卡,比如64 ...

  2. 【树莓派】树莓派SD卡系统镜像系统备份方法

    微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 先感谢漂移菌的技术支持,耐心.细致的帮我解决了一个困扰我很久的问题--树莓派系统备份问 ...

  3. 树莓派 SD卡 的系统备份 方法 WindowsLinux (奶妈式教学)

    树莓派SD卡的系统备份方法 Win&Linux 情景: 在树莓派上进行开发的时候经常遇到各种超出预料而又无法解决的问题需要重装系统,问题是重装系统之后一大堆的设置和常用的软件包实在让人头疼,之 ...

  4. 如何备份还原ABB机器人SD卡系统,如何自制ABB机器人SD系统卡。

    所需工具:普通的SD卡,带有系统的SD卡. 软件:EasyGhost,用于磁盘的备份与还原. DISKGENIUS,用于磁盘分区的修改与创建.电脑安装系统必备工具. 链接:https://pan.ba ...

  5. 第1章 Raspberry Pi树莓派系统镜像制作方法

    前言 本文将探讨的树莓派操作系统版本为Raspbian,树莓派操作系统一般的制作(安装)方法是通过官方下先最新版的镜像文件(大概在4G左右),然后通过专用软件进行烧写到TF卡. 本方案采用两步法来达到 ...

  6. Raspberry Pi 树莓派的备份

    脚本 http://pastebin.com/48fr9BAS# 官方BBS http://raspberrypi.stackexchange.com/questions/311/how-do-i-b ...

  7. 【移植Linux 3.4.2内核第三步】从0制作支持新内核的文件系统

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 上一篇文章,我们修改了内核代码改了系统的分区,但是最后启动,发现虽然 ...

  8. 制作SD卡备份镜像以及还原

    转载:https://blog.csdn.net/zhenguo26/article/details/799672470 补充说明: 这里介绍树莓派怎么备份一个SD卡的镜像文件,烧写到SD卡,变成一模 ...

  9. Android开发环境搭建与起步--太详细了,一步一步图文教你

    字体颜色说明:黑色表示已理解内容,红色表示未解决的问题或知识点. 目录 一.安装JDK.. 1 1.JDK下载... 1 2.安装JDK.. 1 3.环境变量设置... 3 二.安装Eclipse. ...

最新文章

  1. setTimeOut()
  2. PHP:使用Zend对源码加密、Zend Guard安装以及Zend Guard Run-time support missing的解决方法
  3. POJ - 3322 Bloxorz I(bfs+状态设计)
  4. 工作208:element $message居中测试无法实现
  5. linux查看日志命令_查看log日志基础命令
  6. android makefile文件批量拷贝文件的方法
  7. 快速入门(完整):Python练手经典实例100个 (让你的Python技能点全亮)
  8. 达梦数据库ODBC连接异常问题
  9. Java使用ffmpeg将视频转为Mp4格式
  10. 职场“奇葩说”:我的老板有多坑?
  11. 12.21 linux前戏
  12. 《亡灵序曲》各版本收集
  13. Blink SQL内置函数大全
  14. mysql即是主键又是外键怎么写_数据库 既是主键又是外键
  15. excel 关联数据
  16. Haproxy基础知识 -运维小结
  17. Java、JSP企业内部邮件系统
  18. js实现web汉字笔画教学
  19. java中的强行终止线程的执行
  20. 面试官:线上服务CPU飙高怎么排查?

热门文章

  1. 还在找 WiFi 吗?
  2. j2se、j2ee、j2me、jse、jee及jme的区别
  3. i2c子系统之platform_driver初始化——i2c_adap_s3c_init()
  4. 应届生白手起家当老板
  5. dataframe数据运算测速
  6. 支持UEFI的主板在win10下安装ubuntu双系统
  7. 让机器人更安全——(2.协作机器人的兴起)
  8. 第三章:鼓起勇气,大胆尝试
  9. 照猫画虎学太极(杨)
  10. taichi 冰雪奇缘学习