在 ext2 中让文件大小超过 2GB 是个好主意吗?

在 ext2 中让文件大小超过 2GB 是个好主意吗?

我正在开发一个需要在具有 ext2 文件系统的 Linux 发行版上运行的程序。该程序将写入可能变得非常大的文件。我注意到 ext2 的最大文件大小为 16GB 到 64GB。然而,维基百科页面上的以下内容让我有些害怕:

还有许多用户空间程序无法处理大于 2 GB 的文件。

...当谈到 ext2 的限制时。这是否意味着我应该小心不要让文件超过 2 GB?

答案1

您会发现一些程序使用“fseek”在文件中移动。

int fseek ( FILE * stream, long int offset, int origin );

如果他们执行相对于文件开头的操作(SEEK_SET 作为原点参数),那么他们只有一个有符号的 32 位整数作为偏移量参数,因此他们只能将 2GB 放入文件中。

对于不使用 fseek/ftell 的程序(例如,仅以线性方式读取整个文件的程序)以及仅使用 fseek 从当前位置稍微来回跳转的程序(SEEK_CUR 偏移量小于 2G),没有问题,一切都会正常工作,无论文件有多大。只有随机访问文件数据的程序才会出现问题。

请注意,某些环境具有“fseek64”和“ftell64”函数,它们为调用者提供 64 位有符号整数,从而可以访问他们想要的任何内容。

答案2

我从来没有遇到过问题,我的一些具有外部 IP 的服务器上的系统日志通常大于 2 GB(日志每周轮换一次,而不是按大小轮换)。我还运行了几个大型 feed,它们产生的文件大小为 3-6 GB,我也没有遇到过这些问题。

我认为这完全取决于您需要什么用户空间程序:如果存在交易破坏者,您可能需要重新评估。

答案3

文件大小限制很大程度上取决于文件系统的块大小。如果块大小为 1K,则单个文件限制为 16GB;如果块大小为 2K,则单个文件限制为 256GB;如果块大小为 4K,则单个文件限制为 4TB。您可以使用以下方法检查块大小:

mojo-jojo david% sudo tune2fs -l /dev/sda1 | grep "Block size"
Block size:               4096

这是在 ext3 分区上,但它们有相同的限制。如果您有一个 1K 块大小的分区,我会感到非常惊讶,因此您无需担心文件系统。

话虽如此,有些程序确实不支持大文件(大于 2GB),但我已经很久没见过这样的程序了。我见过的最后一个程序是 commons-java 的 jsvc,当它的日志文件大于 2GB 时,它就崩溃了。过去 6 年编写的几乎所有程序都可以运行,除非有人特意做了一些奇怪的事情。

答案4

2 GB 的限制源于旧系统上 ssize_t/size_t/off_t 的 32 位大小。这是 POSIX 规范的移植,与 ext2 并无特别关系。

正如上面的评论中提到的,您可以使用标志“_FILE_OFFSET_BITS=64”编译您的应用程序,以使这些类型的大小为 64 位。

这是一篇关于 Linux 中大文件支持状态的文章

相关内容