![使用 dd 命令将系统移至新的 SSD](https://linux22.com/image/913278/%E4%BD%BF%E7%94%A8%20dd%20%E5%91%BD%E4%BB%A4%E5%B0%86%E7%B3%BB%E7%BB%9F%E7%A7%BB%E8%87%B3%E6%96%B0%E7%9A%84%20SSD.png)
这个问题很简单。我搜索了一段时间的答案,但不确定我得到了正确的答案。由于错误很容易破坏我的驱动器和数据,我真的希望事情清楚。
我在 250GB SSD( )上运行 Ubuntu,/dev/sda
它有两个分区,每个分区大约 125GB。sda1 挂载到/
,sda2 挂载到/home
。现在我想将所有内容移到新的 1TB SSD(假设是/dev/sdc
)并将每个驱动器扩展至 500GB。经过一番研究,我提出了两种方法:
克隆
dd if=/dev/sda of=/dev/sdc
整个磁盘。之后我应该得到一个可启动磁盘,其中包含两个 125 GB 分区和一些未分配空间。对吗?然后我需要使用 gparted 之类的工具将 sdc1 和 sdc1 的大小调整为 500GB。调整大小可能需要很长时间,对吗?第二种方法是先格式化新驱动器,创建两个 500GB 分区。执行
dd if=/dev/sda1 of=/dev/sdc1
和dd if=/dev/sda2 of=/dev/sdc2
以克隆两个分区。此时,该磁盘应该无法启动,对吗?为了使其可启动,我需要将引导加载程序复制到新磁盘中。我只需要前 446 个字节。这样我就可以了dd if=/dev/sda of=/tmp/mbrsda.bak bs=512 count=1
。dd 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
(又名d
isk d
estroyer),都有可能弄乱您的数据。dd
没有安全措施防止意外将新驱动器写入旧驱动器。唯一能使其正常工作的方法是,如果您非常小心地正确输入命令,不要混淆源和目标。if=
并且of=
彼此之间只有一个小小的错误击键!
另一个问题是速度dd
很慢,并且会给目标 SSD 带来不必要的磨损。大多数分区通常都无法达到 100% 的利用率。使用dd
复制具有大量可用空间的分区最终会复制该分区的每个字节,甚至包括实际上不包含任何分配数据的字节!
如果这是我的系统,我会这样做:
- 截取旧 SSD 分区表的屏幕截图,以供我们稍后设置新 SSD 分区表时参考。
- 将新 SSD 连接到计算机并断开旧 SSD 的连接。保持旧 SSD 断开连接可使我们在进行可能具有破坏性的工作时无法破坏任何宝贵的数据。
- 在 Linux 实时模式下从 Ubuntu 安装 USB 拇指驱动器启动。确保您的 BIOS 始终以传统/MBR 模式而不是 UEFI 模式启动拇指驱动器,因为听起来您的旧系统正在使用 MBR。如果我的假设无效,请确保您的 BIOS 改为以 UEFI 模式启动拇指驱动器。混淆会使以后正确安装 grub 变得更加困难。
- 使用
gparted
所需的分区表设置新 SSD 并格式化文件系统。尽量让所有内容与旧 SSD 的分区表保持一致(分区大小和 UUID 除外)。不要忘记将根/
文件系统标记为active/ bootable,就像旧 SSD 一样。 - 现在所有危险的分区编辑工作都已完成,您可以安全地关机并添加连接到计算机的旧 SSD。
- 再次启动 Linux live USB 拇指驱动器,这次将两个驱动器连接起来。不要从旧 SSD 启动(我们需要保持该系统处于非活动状态,以便对其进行良好的干净复制)。
启动后,打开终端并开始使用这些命令将数据从旧 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
现在您可以安全地关闭并断开旧 SSD 的连接,以便我们在使新 SSD 可启动时不可能破坏其上的任何东西。
使用 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
答案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
信号,使其显示进度信息,而不会干扰其操作。