使用 dd 从入口磁盘映像恢复到未分配的空间或特定分区

使用 dd 从入口磁盘映像恢复到未分配的空间或特定分区

我已经dd为入门磁盘创建了一个适用于 Windows 10 的映像,并且我从 Ubuntu 恢复模式恢复它

当我想恢复 Windows 时,我会擦除硬盘并删除所有分区

wget -O- 'http://your_webhosting.com/Windows10template.img.gz' | gunzip | dd of=/dev/sda

图像大小为 5GB(压缩)(gz 格式),20GB(未压缩)

我有三个分区

 Device     Boot     Start        End    Sectors   Size Id Type
    /dev/sda1  *         2048    1026047    1024000   500M  7 HPFS/NTFS/exFAT
    /dev/sda2         1026048  208089944  207063897  98.8G  7 HPFS/NTFS/exFAT
    /dev/sda3       208089949 1953520064 1745430116 832.3G  f W95 Ext'd (LBA)
    /dev/sda5       208090012 1953520064 1745430053 832.3G  7 HPFS/NTFS/exFAT

我所需要的只是将从入口磁盘创建的映像恢复到 sda1 和 sda2,并保留 sda5(我自己的文件)

我删除了 sda1 和 sda2,并创建了一个 100GB 的新分区 sda1,然后使用以下命令恢复映像

wget -O- 'http://your_webhosting.com/Windows10template.img.gz' | gunzip | dd of=/dev/sda1

但什么都没变。我的分区现在像这样

Device     Boot     Start        End    Sectors   Size Id Type
/dev/sda1            2048  195311615  195309568  93,1G 83 Linux
/dev/sda3       208089949 1953520064 1745430116 832,3G  f W95 Ext'd (LBA)
/dev/sda5       208090012 1953520064 1745430053 832,3G  7 HPFS/NTFS/exFAT

正常且有效的方法彻底清除了硬盘。我需要一种有效的方法将其恢复到一个分区或未分配的空间

/dev/sda1

如何用 来做到这一点dd

更新

$ fdisk -l Windows10template.img
Disk Windows10template.img: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x266de740

Device                 Boot   Start      End  Sectors  Size Id Type
Windows10template.img1 *       2048  1026047  1024000  500M  7 HPFS/NTFS/exFAT
Windows10template.img2      1026048 41940991 40914944 19,5G  7 HPFS/NTFS/exFAT

答案1

是一种非常强大但也非常危险的工具。请备份在开始篡改 dd 之前,目标驱动器上(例如分区 /dev/sda5)有什么新内容。

我认为最不危险的方法是

  1. 将备份映像中的“所有内容”克隆到额外的驱动器

  2. 将额外驱动器的第一个分区克隆到目标驱动器的第一个分区。

  3. 但是您损坏了驱动器的头部(第一个 mibibyte),因此您也需要将备份映像中的该部分克隆到目标驱动器。您只能count=N复制 N 个块,默认块大小为 512 字节。

另一种更快但更危险的方法是克隆备份的第一部分,从头端到第一个分区的末尾。

答案2

由于驱动器备份映像上的分区边界与当前磁盘布局的子集对齐,因此从输出中截取相关部分并将其写入 的正确部分相对简单,gunzip但我不会写出一个只对您有帮助却会覆盖其他人数据的答案。即使对您自己来说,进行错误的偏移计算或输入错误的数字以得到相同的结果也有很大的风险。/dev/sdadd

相反,将驱动器映像解压到足够大的存储介质上并对其进行操作会更好。即使在恢复模式下也可以这样做。但是,如果您使用图形用户界面(例如从实时 DVD/USB)执行此操作会容易得多 - 即使您最终在终端上执行大部分操作。

我假设文件系统上至少有 25 GB(足以保存压缩和解压缩的备份映像)的可用空间/dev/sda5

  1. 将文件系统挂载到/dev/sda5

    • 您可以使用文件管理器或Gnome 磁盘挂载文件系统。

    • 或者在命令行上:

      udisksctl mount --block-device /dev/sda5 --options rw
      

      udisksctl将告诉您驱动器的安装位置。

    我假设挂载点位于/media/ubuntu/my-data。根据实际挂载点调整以下命令。

  2. 将压缩的驱动器映像下载到先前安装的文件系统上

    • 使用网络浏览器或

    • 你最喜欢的 HTTP 客户端,

    • 例如在命令行上:

      wget -P /media/ubuntu/my-data 'http://your_webhosting.com/Windows10template.img.gz'
      
  3. 解压缩图像并将输出存储在同一文件系统上。

    • 您可以使用以下档案管理器:文件滚筒(您的文件管理器应该自动打开它作为文件的默认操作.gz)或

    • 命令行工具,例如:

      gunzip /media/ubuntu/my-data/Windows10template.img.gz
      
  4. 为解压的驱动器映像设置循环设备。

    • 您应该能够告诉您最喜欢的图形文件管理器安装图像文件(通过其上下文菜单)并通过新创建的循环设备的属性对话框找出设备路径(可通过其上下文菜单访问)。

    • 或者在命令行上:

      udisksctl loop-setup --file /media/ubuntu/my-data/Windows10template.img --read-only
      

      udisksctl将显示循环设备的路径。

    我假设循环设备路径为/dev/loopX。根据实际设备路径调整以下命令。

  5. 通常,在这两种情况下,udisksctl都会告诉内核检测循环设备内的分区表(由驱动器映像支持)并为检测到的分区添加额外的块设备节点,即/dev/loopXp1/dev/loopXp2

    如果没有:

    sudo partprobe /dev/loopX
    
  6. 复制先前暴露的分区单独地到目标设备。

    • 您可以使用图形分区管理器,例如Gnome 磁盘或者分区(这是更安全的途径,因为目标设备的性质通过一些上下文图形信息更加明显,这使得意外选择和随后的数据丢失不太可能发生;它们完全禁止更改正在使用的分区)。

    • 或者在命令行上:

      sudo dd if=/dev/loopXp1 of=/dev/sdX1 bs=8M
      sudo dd if=/dev/loopXp2 of=/dev/sdX2 bs=8M
      

      loopXsdX1替换为适当的设备名称。仔细检查您输入的目标设备路径是否正确,以及是否/dev/sdX确实是您认为的那样!不要依赖内核在系统重启后将相同的名称重新分配给块设备!

      /dev/sdX您可以通过查看其分区布局(例如使用或 Gnome Disks)来验证的身份fdisk /dev/sdX,或者使用中唯一且(大多数)稳定的设备标识符/dev/disk/by-*

  7. 验证/dev/sdX1/dev/sdX2包含预期数据。

  8. 大功告成。重新启动进入 Windows 或执行其他操作。

  9. 可选清理:

    1. 如果要删除驱动器映像在上一步中重新启动后,请先移除循环设备,然后才允许这样做。

      • 您可以再次使用文件管理器或Gnome 磁盘,两者都应该提供喷射与循环设备关联的按钮。

      • 或者在命令行上:

        udisksctl loop-delete --block-device /dev/loop7 
        
    2. 随时根据需要删除剩余的驱动器映像。


1 sdX是一个占位符,它不存在于任何合理的默认 *nix 设置中,以避免人们错误地将逐字命令复制并粘贴到终端中而造成数据丢失。

相关内容