当我将外部硬盘驱动器连接到我的计算机(使用 FreeBSD 或其他 Unix 系统)并将文件从第一个外部硬盘驱动器复制到第二个硬盘驱动器时,第二个硬盘驱动器上的文件与源中的文件相同(第一个外部硬盘)?
我知道有一个哈希(校验和)。我在某处读到从不同的卷复制会产生不同的文件(因为它们是两个不同的卷)。
只有当我将文件复制到同一卷时,我才能保证它是同一个文件。
复制的建议是什么?我的文件会保持不变吗?
答案1
当制作文件的副本时,该副本是确切地与原件相同(假设复制过程中没有错误)。无论文件是复制到同一设备上的另一个位置还是复制到不同设备,都是如此。
该副本可能具有不同的文件名,或者可能具有不同的时间戳或不同的权限,但内容是相同的。
md5sum
这可以通过在原始文件和副本上运行某种校验和或散列算法(例如)来验证。
例如:
$ cp original /tmp/thecopy
$ md5sum original /tmp/thecopy
93d9d61139ff5f1287764f1c1994cbe3 original
93d9d61139ff5f1287764f1c1994cbe3 /tmp/thecopy
两个文件具有完全相同的 md5sum。 original
存储在 NVME 上。 /tmp/
是一个虚拟磁盘。
从技术上讲,两个不同的文件具有相同的md5sum
.这种情况发生的概率极低。 md5sum
对于许多简单的目的来说大多“足够好”,但是现在大多数人使用并推荐更强的散列方法来进一步降低概率。以下是sha512sum
关于文件相同性的说明。
$ sha512sum original /tmp/thecopy
5ba61d6f2a883c3afebc949b0f0d0a1c020498a1052771de98e6e1bbb42d438a0a53f49f381a2e1311c1bdf82a0cea9de646fc03c529fcb6fca0ab6476badf35 original
5ba61d6f2a883c3afebc949b0f0d0a1c020498a1052771de98e6e1bbb42d438a0a53f49f381a2e1311c1bdf82a0cea9de646fc03c529fcb6fca0ab6476badf35 /tmp/thecopy
再次,相同。
答案2
复制的建议是什么?我的文件会保持不变吗?
cp -a
将复制数据,但它会不是复制创建时间,可能会丢失最后访问时间。如果您的源系统使用 SeLinux 上下文,则 cp 不了解 SeLinux 的其他系统将不会复制它。
至于crtime请参考复制或恢复 ext4fs 文件系统上文件/目录的 crtime
最后,md5sum
复制后立即运行,特别是对于小文件不是建议这样做,因为当时的文件无法物理地转储到存储器中,而内核将使用存储在 RAM 中的脏缓冲区。
为了确保您已准确复制所有内容,您需要:
- 复制所有文件
- 创建它们的校验和(如果您的 CPU 足够现代,
sha256sum
则更可靠并且快点比 md5sum) - 删除缓存
echo 3 | sudo tee /proc/sys/vm/drop_caches
- 为新复制的文件创建校验和并将其与旧文件进行比较。
或者,对于 ext2/ext3/ext4 文件系统,您可以使用e2image
它复制除可用空间之外的所有内容(所有时间戳,包括 crtime 和上次访问时间)。我通常用它来复制分区。
对于 NTFS,我曾ntfsclone
多次使用过 - 它快速且可靠。
我认为其他文件系统也有类似的实用程序,但我只在我的设备上使用 ext4 和 NTFS。