LargeFiles

Материал из ALT Linux Wiki
Freesource-logo.png Blue Glass Arrow.svg MediaWiki logo.png
Эта страница была перемещена с freesource.info.
Эта страница наверняка требует чистки и улучшения — смело правьте разметку и ссылки.
Просьба по окончанию убрать этот шаблон со страницы.
42px-Wikitext-ru.svg.png
Эту статью следует викифицировать.


Большие файлы

...и файловые системы.

Ниже описано, почему файлы >2Gb могут успешно создаваться одним и тем же бинарником на reiserfs и не создаваться, скажем, на ext3.

Date: Wed, 21 Sep 2005 22:40:16 +0400
From: Sergey Vlasov <vsu/altlinux.ru>
To: ALT Linux Community <community/altlinux.ru>
Subject: Re: [Comm] Re: ограничение размера файла на ext3

On Wed, Sep 21, 2005 at 08:16:40PM +0300, Michael Shigorin wrote:
> On Wed, Sep 21, 2005 at 09:03:38PM +0400, Владимир Гусев wrote:
> > >mc - глюкало.  VMware поддерживает файлы больше 2G но как-то
> > >странно работает.  А вообще это проблемы софта.
> > Почему "софта"? Ведь тот же софт не "жужжит", если это reiserfs 3.6..
> 
> Не верю (c)

Ха.  А ведь это правда.  Причём вплоть до последних ядер 2.6.x.

Однако ошибка в данном случае не в ext2/3, а как раз в reiserfs.  Дело
в том, что для работы с файлами больше 2 Гб программы должны быть либо
собраны с опцией -D_FILE_OFFSET_BITS=64 (в этом случае
переопределяется тип off_t и структуры, где присутствуют размеры
файлов - например, struct stat), либо с опцией -D_LARGEFILE64_SOURCE
(в этом случае должны использоваться функции open64(), lseek64() и
т.д.).  При открытии файлов в ядро передаётся флаг, определяющий
возможности программы (O_LARGEFILE); если этот флаг не установлен,
открытие файлов размером более 2 Гб невозможно.  (Всё это относится к
32-разрядным архитектурам - на 64-разрядных архитектурах этой проблемы
нет в принципе.)

Большинство файловых систем использует общую функцию для обработки
открытия файлов - generic_file_open(); именно там выполняется проверка
O_LARGEFILE при открытии.  Однако в reiserfs обработчик ->open вообще
не задан, в результате проверка размера не выполняется, и файл удаётся
открыть даже при несоблюдении ограничения на размер.  Это может
привести к проблемам при дальнейшем выполнении программы - например,
если программа, собранная без поддержки больших файлов, попытается
определить размер такого файла, она получит совершенно неверный
результат (а в некоторых случаях может повести себя совсем
непредсказуемым образом, поскольку из-за переполнения получится
отрицательное число).

Так что то, что на reiserfs файлы размером более 2 Гб открываются
любой программой, даже собранной без поддержки больших файлов - это
ошибка reiserfs, и когда-нибудь она будет исправлена.

Кстати, похожие баги были и в других ФС (или, вероятно, в общем коде),
и чинились довольно давно:

http://lkml.org/lkml/2000/7/30/38