Bs0Dd 206 Опубликовано: 12 декабря, 2020 Некоторое время назад возникла необходимость иметь доступ к файлам с разных компьютеров. Для такого уже есть программка от @Zer0Galaxy, но ей невозможно пользоваться, поскольку сервер падает при открытии файла (ибо модем заставляют переслать таблицу с функциями файла, а он в такое не умеет). В октябре я засел писать свою версию (еще не зная о программе "FTP"), писал с большими перерывами, а потому первая более-менее рабочая версия у меня получилась только сейчас. Данная система работает несколько иначе, она выделяет под сервер не определенную папку, а диск целиком, являясь, фактически, прокси-прослойкой между диском сервера и ОС клиента, также на стороне сервера есть два уровня логирования запросов (в текстовый файл). "Лэйбл" передается напрямую с реального удаленного диска, адрес тоже соответствует реальному, но без всех тире и с приставкой "-rfs". Посмотреть весь код можно на ГитХабе Как развернуть сеть: Скрытый текст Для начала, нужно поднять сервер: 1. Скачаем его с Пастебина: pastebin get 8yTQdACn /etc/rc.d/rmdsrv.lua 2. Затем в файле /etc/rc.cfg нужно задать настройки для сервера: порт, имя сервера, логин, пароль, адрес жесткого диска, режим работы и уровень логирования. Делается это аналогично файлу примера. 3. Если все настроено верно, запускем сервер через RC командой: rc rmdsrv start и наблюдаем такую картину: Сервер поднят, а значит половина дела сделана. Впоследствии, его можно завершить командой: rc rmdsrv stop Теперь настраиваем клиент: 1. Скачиваем набор утилит и библиотеку через инсталлятор на Пастебине: pastebin run CnJP04yJ 2. Теперь у нас есть программы rmdmt и rmdumt. Для монтирования нужна первая: rmdmt <port> <hostname> <login> <password> Если необходимо часто подключаться к нескольким серверам, можно написать небольшой скрипт для монтировщика и запустить его командой: rmdmt -f <filename>. Пример такого файла есть тут. 3. Теперь сетевой диск примонтировался в папку /mnt/ (монтировщик указывает путь до смонтированного диска). Можно работать с ним как с реальным носителем. 4. Если диск вам более не нужен и вы не хотите занимать место на сервере, воспользуйтесь демонтировщиком: rmdumt <path>. Для него также можно написать скрипт. Или сразу отключиться от всех дисков командой: rmdumt -l. Вот и все! Про режимы работы и уровни логирования: Скрытый текст У сервера есть два режима работы, которые задаются значениями 1 и 2 у переменной mode 1. mode = 1 - Режим 14/1 На сервере может находиться до 14 человек, но каждый может открыть только по одному файлу. 2. mode = 2 - Режим 7/2 На сервере может находиться всего до 7 человек, но теперь каждый может открыть целых два файла. Сделано такое ограничение намеренно, поскольку система не может держать одновременно открытыми более 16 файлов (2 из которых идут на нужды системы и самого сервера) Внимание: имейте ввиду, если вы попытаетесь открыть файл сверх лимита, сервер вернет ошибку "too many open handles". Поэтому не забывайте сами закрывать файлы. И учтите, что система позволяет открыть на запись файл только единожды. Поэтому если другой клиент уже открыл его на запись, вы не сможете этого сделать, а поскольку это ограничение на уровне системы, обойти его скорее всего не выйдет. Также у сервера имеются три уровня логирования (ведется в файл /etc/rdwork.log). Задаются значениями false, 1 и 2 у переменной log 1. log = false - Логирование отключено 2. log = 1 - Логирование данных о подключениях и входе на сервер 3. log = 2 - Логирование данных о подключениях, входе на сервер, а также дисковых запросов от клиентов (имейте ввиду, что лог-файл может достигнуть очень больших размеров) Примите во внимание, что обмен сетевыми пакетами требует некоторого времени, поэтому чтение/запись данных (особенно малыми блоками) может занять продолжительное время. Возможно, в будущем, попробую снизить задержки. Еще, если кто-то нашел в программах баг или недоработку (а таких может быть много), просьба сразу сообщить об этом. А если вы еще и скажете, как решить эту проблему, то цены вам не будет))). 6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
hohserg 197 Опубликовано: 13 декабря, 2020 14 часа назад, Bs0Dd сказал: На сервере может находиться до 14 человек, но каждый может открыть только по одному файлу. А почему бы не сделать в этом случае виртуальные файлы с очередью записи на диск? Типо, если юзер открывает файл для чтения, то он читается полностью и помещается в таблицу, а файл закрывается. Если юзер открывает файл для записи, то запись идет в таблицу, а при закрытии добавляется в очередь записи на диск. Плюс еще какие-то условия для соблюдения прозрачности. 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Bs0Dd Автор темы 206 Опубликовано: 13 декабря, 2020 7 часов назад, hohserg сказал: А почему бы не сделать в этом случае виртуальные файлы с очередью записи на диск? Выгружать файлы целиком в ОЗУ очень нехорошая идея. Если все 14 клиентов пооткрывают файлов (размер которых может быть и немаленьким), сервер может закушать столько памяти, что и вовсе свалится от ее нехватки, а дорогие сервера с кучей ОЗУ под это выделять не всегда возможно. Да с количеством файлов надо что-то думать, но так, чтобы оно сильно не ело память. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
hohserg 197 Опубликовано: 14 декабря, 2020 Ок, грузи не сразу, а по кускам. Но после каждого чтения куска закрывать файл и сохранять место чтения. Суть в том ,чтобы убрать ограничение на количество клиентов и количество открытых(выглядящих открытыми) файлов 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Bs0Dd Автор темы 206 Опубликовано: 14 декабря, 2020 36 минут назад, hohserg сказал: Ок, грузи не сразу, а по кускам. Но после каждого чтения куска закрывать файл и сохранять место чтения. Ладно, позже попробую реализовать. Если получится, добавлю в качестве третьего режима (первые два режима все же более надежны и стабильны, поэтому пускай будут) 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах