Проблема блокировки записи между Linux и Windows - PullRequest
2 голосов
/ 19 сентября 2009

Мне нужно запустить кучу старых приложений DOS FoxPro / Clipper в linux под DOSEMU. Программы обращаются к своим «базам данных», расположенным на сетевом сервере (может быть Windows или Сервер Linux)

На самом деле программы работали нормально, но мне не удается заставить блокировку записи работать как и предполагалось: я могу запустить программу в двух терминалах (или на сервере и любом терминале для экземпляр) и заблокировать одну и ту же запись в обоих.

Теперь я использую Tiny Core Linux в качестве терминала и Windows XP в качестве сервера для доступа к общему ресурсу. файлы через CIFS и последнюю версию DOSEMU (1.4.0), но я пробовал с различными комбинациями серверный (Ubuntu 7–9, Damn Small Linux, XP) протокол <-> (CIFS, samba, различные версии smbclient) <-> клиент (такой же, как сервер) без удачи

Я попытался настроить работу серверной части без блокировок в samba (после прочтения всей главы о блокировке книг O'Reilly Samba в http://oreilly.com/catalog/samba/chapter/book/ch05_05.html) и в XP (\ HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ UseOpportunisticLocking = 0), но проблема сохраняется.

Есть идеи?

ТИА, Пабло

Ответы [ 5 ]

1 голос
/ 19 сентября 2009

@ Майкл: программы отлично работают в любой сети DOS (Lantastic, WFW) или Windows (95, NT, XP, ...).

Я создал минимальную C-программу для воспроизведения поведения:

#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <process.h>
#include <share.h>
#include <stdio.h>
#include <conio.h>

int main(void)
{
 int handle, status;
 long length;

 handle = sopen("testlock.txt", O_RDONLY,SH_DENYNO,S_IREAD);

 if (!handle)
 {
    printf("sopen failed\n");
    exit(1);
 }

 length = filelength(handle);
 status = lock(handle,0L,length/2);

 if (status == 0)
    printf("lock succeeded\n");
 else
    printf("lock failed\n");

 printf ("Press a key...\n");
 getch();

 status = unlock(handle,0L,length/2);

 if (status == 0)
    printf("unlock succeeded\n");
 else
    printf("unlock failed\n");

 close(handle);
 return 0;
}

Он отлично работает в DOS / Windows (первый терминал может заблокировать, второй - нет), но не работает в Linux под DOSEMU (вы можете одновременно запустить два экземпляра программы в общей сетевой папке, и оба могут получить блокировка независимо от последовательности запуска Linux-Windows / Windows-Linux).

0 голосов
/ 02 сентября 2010

Мы запускаем приложение dos epos на общем ресурсе samba с обоими рабочими станциями Windows 98, Xp с правильной настройкой блокировки на общем ресурсе samba. Мы также можем запускать приложение через dosmeu. На общем ресурсе samba есть ряд настроек блокировки, мы использовали следующие настройки.

 [data]
        comment = data Share
        inherit acls = Yes
        path = /data/
        read only = No
        oplocks = no
        locking = Yes
        strict locking = No
        create mask = 0774
        directory mask = 0775
        browseable = Yes
        default case = upper
0 голосов
/ 16 июня 2010

Это, кажется, известная, продолжающаяся проблема .

Я знаю, что для блокировки байтового диапазона (так называемой блокировки записей в стиле Windows) требуются последние версии ядра, хотя я не знаю, появилась ли она в серии 2.4 или нет.

Если DosEMU нельзя заставить работать на вас, вам, возможно, придется прибегнуть к чему-то более «экзотическому». Возможно, запуск FreeDOS под виртуальной машиной KVM приблизит вас к вашим целям, хотя вам придется выполнить некоторую ручную настройку, чтобы получить поддержку сети (то есть, или придумать, как это сделать). сетевая папка отображается как гостевая буква локального диска). Прокрутите список совместимости KVM до конца, чтобы увидеть состояние различных установок, подобных DOS.

Если у вас есть оригинальные версии 6.22 для работы, тогда это может быть вашим лучшим вариантом.

0 голосов
/ 28 декабря 2009

Я могу подтвердить, что эта проблема существует, как указано выше. Одним из решений является перемещение общих файлов DBF с сервера Windows на сервер Linux. затем эти файлы могут быть переданы через CIFS (SAMBA) заинтересованным сторонам Windows и vi NFS (с опциями -o sync nolock) заинтересованным сторонам Linux. У нас это хорошо работает

Brett

0 голосов
/ 19 сентября 2009

Прежде всего: эти программы имеют какое-либо представление о блокировке? Они созданы для работы с файлом db на сетевом ресурсе?

В те времена, когда работали в DOS, общий доступ к сети не был обычным явлением (и когда это было, это было Netware так часто, как и не было). Если ядро ​​базы данных не подозревает, что базовый файл БД может быть предоставлен в общий доступ, то не имеет значения, что вы используете с cifs - он не блокируется, поэтому он не будет работать.

Теперь, если вы уже правильно выполняете это в сети с DOS-блоками и пытаетесь перейти на Linux, какова текущая сеть DOS? Это cifs или больше похоже на Netware? Есть ли вероятность, что ядро ​​базы данных знает о сетевом стеке и делает что-то смешное? Это может привести к проблемам в новой среде, где механизм БД не знает о сети.

Если вам действительно нужно выяснить, что происходит, вы можете попробовать использовать Wireshark для отслеживания трафика CIFS и попытаться понять, как он использует (или не использует) блокировку. Однако это большое усилие, и если вы не сможете сгенерировать тривиальные приложения для тестирования, то это будет много работы.

...