我们的系统管理员创建了一个备份系统,可以创建硬盘驱动器的快照。
当我尝试从快照恢复旧版本时:
cp /path/to/snapshots/foo.bar /path/to/folder/foo.bar
我收到错误:
cp: `/path/to/snapshots/foo.bar' and `/path/to/folder/foo.bar' are the same file.
我可以删除该文件并复制它,但我想知道是否有办法使用 cp 来执行此操作。
我知道这些文件没有链接,因为:
- 我可以更改源的内容并且快照保持不变(已测试)
- 我可以删除源,并且可以恢复快照(已测试)
- 这些文件存储在大学计算集群上。如果这样的事情是真的,那么有人已经被解雇了(或者至少被吼叫了)。
尽管如此,inode
文件的数量是相同的
集群是在red hat linux上实现的,我不知道文件系统是什么
df 结果:
Filesystem 1K-blocks Used Available Use% Mounted on
<ipadress>:/vol/hpc/storage
67633152 67633152 0 100% /storage
<ipadress>:/vol/hpc/storage
2186805248 982498048 1204307200 45% /storage
统计结果:
File: `/path/to/snapshots/foo.bar'
Size: 404 Blocks: 8 IO Block: 4096 regular file
Device: 17h/23d Inode: 19750461 Links: 1
Access: (0644/-rw-r--r--) Uid: (<num1>/ yotama9) Gid: ( <num2>/ <groupname>)
Access: 2012-01-22 00:03:27.246852000 +0200
Modify: 2012-01-19 23:10:32.746397000 +0200
Change: 2012-01-19 23:10:32.746397000 +0200
File: `/path/to/folder/foo.bar'
Size: 404 Blocks: 8 IO Block: 4096 regular file
Device: 17h/23d Inode: 26335134 Links: 1
Access: (0644/-rw-r--r--) Uid: (<num1>/ yotama9) Gid: ( <num2>/ <groupname>)
Access: 2012-01-24 16:03:48.732453000 +0200
Modify: 2012-01-24 16:03:30.728900000 +0200
Change: 2012-01-24 16:03:30.728900000 +0200
답변1
通常,文件系统实现应该向应用程序保证,在给定机器上的任何给定时间,每个文件都可以通过其设备 ID(st_dev
文件中的字段)的组合来唯一标识。stat
结构)及其索引节点(字段st_ino
)。设备 ID 指示该文件位于哪个已安装的文件系统上,而 inode 则表征特定文件系统内的一个文件。cp
如果两个文件具有相同的设备 ID 和相同的 inode,则认为它们是相同的。
如果通过不同方式访问一个文件,则可能有多个(设备 ID、inode)对,例如通过 NFS 挂载到本地主机(这种情况往往很奇怪)。
不同的文件不应该具有相同的(设备 ID、索引节点)对。然而,这取决于文件系统的实现。如果您可以在不更改快照的情况下更改源的内容,那么我希望快照显示与源不同的设备 ID,但某些实现可能不会这样做。
请注意,除了更改文件之外,您的测试无法证明任何内容。删除一个硬链接不会删除该文件的其他名称。按需复制文件是快照的常见现象,因此只要文件内容保持一致,快照内的文件与快照外的文件完全相同就不会出现异常。索引节点号通常保持不变。
更改文件时,请确保写入同一文件,而不是在创建另一个同名文件后立即删除一个文件。
如果您确实有两个不同的文件(快照和源),它们具有相同的设备 ID 和相同的 inode,但内容不同,则大多数应用程序会认为它们是相同的。您必须找到一种取决于快照技术的文件相等性测试方法,或者对双方的内容进行校验和或系统地删除目标。