如何在本地机器上使用 SSH 添加远程磁盘并保存到本地磁盘

Qu0*_*0rk 107 ssh remote dd hard-disk

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


我尝试了以下方法:

ssh hostname@my.ip.address "sudo dd if=/dev/sdX " | \
  dd of=/home/username/Documents/filename.image`
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

不存在 tty 且未指定 askpass 程序

slm*_*slm 150

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

例子

从远程计算机运行

$ dd if=/dev/sda | gzip -1 - | ssh user@local dd of=image.gz
Run Code Online (Sandbox Code Playgroud)

从本地计算机运行

$ ssh user@remote "dd if=/dev/sda | gzip -1 -" | dd of=image.gz
Run Code Online (Sandbox Code Playgroud)

活生生的例子

$ 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
Run Code Online (Sandbox Code Playgroud)

监测方法?

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

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

    $ pkill -USR1 dd
    
    Run Code Online (Sandbox Code Playgroud)

参考

上面提到的监控方法最初是通过@Ryan & @bladt和我自己的评论留下的。我已将它们移到答案中,以使它们更明显。

  • 关于监控:较新的 dd 版本也有 `status=progress` 选项。因此,您不再需要从另一个终端运行 `pkill -USR1 dd`。 (10认同)
  • 恢复:gunzip -c xxx.gz | 光伏 | dd=/dev/sda1 (2认同)

小智 14

您收到的错误是由于远程使用 sudo (您会被要求输入密码,但您没有输入密码)。另一方面,作为普通用户,您通常不能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使用任何参数运行,但最好将此免费权限保持在您需要的最低限度。

  • @MikeW 请注意,这可能不起作用,因为默认情况下“sudo”仅记住同一控制台会话的身份验证,请参阅“man 5 sudoers”中的“timeout_type”。 (3认同)

小智 8

我刚刚在虚拟 Linux Mint 机器上使用了一个修改版本,在老化的 RedHat 服务器上克隆了一个物理硬盘驱动器。

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

ssh root@192.168.1.5 "dd if=/dev/cciss/c0d0" | dd of=/dev/sdb
Run Code Online (Sandbox Code Playgroud)
  • 192.168.1.5 是物理 Red Hat Enterprise Linux 2.1 机器。
  • /dev/sdb 是一个新的虚拟磁盘,克隆完成后它将成为旧的垂死物理盒的虚拟版本的基础。


小智 7

结合这些答案,我可以克隆到另一个 Linux 主机并避免“权限被拒绝”错误:

  • RPI4 SD 卡(/dev/mmcblk0- 这会克隆整个卡)
  • 通过提示提升权限来避免权限问题 ( sudo -S)
  • 复制时查看进度 ( status=progress)
  • 压缩副本 ( gzip)
  • 指定缓冲区大小 ( bs=64k) 以提高速度。您可以指定更高的值。请阅读这个
ssh user@1.1.1.1 "sudo -S dd if=/dev/mmcblk0 bs=64k status=progress | gzip -1 -" | dd of=rpiimg.gz bs=64k
Run Code Online (Sandbox Code Playgroud)