我想知道这是否被认为是安全的。我知道只要存在链接,文件处理就可以正常工作,并且我知道标识符是索引节点而不是名称,但我不确定它如何在不同的文件系统中工作。
例如,从 ext4 硬盘驱动器复制到 NTFS USB 记忆棒,或从 FAT 记忆棒复制到 ext4 驱动器。
我只是复制了一堆大媒体文件,并在复制完成之前重命名了它们。校验和匹配。我想知道它是否总是安全的,它是否会朝相反的方向起作用,是否有我应该了解的怪癖或避免这样做的原因?
操作系统/发行版是带有 5.0.0-15 Linux 内核的 Ubuntu。
答案1
我不确定它在不同的 FS 中如何工作。
重命名操作本身并不跨不同的文件系统进行操作;从文本编辑器写入文件与使用cp
另一个文件系统上的源文件写入文件之间没有区别。
在 Linux 上,rename
系统调用对于文件的其他链接是透明的,其中包括其他硬链接和打开的文件描述(和描述符)。联机帮助页明确指出
打开文件描述符旧路径也不受影响。
(我之所以选择“在 Linux 上”只是因为我在 POSIX 中找不到参考资料;我认为这在 POSIX 风格的操作系统中很常见。)
因此,当您跨文件系统复制文件时,cp
请打开读取源、写入目标,然后开始复制。重命名操作不会影响它正在使用的文件描述符;您可以重命名源和/或目标而不影响cp
.
另一种思考方式是,文件在其包含目录中的名称是其目录项的一部分,该目录项指向其索引节点;打开文件描述是指向 inode 的其他指针,其他硬链接也是如此。更改文件名不会影响任何其他现有指针。
需要注意的是,诸如此类的工具mv
不会将自己限制为rename
系统调用可以执行的操作;如果您mv
跨文件系统进行文件存储,rename
则会失败(或者mv
会发现该操作是跨文件系统的,甚至不会尝试),然后mv
将采取手动复制文件内容并删除原始文件的方式。如果同时更改正在重命名的文件,这将不会产生良好的结果。