我们有基于 beaglebone black 的定制板,具有 256MB RAM 和 4GB eMMC。主板运行 Linux 内核 4.9
我们遇到了一种情况,我们在其中创建一个文件,tempfs
然后在验证后,我们必须将它移动到 eMMC 的 ext4 分区。只归档一个certificate
在某些情况下,我们在一个目录中有多个证书,因此我们必须将整个目录从 tempfs 移动到 eMMC 上的 ext4 分区。
所以我们担心的问题之一是atomicity
(mv
移动)操作。
根据rename
系统调用 Linux 手册页重命名文件是一个原子操作。
http://man7.org/linux/man-pages/man2/rename.2.html
但是我们不确定重命名操作是否涉及在两个文件系统之间移动文件,原子性是否仍然可用。所以问题是将文件从原子移动tmpfs
到ext4
原子吗?
显然,一种可能的解决方案是将文件保存在同一分区上的不同文件夹中(显然在同一文件系统上)并使用mv
. 对于使用以下重命名方法的目录
SRC_dir --> TMP_DEST_dir
DEST_dir --> BAK_DEST_dir
TMP_DEST_dir --> DEST_dir
delete BAK_DEST_dir
对替代品有什么建议吗?
编辑
收到回复后,我尝试在板上执行以下测试代码,
#include <stdio.h>
#include <errno.h>
int main()
{
int retcode = 0;
system("touch /tmp/rename_test");
retcode = rename("/tmp/rename_test", "/home/fs_rename_test");
if ( retcode < 0) {
printf("errno : %d\n",errno );
perror("Error occurred while renaming file");
return 1;
}
return 0;
}
返回以下输出。并确认重命名不能跨文件系统工作。
errno : 18
Error occurred while renaming file: Invalid cross-device link