Articles of 文件系统

黑匣子types的数据logging

在我正在开发的Linuxembedded式应用程序中,需要logging一些不时发生的事件。 这些logging保存在MTD闪存设备上,一旦写入,就不需要改变它们或进行有效的search,但是需要读取访问权限才能将数据显示给用户。 一个很大的问题是,如果没有正确的关机顺序,电源可能会随时消失。 这些事件发生的频率可能非常缓慢(天/星期),但其中几个会立即发生。 要为每个事件保存的数据是强types的:date,时间,几个简短的文本string和几个整数。 目前我inheritance了一个基于jffs2和SQLite的解决scheme,这个解决scheme远不是最优的,因为DB文件有时会被损坏。 当发生这种情况时,整个文件变得不可读,并且无法理解是由于jffs2中的错误还是SQLite中的错误,或者闪存扇区是坏的,还是在错误的时间断电。 有没有一个库或文件系统/库的组合可以更好地帮助我解决这类问题? 或者我应该只使用CSV格式的文本文件?

从文件系统中随机select一个文件

这个问题涉及到模拟文件系统访问 。 我需要随机select文件和目录作为文件操作的参数,如重命名,写入,读取等。我打算做的是将所有文件和目录与他们的path列表,并从这个列表中随机select。 但是,由于文件和目录在实际的文件系统中被创build和删除,因此该列表也必须被更新。 我发现维护列表并以这种方式更新它是低效的,它也必须是primefaces的,以便以后的操作不访问以前的操作删除的文件。 你能build议一种不同的方式来select文件..可能有一些方法直接从文件系统做…但是,我们如何知道文件的path。 谢谢 我在这里发现了一些有趣的东西,特别是在Michael J. Barber的答案中, 从目录树中随机select一个文件 ,但是由于我的Python无知而无法完全遵循它

什么时候write()到一个文件返回EWOULDBLOCK?

我想将数据往往追加到本地文件系统上的文件。 我想这样做,而不会阻塞太久,没有任何工作线程。 在Linux内核2.6.18上。 看来Linux上的glibc的POSIX AIO实现使用户空间线程池并阻塞这些线程。 这很酷,但我可以轻松地分离出我自己的专用的文件阻塞线程。 http://www.kernel.org/doc/man-pages/online/pages/man7/aio.7.html 而且我的理解是,Linux内核AIO实现目前阻止追加。 追加是我想要做的唯一的事情。 http://code.google.com/p/kernel/wiki/AIOUserGuide https://groups.google.com/forum/#!msg/linux.kernel/rFOD6mR2n30/13VDXRTmBCgJ 我正在考虑用O_NONBLOCK打开文件,然后做一个懒惰的写作,如果它EWOULDBLOCK ,然后再尝试写。 像这样的东西: open(pathname, O_CREAT | O_APPEND | O_NONBLOCK); 调用write() ,检查错误EAGAIN | EWOULDBLOCK EAGAIN | EWOULDBLOCK 如果EAGAIN | EWOULDBLOCK EAGAIN | EWOULDBLOCK ,然后保存要写入的数据,然后再次尝试write() 。 这是一个好主意吗? 这有什么实际优势吗? 如果我是唯一一个打开文件描述符的文件,并且我尝试了write()和EWOULDBLOCK ,那么以后EWOULDBLOCK可能性会小EWOULDBLOCK吗? 它会永远EWOULDBLOCK ? 如果我write() ,它不EWOULDBLOCK ,这是否意味着write()将迅速返回? 换句话说,在什么情况下,如果有的话,在Linux 2.6.18 EWOULDBLOCK write()到本地文件失败?

我应该在embedded式系统上使用ext3吗?

我们有一些embedded式系统需要通过块设备模拟来访问驻留在闪存上的文件系统。 我们最老的平台运行在紧凑型闪存上,并且这些系统已经使用超过3年,在启动过程中没有运行单个fsck,到目前为止我们没有归档文件系统或CF的故障。 在我们最新的平台上,我们使用USB闪存进行初始生产,现在正在迁移到磁盘模块以存储r / w。 前段时间,我们在USB存储上运行的很多设备上都遇到了文件系统问题,所以我启用了e2fsck来查看是​​否有帮助。 事实certificate,我们收到了一批糟糕的闪存,所以一旦被更换,问题就消失了。 我自从禁用了e2fsck以来,我们没有任何迹象表明它使系统更加可靠,而且历史上我们没有这个系统就没有问题。 现在我们已经开始放入磁盘模块单元,我又开始看到文件系统错误了。 突然系统无法读取/写入某些文件,如果我试图从紧急控制台访问文件,我只是“ input/输出错误 ”。 我又启用了e2fsck,所有的文件都被修正了。 O'Reilly的“ 构buildembedded式Linux系统 ”build议在ext2文件系统上运行e2fsck,但是没有提及ext3,所以我有点困惑我是否应该启用它。 你在embedded式系统上运行fsck有什么意义? 我们正在考虑把二进制文件放在ar / o分区上,只有在同一个闪存设备上的ar / w分区上需要修改的文件,这样fsck永远不会意外删除重要的系统二进制文件,没有人有任何关于这种设置的经验(好坏)?

在ext4上覆盖一个小文件primefaces?

假设我们有一个FILE_SIZE字节的文件,并且: FILE_SIZE <= min(page_size, physical_block_size) ; 文件大小永远不会改变(即truncate()或append write()永远不会执行); 文件只能通过完整覆盖其内容来修改: pwrite(fd,buf,FILE_SIZE,0); 是否保证在ext4上: 这样的写入在并发读取方面是primefaces的吗? 这种写入是关于系统崩溃的事务处理? (即,在崩溃之后,文件的内容完全来自之前的一些写入,我们将永远不会看到部分写入或空白文件) 是第二个真实的: data=ordered ? 与data=journal或备选data=journal启用单个文件? (使用ioctl(fd, EXT4_IOC_SETFLAGS, EXT4_JOURNAL_DATA_FL) ) 当physical_block_size < FILE_SIZE <= page_size ? 我已经find了相关的问题链接2011年的讨论 。但是: 我没有为我的问题2find明确的答案。 我想知道,如果上述是真的,是否logging在某处?

通过inode打开文件

是否有可能打开一个文件知道它的inode? ls -i /tmp/test/test.txt 529965 /tmp/test/test.txt 我可以提供path,inode(529965以上),我期待得到一个文件描述符。

什么是Linux上的getfsstat()相当于什么?

问题说明了一切。 我想C函数调用,返回列表挂载的文件系统以及相关的信息,如文件系统types。

在linux / unix下,如何发现一个目录是否是一个使用c ++的链接?

我想弄清楚如何找出一个目录是使用c + +的符号链接 找出一个文件是否是一个符号链接很容易,使用lstat和S_ISLNK(fs.st_mode),但这似乎只对文件起作用。 S_ISDIR总是说目录是一个目录,即使它实际上是一个指向目录的符号链接。 那么,我如何做一个文件的目录呢?

鉴于目录名称,如何find它驻留在C中的文件系统?

例如,一个示例df命令输出是 Filesystem MB blocks Free %Used Iused %Iused Mounted on /dev/hd4 512.00 322.96 37% 4842 7% / /dev/hd2 4096.00 717.96 83% 68173 29% /usr /dev/hd9var 1024.00 670.96 35% 6385 4% /var /dev/hd3 5120.00 0.39 100% 158 10% /tmp 现在,如果我指定了类似/tmp/dummy.txt东西,我应该可以得到/dev/hd3或者hd3 。 编辑 :谢谢你的答案。 但是探测/proc会变得非常单调乏味。 任何人都可以build议我一些系统调用,可以做同样的内部?

如何安全地打开一个正常的文件,而没有拒绝服务的问题?

标志O_DIRECTORY可以与系统调用open(2)和openat(2)以避免打开目录时出现拒绝服务问题。 但是,如何避免常规文件的相同种族条件? 一些背景信息:我正在尝试开发某种备份工具。 程序遍历目录树,读取所有常规文件,只统计其他文件。 如果我首先为每个目录条目调用fstatat(2) ,那么testing一下普通文件的结果并用openat(2)打开它们,系统调用之间就会出现争用情况。 攻击者可以使用FIFOreplace常规文件,而我的程序将挂在FIFO上。 我怎样才能避免这种竞争条件? 对于目录,有O_DIRECTORY ,对于符号链接,可以使用O_PATH 。 但是,我找不到常规文件的解决scheme。 我只需要一个适用于最新Linux版本的解决scheme。