LargeFiles
Большие файлы
...и файловые системы.
Ниже описано, почему файлы >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