我想将我的外部硬盘 (/dev/sda) 备份到新硬盘 (/dev/sdb)。最初,旧硬盘有一个 ext4 分区,新硬盘有一个 exfat 分区。我做了以下操作。
$ sudo dd if=/dev/sda of=/dev/sdb status=progress
1500292583936 bytes (1.5 TB, 1.4 TiB) copied, 13878 s, 108 MB/s
2930277167+0 records in
2930277167+0 records out
1500301909504 bytes (1.5 TB, 1.4 TiB) copied, 13878.1 s, 108 MB/s
据我了解,这会逐块复制第一个磁盘。两个磁盘的块均相同,这在 fdisk 实用程序中已识别。但我无法安装新磁盘。
$ sudo mount /dev/sdb1 /media/darth_vader124/Expansion/
FUSE exfat 1.2.3
ERROR: invalid VBR checksum 0x180000 (expected 0xef00f1d9).
$ sudo mount -t ext4 /dev/sdb1 /media/darth_vader124/Expansion/
mount: wrong fs type, bad option, bad superblock on /dev/sdb1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
$ dmesg | tail
[35260.595816] sd 5:0:0:0: Attached scsi generic sg0 type 0
[35264.291591] sd 5:0:0:0: [sdb] 2930277167 512-byte logical blocks: (1.50 TB/1.36 TiB)
[35264.291596] sd 5:0:0:0: [sdb] 4096-byte physical blocks
[35264.291771] sd 5:0:0:0: [sdb] Write Protect is off
[35264.291774] sd 5:0:0:0: [sdb] Mode Sense: 53 00 00 08
[35264.292084] sd 5:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[35264.292374] sd 5:0:0:0: [sdb] Optimal transfer size 33553920 bytes not a multiple of physical block size (4096 bytes)
[35264.380436] sdb: sdb1
[35264.382173] sd 5:0:0:0: [sdb] Attached SCSI disk
[35994.146335] EXT4-fs (sdb1): VFS: Can't find ext4 filesystem
我发现 mount 无法将新磁盘识别为 ext4。因此,dd 可能没有复制所有块。
编辑:我在 dd 之后没有运行 partprobe
$ sudo partprobe -s
/dev/sda: gpt partitions 1
/dev/sdb: gpt partitions 1
$ sudo fdisk -l
Disk /dev/sda: 1.4 TiB, 1500301909504 bytes, 2930277167 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: BE916BAF-9FFC-4D88-8E8C-B8DD0072B234
Device Start End Sectors Size Type
/dev/sda1 2048 2930276351 2930274304 1.4T Linux filesystem
Disk /dev/sdb: 1.4 TiB, 1500301909504 bytes, 2930277167 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: BE916BAF-9FFC-4D88-8E8C-B8DD0072B234
Device Start End Sectors Size Type
/dev/sdb1 2048 2930276351 2930274304 1.4T Linux filesystem
编辑2:
$ sudo cat /dev/sda1 | file -
/dev/stdin: Linux rev 1.0 ext4 filesystem data, UUID=61852e31-2c29-41fc-acbd-2a146f7d0d51, volume name "darth_vader124" (extents) (large files) (huge files)
$ sudo cat /dev/sdb1 | file -
/dev/stdin: DOS/MBR boot sector
$ sudo cmp /dev/sda /dev/sdb
/dev/sda /dev/sdb differ: byte 1048577, line 1
$ sudo cmp /dev/sda1 /dev/sdb1
/dev/sda1 /dev/sdb1 differ: byte 1, line 1
因此,看起来 dd 没有正确复制所有块。cmp 显示从扇区 2048(分区开始)开始存在大量差异(至少总共有 1000 个不匹配的字节)。
我尝试使用 cmp 对 sda 中的 100 万个 512 大小的块执行 dd 操作,以进行健全性检查。我再次比较了前 5.12 亿字节(~489MB)。现在它们匹配了。令人惊讶的是,我现在也可以挂载 sdb 并能够看到所有其他文件。我不确定是什么原因导致 sdb 无法挂载以及 sda 和 sdb 之间的数据第一次存在差异。当我第一次运行 dd 时,两个磁盘都已挂载(很可能,但不太确定),但我没有使用任何文件。我猜可能是原始数据访问和运行 dd 的主机操作系统进行的文件系统缓存之间存在一些冲突。
答案1
正如评论中所讨论的,这很可能是由于在执行 dd 时安装了新硬盘。dd 完成后,卸载了新硬盘。这可能导致新硬盘上的超级块被覆盖。