У меня есть две генты с иксами: 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 не работает на smb, и исправь.Работа с большими файлами давно регулирется макросами glibc.
>Разберись почему mmap не работает на smb, и исправь.
>
>Работа с большими файлами давно регулирется макросами glibc.Легко сказать разберись :)
Написал простейшую прогу, вызывающую mmap, а в strace снова вижу mmap2. Про макросы теперь понятно :) А что где надо объявить чтобы при компиляции проги не выполнялась такая замена?Я вот для локализации проблемы хочу понять: если самба-сервер на 32битной операционке поддерживает обращения (mmap) из 64битной системы, но не поддерживает из 32битной (mmap2), то виноват самба-клиент или самба-сервер?
А конкретнее - mmap2 это отдельная реализация функции mmap и ее поддержки может не быть в самбе? Или все-таки mmap2 после вычисления вызывает mmap с 64битным off_t? Тогда это была бы проблема на стороне самба-клиента.
Оказывается на 64битном клиенте при монтировании шары параметр directio не отключает поддержку mmap, а на 32битном отключает.
Зачем я directio прописал уже не помню, а при переносе fstab с 64 на 32 не обратил на него внимания.Знатные грабли получились :) А ведь в мануале серым по черному...
Спасибо за участие :)