如何在本地计算机上使用SSH dd远程磁盘并将其保存到本地磁盘


85

如何在本地计算机上使用SSH创建远程磁盘的备份并将其保存到本地磁盘?


我尝试了以下方法:

ssh hostname@my.ip.address "sudo dd if=/dev/sdX " | \
  dd of=/home/username/Documents/filename.image`

但是,我收到以下错误:

没有tty存在且未指定AskPass程序

Answers:


114

如果您打算通过SSH将远程计算机的HDD A备份到本地计算机的HDD上的单个文件中,则可以执行以下操作之一。

例子

从远程计算机运行

$ dd if=/dev/sda | gzip -1 - | ssh user@local dd of=image.gz

从本地计算机运行

$ ssh user@remote "dd if=/dev/sda | gzip -1 -" | dd of=image.gz

现场例子

$ ssh skinner "dd if=/dev/sda5 | gzip -1 -" | dd of=image.gz
208782+0 records in
208782+0 records out
106896384 bytes (107 MB) copied, 22.7608 seconds, 4.7 MB/s
116749+1 records in
116749+1 records out
59775805 bytes (60 MB) copied, 23.9154 s, 2.5 MB/s

$ ll | grep image.gz
-rw-rw-r--.   1 saml saml  59775805 May 31 01:03 image.gz

监控方法?

  1. 通过ssh另一个终端登录,然后ls -l查看文件的大小。
  2. 您可以pv用来监视大型dd操作的进度,例如,对于上面的远程示例,您可以执行以下操作:

    $ dd if=/dev/sda | gzip -1 - | pv | ssh user@local dd of=image.gz
    
  3. 向发送“ SIGUSR1”信号dd,它将打印统计信息。就像是:

    $ pkill -USR1 dd
    

参考文献

上面提到的用于监视的方法最初由@Ryan@bladt和我自己通过评论保留。我将它们移到答案中以使其更加明显。


我针对类似的问题尝试了此操作(将远程计算机ONE的硬盘驱动器备份到远程计算机TWO的存储中),如下所示:ssh root @ TWO dd of=/root/Public/ONE/sda1.img<br /> 409600 + 0条记录中的409600 + 0条记录已复制209715200字节(210 MB),0.894929 s,234 MB / s不会分配伪终端,因为stdin不是终端root @ TWO的密码:问题在于该/root/Public/ONE/sda1.img文件是在上创建的ONE,而不是在TWO预期的位置上创建的。我该如何解决?
Urhixidur

1
有人可以给我们提供pv在本地计算机上使用的示例吗?谢谢。
TCB13

最好使用lbzip2或由gzip
插入的Pigz

为什么我最后需要“ | dd of = image.gz”?(不仅仅是“> image.gz”),因为dd占用了一个CPU的100%
Shimon Doodkin

6
关于监视:较新的dd版本也可以status=progress选择。因此,您不再需要pkill -USR1 dd从另一个终端运行。
TillSchäfer18年

12

您收到的错误是由于远程使用sudo(系统会要求您输入密码,但您没有输入tty的密码)。另一方面,作为普通用户,您通常不能简单地dd按其他答案中的建议使用(您没有对设备的必需权限)。您可以通过赋予自己在dd没有密码的情况下以sudo 身份执行的权限来解决该问题。您可以通过编辑sudoers文件(在远程上!)来做到这一点:

sudo visudo

添加以下行:

userfoo ALL=(ALL) NOPASSWD: /bin/dd if=/dev/sdX

现在您可以发出:

ssh userfoo@host "sudo /bin/dd if=/dev/sdX" | dd of=test.dd

它应该工作。您可以在sudoers中创建一个更通用的条目,允许您dd使用任何参数运行,但是将这种自由权限保持在所需的最低限度是比较明智​​的。


或者,您可以在运行“ sudo dd ...”命令之前在适用的一端运行“ sudo ls”(并输入密码)
MikeW

在dd的较新版本中,添加status = progress甚至可以监视复制进度。
感性

7

我刚刚在虚拟Linux Mint盒上使用了修改后的版本,以在老化的RedHat服务器上克隆物理硬盘。

我在虚拟机上以root用户身份运行以下命令:

ssh root@192.168.1.5 "dd if=/dev/cciss/c0d0" | dd of=/dev/sdb
  • 192.168.1.5是物理Red Hat Enterprise Linux 2.1框。
  • / dev / sdb是一个新的虚拟磁盘,克隆完成后,它将作为即将死去的物理盒的虚拟版本的基础。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.