尽管起初提议的“挑战”似乎有些困难,不可行或听起来有些幼稚,但事实并非如此。使用dd从较大的磁盘迁移到较小的磁盘的主要思想非常好,并且具有迁移数据的好处。当然,必须有足够的可用空间以使所占用的数据适合目标磁盘。
这样做的想法是单独考虑每个分区,而不是像最初建议的那样立即考虑整个磁盘。甚至可以完成更多工作:在文件系统调整工具的帮助下,可以将被截断的分区安全地迁移。确实,这种迁移很有趣,可以保留文件系统matadata和扩展文件属性,而这些文件属性无法通过cp,rsync,pax等工具轻松复制,这些工具在文件系统层而不是在设备层运行。使用dd不需要重新安装OS或重新标记FS,以避免SELinux出现问题。
以下是我通常要完成的任务:
1)首先,在受影响的分区中减少了将被截断的文件系统。为此,请使用resize2fs工具(假设我们正在谈论ext2 / ext3 / ext4 fs-其他现代FS也具有用于相同用途的调整大小工具)。请注意,尽管出于明显的原因,文件系统不能大于其所在分区,但可以安全地较小。这里的安全技巧是减少“超出需要”。例如:假设您有一个1TB的文件系统要迁移到500 Gig驱动器。在这种情况下,我建议将fs减小到450 Gig(当然,您必须有足够的可用空间,例如,该文件系统中当前占用的空间不能超过450 Gig)。数据迁移后,固定的表观浪费50 Gig的空间将得到修复。
2)考虑到其空间限制,使用适当的几何形状对目标磁盘进行分区;
3)使用分区设备而不是磁盘设备dd数据(即dd if=/dev/sda# of=/dev/sdb#
用于每个分区而不是if=/dev/sda of=/dev/sdb
)。注意:此处的sda和sdb只是示例;重要说明:当dd从较大的分区设备转移到较小的分区设备时,dd会抱怨试图将post写入块设备的末尾,这是可以的,因为文件系统数据在到达该点之前已被完全复制。为了避免出现此类错误消息,您可以使用bs=
和count=
参数指定副本的大小以匹配缩小的文件系统大小,但这需要进行一些(简单的)计算,但是如果操作不正确,则可能会冒数据风险。
4)在添加数据之后,使用resize2fs再次调整目标分区内各个文件系统的大小。这次不指定新的文件系统大小。在没有大小规格的情况下运行时,resize2fs会扩展文件系统,使其占据最大允许的大小,因此,在这种情况下,450 Gig文件系统将再次增长以占据整个500 Gig分区,并且不会浪费任何字节。(“减少超过所需数量”的方法可避免您意外地错误指定大小并冒数据风险。请注意,GB和GiB单位可能很棘手)。
有关更复杂的操作的注意事项:如果您打算将启动管理器复制到一起(很可能是这种情况),则可以使用磁盘设备而不是分区设备(例如, dd if=/dev/sda of=/dev/sdb bs=4096 count=5
),然后在/ dev / sdb中重新配置几何图形(它将临时包含新驱动器的无效几何图形,但完整有效的启动管理器)。最后,如上所述使用分区设备进行一次分区。我做了很多这样的操作。最近,从包含混合MacOSX和Linux安装的HDD升级到MacMini6,2中较小的SDD时,我成功地执行了复杂的迁移。在这种情况下,我必须从外部驱动器引导Linux,先启动bootmanager,然后运行gdisk将GPT修复到新磁盘中,最后再启动每个包含刚刚缩小的文件系统的分区。(请注意,GPT分区方案保留了分区表的两个副本,一个副本位于磁盘的开头,另一个副本位于磁盘的结尾。gdisk抱怨很多,因为它找不到PT的第二个副本,并且分区超出了磁盘的大小,但是它在重新定义磁盘几何形状后正确地解决了PT副本的问题。这是一个更为复杂的情况,但值得一提,因为它说明了这种操作也是完全可行的。
祝好运!...并且最重要的是,请记住在进行此类操作之前备份所有重要数据。一个错误,您肯定会无法挽回地损坏您的数据。
以防万一,我的强调不够:在迁移之前备份您的数据!:)
dd
最佳块大小计算方法有用