如何使用 Linux dd 将 128GB 驱动器映像为 120GB 驱动器?

如何使用 Linux dd 将 128GB 驱动器映像为 120GB 驱动器?

我有 2 个 SSD。我的系统(Ubuntu 12.04)安装在其中一个上,我想将其克隆到另一个上。问题是系统当前位于 128GB 驱动器上,而新驱动器只有 120GB。是否可以使用dd容量较小的驱动器创建映像?

答案1

如何完成您要求做的事情:

  1. 使用 gparted 调整系统分区的大小,使其小于 120GB...最好,如果可能的话,相当小于 120GB,以确保它确实低于目标驱动器的总大小。

  2. dd if=/dev/sda bs=8M of=/dev/sdb,假设您的源驱动器和目标驱动器分别为 sda 和 sdb。从安全模式或实时启动环境执行此操作,而不是从以正常多用户登录运行的源操作系统执行此操作。

    或者,如果您在实时启动环境中具有网络访问权限,并且源中有 Universe:。apt-get install pv ; pv < /dev/sda > /dev/sdb此命令与 dd 命令之间的区别在于,此命令为您提供了进度条... :)

然而,做你真正想做的事情可能更好的方法是:

  1. 在目标驱动器上进行 Ubuntu 的裸安装。(有更有效的方法在新驱动器上获取引导扇区,但在这里我选择“新手友好型”的。)

  2. 从实时启动环境挂载两个驱动器,然后rsync -harv --progress /path/to/source/ /path/to/target/。请注意,您确实希望处于实时启动环境中,而不是正在运行的系统中,否则您将不得不处理诸如 devfs、procfs 等内容 - 更不用说在 rsync 时文件可能会更改/消失。

答案2

脚步

  1. 如果可能的话,请备份源驱动器(128 Gb)。

  2. 使用分区USB 启动,然后使用它来缩小源驱动器分区(128 Gb)以使其小于目标驱动器大小(120 Gb)。如果您的驱动器已满,比如说 128 Gb,没有任何空间,那么您可能需要压缩(zip)一些数据文件,或复制到另一个临时 USB 以使其小于 120 Gb(目标驱动器大小)。否则,您无法将源内容放入目标驱动器。它根本装不下。

    留出一些额外的可用空间以防万一(也许 1 Gb,用于几何转换或其他什么。我的驱动器是一种大小,但ddGparted 显示的大小不同,略有不同)。

  3. 一旦源驱动器的分区缩小到小于目标驱动器的大小,您就可以执行dd。 确保您正在将源复制到目标,否则您将会非常不高兴。 (如果源是/dev/sda确保128 Gb 驱动器现在分区小于 120 Gb...你的目标是/dev/sdb 新的 120 Gb 驱动器。

    dd if=/dev/sda of=/dev/sdb bs=4096 conv=notrunc,noerror

  4. 现在,如果您愿意,您可以返回 Gparted 并在源驱动器上将分区的完整大小扩展至允许的最大值。

Gparted 可以很好地缩小分区并显示已用空间,因此您可以将分区缩小到已用空间以上的任意大小。我尝试使用 Gparted 复制和粘贴分区,但没有成功。仅使用 Gparted 来缩小分区,然后用来dd进行复制。

一旦完成,它可能会告诉你空间不足。这是正常的;您正在复制到较小的磁盘上。但由于您正在复制较小的分区,因此所有数据都会被复制。dd尝试将所有 128 Gb 复制到 120 Gb 并引发错误。别担心;不会损坏驱动器。现在移除 Gparted USB,移除源驱动器并启动到新的 120 Gb 磁盘,检查内容,如果还有空间,您可以解压缩那些之前压缩的文件。

答案3

我能想到的唯一可行选择是调整 ext4 分区的大小,这样你就有 119gb 的数据和 9gb 的可用空间。然后,你可以使用 DD 和 bs= 和 count= 命令将 120gb 的数据复制到驱动器。(你将剩下 1gb 的可用空间,然后你可以再次调整其大小(我这样做只是为了安全))

答案4

我假设每个驱动器都有/只有一个分区。

dd无法按照您想要的方式使用,因为它会将一个驱动器上的每个物理数据块复制到另一个驱动器,包括使用 128GB 定义分区和文件系统的数据。并且存储在第一个驱动器末尾的任何数据块都将丢失。

Ottavio Campana 在评论中提到了一个简单的解决方案:

  1. 使用 LiveCD 启动系统
  2. 在新驱动器上创建文件系统
  3. 安装两个驱动器,并使用以下方法将旧驱动器复制到新驱动器:cp -a

然后,如果新驱动器将成为您的主驱动器,那么您必须在新驱动器上安装引导加载程序(例如 GRUB)。

Benny Hill 的评论提供了一个类似问题的链接,其中的答案提供了其他解决方案。

相关内容