URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8297
[ Назад ]

Исходное сообщение
"mmap против mmap2 на 32битной системе"

Отправлено mikra , 09-Июн-09 11:43 
У меня есть две генты с иксами: 32битная и 64битная. Кроме того, есть samba сервер с единственной шарой на полтора терабайта. На шаре лежит текстовый файл.
Открываю текстовый файл редактором gedit, и в 32битной системе он не открывается с ошибкой ENODEV.

В 64битной системе через strace вижу, что используются обычные функции вроде fstat, fcntl, mmap, но с 64 битным параметром типа off_t, который содержит размер, смещение в файле итп. Собственно как и положено в amd64... Все работает, файл открывается.

В 32битной же системе off_t 32битный. Поэтому для работы с большими файлами дополнительно существуют функции mmap2, fstat64, fcntl64 итд. Однако обычные fstat, fcntl и mmap все еще присутствуют. Ошибка ENODEV возвращается функцией
mmap2(NULL, 562, PROT_READ, MAP_PRIVATE, 8, 0) = -1 ENODEV (No such device)

Пример с редактором простой, но та же неприятность есть и с другими программами (в том числе системными типа ldconfig), которые не заменить так же просто, как редактор. Причина снова в mmap2. Вопрос вобщем один - как побороть эту проблему? А если конкретнее то:
1. Как запретить работу с большими файлами (mmap2 итп) локально для определенной точки монтирования и монтируемого девайса? А может произвольного каталога? Или произвольной программы?
2. Как запретить работу с большими файлами глобально для всей системы?
3. Какую сетевую файловую систему взять вместо самбы чтобы расшарить большое хранилище с одного сервера <10 клиентам?

Также интересуют ваши соображения и опыт по этому вопросу относительно любой невиндовой оси и, как вариант, альтернативные способы решения.
Спасибо за внимание :)


Содержание

Сообщения в этом обсуждении
"mmap против mmap2 на 32битной системе"
Отправлено svn , 09-Июн-09 12:05 
Разберись почему mmap не работает на smb, и исправь.

Работа с большими файлами давно регулирется макросами glibc.


"mmap против mmap2 на 32битной системе"
Отправлено mikra , 09-Июн-09 14:28 
>Разберись почему mmap не работает на smb, и исправь.
>
>Работа с большими файлами давно регулирется макросами glibc.

Легко сказать разберись :)
Написал простейшую прогу, вызывающую mmap, а в strace снова вижу mmap2. Про макросы теперь понятно :) А что где надо объявить чтобы при компиляции проги не выполнялась такая замена?

Я вот для локализации проблемы хочу понять: если самба-сервер на 32битной операционке поддерживает обращения (mmap) из 64битной системы, но не поддерживает из 32битной (mmap2), то виноват самба-клиент или самба-сервер?
А конкретнее - mmap2 это отдельная реализация функции mmap и ее поддержки может не быть в самбе? Или все-таки mmap2 после вычисления вызывает mmap с 64битным off_t? Тогда это была бы проблема на стороне самба-клиента.


"mmap против mmap2 на 32битной системе"
Отправлено mikra , 09-Июн-09 14:54 
Оказывается на 64битном клиенте при монтировании шары параметр directio не отключает поддержку mmap, а на 32битном отключает.
Зачем я directio прописал уже не помню, а при переносе fstab с 64 на 32 не обратил на него внимания.

Знатные грабли получились :) А ведь в мануале серым по черному...
Спасибо за участие :)