使用 Linux 和 dd 将 FAT32 Windows 分区克隆到另一个更大的磁盘

使用 Linux 和 dd 将 FAT32 Windows 分区克隆到另一个更大的磁盘

问题:

我目前有一个 4GB 的磁盘,其中有一个主 FAT32 分区,安装了 Windows 98SE。磁盘几乎已满,我想将该分区移至更大的 8GB 磁盘。

问题

使用dd,我如何才能成功地将原始 4GB 磁盘克隆到更大的 8GB 磁盘,并且 Windows 操作系统仍然可以启动?

范围:

对于广大读者来说,我是否使用 CompactFlash 卡作为硬盘进行本次测试无关紧要。我认为对于有类似问题的用户来说,用传统的 IDE/SATA 硬盘代替 CompactFlash 卡是没有理由不合适的。

配置

我没有使用标准的 IDE/SATA 硬盘,而是使用带有 IDE CF 适配器的 Transcend CompactFlash (CF) 卡作为旧硬件系统中的主硬盘来运行 MS-DOS 或 Windows 95/98SE。测试系统使用 IDE 到 CF 适配器,将 CompactFlash 卡视为常规本地硬盘。

我正在使用带有 USB CompactFlash 读卡器的 Linux 笔记本电脑来从 CF 读取图像/向 CF 写入图像。

为了进行测试,Linux 中的磁盘标识如下:

/dev/sda创见 4GB CompactFlash 133x

/dev/sdb创见 8GB CompactFlash 133x

为了节省那些不想看到我尝试过什么但知道完美答案的人的阅读时间,请忽略剩余的文字。对于那些希望看到我迄今为止尝试过什么的人,请继续阅读:

尝试

  1. 将 4GB 磁盘 dd 到 8GB 磁盘
  2. 将 4GB 分区 dd 到 8GB 磁盘上的 4G 分区
  3. clonezilla 4GB -> img -> 8GB
  4. 将 Windows 安装到 8GB 磁盘

    4a. 将 4GB 分区恢复到 8GB 磁盘

    4b. 将 4GB 分区还原到 8GB 磁盘,然后还原 8GB MBR

笔记:每次尝试清除目标磁盘失败后(4a 除外),我都会使用 GParted 删除分区并创建一个新的分区表来清除现有的分区:设备->创建分区表->msdos->应用

1. 将 4GB 磁盘 dd 到 8GB 磁盘

我的第一次尝试是使用以下命令克隆整个磁盘dd

sudo dd if=/dev/sda of=win98se.img bs=4M; sync

然后将磁盘映像恢复到 8GB 磁盘:

sudo dd if=win98se.img of=/dev/sdb bs=4M; sync

这不起作用。启动系统时,我看到以下错误:“系统磁盘无效。更换磁盘,然后按任意键”

2. dd 4GB 分区到 8GB 磁盘上的 4G 分区

我从 4GB 磁盘克隆了分区而不是整个磁盘:

sudo dd if=/dev/sda1 of=win98se_part.img bs=4M; sync

然后我将这个 4GB 分区恢复到 8GB 磁盘:

sudo dd if=win98se_part.img of=/dev/sdb1 bs=4M; sync

我注意到这不会启动操作系统,因为 8GB 磁盘的 MBR 中没有引导加载程序知道如何从我刚刚复制的分区启动 Windows。

在 GParted 中,分区布局看起来正确,但它无法启动,因为没有必要的启动代码: :

3. clonezilla 4GB -> img -> 8GB 此测试仅在目标系统上进行。我从 CD 启动了 clonezilla live,并使用选项device-imagesavedisk路由将 4GB 磁盘映像保存到辅助存储(USB 闪存驱动器)。然后我使用路由将此映像还原到 8GB 磁盘restoredisk。但是,我得到了与尝试 #1 中相同的错误。

4.将 Windows 安装到 8GB 磁盘

为了确认 8GB 磁盘是否能够启动 Windows,我从头开始(即安装 CD)将 Windows 98SE 安装在 8GB 磁盘上。安装完成后,操作系统可以启动,我对磁盘进行了映像处理:

sudo dd if=/dev/sdb of=win98se_8gb.img bs=4M; sync

我还单独复制了 MBR:

sudo dd if=/dev/sdb of=~/tmp/transcend_8gb.mbr bs=512 count=1

4a. 将 4GB 分区恢复到 8GB 磁盘

8GB 磁盘现在有一个可启动的 MBR 和分区,可以启动(基本且空白的)Windows 安装。使用dd,我将 4GB 磁盘的分区(如尝试 #2 中所做的那样)复制到现有的 8GB 分区上。这使我能够启动 Windows 并包含 4GB 分区中的数据和配置。但是,这种方法创建了一个 8GB 分区,该分区在 Windows 中仅被识别为原始 4GB 分区大小。在 GParted 中,它看起来像这样:

使用 GParted 缩小并重新增大分区并不能解决问题,Windows 仍然将其视为 4GB 磁盘。

4b. 将 4GB 分区还原到 8GB 磁盘,然后还原 8GB MBR

我曾经从一个干净的磁盘dd将 4GB 分区复制到 8GB 磁盘:

sudo dd if=win98se_part.img of=/dev/sdb1 bs=4M; sync

然后将 MBR(来自 Windows 98 安装映像)复制回 8GB 卡:

sudo dd if=transcend_8gb.mbr of=/dev/sdb

结果与尝试 #4a 相同。Windows 启动,但 4GB 分区现在是一个 8GB 分区,但仅被识别为 4GB(与尝试 #4a 中的屏幕截图相同)。

我也尝试了同样的操作,只复制引导代码(MBR 的前 446 个字节):

sudo dd if=transcend_8gb.mbr of=/dev/sdb bs=446 count=1

但这不起作用,因为当尝试将dd分区到目标磁盘时,它是不可见的。

我已经花了 6 天时间尝试以不同顺序(dd先 MBR 然后分区,反之亦然)的不同方法,但没有成功。

阅读材料:

https://askubuntu.com/questions/119791/how-to-copy-a-bootable-ntfs-partition-from-one-physical-hard-drive-to-another-wi

https://unix.stackexchange.com/questions/111895/copy-mbr-and-boot-partition-to-a-smaller-disk

如何使用 unix/linux 工具 dd 将系统迁移到较小的驱动器?

https://www.howtoforge.com/tutorial/linux-dd-command-clone-disk-practical-example/

答案1

感谢@davidgo 的评论,我能够解决这个问题,fatresize这就是我正在寻找的答案。

  1. sudo fdisk -s /dev/sdb1获取分区的大小(以 kB 为单位)。
  2. sudo fatresize -v -s <size in kB> /dev/sdb1

fatresize另请注意:在处理具有较长名称的分区时会出现错误/dev/mmcblk0p1,因此您可能需要创建一个临时软链接,正如Roberto在https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=810735#20

相关内容