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

ptr*_*ove 5 partitioning disk clone dd mbr

问题很简单。我已经寻找答案一段时间了,但不确定我是否得到了正确的答案。由于错误很容易毁掉我的驱动器和数据,所以我真的希望事情弄清楚。

我在 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文件。

我对这一切的看法正确吗?
是否存在弄乱我的旧驱动器的潜在风险?

K9s*_*pud 9

任何时候你使用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
    
    Run Code Online (Sandbox Code Playgroud)

    验证您是否可以看到旧数据。如果您看到的只是一个空文件系统,则可能您使用了错误的“/dev/sdXX”设备...

    sudo mount -o noatime /dev/sdc1 newroot
    sudo mount -o noatime /dev/sdc2 newhome
    ls newroot
    ls newhome
    
    Run Code Online (Sandbox Code Playgroud)

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

    sudo cp -Rfax oldroot/* newroot/
    sudo cp -Rfax oldhome/* newhome/
    
    Run Code Online (Sandbox Code Playgroud)

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

    sudo umount oldroot
    sudo umount oldhome
    sudo umount newroot
    sudo umount newhome
    sync
    
    Run Code Online (Sandbox Code Playgroud)
  8. 现在,您可以安全地关闭并断开旧 SSD,这样我们在使新 SSD 可启动时就不可能损坏其上的任何内容。

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

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

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

    update-grub
    grub-install /dev/sda
    
    Run Code Online (Sandbox Code Playgroud)

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

    umount /sys
    umount /proc
    umount /dev
    exit
    sudo umount newroot
    sync
    
    Run Code Online (Sandbox Code Playgroud)

现在你就拥有了!希望您的新 SSD 可以启动并且现在一切都很好。


小智 0

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

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