案件设想:
$ sudo fdisk -l
Disk /dev/sda: 223,6 GiB, 240057409536 bytes, 468862128 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: 0x13a30a5a
Device Boot Start Final Sectors Size Id Type
/dev/sda1 * 2048 1333247 1331200 650M 27 WinRE NTFS hidden
/dev/sda2 1333248 264058879 262725632 125,3G 7 HPFS/NTFS/exFAT
/dev/sda3 264060926 468860927 204800002 97,7G 5 Extended
/dev/sda5 264060928 434049023 169988096 81,1G 7 HPFS/NTFS/exFAT
/dev/sda6 434051072 464771775 30720704 14,7G 83 Linux
/dev/sda7 464773120 468860927 4087808 2G 82 Linux swap / Solaris
Windows 10安装在/dev/sda2
并且我假设它/dev/sda1
是来自同一 Windows 系统的隐藏分区。
我怎么能够备份我的 Windows 10安装从Linux以便稍后恢复?
根据要求提供更多数据:
- 我所说的“安装”是指将 Windows 返回到克隆时所需的“完整分区”(或多个分区)。
- 能够恢复到相同的系统(计算机、硬件)甚至硬盘就足够了。即:我安装了 Windows 10,做了备份,几个月前我想恢复我所做的备份,因此无需再次执行 Windows 10 的完整安装(驱动程序、打印机、程序...等)。
已测试到目前为止(所有测试都在具有相同分区布局的同一台计算机上执行):
答案1
pv
方法
你可以使用pv
(手册页)像这样的实用程序:
sudo sh -c 'pv < /dev/sda > /destination'
当然你可以先成为root:
sudo -i
然后就做备份:
pv < /dev/sda > /BackupDestination
然后在需要时执行恢复:
pv < /BackupDestination > /dev/sda
笔记
dd
这基本上与其他答案中的工作相同,但速度更快并且显示出进步。此方法可能比 慢
rsync
,但它只是复制文件,这不是有意的。它以 1:1 的方式复制所有内容,您可能会说这是一个完美的复制。
您还需要引导扇区以便稍后引导。最简单的方法是备份整个驱动器。
显示进度
dd
(手册页),你可以添加到命令中:status=progress
提示
为了之后能够有效地压缩图像,请不要忘记将可用空间归零。
答案2
我刚刚成功完成了所描述的将 Windows 10 从 Linux 备份到文件并将其恢复到新驱动器上的场景。
使用删除用零填充未使用的空间
sdelete -z c:
这本身并不是必需的,但可以提高生成文件的压缩率。删除的文件实际上并没有在磁盘上替换为零,它们占用的空间只是被标记为再次可用,但数据仍然存在。 dd 也会恢复这些数据,因此用零填充标记为空闲的每个空间可以使压缩更加有效
获取一些实时 Linux USB 来启动并将 MBR 和分区表备份到备用驱动器
dd if=/dev/sda of=/somewhere/file.mbr bs=512 count=63
将启动分区复制到文件中
dd if=/dev/sda1 bs=1M status=progress | lz4 > /somewhere/sda1.lz4
将系统分区复制到文件
dd if=/dev/sda2 bs=1M status=progress | lz4 > /somewhere/sda2.lz4
将新磁盘放入计算机,再次启动live Linux并恢复磁盘的开头
dd of=/dev/sda if=/somewhere/file.mbr
这将为您提供相同的主分区布局(扩展分区内的分区存储在其他位置,并且不会通过执行此操作来恢复)。
现在恢复两个 Windows 分区
dd of=/dev/sda1 bs=1M status=progress < lz4cat /somewhere/sda1.lz4
dd of=/dev/sda2 bs=1M status=progress < lz4cat /somewhere/sda2.lz4
驱动器在这个阶段没有启动(grub 抱怨)。因此启动Windows救援盘或安装介质并选择“修复”。在故障排除中启动 cmd 提示符并运行
bootrec /fixmbr
在这个阶段,我让原来的 Windows 系统在新的更大的驱动器上启动。我使用 gzip 和 lz4 获得了 50% 的压缩率(70% 已满驱动器),但 gzip 受到 CPU 速度的限制(在我的情况下为 27MB/s),而 lz4 则没有(480MB/s CPU 限制,180MB/s 我的备份)驱动限制)。
我的第一次尝试是使用,ntfsclone
但没有生成可启动的 Windows(它抱怨 \Windows\System32 中缺少一些文件)。我不知道为什么它不起作用。最后,dd
+lz4
解决方案创建了比其本身更小的图像ntfsclone
。您的里程可能会根据磁盘的满度和错误模数而有所不同ntfsclone
-dd
似乎更容易得到正确的结果:-)
答案3
是的,最简单的解决方案是
dd if=/dev/sda of="/media/usb/$(date).img"
这很慢并且占用大量空间,因此您可以
- 只需复制您想要的分区+引导扇区
- 归零并压缩可用空间
- 文件而不是基于块的备份
- rdiff-backup 用于反向差异(第一次后大小大幅减小)
- rsync(在慢速网络上显着加速)
- 如果您将 Windows 放入虚拟机中,则牛 FS (btrfs/zfs) 比 rsync/diff 备份更快/更小只是一个选择,而且我不确定它们是否适合该场景。
您可能错过了引导扇区、UUID,应该阅读 grub 和 https://en.m.wikipedia.org/wiki/Windows_Vista_startup_process
答案4
我对新安装的 Windows 计算机进行了备份,如下所示兹宾涅克·温克勒的回答多于。我尝试了lzma
和gzip --fast
,但这些成为了瓶颈(我的两个 SSD 在没有压缩的情况下管理着 2 GB/s 的传输速度)。实际命令行:
$ sudo dd if=/dev/nvme0n1 bs=1M status=progress | pzstd -o /tmp/windows-disk.zst
该过程大约需要八分钟,1 TB SSD 被压缩为 8 GB 文件。请注意,这是全新安装,因此只有 Windows,没有用户数据或应用程序。
恢复:
$ pzstd -d /tmp/windows-disk.zst -c | sudo dd of=/dev/nvme0n1 bs=1M status=progress