知道分区需要编辑,可以使用“dd”克隆到较小的硬盘驱动器吗?

Ray*_*ews 19 partition dd cloning hard-disk

我曾经dd像这样克隆磁盘:

 dd if=/dev/sdb of=/dev/sda bs=4096 conv=notrunc,noerror,sync
Run Code Online (Sandbox Code Playgroud)

而且它一直运行良好。'dd' 上的所有文档都煞费苦心地提醒您目标磁盘的大小必须与源磁盘相同或更大。这一定是真的吗?

现在,我很清楚,如果我克隆到一个较小的磁盘,我不能指望目标上任何部分 “越界”的分区都完好无损。

但是,完全知道我稍后需要在目标上编辑我的分区,删除“越界”的分区,我是否仍然可以使用“dd”来制作源的蛮力副本,直至达到极限目标的物理尺寸?或者,当目标达到其大小限制时,会“dd”将目标减少为一堆冒烟的残骸;-)

顺便说一句,在研究这个时,我已经看到bs=了从bs=1024到的所有内容的推荐值bs=32M,什么才是最好的?

Gio*_*ani 7

物理驱动器至少不应该开始冒烟,但是很有可能您的文件系统将不再工作(我的意思是目标文件系统;如果您只是复制并且没有触及源中的任何内容,源本身应该没问题)。分区内的数据不一定按升序分配。即使分区未满,其中一些也可能位于分区的末尾(实际上,我认为某些文件系统会确定性地发生这种情况,但我不了解详细信息)。那里的数据可能对文件系统的完整性至关重要。所以我强烈建议你不要依赖这样的副本。

如果要进行此复制,首先必须使用一些了解其内部结构并能够将所有内容重新映射到较小分区的工具来缩小分区。然后就可以进行复制了。gparted是一个很好的 GUI 界面来做这种事情。

对于bs价值,通常最好的办法是在开始真正的副本之前进行几次测试。有一些工具可以帮助您自动执行此检查,但我不记得名称。根据我的经验,最佳范围通常在 4M 到 16M 之间。高于此值,您将不再赚很多钱。但这取决于很多事情,包括磁盘本身。例如,我很少使用真正的高端磁盘,由于更大的速度和缓存大小,它可能适合更高的值。

编辑如果一个分区被完全复制,那么你可以毫无问题地使用它。但是,正如其他人所强调的,您还必须确保分区表完好无损(至少是相关条目)。MBR 的四个主分区没有问题,因为它们是在磁盘的前 512 字节中描述的。逻辑分区在整个扩展分区中都有描述,因此条目可能会丢失(但它们会描述无论如何都会丢失的分区)。使用 GPT,在磁盘的开头和结尾都有分区表的副本​​。你失去了第二个,但你可以从第一个重建它。当然,最好尽快这样做;其他答案在这方面更准确。


acu*_*cud 7

正如其他人在这里提到的dd那样,由于 GPT 表的副本放置在磁盘的末尾,因此使用将不起作用。

我设法使用以下方法迁移到较小的驱动器:

首先 - 启动到您选择的 liveCD 发行版。

调整源驱动器分区的大小以确实适合较小驱动器的约束(gparted例如使用)。然后,假设sda是源磁盘,使用sgdisk,首先从源驱动器创建 GPT 表的备份,以确保安全:`

    sgdisk -b=gpt.bak.bin /dev/sda
Run Code Online (Sandbox Code Playgroud)

假设sdb是目标,将表从源驱动器复制到目标:

    sgdisk -R=/dev/sdb /dev/sda
Run Code Online (Sandbox Code Playgroud)

sgdisk 现在会抱怨它试图将标题副本放置在目标磁盘的边界之外,但随后会回退并将标题正确放置在目标磁盘的上限。

使用您选择的工具(gparted例如)验证是否已在目标驱动器上创建了正确的分区表克隆。

使用dd,将每个分区从源驱动器复制到目标:

dd if=/dev/sda1 of=/dev/sdb1 bs=1M
dd if=/dev/sda2 of=/dev/sdb2 bs=1M
dd if=/dev/sda3 of=/dev/sdb3 bs=1M
etc...
Run Code Online (Sandbox Code Playgroud)

显然,如果您在没有备份的情况下复制 GPT 分区表时或在dd处理内容时混淆了驱动器的名称,您就可以告别内容了 :)