[devel] inode > 2^32 на 32-битных системах

Vitaly Lipatov lav на altlinux.ru
Ср Окт 23 17:56:45 MSK 2013


Добрый день!

Начну с того, что у нас в компании используются как 32-битные, так и 
64-битные системы. При этом они взаимодействуют между собой, а ещё и 
работают с файлами.

За последний год выявилось следующее:
1. Файловая система glusterfs, разработчики которой заявляют, что она 
не работает на 32-битных системах, на самом деле работает.
2. Файловая система XFS при достижении определённого объёма начинает 
создавать файлы с inode >2^32 (поскольку inode там зависит от позиции 
данных на диске)
3. Функция stat (32-битная функция stat — для структуры с 32-битным 
st_ino) возвращает ошибку, если inode у файла слишком велик
4. Многие программы (особенно такие важные, как apt и rpm) собраны без 
поддержки _FILE_OFFSET_BITS=64 (AC_SYS_LARGEFILE в configure.am)
и не способны работать с файлами (работа с файлами почти всегда 
включает в себя вызов функции stat).

Не дождавшись исправления сборки rpm (rpmReadSignature failed при 
inode, выходящем за 32 бита 
https://bugzilla.altlinux.org/show_bug.cgi?id=29117)
я подумал, что большинству программ, вызывающих stat(), значение inode 
не очень-то интересно.

Собственно, я рассматриваю 3 варианта:
1. Обнулять st_ino, если значение туда не влезает. Возражающие 
программы следует пересобрать со stat64()
2. Заполнять st_ino максимальным значением (все единицы). Возражающие 
программы следует пересобрать со stat64()
3. Сжимать значение inode в 32-битное (squash). Это существующая 
практика, применяемая в cifs, nfs и fuse. Но возникает вопрос с 
последствиями коллизий.

При использовании glibc исправление касается только glibc, при 
использовании других библиотек, предполагаю, нужно изменить и 
соответствующую функцию в ядре.

Прошу совета, мнений, помощи.

Здесь некоторые подробности (то же самое другими словами и пример 
патча)
http://wiki.etersoft.ru/Linux/ZeroInode

-- 
С уважением,
Виталий Липатов,
Etersoft


Подробная информация о списке рассылки Devel