使用dd备份、还原镜像

在前面的章节中介绍了如何在emmc/nand与SD卡之间如何相互备份烧录,前面的方式较为简单, 也 推荐 使用前面的方式对镜像进行备份,接下来将介绍一种较为复杂的备份方式作为备用方案。

基于SD卡搭建了自己的环境

下面介绍两种备份SD卡镜像的方法,一种是使用dd命令来备份SD卡镜像, 该方法的优点是备份的镜像大小比较小,缺点是容易制作失败; 另一种是使用Win32磁盘映像工具备份镜像,该方法的有点是比较简单直接,在windows下操作, 不容易出错,缺点是备份的镜像太大,备份时间长,它备份整个SD卡作为镜像。

将带镜像SD卡的内容打包成镜像文件.img

  1. 将已经搭建好环境的SD卡从开发板取出并插到读卡器上,然后将读卡器接入PC机(ubuntu中), 在桌面版本的ubuntu中会自动挂载SD卡的内容,使用 df -h 命令查看下SD卡中镜像的大小。

    #命令
    df -h
    
    #部分打印信息
    /dev/sdb4       100M   18M   83M   18% /media/embedfire/BOOT
    /dev/sdb6       987M  813M  108M   89% /media/embedfire/rootfs
    

    在此台电脑中,该SD卡设备挂载在/dev/sdb中,由于该SD卡有6个分区,只能识别2个分区, 分别为/dev/sdb4和/dev/sdb6。 大家根据自己Ubuntu中SD卡设备的实际情况来处理,如果不知道自己的SD卡设备是哪个, 可以先不插入读卡器,ls /dev看下有哪些设备, 然后再插入读卡器再ls /dev查看当前设备,对比两次的ls /dev,一般多出来的设备便是该SD卡。

    从上图可以看到SD卡镜像大小为/dev/sdb4 + /dev/sdb6 +其余分区= 100M + 987M +100M = 1187M。 可以取整1200MB。

  2. 使用 mkdir 命令创建一个新的目录,用于存放从带镜像的SD卡中拷贝的镜像。 然后使用 dd 命令将带镜像的SD中的镜像拷贝到新创建的目录中。

    #创建新目录
    mkdir image_backup
    
    #将带镜像的SD卡中的镜像拷贝到创建的目录中
    sudo dd if=/dev/sdb of=./image_backup/mp157_backup.img count=1200 bs=1024k conv=sync
    
    #拷贝需要时间,请耐心等待,打印消息如下
    ount=1200 bs=1024k conv=sync
    [sudo] embedfire 的密码:
    记录了1200+0 的读入
    记录了1200+0 的写出
    1258291200 bytes (1.3 GB, 1.2 GiB) copied, 128.125 s, 9.8 MB/s
    

    使用dd命令拷贝的时候要注意拷贝的大小尽量大于SD卡中镜像的大小,此处拷贝了1200M, 需要保证整个镜像都被完整的拷贝出来而没有遗漏, 拷贝完成后可以将备份的img镜像烧录到其他SD卡中。

    提示

    若备份的镜像烧录后仍无法正常运行,请将bs=1024k改为bs=1M并去掉conv参数,即 sudo dd if=/dev/sdb of=./image_backup/mp157_backup.img count=1200 bs=1M

dd命令参数的含义:

  • if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=/dev/sdb >

  • of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=./image_backup/mp157_backup.img, 这里的.img是镜像的格式,转成.img格式的文件后方便后续使用etcher烧录镜像 >

  • bs = bytes:同时设置读入/输出的块大小为bytes个字节,此处填的是1024,表示1M大小。

  • count = blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数,此处设置的是1200, 表示1200个bs,也就是1200M。

  • conv= sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

得到img文件后,就可以将这个img文件烧录到其它卡上了,具体烧录步骤请参考前面的说明。

使用Win32磁盘映像工具备份Debian系统镜像

Win32磁盘映像工具下载链接: https://win32diskimager.org/

  1. 在windows下新建一个空文件,后缀为img,例如backup.img, 将需要备份镜像的SD卡插到windows上并打开Win32磁盘映像工具, 然后点击文件夹图标,找到刚刚创建的backup.img文件并确认,并确认SD卡盘符, 取消“仅读取已分配区”的勾选,最后点击读取按钮,如果弹出是否覆盖backup.img的对话框, 点击是即可,等待镜像备份完毕。

    未找到图片36|

    此时镜像已经备份完毕,备份好的镜像就是backup.img。

  2. 除了Etcher软件之外,也能够使用Win32磁盘映像工具烧写SD卡, 打开Win32磁盘映像工具,选择backup.img镜像,选择新的空白SD卡盘符, 最后点击写入按钮即可,注意被烧录的SD卡大小必须大于等于镜像的大小。

    未找到图片37|

备份开发板emmc中的环境(须支持SD卡启动)

在章节中,需要使用到两张SD卡,一张空白的SD镜像,一张装有系统镜像, 同时需要板子支持SD卡启动,大致步骤为:

备份:

  1. 在需要备份的开发板中插入装有系统的SD卡,选SD卡启动。

  2. 将空白SD卡通过读卡器插到开发板上。

  3. 将开发板的内容备份到空白SD卡上。

烧录:

  1. 将需要烧写系统的开发板插入装有系统的SD卡,选择SD卡方式启动。

  2. 将备份好数据的SD卡通过读卡器插到需要烧写的开发板中,将备份的内容烧写到该开发板中。

产品量产,且需将制作好的SD卡镜像备份到emmc中

注意

需要将空白SD卡格式化为NTFS格式,FAT32格式不支持4G以上文件大小的拷贝。 同时还要使镜像系统支持NTFS格式,从emmc备份的镜像只能烧录到其他emmc板子上。

提示

建议将emmc烧录到sd卡,然后将sd卡镜像进行打包,不建议直接使用以下方法。

备份

  1. 想要系统支持NTFS格式有两种方法, 一种是在制作linux内核的时候,在make menuconfig菜单选项里面勾选NTFS格式支持选项, 另一种是通过软件包安装NTFS格式支持,此处采用第二种方法,通过apt命令安装 ntfs-3g 即可 。

    将烧录好镜像的SD卡插入到板子上,选择以SD卡的方式启动开发板。

    1
    2
    3
    4
    5
    #更新软件索引
    sudo apt updade
    
    #安装ntfs-3g
    sudo apt install ntfs-3g
    
  2. 将空白SD卡格式化为NTFS格式,将SD卡插入读卡器并接入PC机, 找到该SD卡存储器,右击,然后选择NTFS格式化即可, 所用的SD卡大小必须大于emmc设备的容量大小。

    未找到图片00|
  3. 将空的NTFS格式的SD卡插入读卡器,然后将读卡器接入板子的USB接口, 可输入 lsblk 命令查看设备情况,如下所示

    lsblk
    
    #打印信息如下
    NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda            8:0    1 28.9G  0 disk
    └─sda1         8:1    1 28.9G  0 part
    mmcblk0      179:0    0 14.9G  0 disk
    ├─mmcblk0p1  179:1    0  256K  0 part
    ├─mmcblk0p2  179:2    0  256K  0 part
    ├─mmcblk0p3  179:3    0    2M  0 part
    ├─mmcblk0p4  179:4    0  100M  0 part /boot
    ├─mmcblk0p5  179:5    0   32K  0 part
    └─mmcblk0p6  179:6    0 14.8G  0 part /
    mmcblk1      179:16   0  7.3G  0 disk
    ├─mmcblk1p1  179:17   0    2M  0 part
    ├─mmcblk1p2  179:18   0  100M  0 part
    ├─mmcblk1p3  179:19   0  512K  0 part
    └─mmcblk1p4  179:20   0  7.2G  0 part
    mmcblk1boot0 179:32   0    4M  1 disk
    mmcblk1boot1 179:48   0    4M  1 disk
    

    此处可看到SD卡大小为28.9G已经识别出来了,设备为sda1。

  4. 使用 mount 命令将SD卡设备挂载到/mnt这个挂载点下。

    mount -t ntfs-3g /dev/sda1 /mnt/
    

    使用 df -h 命令可看到/dev/sda1已经被挂载到了/mnt目录下

  5. 使用dd命令将整个emmc设备的内容全部备份到/mnt/中,在开发板上emmc的设备为 mmcblk1,其中mmcblk1p2和mmcblk1p4为emmc的两个分区,此处需要备份的是emmc的全部 内容。输入命令 sudo dd if=/dev/mmcblk1 of=/mnt/image_emmc_backup.img 开始拷贝。

    sudo dd if=/dev/mmcblk1 of=/mnt/image_emmc_backup.img
    

    当输入完这条命令后,此时需要耐心的等待备份完成,因为板载emmc大小默认为8G, 所以非常耗时间,一般需要好几个小时,甚至一上午。

    当看到如下信息,说明表明拷贝完成。

    #拷贝完成信息
    15269888+0 records in
    15269888+0 records out
    7818182656 bytes (7.8 GB, 7.3 GiB) copied, 12933.1 s, 605 kB/s
    
  6. 最后使用 umount /mnt 取消挂载。

umount /mnt

还原

  1. 使用需要烧录的新板子,插入装有镜像的SD卡,选择SD卡启动, 同时将备份好的SD卡插入读卡器通过USB接口连接到板子上。 板子启动后确定备份的SD卡所对应的设备文件,使用 mount 命令挂载到 /mnt 中,

    sudo mount -t ntfs-3g /dev/sdb1 /mnt/
    
  2. 挂载后,接下来就是将挂载点/mnt目录下的image_emmc_backup.img文件烧录到emmc上, 开发板的emmc设备文件默认为/dev/mmcblk1。

  3. 使用dd命令,将image_emmc_backup.img文件的数据拷贝到/dev/mmcblk1上。

    sudo dd if=/mnt/image_emmc_backup.img of=/dev/mmcblk1
    

    还原的时间也是相当漫长,请耐心等待。

至此,镜像备份结束。