零说 · 2024-10-12 0

使用DD命令备份,配合SSH可异地备份或恢复

【编辑中。。。】

dd命令的解释

dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512;c=1;k=1024;w=2

参数注释:

  1. if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
  2. of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
  3. ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
    obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
    bs=bytes:同时设置读入/输出的块大小为bytes个字节。
  4. cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
  5. skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
  6. seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
    注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。
  7. count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
  8. conv=conversion:用指定的参数转换文件。
    ascii:转换ebcdic为ascii
    ebcdic:转换ascii为ebcdic
    ibm:转换ascii为alternate ebcdic
    block:把每一行转换为长度为cbs,不足部分用空格填充
    unblock:使每一行的长度都为cbs,不足部分用空格填充
    lcase:把大写字符转换为小写字符
    ucase:把小写字符转换为大写字符
    swab:交换输入的每对字节
    noerror:出错时不停止
    notrunc:不截短输出文件
    sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

dd 命令的基本操作

将本地的/dev/sda整盘备份(复制)到/dev/sdb

dd if=/dev/sda of=/dev/sdb

将/dev/sda全盘数据备份到指定路径的image文件

dd if=/dev/sda of=/home/username/sdadisk.img

将备份文件恢复到指定盘

dd if=/home/username/sdadisk.img of=/dev/sda

备份/dev/hdb全盘数据,并利用gzip工具进行压缩,保存到指定路径

dd if=/dev/sda | gzip > /home/username/sdadisk.img.gz

将压缩的备份文件恢复到指定盘

gzip -dc /home/username/sdadisk.img.gz | dd of=/dev/sda

备份与恢复MBR

备份磁盘开始的512个字节大小的MBR信息到指定文件:

dd if=/dev/sda of=/home/username/sdambr.img count=1 bs=512

count=1指仅拷贝一个块;bs=512指块大小为512个字节。

恢复:

dd if=/home/username/sdambr.img of=/dev/sda

将备份的MBR信息写到磁盘开始部分

——————编辑分割线======

上面的命令针对整个驱动器创建映像文件,你也可以针对驱动器上的单个分区进行操作。下面的例子针对驱动器的单个分区进行操作,同时使用了一个bs参数用于设置单次拷贝的字节数量 (此例中是 4096)。设定bs参数值可能会影响dd命令的整体操作速度,该参数的理想设置取决于你的硬件配置和其它考虑。

# dd if=/dev/sda2 of=/home/username/partition2.img bs=4096

数据的恢复非常简单:通过颠倒if和of参数可以有效的完成任务。在此例中,if=使用你要恢复的映像,of=使用你想要写入映像的目标驱动器:

# dd if=sdadisk.img of=/dev/sdb

你也可以在一条命令中同时完成创建和拷贝任务。下面的例子中将使用 SSH 从远程驱动器创建一个压缩的映像文件,并把该文件保存到你的本地计算机中:

# ssh username@54.98.132.10 "dd if=/dev/sda | gzip -1 -" | dd of=backup.gz

你应该经常测试你的归档,确保它们可正常使用。如果它是你创建的启动驱动器,将它粘贴到计算机中,看看它是否能够按预期启动。如果它是普通分区的数据,挂载该分区,确保文件都存在而且可以正常的访问。

使用 dd 擦除磁盘数据

多年以前,我的一个负责政府海外大使馆安全的朋友曾经告诉我,在他当时在任的时候, 政府会给每一个大使馆提供一个官方版的锤子。为什么呢? 一旦大使馆设施可能被不友善的人员侵占,就会使用这个锤子毁坏所有的硬盘.

为什么要那样做?为什么不是删除数据就好了?你在开玩笑,对吧?所有人都知道从存储设备中删除包含敏感信息的文件实际上并没有真正移除这些数据。除非使用锤子彻底的毁坏这些存储介质,否则,只要有足够的时间和动机, 几乎所有的内容都可以从几乎任何数字存储介质重新获取。

但是,你可以使用dd命令让坏人非常难以获得你的旧数据。这个命令需要花费一些时间在/dev/sda1分区的每个扇区写入数百万个0(是指0x0字节,意即NUL,而不是数字0):

# dd if=/dev/zero of=/dev/sda1

还有更好的方法。通过使用/dev/urandom作为源文件,你可以在磁盘上写入随机字符:

# dd if=/dev/urandom of=/dev/sda1

监控 dd 的操作

由于磁盘或磁盘分区的归档可能需要很长的时间,因此你可能需要在命令中添加进度查看器。安装管道查看器(在 Ubuntu 系统上安装命令为sudo apt install pv),然后把pv命令和dd命令结合在一起。使用pv,最终的命令是这样的:

# dd if=/dev/urandom | pv | dd of=/dev/sda1

4,14MB 0:00:05 [ 98kB/s] [      <=>                  ]

如果你使用的是GNU版本的dd,并且coreutils版本高于8.24,那么可以使用status选项。例如:

# dd if=/dev/sda of=/dev/zero status=progress

使用pkill打印进度。重新打开一个Shell,然后执行如下命令即可每秒输出一次进度信息

# watch -n 1 pkill -USR1 -x dd


远程操作的例子

把远程主机磁盘备份到本地

ssh user@ip "dd if=/dev/sda | gzip -1 -" | dd of=./backup.gz

把本地磁盘备份到远程主机

dd if=/dev/sda | gzip -1 - | ssh user@ip "dd of=backup.gz"

把远程备份恢复到本地

ssh user@ip "dd if=/path/to/backup.gz" | gunzip | dd of=/path/to/restore

把本地备份恢复到远程主机

dd if=/path/to/backup.gz | ssh user@ip "gunzip | dd of=/dev/sda"