如何将 NTFS 分区部分克隆到较小的磁盘,而没有空间存放完整映像

如何将 NTFS 分区部分克隆到较小的磁盘,而没有空间存放完整映像

我时不时会遇到以下问题:

磁盘发生故障,而替换磁盘较小。数据通常可以轻松装入较小的磁盘,但 partclone 不会缩小文件系统以匹配较小的分区大小。

您可以简单地将整个磁盘映像到临时驱动器上,然后缩小。但如果空间不足呢?

答案1

从第 16 点开始还不起作用。可能是因为有一个过时的循环设备我没有删除。

partclone将原始数据转储到稀疏图像中

此解决方案对您的数据有危险。请仅在您了解自己在做什么并且熟悉dd设备的情况下尝试。我不会对任何数据丢失负责。

开始之前:

  • 不要使用此过程来镜像物理损坏的磁盘,因为

    • partclone需要一个健康的文件系统才能工作

    • 这个过程比现在要复杂得多dd,你可能需要重复几次才能成功——给破碎的椎间盘带来更大的压力

    • 对于损坏的磁盘,你应该使用safecopy,因为dd坏扇区会中止

  • 您最多需要2 x 数据大小的可用空间在您的临时驱动器上。

  • 如果您忘记自定义命令,我将输入sdXX任何可能破坏数据的命令。这不处理循环,因此请务必请勿使用任何其他循环设备以避免意外覆盖宝贵的数据。

  • 如果您在某处失败并删除了图像,请务必先卸载指向该图像的所有内容,然后删除循环设备:kpartx -dv <image>如果使用错误的环路设备,可能会导致严重问题!我相信我的问题是由陈旧的循环设备引起的......

  • 在此答案的末尾找到常见问题的修复方法。

我们走吧

  1. 获取源磁盘的磁盘大小

    sudo fdisk -l /dev/sda
    output: Disk /dev/sda: 465,8 GiB, 500107862016 bytes, 976773168 sectors
    
  2. 将原始分区布局读入图像

    sudo dd if=/dev/sda of=sparse.img bs=1M count=1
    
  3. 用“无”内容填充图像,直至达到上述尺寸。-这会不是占用磁盘上的任何空间。

    sudo dd if=/dev/zero of=sparse.img bs=1 count=0 seek=500107862016
    
  4. 检查没有其他循环设备处于活动状态 -如果输出不为空,请参阅故障排除部分

    losetup -l -a 
    
  5. 检查分区布局是否与源驱动器相同

    fdisk -l sparse.img
    
  6. 创建循环设备以访问映像中的分区

    sudo kpartx -av sparse.img 
    output: add map loop0p1 (253:0): 0 976771072 linear 7:2 2048
    
  7. 使用以下方法将数据读入图像partclone这将增加“数据大小”加上“开销”的空间使用量。

    sudo partclone.ntfs -s /dev/sda1 -o /dev/mapper/loop0p1 -b -L sparse.log
    
  8. 删除源驱动器以保存它

  9. 收缩使用gparted-应至少比目标驱动器小 10%

    • 创建链接,因为gparted不了解开发人员kpartx创建的。

      ln -s /dev/mapper/loop0p1 sparse.img1
      
    • 用于gparted缩小分区

      sudo gparted sparse.img
      
  10. 或者,您可以使用来缩小ntfsresize,但之后您也必须缩小分区。

    • 获取最小尺寸

      sudo ntfsresize -i /dev/mapper/loop0p1
      
    • 测试调整大小

      sudo ntfsresize -n -s 100G /dev/mapper/loop0p1
      
    • 真正的调整大小 -这将使空间使用量增加至“数据大小”

      sudo ntfsresize -s 100G /dev/mapper/loop0p1
      
    • TODO:缩小分区

  11. (因为缩小了而不是放大了所以没必要?)由于分区大小发生变化,删除并重新创建循环设备

    sudo kpartx -dv sparse.img 
    sudo kpartx -av sparse.img 
    
  12. (可选)TODO截断图像

  13. 检查使用ntfsresize-对我来说这给出了一个好的答案

    sudo ntfsresize -i /dev/mapper/loop0p1
    
  14. 插入目标驱动器 -再次检查是否插入了正确的驱动器

  15. ntfsresize(由于文件系统被标记为脏,所以不起作用) partclone将图像复制到新驱动器

    sudo partclone.ntfs -o /dev/sdXX -s /dev/mapper/loop0p1 -b -L restore.log
    
  16. 而是dd将图像复制到新驱动器 -不指定大小,或者大于缩小后的分区大小的 10%

    sudo dd if=sparse.img of=/dev/sdXX
    
  17. 检查使用ntfsresize-对我来说失败了,这不应该发生,因为图像没有问题,而且我们创建了图像的相同副本!!!

    sudo ntfsresize -i /dev/sda1
    
  18. 删除循环设备

    sudo kpartx -dv sparse.img
    
  19. 删除所有未完全移除的循环设备 -如果仍然存在问题,请重新启动或在网上搜索。

    sudo losetup -D 
    
  20. 最后,您应该尝试启动磁盘,然后运行 ​​Windows chkdsk / f。之后使用gparted将分区扩展至其最大大小。

故障排除:

  • 如果ntfsresizegparted无法访问映像:chkdsk /f从源磁盘上的 windows 执行。请勿使用ntfsfix有适用于 Linux 的 NTFS 检查器吗?

  • 如果kpartx无法创建循环设备:请检查losetup并删除未使用的设备。

  • 如果您想摆脱过时的循环设备,请删除sudo losetup -d或搜索网络。

相关内容