前言

最近经常玩电子垃圾,之前都是刷别人制作好的初始系统镜像img文件,每次刷机都要进行一些基础配置:替换固件中的一些文件、设置账户和密码、改国内源、改ssh配置、装基础软件。

但因为我经常重刷,每次重刷又要把上面提到的基础配置流程走一遍,少说也要半个小时。重复了一次又一次以后,我肯定要考虑自己制作镜像文件了,类似早年的windows ghost,把完成了基础配置的系统直接做成镜像,下次刷机就不用再无意义的重复了。

linux下实现这个功能,用dd命令。


准备工作

  • 目的是备份整个系统盘
  • 假定系统盘是/dev/sda
  • 要另一个u盘或者移动硬盘做备份盘,这里假定备份盘为/dev/sdb

制作镜像

第一步:插上备份盘,用命令lsblk确认系统盘和备份盘的名称,系统盘为/dev/sda,备份盘为/dev/sdb

第二步:挂载备份盘到/mnt

mount /dev/sdb /mnt

第三步:制作镜像。

dd if=/dev/sda of=/mnt/sda_bakcup.img

这是最简单的备份方式,不考虑任何其它参数(比如bscount),就是1:1的备份,如果系统盘是2GB(指整个盘的大小,不是指已使用的空间),那制作出来的镜像也就是2GB。

如果想制作的镜像是压缩包,减少占用空间,这里以xz格式为例

dd if=/dev/sda | xz > /mnt/sda_backup.img.xz

优化

dd命令可以通过增加-bs-count来优化传输速度和镜像大小。

先看下bscount的定义:

bs=bytes:指block size,用来设定多少了bytes为一个block,系统就以一个block为数据单位进行读取和写入。可以分成ibsobs两个参数分别设定读和写。

count=blocks:设定整个dd任务读取多少个blocks的数据。

  • bs用来设定每次读写的数据量,读取指定数据量为一个块(block)到缓存,然后从缓存把指定的数据量写到备份盘。无论是u盘、hdd还是ssd,一般大文件的连续读写速度都是远远高于小文件的随机读写,所以这个值可以设置的大一些。但也要根据自己的实际情况调整,比如小文件特别多时,可以分开设定读的数据量(ibs)和写的数据量(obs),更好的优化速度。

  • count用来设定读取多少个块(block)以后停止读取。如果这个值留空,默认全盘克隆,也就意味着原盘20G,生成的镜像也是20G,原盘如果200G,镜像就是200G,所谓1:1复制。但实际其实只需要克隆数据就可以了,没有使用的空白空间不需要写到镜像里,比如200G的盘,实际只使用了8GB,假定bs=1M,计算以后可得count应该是8192,考虑到空间冗余,可以设定count=9000,那生成的镜像文件就是9000M,不会出现无意义的空白空间占用镜像体积。

另外还可以整合xzgzip之类的压缩命令,把镜像生成为压缩包,减少镜像文件的体积。但要注意,压缩需要cpu算力性能的支持,如果cpu性能孱弱(比如我的ws1508),使用xz命令以后会爆炸式的增加dd制作镜像的时间。所以cpu性能弱的就不用考虑整合xz命令。

  • xz命令可以通过-T增加线程数,默认是1。

增加三个参数以后的例子:

dd bs=1M count=1400 if=/dev/sda | xz -T3 > /mnt/backup-20230724.img.xz

╮(╯▽╰)╭


参考文章

1: https://www.runoob.com/linux/linux-comm-dd.html