交换两个相同容量驱动器的内容

交换两个相同容量驱动器的内容

我有两个容量相同的硬盘(等于 1 字节)。我需要交换它们的内容(一个是 QVO,另一个是 EVO,但它们的应用程序选择错误)。

是否可以通过 Linux 中的管道或 FIFO 来实现这一点?

我正在考虑最终同时存储每个驱动器的 100/500 MB(在 Linux 驱动器上或内存中)并将其重写到另一个磁盘,重复该过程。

我知道dd第三个磁盘,但只需要对这两个磁盘进行操作。两个磁盘都是 1 TB SSD,其中一个磁盘已满 70%,另一个磁盘装有基本 Linux 系统,数据不超过 20 GB。

我同意有第三种带有操作系统的介质(在本例中是 Linux),但该磁盘的可用空间有限,假设我们最多可以使用 ~1 GB,因此我们无法制作完整的磁盘映像(即使是压缩的)。

答案1

一个解决方案是使用 bash 脚本。

请注意,使用第三个驱动器是首选方式,而使用脚本则是一种自杀任务!

因此,如果您没有(或无法访问)第三个驱动器,而且您很绝望,请使用这种方法!!您已被警告!!

#!/bin/bash

DRIVE1="${1}"
DRIVE2="${2}"
BS="${3:-16M}"
block="${4:-0}"
TMP="$( mktemp ~/$$.XXXX )"

while true; do
  dd if=$DRIVE1 of=$TMP bs=$BS skip=$block
  dd if=$DRIVE2 of=$DRIVE1 bs=$BS skip=$block seek=$block
  dd if=$TMP of=$DRIVE2 bs=$BS seek=$block || break
  block=$(( block += 1 ))
  echo $block > ~/block.info
done

将上面的代码复制到一个文件中并使其可执行(chmod +x文件名然后,您可以使用sudo ./filename /dev/sdX /dev/sdY 16M以下命令调用脚本
- /dev/sdX 应该是第一个驱动器(例如 /dev/sda 和不是/dev/sda1 !!)
- /dev/sdY 应该是第二个驱动器
- 16M 是选定的块大小(16M 代表 16 MB,也可以是 32M、64M、128M、256M,...)

答案2

此答案并非旨在帮助解决“交换两个相同容量驱动器的内容”的一般情况。它是针对特定问题量身定制的:

两个磁盘都是 1 TB SSD,其中一个已满 70%,另一个具有基本 Linux 系统,数据不超过 20 GB。

简而言之,该程序只是为了让您了解我们要做什么:

  1. 读取磁盘 A 并存储其图像(压缩或稀疏,比较) 位于磁盘 B 上的文件系统内。
  2. 将磁盘 B 完全复制到磁盘 A,连同原始 A 的映像一起。
  3. 从 A 读取图像并将其写入 B。

详细地:

  1. 确定哪个磁盘是哪个:

    diskA=/dev/sdx    # choose disk with little data
    diskB=/dev/sdy    # choose disk with lot of data
    
  2. 挂载磁盘 A 的各个文件系统并进行修剪:

    fstrim -v /the/mountpoint
    

    然后卸载。您可以一次卸载一个文件系统。至少对磁盘 B 上的一个文件系统(您计划将映像写入其中的文件系统)也执行此操作。

    有关修剪的更多信息这里这里这里。其意义有两点:

    • 从磁盘 A 读取现在应该会给我们带来许多高度可压缩的零块(这个答案适用于 HDD,HDD 需要明确写入零;但是这个答案表示只需要修剪 SSD 即可获得类似的结果);
    • 磁盘 B 现在可以存储磁盘 A 的映像了。
  3. 挂载磁盘 B 的选定文件系统。

  4. 确保磁盘 A 未安装任何文件系统。读取整个磁盘 A,并将其映像以压缩或稀疏形式存储在磁盘 B 的文件系统中。此示例使用压缩(并pv显示进度):

    <"diskA" pv | gzip -c >/the/mountpointB/image.gz
    
  5. 卸载磁盘 B 的文件系统。

  6. 确保磁盘 B 的文件系统未挂载。将磁盘 B 克隆到磁盘 A。您可以使用、、、、执行此操作,有dd很多工具。此示例使用:catcpddrescuepv

    pv "$diskB" > "$diskA"
    

    现在您有磁盘 B 的两个副本,每个副本都包含磁盘 A 的映像。

  7. 从磁盘 B 中删除分区表或文件系统签名。如果磁盘 B 使用 BTRFS(因此现在 A 也使用它),这一点非常重要。潜在的问题是,如果您尝试挂载 BTRFS 文件系统,并且发现有两个副本(相同的 UUID),那么它将被视为多设备文件系统;挂载它可能会导致数据丢失。在下一步中,我们将从磁盘 A(B 的副本)挂载文件系统,因此请小心。

    wipefs -a "$diskB"
    partprobe
    
  8. 挂载用于存储磁盘 A 映像的文件系统的副本。请记住,副本现在位于磁盘 A 上。

  9. 将数据恢复image.gz到磁盘 B。这样磁盘 A 的原始内容就移动到了磁盘 B:

    </the/mountpointA/image.gz gzip -dc | pv >"diskB"
    
  10. 挂载每个磁盘的每个文件系统并对其进行整理。您可以一次对一个文件系统进行此操作。

请注意,如果任何步骤失败,您仍然可以相对轻松地恢复。这是因为每次您实际覆盖数据时,另一个磁盘都包含有效副本。

答案3

我过去所做的是精确克隆每个磁盘以释放单独磁盘上的存储空间,然后将它们克隆回目标磁盘,此外,克隆有助于防止出现问题时丢失数据。在 Windows 中,我使用“免费磁盘克隆”,它允许您克隆分区,即使目标分区较小,也允许您复制硬件磁盘 ID,如果磁盘大小不同,这很好。

对于 Linux,请尝试命令“dd”,但要小心,如果操作错误,可能会出错...以下链接提供了有关 dd 的一些提示 https://opensource.com/article/18/7/how-use-dd-linux

这部分更像是一条评论……不过有点长

比斯,不确定这里的磁盘分区,假设您在磁盘 A 上有单个部分,包含 700GB 数据,磁盘 B 也有单个部分,包含 20GB 数据,在磁盘 B 上使用可用空间创建新分区,将磁盘 A 克​​隆到磁盘 B 上的新分区,现在您在磁盘 B 上拥有完整的两个副本。现在准备磁盘 A 以接收磁盘 B 的克隆作为主副本,并将磁盘 A 的原始克隆作为辅助部分,现在磁盘 B 可以自由准备其分区以接收磁盘 A 的克隆作为主副本,最好启动实时 Linux CD 来执行所有这些操作...希望这些聪明人中的一位可以提供更多关于如何在 Linux 中执行此操作的信息,以及哪种方法最适合克隆和分区过程(ddrecue 等)这对我来说很有意义,不确定其他人是否同意??

相关内容