Вопрос или проблема
Я пытаюсь запустить TallyPrime на Linux с помощью Wine, и это работает очень хорошо для одного пользователя. У моего клиента установлена система с Citrix на Windows Server, где несколько пользователей используют потоковое приложение и запускают несколько экземпляров Tally Prime, работающих с одного и того же оконного сервера, имеющего данные на NTFS-томе. Я пытаюсь воспроизвести эту настройку в Linux с Wine, чтобы сократить расходы. Поэтому я использую контейнеры Docker, запускаю Wine и использую VNC для потоковой передачи сессии X11 в браузер, и эта настройка работает довольно хорошо. Проблема возникает, когда несколько контейнеров пытаются получить доступ к папке данных Tally (так же, как в настройке Citrix на Windows), но это не работает в Linux. Появляются различные ошибки, связанные с транзакциями базы данных, когда несколько клиентов обращаются к данным. Нарушение доступа к памяти, порча данных были обычными среди них, что указывает на то, что данные перезаписываются, когда несколько клиентов пытаются записать в базу данных Tally.
После небольшого исследования я обнаружил, что это происходит из-за блокировки файлов, так как данные Tally повреждаются, когда к ним обращаются несколько клиентов. Я выполнил связывание папки данных, надеясь, что это сработает вначале, но это не сработало из-за отсутствия поддержки блокировки в Linux. После небольших поисков я нашел, что есть параметр mand
в mount, и он может включить обязательную блокировку, что может решить проблему, но параметр mand
был устаревшим в ядре и был удален. Добавление его в mount вызывает ошибку в dmesg. Таким образом, mand не является вариантом. Я пытался использовать ntfs-3g, надеясь, что его последовательный ввод-вывод работает как блокировка, но это ужасно провалилось. Я пробовал samba, она очень медленная, так что становится контрпродуктивным решением. Я пробовал ntfs3, но ей также не хватает блокировки. Я пробовал ext4, xfs, ntfs3, ntfs-3g, zfs, FAT — все провалились. Samba работает, но ненадежна.
Мне интересно, как это работает так хорошо в Windows, когда несколько клиентов Tally одновременно обращаются и записывают данные, и никаких проблем не возникает, и это совсем не возможно в Linux?
Windows выигрывает здесь?
Я в данный момент исследую, будет ли nfsv4
хорошим вариантом. В то же время спрашиваю здесь, может ли кто-то помочь с этой проблемой совместного использования данных между несколькими клиентами Tally на Linux, работающими в Docker? — цель заключается в том, чтобы избежать повреждения данных и сделать это стабильным, как в Windows. Любая помощь в решении этой головоломки приветствуется.
Ответ или решение
Проблема с повреждением данных и нарушением доступа к памяти при запуске TallyPrime на Linux с несколькими пользователями, которые используют общие данные, является сложной и многоаспектной задачей. Давайте разберемся в каждом аспект этого вопроса и попробуем предложить возможные решения.
Проблема доступа к данным в многопользовательской среде
Вы смогли успешно развернуть TallyPrime на Linux с использованием Wine и контейнеров Docker для однопользовательского режима. Однако, когда несколько пользователей пытаются одновременно взаимодействовать с общим хранилищем данных, возникают ошибки, связанные с потоками, такие как Memory Access Violation и повреждение данных. Это связано с тем, что TallyPrime, как и многие другие приложения, предполагает, что имеет эксклюзивный доступ к файлам при выполнении операций, что не всегда работает в Linux.
Отсутствие поддержки блокировок
Как вы уже заметили, ключевым фактором, приводящим к ошибкам, является отсутствие поддержки блокировки файлов в большинстве файловых систем Linux. В Windows система блокировок встроена в механизм работы с файлами, что позволяет избежать конфликтов при доступе нескольких потоков к одним и тем же данным. В отличие от этого, на Linux необходимо явно управлять потоками для обеспечения целостности данных.
Решения для предотвращения повреждения данных
-
Использование NFSv4: Вы упомянули о возможности применения NFSv4. Этот протокол может обеспечить необходимую поддержку блокировок и позволит организовать доступ к файлам так, чтобы избежать конфликтов. Однако, будьте внимательны к настройкам конфигурации и производительности, так как неправильные параметры могут негативно сказаться на скорости работы.
-
Альтернативные файлы систем: FUSE или другие системные решения могут быть полезны. Несмотря на ваши предыдущие опыты с NTFS-3G и Samba, стоит рассмотреть другие реализации или версии файловых систем. Например, использование
gocryptfs
для послойного шифрования данных с поддержкой блокировок или совместимый файловый сервер. -
Имитация блокировок в приложении: Возможно, стоит рассмотреть модификацию самого приложения TallyPrime или его настройку для работы в многопользовательском режиме. Вместо того чтобы полагаться на системные блокировки, приложения могут использовать базы данных, которые поддерживают транзакции, такие как SQLite или PostgreSQL, адаптируя систему управления данными к нуждам.
-
Docker-сеть и конфигурация: Если вы используете Docker, убедитесь, что контейнеры правильно настроены для работы с общими ресурсами. Использование сетевых томов может улучшить совместное использование данных.
Заключение
На текущий момент, у вас есть несколько путей, которые могут привести к успешному решению проблемы. Основное внимание следует уделить вопросам блокировок и совместного доступа к данным. Возможно, потребуется экспериментировать с конфигурациями и программным обеспечением, чтобы найти наиболее подходящее решение для вашей среды.
В конечном итоге, Windows, безусловно, предлагает более простое решение для работы с многопользовательскими данными, но с помощью подходящего настроенного программного обеспечения и конфигурации можно добиться стабильной работы TallyPrime на Linux. Если у вас появятся дополнительные вопросы или потребуется помощь с настройкой, не стесняйтесь обращаться за поддержкой.