前言

其实之前已经写过一篇用dd制作系统备份镜像文件的文章,【Linux使用dd命令克隆磁盘(制作系统镜像)】。但写的有点啰嗦,直接改也不合适。索性重新写一篇简单的。

先定义一下两个名词:

  • 当前系统:指装在玩客云emmc上的armbian
  • 第三方系统:指装在u盘、sd卡上的玩客云armbian

用dd命令备份还原的原理和windows ghost一样,就是把整个emmc磁盘克隆,生成一个img镜像文件。要还原的时候,再用dd命令把img镜像文件写回emmc。

整个过程分成两步:备份 + 还原。备份可以在当前系统或第三方系统下操作,还原必须要通过第三方系统。

这篇文章中,我是在【当前系统】下备份,在【第三方系统】下还原。


准备工作

  • 一个已经直刷armbian的玩客云(系统装在emmc)
  • 备份操作需要准备一个移动硬盘或者存储U盘,因为生成的备份镜像大概1~2GB左右
  • 还原系统需要准备一个已经刷了armbian的U盘或者sd卡
  • ssh连上玩客云机器

备份

先用lsblk命令确定分区信息和设备名称,输出结果如下

NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda            8:0    0 465.8G  0 disk
└─sda1         8:1    0 465.8G  0 part /mnt
mmcblk1      179:0    0   7.3G  0 disk
├─mmcblk1p1  179:1    0   256M  0 part /boot
└─mmcblk1p2  179:2    0     7G  0 part /var/log.hdd
                                       /
mmcblk1boot0 179:16   0     4M  1 disk
mmcblk1boot1 179:32   0     4M  1 disk
zram0        253:0    0 494.7M  0 disk [SWAP]
zram1        253:1    0    50M  0 disk /var/log
zram2        253:2    0     0B  0 disk

可以看到玩客云内置emmc分区的硬件名称是mmcblk1,分了两个区,一个是mmcblk1p1启动分区,一个是mmcblk1p2系统分区。通过usb外接的移动硬盘的设备名称是挂载在/mntsda1。所以最终要实现的需求就是把整个mmcblk1制作成img镜像文件,保存到sda1的某个路径下(假定/mnt/ws1608-backup.img)。

在用dd命令开始制作镜像之前,需要先指定读取多少内容(或者理解为给镜像分配多少空间)。如果不指定读取多少内容,就会读取整个emmc存储的7.3GB空间,最后生成一个7.3GB的系统镜像。

上面lsblk命令的输出结果中可以看到,mmcblk1p1启动分区,大小256MB,mmcblk1p2系统分区,大小7GB,但实际系统分区使用的只有一点点,大部分都是空白空间(free space),空白空间不需要备份。

df -h命令来查看系统分区的空间使用情况,输出结果如下

Filesystem      Size  Used Avail Use% Mounted on
udev            460M     0  460M   0% /dev
tmpfs            99M  4.1M   95M   5% /run
/dev/mmcblk1p2  6.9G  1.5G  5.4G  21% /
tmpfs           495M     0  495M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           495M     0  495M   0% /tmp
/dev/mmcblk1p1  256M   44M  213M  17% /boot
/dev/zram1       47M   14M   30M  32% /var/log
/dev/sda1       466G  253G  214G  55% /mnt
tmpfs            99M     0   99M   0% /run/user/1000

可以看到系统分区mmcblk1p2只使用了1.5GB。

现在可以开始用dd命令备份了。启动分区256MB,系统分区使用了1.5GB,合计1.8GB,再考虑一些冗余空间,这里指定读取2GB空间吧。命令中的bscount参数的定义这篇文章中不再赘述,而且镜像也不进行压缩打包。想知道参数定义、想压缩打包的,可以看【Linux使用dd命令克隆磁盘(制作系统镜像)】。

dd bs=1M count=2000 if=/dev/mmcblk1 of=/mnt/ws1608-backup.img

玩客云的usb2.0接口的极限速度大概35MB/s,2GB的镜像,1分钟左右就制作好了。


还原

有了镜像备份以后,系统玩坏了,就可以通过重新写入img镜像来还原系统。

要还原自制的img备份,需要准备的工具如下:

  • 一个u盘(sd卡也行)且已经刷了u盘版本的玩客云armbian系统
  • 自制的img备份文件

好了,现在还是还原系统。

第一步:插入系统u盘(或者sd卡),机器通电开机,进入u盘的armbian系统

第二步:准备好img备份镜像。我这里是存在移动硬盘,挂载到/mnt,所以镜像路径是/mnt/ws1608-backup.img

第三步:把img备份镜像重新写入emmc

dd if=/mnt/ws1608-backup.img of=/dev/mmcblk1

第四步:等写入完成后,关机,拔掉全部u盘,然后通电开机,emmc上的系统就完成还原了。😄


扩展

结合crontab的定时任务功能,可以设置每天、每周定时生成系统备份镜像。