我在笔记本电脑的硬盘上安装了 Lubuntu 17.04。我现在买了一个几乎相同大小的SSD作为替代品;它是空的,没有动过。
现在,我想切换磁盘,并将 HDD 上已有的基本完全相同的内容移至 SSD - 并且让我的 Linux 启动并运行,而不需要任何进一步的调整(可能除了/etc/fstab
UUID 问题)。
我怎样才能做到这一点...
- 无需额外电脑的帮助?
- 需要额外一台电脑的帮助吗?
笔记:
- 如果需要的话,我可以生成可启动的 USB 记忆棒。
- 如有必要,我可以使用 CD/DVD 阅读器。
- HDD 的使用率为 33%,因此可以容纳数据 - 但 HDD 容量稍大一些。
- HDD 可能有一些扇区处于临界状态(但目前 - Linux 可以启动并工作)。
- HDD 上只有一个分区,据我所知 - 考虑到我是唯一用户,我也可以在 SSD 上保留它,并且它不用作某些公共服务器等。
答案1
您有两种基本方法可以将安装切换到新磁盘、克隆磁盘或复制内容并修复系统(即引导加载程序、fstab 条目)。两种方法都有其优点和缺点。
这两种方法都需要另一个连接了该磁盘的系统以及一些额外的存储空间或第二个磁盘。这可以是另一台笔记本电脑或台式机 - 或实际笔记本电脑上的实时 USB/CD。
如果您可以将两个磁盘都连接到系统,则最简单 - 但如果您不能这样做,则可以在交换驱动器时使用额外的存储作为临时暂存区域。如果您有一个大的 USB 硬盘驱动器,则可以使用它。一个更简单的选择可能是获得USB外壳相反,这将允许您将两个磁盘连接到同一台计算机。
因此,使用实时 USB 和 USB 外壳,您可以从要更换驱动器的笔记本电脑上完成整个操作。对于这两种方法,我将讨论在连接两个磁盘的情况下进行直接磁盘传输,并且它们都没有安装(即您已经安装了另一台计算机或正在使用实时 USB/CD)。我将使用/dev/sdS
来指示源磁盘(在您的情况下为 HDD)并/dev/sdD
指示目标磁盘。将这些磁盘替换为系统上的实际磁盘 - 请务必验证这些磁盘,因为错误会破坏您的目的地的任何数据。
方法一:克隆磁盘
当从磁盘转到相同大小或更大的磁盘时,这是最简单的方法,但通过额外的步骤可以从较大的磁盘转到较小的磁盘。这样做的主要缺点是它逐块复制磁盘,因此需要读取和写入整个磁盘。这比在磁盘大部分为空时复制系统需要更长的时间。
您提到从稍大的磁盘到更小的磁盘,因此第一步是将源磁盘上的分区大小调整为小于目标磁盘的大小。这是最容易做到的gparted,只需确保缩小驱动器,以便可用空间位于磁盘末尾。这可能需要一段时间,因为它必须将磁盘末尾的所有数据移动到新位置。
dd
现在,您只需使用或将源磁盘克隆到目标即可ddrescue
。ddrescue
可能是明智的,因为它会更加努力地重新读取您提到的可能有的坏扇区。
sudo ddrescue /dev/sdS --force /dev/sdD
或者使用dd
:
sudo dd if=/dev/sdS of=/dev/sdD
请注意,您将收到一条错误消息,指出写入期间目标磁盘已满 - 这很好,因为磁盘末尾不应包含任何有用的内容,因为我们调整了磁盘大小。这就是为什么您必须确保将其大小调整为略小于目标大小。
现在,您可以再次使用 gparted 来调整目标大小以填充驱动器。
您现在应该能够交换磁盘并启动新系统。
方法2:复制根文件系统
如果您仅在大磁盘上使用少量空间,但需要更多步骤来重新配置引导加载程序和 fstab 才能引导系统,则此方法可能会更快。它还具有在源磁盘上只读的优点,因此不太可能损坏原始磁盘(尽管这对于上述方法来说并非如此,因为由于目标小于源,您必须调整磁盘大小)。它也更加灵活,因为您可以根据需要轻松更改分区。
第一步是在新驱动器上设置分区表并格式化分区。您提到您的驱动器上只有一个分区 - 由此我假设您正在使用旧版 BIOS 引导(因为 uefi 除了根文件系统之外还需要 vfat 分区)。这是最容易做到的parted
:
sudo parted /dev/sdD mklabel msdos
sudo parted /dev/sdD mkpart primary ext4 0% 100%
sudo mkfs.ext4 -F /dev/sdD1
但如果您愿意,也可以使用fdisk
orgdisk
或。gparted
如果您的源磁盘有更多分区或者您想更改分区布局,您现在就可以这样做 - 只需根据您的需要设置目标磁盘即可。
现在安装源磁盘和目标磁盘。
sudo mkdir -p /mnt/src /mnt/dest
sudo mount /dev/sdS1 /mnt/src
sudo mount /dev/sdD1 /mnt/dest
如果您拥有/想要比这更多的分区,请在上述位置安装根目录以及与之相关的其他分区。 (例如,如果您的源有一个额外的引导分区,则将其安装到 /mnt/src/boot)。
现在将内容从源复制到目标。
sudo rsync -avh /mnt/src/ /mnt/dest/
这需要一段时间。如果它被中断,您可以通过重新运行命令来恢复它。
您现在可以卸载源驱动器,因为我们不再需要它。
sudo umount /mnt/source
最后的步骤是修复系统以便其可以启动。首先打开/mnt/dest/fstab
并修复新系统 - 如果分区布局相同,则应该更新 UUID/驱动器号以反映新分区。用于blkid
获取所需信息,建议使用UUID=
或PARTUUID=
如果可用。
最后,我们需要修复引导加载程序 - 这里我假设您使用的是带有旧版 BIOS 的 grub2,如果情况并非如此,请忽略这一点并按照有关如何恢复引导加载程序的说明进行操作。
sudo grub-install --boot-directory=/mnt/dest/boot /dev/sdD
有关恢复 ubuntu 引导加载程序的更多信息,请参见这里。
如果一切顺利,您应该能够关闭、交换驱动器并启动新磁盘。
附加功能
通过第三个磁盘工作
如果您无法将两个磁盘连接到一台计算机,您将需要一些额外的存储 - 这可能是 USB 磁盘、网络附加存储或任何您可以在本地访问且足够大以存储磁盘或根文件系统的其他存储。
上述两种方法的总体过程是相同的,但不是从一个磁盘复制到另一个磁盘,而是先复制到临时暂存区域;
使用方法 1:请注意,这要求暂存区域与您要复制的磁盘一样大。
将存储安装到/mnt/staging
:
sudo ddrescue /dev/sdS /mnt/staging/rootfs.img
您可以随心所欲地处理所有文件。如果您愿意,您可以从这里压缩它并将其保留为系统的备份。
然后您可以关闭交换驱动器并再次启动实时 USB 以恢复映像
sudo ddrescue /mnt/staging/rootfs.img --force /dev/sdD
请注意,使用此方法时,源和目标的驱动器号可能相同。
使用方法2:请注意,这只需要压缩时的暂存区域与文件系统一样大,而不是整个磁盘。
将存储安装到/mnt/staging
并将源安装到/mnt/src
:
sudo tar -C /mnt/src -caf /mnt/staging/roofs.tar.gz /
然后,您可以在设置目标磁盘文件系统后关闭交换驱动器并再次启动实时 USB 以恢复文件系统。
sudo tar -C /mnt/dest -xf /mnt/staging/roofs.tar.gz /
然后继续恢复fstab和bootloader。
答案2
最简单的解决方案(如果 HDD 小于 SDD 并且 SDD 可以连接到计算机)是:
- 启动到笔式驱动器发行版。这可以避免在硬盘中打开临时文件。
使用 dd 将整个磁盘 HDD 复制到 SDD:
dd if=/dev/HDD of=/dev/SDD bs=4k
当然,HDD 和 SDD 必须替换为整个磁盘的正确名称,例如
/dev/sda
或/dev/sdd
(不是分区/dev/sda1
)。将计算机中的 HDD 替换为 SDD。
- 一如既往地启动。
唯一的问题是两个硬件的 UUID 相同,可能会阻止您将 HDD 分区安装为附加驱动器。如果需要的话,可以稍后纠正。