微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何获得Linux中的inode的世代号?

简介:我想从用户空间获取Linux(或至lessext4)中的文件的世代号( i_generation )。 或者,也可以是“出生时间”(文件创build时间)。

我试图写一个双向文件同步程序(又名Unison ),但没有一个中央数据库(简单,只是在同步根存储数据),并通过保留文件移动(非常非常难以得到正确的,如果你想支持所有奇怪的情况下,例如,将文件从之后删除的目录中移出)。

一个唯一的方法来识别文件将缓解事情很多。 我知道如何获得inode和设备号(通过stat ),但作为inode可以重新使用(我已经看到这个我自己),我想使用一个更稳定的唯一标识。

我已经阅读了NFS正在使用的“世代号”来唯一标识文件。 在NFS中,( st_ino , i_generation )组合用于在重新启动和服务器崩溃之间唯一标识文件句柄(或者至less防止重新使用导致可能的数据损坏的相同文件句柄)。

如何在ext4上存储十亿个文件

重新启动后的Inode编号

在Linux中检测移动或重命名文件的最佳方法

Linux文件删除恢复

给定一个特定的inode结构的最大文件大小?

不过,我还没有成功获得这个数字。 这个ext4文件似乎提示可以从一个ext4文件系统获得这个数字,但是我不能从用户空间得到它(我不打算在内核空间中运行这个简单的程序)。 请参阅EXT4_IOC_GETVERSION 。 我无法在我的系统上find适当的头文件(LMDE,Debiantesting)。 有两个选项我可以find:

尝试使用内核中的一个 – 不能说它不应该从用户空间使用。

尝试在<linux/ext2_fs.h>使用EXT2_IOC_GETVERSION – 给出EBADF ( errno 9)。 也许是因为我想从EXT4文件系统获取EXT2信息? 或者,也许我做错了ioctl ,这是我第一次尝试使用它。 该文件被正确打开,因为在我的情况下open调用返回3(这应该是有效的)。

代码

#include <sys/ioctl.h> #include <sys/fcntl.h> #include <linux/ext2_fs.h> #include <stdio.h> #include <errno.h> int main () { int fileno = open("generation.c",O_RDONLY); printf("fileno: %dn",fileno); int generation = 0; if (ioctl(EXT2_IOC_GETVERSION,fileno,&generation)) { printf("errno: %dn",errno); } printf("generation: %dn",generation); }

这个代码在Ubuntu 12.04上给出了一个错误(errno = 9),在LMDE(Debiantesting)上它给出了一个编译器错误( EXT2_IOC_GETVERSION未find)。

另一种方法是获得文件的创build时间( crtime ,或btime / birth time),但是我所有的谷歌search结果都显示,这似乎不可能从Linux的用户空间获得(IIRC FreeBSD有一个系统调用它)。 我更喜欢crtime因为crtime可能比一代人更便携(对Windows)。

我知道这将取决于系统。 当没有唯一的索引节点(或者在USB盘上常见的FAT的情况下根本没有索引节点)可以find时,我想要有一个回退。

inotify不是一个选项。 这是一个文件修改后同步文件的程序,就像rsync一样。 不像DropBox如何留在后台观看文件更改。

如果没有办法得到这些数字,我也会接受这个答案(当然有适当的文档):)

为什么inode号从1开始而不是0?

C程序:如何获取父目录的inode号码?

如何有效地监视一个目录在Linux上的变化?

在linux内核模块中,如何获得已知path的inode?

是否有可能从一个打开的文件描述符重新创build一个文件

我找到了解决方案。 我换了fileno和ioctl调用(显然C做了一些自动类型转换)。

工作代码如下所示:

#include <sys/ioctl.h> #include <sys/fcntl.h> #include <linux/fs.h> #include <stdio.h> #include <errno.h> int main () { int fileno = open("generation.c",fileno); int generation = 0; if (ioctl(fileno,FS_IOC_GETVERSION,generation); }

使用FS_IOC_GETVERSION可以使调用在Linux中的大多数常用文件系统中工作。 这不包括vfat和ntfs(至少看起来像是在内核源代码中,既没有列出vfat也没有保险丝),因为它们可能不支持代数。

coreutils(tar包中的src / copy.c)的这个片段让我想到:

/* Perform the O(1) btrfs clone operation,if possible. Upon success,return 0. Otherwise,return -1 and set errno. */ static inline int clone_file (int dest_fd,int src_fd) { #ifdef __linux__ # undef BTRFS_IOCTL_MAGIC # define BTRFS_IOCTL_MAGIC 0x94 # undef BTRFS_IOC_CLONE # define BTRFS_IOC_CLONE _IOW (BTRFS_IOCTL_MAGIC,9,int) return ioctl (dest_fd,BTRFS_IOC_CLONE,src_fd); #else (void) dest_fd; (void) src_fd; errno = ENOTSUP; return -1; #endif }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐