Articles of ext4

如何在Linux上通过inode访问文件

有没有任何用户空间的API或第三方内核模块,可以帮助通过Linux上的inode访问文件? 我试图执行一些像这样的事情: int read_file_by_ino(int ino, int pos, int size, char* buf); int write_file_by_ino(int ino, int pos, int size, const char* buf); int readdir_by_ino(…); int stat_by_ino(…); … 该程序预计在root用户下运行,因此没有安全要求进行权限检查。 谢谢!

为什么Python给“OSError:文件名太长”的文件名短于文件系统的限制?

以下代码会产生一个意外的exception: open("52bbe674cdc81d4140099b84fa69eea4249bcceee75bcbe4838d911ab076547cfdad3c1c5197752a98e5525fe76613dbe52dcdb1a9a397669babce0f101d010142cffa000000.csv", "w") OSError: [Errno 36] File name too long: '52bbe674cdc81d4140099b84fa69eea4249bcceee75bcbe4838d911ab076547cfdad3c1c5197752a98e5525fe76613dbe52dcdb1a9a397669babce0f101d010142cffa000000.csv' 这是意外的,因为我的文件系统是ext4(根据维基百科)有一个255字节的文件名长度限制。 上面的文件名长度为144。 那么为什么当文件名长度限制还没有被超过时,Python会引发这个exception呢?

Linux的AIO:可怜的扩展

我正在编写一个使用LinuxasynchronousI / O系统调用的库,并想知道为什么io_submit函数在ext4文件系统上performance出较差的缩放。 如果可能,我可以做些什么来让io_submit不要阻塞大的IO请求大小? 我已经做了以下(如这里所述): 使用O_DIRECT 。 将IO缓冲区alignment到一个512字节的边界。 将缓冲区大小设置为页面大小的倍数。 为了观察内核在io_submit花费了多io_submit ,我运行了一个testing,在该testing中,我使用dd和/dev/urandom创build了1 Gbtesting文件,并重复丢弃了系统caching( sync; echo 1 > /proc/sys/vm/drop_caches )并且读取越来越大的文件部分。 在每次迭代中,我都会打印io_submit所花费的时间以及等待读取请求完成的时间。 我在运行Arch Linux的x86-64系统上运行以下实验,内核版本为3.11。 该机器具有SSD和Core i7 CPU。 第一个graphics绘制了等待io_submit完成所花费的时间。 第二个graphics显示等待读取请求完成的时间。 时间以秒为单位。 为了比较,我创build了一个类似的testing,通过pread使用同步IO。 结果如下: 看起来,asynchronousIO的工作如预期的要求约20,000页的大小。 之后, io_submit块。 这些意见导致了以下问题: 为什么不是io_submit的执行时间是常量? 什么是造成这种不好的缩放行为? 我是否需要将ext4文件系统上的所有读取请求拆分为多个请求,每个请求的大小都小于20,000页? 20,000这个“魔术”价值从哪里来? 如果我在另一个Linux系统上运行我的程序,如何确定使用的最大IO请求大小,而不会遇到缩放行为不佳的情况? 用于testingasynchronousIO的代码如下所示。 如果您认为他们是相关的,我可以添加其他来源列表,但我试图只发布我认为可能相关的细节。 #include <cstddef> #include <cstdint> #include <cstring> #include <chrono> #include <iostream> #include <memory> #include <fcntl.h> #include […]

在Linux中存储和访问多达1000万个文件

我正在编写一个应用程序,需要存储大量的文件大约1000万。 他们现在用一个UUID命名,每个大概4MB,但总是相同的大小。 从这些文件读取和写入将始终是连续的。 2个主要问题我正在寻找答案: 1)哪个文件系统最适合这个。 XFS还是ext4? 2)是否有必要将文件存储在子目录下,以减less单个目录中文件的数量? 对于问题2,我注意到人们试图发现XFS可以存储在单个目录中的文件数量限制,并且没有发现超过数百万的限制。 他们注意到没有性能问题。 那在ext4下呢? search人员做类似的事情,有人build议存储索引节点号码作为文件的链接,而不是性能的文件名(这是在我也使用的数据库索引)。 但是,我没有看到一个可用的API通过inode编号打开文件。 这似乎更多的是提高ext3下的性能的build议,我不想用这种方式。 什么是ext4和XFS限制? 从一个到另一个有什么性能好处,你能看到在我的情况下使用ext4超过XFS的原因吗?

EXT4上的时间戳精度(亚毫秒)

我在Vala写了一些代码,首先得到系统时间,然后创build一个文件,然后检索该文件的时间戳。 时间戳将始终早于系统时间,在500到1500微秒之间,这是没有意义的。 然后我写了一个简单的shell脚本: while true; do touch ~/tmp/fred.txt stat ~/tmp/fred.txt|grep ^C done 结果如下: Change: 2013-01-18 16:02:44.290787250 +1100 Change: 2013-01-18 16:02:44.293787250 +1100 Change: 2013-01-18 16:02:44.296787250 +1100 Change: 2013-01-18 16:02:44.298787248 +1100 Change: 2013-01-18 16:02:44.301787248 +1100 Change: 2013-01-18 16:02:44.304787248 +1100 Change: 2013-01-18 16:02:44.306787248 +1100 Change: 2013-01-18 16:02:44.309787248 +1100 Change: 2013-01-18 16:02:44.312787248 +1100 Change: 2013-01-18 16:02:44.315787248 +1100 正如你所看到的,小数点后面的前3位(毫秒)看起来不错,因为它们正在按照预期递增,但是第4位数字看起来并不正确。 第四到第九位数字似乎在做一个缓慢倒计时。 […]

设置/更改文件上的ctime或“更改时间”属性

我希望使用java.nio.Files类更改Java文件中的时间戳记元数据。 我想更改所有3个Linux / ext4时间戳(最后修改,访问和更改)。 我能够更改前两个时间戳字段,如下所示: Files.setLastModifiedTime(pathToMyFile, myCustomTime); Files.setAttribute(pathToMyFile, "basic:lastAccessTime", myCustomTime); 但是,我无法修改文件上的最后一个更改:时间。 另外,关于文档中提到的没有更改时间戳的问题。 最接近的可用属性是creationTime ,我尝试没有任何成功。 有关如何根据Java中的自定义时间戳修改文件的Change:元数据的任何想法? 谢谢!

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

我只创build了大约8百万个文件,然后在/ dev / sdb1中没有空闲的inode。 [spider@localhost images]$ df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sdb1 8483456 8483456 0 100% /home 有人说格式化分区时可以指定inode计数。 例如mkfs.ext4 -N 1000000000。 我试过,但得到一个错误: *“inode_size(256)* inodes_count(1000000000)太大…指定较高的inode_ratio(-i)或较低的inode计数(-N)。” 什么是合适的inode_ratio值? 我听说ext4的最小inode_ratio值是1024。 是否有可能在一个分区上存储十亿个文件? 如何? 有人说这会很慢。

重命名()没有fsync()安全吗?

在不调用fsync(tmppath_fd)情况下调用rename(tmppath, path)是否安全? 我希望path始终指向一个完整的文件。 我主要关心的是Ext4 。 rename()在所有未来的Linux内核版本中都承诺是安全的吗? Python中的使用示例: def store_atomically(path, data): tmppath = path + ".tmp" output = open(tmppath, "wb") output.write(data) output.flush() os.fsync(output.fileno()) # The needed fsync(). output.close() os.rename(tmppath, path)