使用 dd 命令将系统移至新的 SSD

使用 dd 命令将系统移至新的 SSD

这个问题很简单。我搜索了一段时间的答案,但不确定我得到了正确的答案。由于错误很容易破坏我的驱动器和数据,我真的希望事情清楚。

我在 250GB SSD( )上运行 Ubuntu,/dev/sda它有两个分区,每个分区大约 125GB。sda1 挂载到/,sda2 挂载到/home。现在我想将所有内容移到新的 1TB SSD(假设是/dev/sdc)并将每个驱动器扩展至 500GB。经过一番研究,我提出了两种方法:

  1. 克隆dd if=/dev/sda of=/dev/sdc整个磁盘。之后我应该得到一个可启动磁盘,其中包含两个 125 GB 分区和一些未分配空间。对吗?然后我需要使用 gparted 之类的工具将 sdc1 和 sdc1 的大小调整为 500GB。调整大小可能需要很长时间,对吗?

  2. 第二种方法是先格式化新驱动器,创建两个 500GB 分区。执行dd if=/dev/sda1 of=/dev/sdc1dd if=/dev/sda2 of=/dev/sdc2以克隆两个分区。此时,该磁盘应该无法启动,对吗?为了使其可启动,我需要将引导加载程序复制到新磁盘中。我只需要前 446 个字节。这样我就可以了dd if=/dev/sda of=/tmp/mbrsda.bak bs=512 count=1dd if=/tmp/mbrsda.bak of=/dev/sdc bs=446 count=1通过这样做,我使其可启动,并保留了 500GB+500GB 的分区表。这种方法将使我免于调整磁盘大小。

对于这两种方法,我都需要更改文件中的 UUID /etc/fstab。这可以通过在克隆后首先挂载新驱动器来完成:sudo mount /dev/sdc1 /mnt/,然后编辑/mnt/etc/fstab文件。

我这么说对吗?
这是否有可能损坏我的旧硬盘?

答案1

任何时候使用dd(又名disk destroyer),都有可能弄乱您的数据。dd没有安全措施防止意外将新驱动器写入旧驱动器。唯一能使其正常工作的方法是,如果您非常小心地正确输入命令,不要混淆源和目标。if=并且of=彼此之间只有一个小小的错误击键!

另一个问题是速度dd很慢,并且会给目标 SSD 带来不必要的磨损。大多数分区通常都无法达到 100% 的利用率。使用dd复制具有大量可用空间的分区最终会复制该分区的每个字节,甚至包括实际上不包含任何分配数据的字节!

如果这是我的系统,我会这样做:

  1. 截取旧 SSD 分区表的屏幕截图,以供我们稍后设置新 SSD 分区表时参考。
  2. 将新 SSD 连接到计算机并断开旧 SSD 的连接。保持旧 SSD 断开连接可使我们在进行可能具有破坏性的工作时无法破坏任何宝贵的数据。
  3. 在 Linux 实时模式下从 Ubuntu 安装 USB 拇指驱动器启动。确保您的 BIOS 始终以传统/MBR 模式而不是 UEFI 模式启动拇指驱动器,因为听起来您的旧系统正在使用 MBR。如果我的假设无效,请确保您的 BIOS 改为以 UEFI 模式启动拇指驱动器。混淆会使以后正确安装 grub 变得更加困难。
  4. 使用gparted所需的分区表设置新 SSD 并格式化文件系统。尽量让所有内容与旧 SSD 的分区表保持一致(分区大小和 UUID 除外)。不要忘记将根/文件系统标记为active/ bootable,就像旧 SSD 一样。
  5. 现在所有危险的分区编辑工作都已完成,您可以安全地关机并添加连接到计算机的旧 SSD。
  6. 再次启动 Linux live USB 拇指驱动器,这次将两个驱动器连接起来。不要从旧 SSD 启动(我们需要保持该系统处于非活动状态,以便对其进行良好的干净复制)。
  7. 启动后,打开终端并开始使用这些命令将数据从旧 SSD 复制到新 SSD。与使用不同dd,该cp命令更防错,因为您无法破坏任何内容,只需将空文件系统复制到旧文件系统上即可 - 在这种情况下不会复制任何内容!此外,我们可以将旧 SSD 安装在“只读”模式下,以避免修改旧 SSD 的任何可能性。

    mkdir oldroot newroot oldhome newhome
    sudo mount -o ro /dev/sda1 oldroot
    sudo mount -o ro /dev/sda2 oldhome
    ls oldroot
    ls oldhome
    

    验证您是否可以看到旧数据。如果您看到的只是一个空文件系统,那么也许您得到的是错误的“/dev/sdXX”设备...

    sudo mount -o noatime /dev/sdc1 newroot
    sudo mount -o noatime /dev/sdc2 newhome
    ls newroot
    ls newhome
    

    验证您看到的是否都是一个空的文件系统作为您的目标。如果一切正常,请发出以下命令来复制所有文件,同时保留所有权限/所有权/SELinux 上下文设置:

    sudo cp -Rfax oldroot/* newroot/
    sudo cp -Rfax oldhome/* newhome/
    

    完成后,卸载所有内容并将缓存的写入同步到持久存储:

    sudo umount oldroot
    sudo umount oldhome
    sudo umount newroot
    sudo umount newhome
    sync
    
  8. 现在您可以安全地关闭并断开旧 SSD 的连接,以便我们在使新 SSD 可启动时不可能破坏其上的任何东西。

  9. 使用 USB 拇指驱动器在 Linux 实时模式下启动计算机,仅连接新的 SSD。打开终端并开始执行以下命令:

    mkdir newroot
    sudo mount -o noatime /dev/sda1 newroot
    sudo chroot newroot /bin/bash
    mount -t devtmpfs udev /dev
    mount -t proc proc /proc
    mount -t sysfs sysfs /sys
    nano -w /etc/fstab
    

    现在您需要修改文件,fstab使 UUID 编号与新 SSD 上的编号相匹配。您可以打开gparted查看分区表并找出新的 UUID。完成后,按 CTRL-X 并将 fstab 更改保存到磁盘。

    update-grub
    grub-install /dev/sda
    

    如果一切正常,这应该会配置 grub 并将其安装到新 SSD 的 MBR 中。安装 grub 后,您必须在退出之前卸载我们之前在 chroot 环境中安装的所有内容。否则,Ubuntu 在关机时很难干净地卸载 Linux 分区。

    umount /sys
    umount /proc
    umount /dev
    exit
    sudo umount newroot
    sync
    

就这样!希望你的新 SSD 可以启动,并且一切正常。

答案2

我刚刚用分区将我的 ubuntu 18.04 从一个 SATA 迁移到另一个。Gparted 提供了一个易于使用的 GUI,其中包含复制和粘贴选项,甚至 UUID 也相同,因此我不必/etc/fstab在新磁盘上更新或安装 grub。过程非常顺利,所以我还没有检查下面发生了什么,但在复制粘贴过程中,e2图像(8)确实被调用了。再次重申,这都是基于我自己的经验,请纠正我,谢谢大家。

答案3

我在这里发帖,更多的是为了分享我的经验,而不是为了回答发布的问题。然而,我的目标和原帖者所说的目标是一样的。


我从 512 GB SSD 上的双启动系统开始,其中包含几个分区:EFI、Microsoft 保留的部分、Windows 系统分区、Linux 系统分区、Linux 主页分区和一些恢复分区。

我的目标是将所有内容迁移到 2 TB SSD。


我从 Ubuntu Live-USB 启动了计算机,并使用 将整个 SSD 克隆到新 SSD dd。我给自己弄了一个可以通过 USB 连接的 NVMe SSD 小型外壳。

新的 SSD 完全未经改动地使用:无需格式化、无需分区,什么都没有。

克隆之后,dd我交换了 SSD,即从计算机上移除小型 SSD 并安装了新的。

Linux 启动顺利,但 Windows 运行了一些诊断/修复操作,但没有任何结果。

接下来,我再次从 Ubuntu Live-USB 启动系统,并启动gparted

gparted报告了 GPT 表中的一些错误,它建议修复。我选择了修复选项,然后调整现有分区的大小并移动它们。完成所有这些操作后,令我惊讶的是,Windows 也无错误地启动了。


我很高兴看到整个克隆过程如此顺利。


这周我又做了一次,还是使用双启动机器。

  • 使用 Live-USB 启动仍在小型 SSD 中的计算机
  • 将新的 SSD 安装到外壳中并插入
  • 使用以下方式复制磁盘dd
  • dd完成后,启动gparted修复 GPT 表,调整大小并移动分区
  • 关闭计算机并更换 SSD
  • 两种操作系统均启动正常

一些说明:

  • 如果旧 SSD 包含 Windows 分区,请确保 BitLocker 已完全禁用
  • 如果您忘记dd使用任何显示进度的选项来启动,请参阅这个答案。您可以发送dd信号,使其显示进度信息,而不会干扰其操作。

答案4

我会用部分图像一次复制一个分区。复制第一个分区后,增加其大小。调整大小会非常快,因为您不必移动任何相邻的分区。然后复制第二个分区并调整其大小以适应剩余空间。

最简单的方法是从系统救援光盘并从该环境中执行所有操作。您可以制作可启动的 USB 驱动器,这样就不需要实际的 CD。

相关内容