如何通过网络 DD 到外部硬盘?

如何通过网络 DD 到外部硬盘?

我正在尝试克隆树莓派上的硬盘驱动器,该硬盘驱动器与我当前使用的计算机的外部硬盘驱动器位于同一网络上。但是我在正确传输命令时遇到问题。我试过了:

ssh user@hostip "dd if=/dev/sda" | sudo dd of=/dev/sdc

但是 sudo 和 ssh 连接的提示堆叠在一起。

答案1

使用 netcat - 如果您不关心隐私(即您的家庭网络确实是您的),那么您的 CPU 上不会产生不必要的负载

在您的主机上运行

cat /dev/sda | nc -n ipaddr 10000

ipaddr您的 PI 的 IP 地址在哪里

在你的 PI 上运行

nc -l 10000 >/dev/sdc

所有命令都必须以 root 身份运行。 OpenBSD netcat 被假定为您的nc版本(可以在 LibreSSL 中找到),但其他版本也应该可以工作。

答案2

一些无需更改命令行的简单解决方法:

  • 使用密钥身份验证(ssh-agent如果密钥文件受密码保护,则使用)而不是 SSH 的密码身份验证。无论如何,这通常是个好主意。
  • 使用SSH的连接复用首先打开一个连接(例如ssh -o ControlMaster=yes -M -f sleep 999999),然后在从属连接中运行副本,这不需要身份验证。看获取 ssh 命令的指示举个例子。
  • sudo true在运行此命令之前运行。默认情况下,sudo 会将验证密码的信息缓存 15 分钟(至少如果您在同一终端上执行此操作,则取决于配置)。

如果由于异常严格的配置而确实必须在命令中键入两个密码,则可以使用命名管道来分隔命令:

mkfifo pipe
ssh user@hostip cat /dev/sda >pipe
# and in another terminal
sudo sh -c 'cat >/dev/sdc' <pipe

另外,使用cat代替dd,它是快点更可靠

答案3

您真的需要整个远程磁盘的逐位副本吗?例如数字取证?

如果没有,如果您只需要分区及其上的数据的副本,则可以通过以下方式节省大量时间和传输带宽:

  1. 复制分区表,例如使用sfdisk.

例如:

ssh user@hostip sudo sfdisk -d /dev/sda | sudo sfdisk /dev/sdc

或者使用临时文件分两步:

ssh user@hostip sudo sfdisk -d /dev/sda > /tmp/sda.txt
sudo sfdisk /dev/sdc < /tmp/sda.txt
  1. 用于partclone仅克隆当前正在使用的文件系统部分,忽略所有空白空间和已删除的文件等。

例如:

ssh user@hostip sudo partclone.ext4 -c -s /dev/sda1 -o - | 
    sudo partclone.ext4 -r -s - -o /dev/sdc1

partclone支持 Linux(ext2/3/4、btrfs、xfs 等)和 Windows(NTFS、FAT)上使用的所有常见和一些不常见的文件系统。

部分克隆为大多数发行版打包,包括 debian。 sfdisk是套餐的一部分util-linux

您仍然需要解决 ssh / sudo 问题,但@Gilles 对此给出了很好的答案。

消除密码提示的最简单方法是以 root 身份执行所有这些操作(sudo -i以获得 root shell),因此您不需要在每个命令前面加上sudo, 并(以 root 身份)运行ssh-copy-id hostip来安装 root@localhost 的 ssh 密钥在~/.ssh/authorized_keys主机上。然后你可以运行:

ssh hostip sfdisk -d /dev/sda | sfdisk /dev/sdc
ssh hostip partclone.ext4 -c -s /dev/sda1 -o - | 
    partclone.ext4 -r -s - -o /dev/sdc1

如果您正在运行 ssh-agent,则最多只需输入 root 密钥的密码一次(如果您以前使用过,则根本不需要输入)。

相关内容