В настоящее время мы работаем на сервере Ubuntu 16.04.3
Это выделенный сервер, и у нас есть полный доступ по SSH и т. Д.
У нас есть каталоги, в которых много файлов (более 50000). Мы хотим, чтобы они были доступны по FTP. Когда мы пытаемся обновить LimitRecursion (значения по умолчанию «2000 8») до «50000 8», у нас возникает ошибка при просмотре этих каталогов через FTP-клиент (Filezilla или WinSCP, та же проблема):
Я не понимаю, как pure-FTPd управляет памятью, и в файле readme я не видел никакой возможности настроить, чтобы я мог отображать все файлы.
Отображение всех файлов в этих папках не является обязательным.
Любая помощь или советы будут очень благодарны.
Я столкнулся с той же проблемой при установке чистого ftpd и после некоторой отладки обнаружил проблему. Существует лимит Linux (максимальный размер сегмента данных процесса), который по умолчанию составляет 16 КБ. Вы можете изменить это ограничение в /etc/security/limits.conf
и установить более высокое значение, или запустить ulimit -d unlimited
перед запуском pure-ftpd
скрипт демона.
К сожалению, это не решает проблему.
pure-ftpd
работает как демон, и главный процесс может иметь неограниченный максимальный размер сегмента данных процесса. Тем не мение, pure-ftpd
создает дочерние процессы с uid, указанным для каждого пользователя ftp. Эти дочерние процессы не наследуют максимальный размер от своего родителя. Дочерние процессы работают с ограничением 16 КБ и pure-ftpd
возвращает ошибку 421 из-за нехватки памяти.
Я пытался изменить /etc/security/limits.conf
файл, добавляющий пользователей, настроенных в pure-ftpd
, и все еще не работает. Я также пытался добавить строку для всех пользователей (*), но это тоже не работает.
Я нашел способ игнорировать эти ограничения, хотя это не лучшее решение.
Есть параметр ядра (ignore_rlimit_data
), что отключает эти ограничения. Вы можете установить это как при загрузке, изменив grub.cfg
(зависит от версии linux). Это решение требует перезагрузки системы. Вы также можете изменить этот параметр в работающем Linux, запустив:
#echo "Y" > /sys/module/kernel/parameters/ignore_rlimit_data
Это решило проблему, но я хотел бы знать, как заставить чистые дочерние процессы наследовать значения ulimit.