我在Linux上有一个文件索引数据库.目前我使用文件路径作为标识符.但是,如果文件被移动/重命名,其路径将被更改,我无法将我的DB记录与新文件匹配,并且必须删除/重新创建记录.更糟糕的是,如果移动/重命名目录,那么我必须删除/重新创建所有文件和嵌套目录的记录.
我想使用inode编号作为唯一文件标识符,但如果删除文件并创建另一个文件,则可以重用inode编号.
所以,我想知道我是否可以使用一对{inode,crtime}作为唯一的文件标识符.我希望在NTFS上的ext4和creation_time上使用i_crtime.在我的有限测试(使用ext4)inode和crtime确实在重命名或移动同一文件系统中的文件或目录时保持不变.
因此,问题在于是否存在文件的inode或crtime可能发生变化的情况.例如,fsck或碎片整理或分区大小调整改变inode或crtime或文件?
有趣的是 http://msdn.microsoft.com/en-us/library/aa363788%28VS.85%29.aspx 说:
那么,他们提到的那些案例是什么?
请注意,我研究了类似的问题:
但他们没有回答我的问题.
假设UNIX文件系统有一些限制 - 比如2 KB块和8B磁盘地址.如果inode包含13个直接条目,每个单个,双重和三个间接条目,则最大文件大小是多少?
有人正在将一个大小为10Mb的文件FTP到Linux服务器上的文件夹.当文件处于转换状态时,cron会唤醒并触发Perl脚本,该脚本旨在查看ftp文件夹并将其找到的任何内容移动到某个备用文件夹.我正在使用File :: Copy中的move()函数.Perl进程实际上将文件重命名为其任务的一部分.这有关系,或者FTP不关心文件系统将文件描述为什么?
将move()成功并移动部分文件,让FTP做什么?或者会移动失败并返回0?
我正在学习Linux设备驱动程序的第3.5章,第3版.本节介绍一种检索我们struct inode *inode在open函数中定义的自定义结构的方法:
int scull_open(struct inode *inode, struct file *filp)
{
struct scull_dev *dev;
dev = container_of(inode->i_cdev, struct scull_dev, cdev);
filp->private_data = dev; /* for other methods */
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,当设备打开时,struct inode *inode表示设备的传递scull_open.然后,dev提取并传递自定义结构,filp->private_data以便其他方法scull_read可以使用它:
ssize_t scull_read(struct file *filp, char _ _user *buf, size_t count,
loff_t *f_pos)
{
struct scull_dev *dev = filp->private_data;
/* other codes that uses *dev */
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很好,直到我意识到我们已经struct scull_dev …
我理解文件描述符是用于标识文件的内核句柄,而文件的inode编号是指向具有关于文件的其他详细信息的结构的指针(如果我错了,请纠正我).但我无法区分它们.
现在,这个问题可能看起来很奇怪,而且可能是,但是为了给出一些上下文,我一直在阅读这篇文章来了解i节点,其中作者给出了一个有趣的例子:
{
FILE *fp;
fp = fopen("some.hidden.file","w");
unlink("some.hidden.file"); /* deletes the filename part */
/* some.hidden.file no longer has a filename and is truly hidden */
fprintf(fp,"This data won't be found\n"); /* access the data part */
/*etc*/
fclose(fp); /* finally release the data part */
}
Run Code Online (Sandbox Code Playgroud)
这允许创建"隐藏"临时文件.
我的问题是:有没有办法重新创建一个文件名,指向调用fp 后打开的inode unlink()?
免责声明:我不打算在实际代码中这样做; 我只是(重新)了解i节点,并想知道这是否可行.
我刚刚运行了一个运行ZFS的NAS,我希望在将文件传输到它时保留创建时间.linux/ext4(现在数据都在这里)和zfs存储创建时间或出生时间.在zfs的情况下,甚至由stat命令报告.但是我无法弄清楚如何设置文件的创建时间,以便它反映原始文件系统中的创建时间.与ext4-> ext4传输不同,我可以向debugfs提供一个脚本来设置文件创建时间.
是否有类似于ZFS的debugfs的工具?
PS.为了更好地解释:
我有一个USB驱动器连接到Ubuntu 14.04笔记本电脑.它拥有一个文件系统,我关心各个文件的创建日期(出生日期).我经常使用基于debugfs的脚本来查阅这些创建时间戳,该脚本将其报告为crtime.
我想将数据移动到运行ZFS的NAS盒子,但我知道的方法(scp -p -r,rsync -a和tar,以及我尝试过的其他方法)保留了修改时间而不是创建时间.
如果我要转移到另一个ext4文件系统,我会用奇妙的工具解决问题debugfs.具体来说,我可以在源fs(文件系统)上创建(filename,crtime)对列表,然后debugfs -w在目标fs上使用表格行读取脚本
set_inode_field filename crtime <value>
我已经测试了这个,它运行得很好.
但是我的目标fs不是ext4而是ZFS,虽然debugfs在目标机器上运行,但它在那里完全没用.它甚至不识别fs.另一个允许您通过直接编辑inode来更改时间戳的调试工具是fsdb; 它也在目标机器上运行,但我似乎无法识别ZFS文件系统.
我告诉那些向我销售NAS框的人们,debugfs和fsdb并不适用于ZFS文件系统,但他们无法提供等效的功能.所以,经过大量的谷歌搜索和尝试的事情后,我终于决定今天在这里发一个问题,希望有人可能有答案.
我很惊讶这是多么艰难的结果.从档案的角度来看,如何复制数据集使所有时间戳都相同的问题似乎很自然.
有很多的网站,详细说明为什么你会在文章并不想使用Apache默认的i节点的mtime大小格式ETag的.
但是我还没有读到任何可能促使Apache首先包含inode的内容.从表面上看,只有在需要能够区分相同资源的八位字节八位字符传真时才有用,但这肯定与ETag的目的相反.
Apache的作者并不以他们对互联网标准的草率处理而闻名,因此我觉得我必须遗漏一些东西.谁能详细说明?
编辑:我在这里问这个,而不是在ServerFault.com上,因为我正在实现一个Web服务器,而不是管理一个.要详细了解为什么这是一个坏主意,请参阅此处或此处.所有这些文章都推荐相同的东西:从你的etags中删除inode.问题是,他们在那里有什么优势吗?
有没有办法在Linux中创建链接到特定iNode的文件?采取这种情况:有一个文件正在写入(可能是一个日志),并删除了特定文件,但 dir/proc中的链接仍然指向它.在这种情况下,我们不需要它的裸副本,而是它的硬链接,因此我们可以在进程关闭之前进行未来的修改和最后修改,系统将其删除.
如果我们有iNode号码有没有办法实现这个目标?
如何在Go中获取文件inode?
我已经可以这样打印了:
file := "/tmp/system.log"
fileinfo, _ := os.Stat(file)
fmt.Println(fileinfo.Sys())
fmt.Println(fileinfo)
Run Code Online (Sandbox Code Playgroud)
看看Go实现,显然正在寻找一些stat方法,但我仍然无法找到Unix系统的结构定义.
如何直接获取inode值?
源代码中的哪个文件定义了结构Sys()?