尽管我进行了大量 Google 搜索,但我还是找不到我的问题的答案。
我是一名 Linux 系统管理员,我想备份位于 160 GB 硬盘的第一个分区(我已将其缩小到最小大小,大约 4.8 GB)上的 Windows XP 安装(但可以是任何其他操作系统)和 MBR,备份到同一个文件中。目标是拥有一个磁盘映像,我可以使用它来覆盖新硬盘(例如 dd if=/my/file.img of=/dev/sda),然后使用 gparted 将分区扩展到新磁盘的完整大小,从而拥有一个与 Debian 或 Ubuntu 为其实时系统发布的混合磁盘映像一样易于使用的映像(您可以使用 dd 直接将其写入 USB 记忆棒,但我只想在普通硬盘上使用它们)。
我已经知道如何使用 dd 备份/恢复 MBR 或单个分区,但现在我想在一个文件中备份两者。
我还没有尝试任何方法,但我想到了两种方法:
将 MBR 和分区映像文件连接(例如使用 cat)为单个映像文件,但我不确定原始磁盘中它们之间没有任何内容。
使用 dd 的
count=
选项备份硬盘直到第一个分区的末尾,但我不知道如何计算结束复制的正确大小。也许是备份分区时复制的字节数(dd 完成后会输出),并为 MBR 添加了 512 字节,但同样,我对硬盘数据结构的了解不够深入,无法确保它们之间没有一些我应该添加到总数中的数据。
将整个磁盘备份到稀疏文件或压缩文件不是一个选择,因为我希望能够在比原始磁盘更小的磁盘上使用该映像(当然,比缩小的分区更大)。
任何建议都将不胜感激,无论是确认第一种方法是否有效,还是计算第二种方法的正确数字的方法,或者采用完全不同的方法来达到这个目标,唯一的限制是,作为 Linux 用户,我更喜欢使用大多数 Linux 发行版上可用的仅基本软件的方法,例如 dd 或 cat。
答案1
您的选项 #2 应该有效。例如,如果fdisk
或parted
显示 Windows 分区在扇区 9,375,000 处结束,您可以执行以下操作:
dd if=/dev/sda of=/path/to/winxp.img bs=512 count=9375001
(请注意,在值上加了 1 count
,因为扇区编号从 0 开始。)要将此映像复制到另一个磁盘,请执行相反的操作,并且可以省略count
和bs
选项(尽管设置更高的bs
值可能会提高性能;我的示例将其设置为 4096,这是新高级格式磁盘上的物理扇区大小):
dd if=/path/to/winxp.img of=/dev/sdb bs=4096
复制将在文件末尾终止。只要磁盘至少有 9,375,001 个扇区,一切都应该正常工作。在基于 BIOS 的计算机上,引导加载程序驻留在主引导记录 (MBR;磁盘的第一个扇区) 中。有时,附加代码(例如 GRUB 或某些类型的磁盘加密软件)会进入 MBR 和第一个分区开头之间的扇区。所有这些扇区都将存在于备份文件中。虽然理论上某些软件可以将数据存储在磁盘最末端的分区之外,但这种做法并不常见。事实上,我不知道有任何东西可以这样做,至少在 BIOS/MBR 计算机上没有。(较新的 GUID 分区表或 GPT 分区系统确实将分区表的备份存储在磁盘末尾。因此,如果您想备份 GPT 磁盘,则需要执行更复杂的操作或在恢复备份后执行分区表修复操作。)
请注意,所有这些都忽略了 Windows 安装往往高度特定于计算机的事实。如果您将安装移至新计算机,驱动程序可能不会匹配,并且在 Windows 更新所有驱动程序时,您最多需要重新启动六次或十几次。最坏的情况下,此过程可能会失败。Windows 序列号也存在问题。