Linux使用dd命令克隆磁盘(制作系统镜像)
前言
最近经常玩电子垃圾,之前都是刷别人制作好的初始系统镜像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
这是最简单的备份方式,不考虑任何其它参数(比如bs
和count
),就是1:1的备份,如果系统盘是2GB(指整个盘的大小,不是指已使用的空间),那制作出来的镜像也就是2GB。
如果想制作的镜像是压缩包,减少占用空间,这里以xz格式为例
dd if=/dev/sda | xz > /mnt/sda_backup.img.xz
优化
dd
命令可以通过增加-bs
和-count
来优化传输速度和镜像大小。
先看下bs
和count
的定义:
bs=bytes:指block size,用来设定多少了bytes为一个block,系统就以一个block为数据单位进行读取和写入。可以分成
ibs
和obs
两个参数分别设定读和写。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,不会出现无意义的空白空间占用镜像体积。
另外还可以整合xz
、gzip
之类的压缩命令,把镜像生成为压缩包,减少镜像文件的体积。但要注意,压缩需要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
╮(╯▽╰)╭