Является ли хорошей идеей позволить файлам расти больше 2 ГБ в ext2?

Я работаю над программой, которая должна работать в дистрибутиве Linux с файловой системой ext2. Эта программа будет писать файлы, которые могут стать очень большими. Я заметил, что ext2 имеет максимальный размер файла от 16 до 64 ГБ. Однако, одна вещь на странице Википедии, которая несколько напугала меня, это следующая строка:

Есть также много программ пользовательского пространства, которые не могут обрабатывать файлы размером более 2 ГБ.

... когда речь идет об ограничениях ext2. Означает ли это, что я должен быть осторожен, чтобы размер файла не превышал 2 ГБ?

4 ответа

Решение

Вы обнаружите, что некоторые программы используют "fseek" для перемещения по файлу.

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

Если они делают что-то относительно начала файла (SEEK_SET для параметра origin), то они имеют только 32-разрядное целое число со знаком в качестве параметра смещения, поэтому они могут получить только 2 гигабайта в файл.

Для программ, которые не используют fseek/ftell (например, программа, которая просто читает весь файл линейным способом), и для программ, которые просто используют fseek, чтобы немного переходить назад и вперед от текущей позиции (SEEK_CUR со смещениями < 2G), проблем нет, все будет работать нормально, независимо от размера файла. Только программы, которые случайным образом обращаются к данным файла, будут иметь проблемы.

Обратите внимание, что в некоторых средах есть функции 'fseek64' и 'ftell64', которые дают вызывающему абоненту 64-битное целое число со знаком и, таким образом, получают доступ ко всему, что им нужно.

У меня никогда не было проблем, и мои системные журналы обычно превышают 2 гигабайта на некоторых моих серверах с внешними IP-адресами (журналы чередуются еженедельно, а не по размеру). Я также запустил несколько массивных каналов, которые генерируют файлы размером 3-6 гигабайт, и у меня также не было проблем с ними.

Я бы сказал, что это полностью зависит от того, какие пользовательские программы вам нужны: если вы заключите соглашение, вам, возможно, придется пересмотреть оценку.

Ограничение размера файла очень зависит от размера блока вашей файловой системы. Ограничение на один файл составляет 16 ГБ, если размер блока составляет 1 КБ, 256 ГБ для 2 КБ и 4 ТБ для 4 КБ. Вы можете проверить размер блока, используя:

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

Это раздел ext3, но у них будут те же ограничения. Я был бы очень удивлен, если у вас есть раздел размером в 1 КБ, и поэтому вам не нужно беспокоиться о файловой системе.

Сказав это, некоторые программы не имеют поддержки больших файлов (больше 2 ГБ), но я не видел ее очень давно. Последним, что я увидел, был jsvc commons-java, который упал, когда его файл журнала стал больше 2 ГБ. Практически все, что написано за последние 6 лет, сработает, если кто-то не попытается сделать что-то странное.

Ограничение в 2 ГБ происходит от 32-битного размера ssize_t/size_t/off_t в старых системах. Это порт спецификации POSIX и не имеет отношения к ext2.

Как упомянуто в комментарии выше, вы можете скомпилировать ваше приложение с флагом "_FILE_OFFSET_BITS=64", чтобы эти типы имели размер 64-битный.

Вот статья о состоянии поддержки больших файлов в Linux.

Другие вопросы по тегам