Расковырял тут smbnetfs (или смычка города и деревни (пингвина с флагом))

Модератор: Модераторы разделов

Ответить
dimbor
Ведущий рубрики
Сообщения: 1569
Статус: Подвинутый участник

Расковырял тут smbnetfs

Сообщение dimbor »

Данный поток сознания публикуется здесь, т.к. не соответствует тематике раздела "Терминальные решения", где из меня обычно прет. Решение-то терминальное, как обычно. Да только не в том смысле. В общем, другого места на форуме не нашел, приткну тут.

Началось все с констатации факта, что детская мечта идиота таки сбылась, и в квартире незаметно образовался компьютерный класс из железок жены, детей, кошки, и моих виртуалок. И все это временами приходится админить (приходишь с работы, а тут опять станки, станки... ©) Сидят они под MS, в отличие от. Домен на самбе поднят давненько, чтоб не разбегались. Захотелось беспроблемного доступа к ресурсам а ля "Сетевое окружение" в винде. Казалось бы, есть gvfs, который под xfce бодро все открывает. Но я то в основном в консольке под mc. Консольку конечно же люблю, но не настолько, чтобы по памяти постоянно шарашить "mount -t cifs <много разных букв>", когда там надо только один файл изменить. mc под дебианом собран без smb (потому что с ним нормально не работает). Если допилить, все равно на каждую шару будет каждый раз спрашивать и юзера, и пароль, и домен - неудобен. FAR - бессмысленно, вайн netbios не умеет.

В гугле накопал оный smbnetfs - монтирование всего мелкософтовского в родное дерево с браузингом, лаптой и монашками. Автор - отечественный, но сильно занятой, т.ч. беспокоить не стал. Под дебиан пакетик есть, и даже последняя версия из sid великолепно под wheezy собралась.

Поставил это дело, запустил по обильно найденным в интернете докам. Особенность - разве только, что /etc/smbnetfs.conf непонятно зачем туда кладется. Работает оно с конфигом из ~/.smb/smbnetfs.conf сотоварищи. Завелось с томозами и глюками. Пришлось расчехлить заржавевший напильник - потратить пару ночей на обработку.

Первая типично "самбовская" беда - поголовно исполняемые файлы. Игрища с параметром umask (от fuse) ожидаемо результатов не принесли. Снимать-то он биты снимает, да только у каталогов тоже, и не зайти в них нифига (привет, chmod *).

Патч отсюда не для этого, но пусть будет - каши маслом.

Значится, родил собственный патч. На самом деле наверное очередной "ugly hack", но работает:
Spoiler

Код: Выделить всё

--- function.c.orig     2016-02-28 23:59:29.000000000 +0300
+++ function.c  2016-02-29 00:01:05.976367809 +0300
@@ -402,6 +402,8 @@

        case SMBITEM_SMB_SHARE_ITEM:
            if (samba_stat(path, stbuf) != 0) return -errno;
+            if (S_ISREG(stbuf->st_mode))
+                stbuf->st_mode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
            return 0;

        default:
@@ -448,6 +450,8 @@
     }

     if (samba_fstat(fd, stbuf) != 0) return -errno;
+    if (S_ISREG(stbuf->st_mode))
+        stbuf->st_mode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
     return 0;
 }


Далее, как одмин, поставил конечно в конфиге show_$_shares "true". Глючит и тормозит.
Установлено седующее: Как только от сервера прилетает "Device or resource busy" на что-то хитроввернутое типа pagefile.sys, оно так удивляется, что вмерает и до конца долистать каталог не может. Ну это ерунда. Не хочет - заставим.
Spoiler

Код: Выделить всё

--- smb_conn_srv.orig.c 2015-01-11 12:46:57.000000000 +0300
+++ smb_conn_srv.c      2016-02-28 23:14:02.264367809 +0300
@@ -470,6 +470,7 @@
            case EPERM:
            case EROFS:
            case ETXTBSY:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, OPEN, error, NULL, 0);
                return;
            default:
@@ -573,6 +574,7 @@
            case EAGAIN:
            case EINTR:
            case EISDIR:
+           case EBUSY:
                state->offset = (off_t) (-1);
                smb_conn_srv_send_reply(ctx, READ, errno, NULL, 0);
                return;
@@ -622,6 +624,7 @@
            case EIO:
            case ENOSPC:
            case EISDIR:
+           case EBUSY:
                state->offset = (off_t) (-1);
                smb_conn_srv_send_reply(ctx, WRITE, errno, NULL, 0);
                return;
@@ -807,6 +810,7 @@
            case ENAMETOOLONG:
            case ENOENT:
            case ENOTDIR:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, RENAME, errno, NULL, 0);
                free((char*)new_url);
                return;
@@ -827,6 +831,7 @@
            case ELOOP:
            case ENAMETOOLONG:
            case ENOTDIR:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, RENAME, errno, NULL, 0);
                free((char*)new_url);
                return;
@@ -1167,6 +1172,16 @@

     if (smbc_stat(url, &reply.stat) < 0){
        switch(errno){
+           case EBUSY:
+                DSRVPRINTF(ctx, 6, "errno=%d, %s; prepare fake reply to send.\n", errno, strerror(errno));
+               memset(&reply.stat, 0, sizeof(struct stat));
+                reply.stat.st_mode = S_IFREG;
+                reply.stat.st_nlink = 0;
+                reply.stat.st_uid = 0;
+                reply.stat.st_gid = 0;
+                reply.stat.st_size = 0;
+                reply.stat.st_blksize = 4096;
+               break;
            case EACCES:
            case ELOOP:
            case ENAMETOOLONG:
@@ -1201,6 +1216,16 @@

     if (smbc_fstat(state->fd, &reply.stat) < 0){
        switch(errno){
+           case EBUSY:
+                DSRVPRINTF(ctx, 6, "errno=%d, %s; prepare fake reply to send.\n", errno, strerror(errno));
+               memset(&reply.stat, 0, sizeof(struct stat));
+                reply.stat.st_mode = S_IFREG;
+                reply.stat.st_nlink = 0;
+                reply.stat.st_uid = 0;
+                reply.stat.st_gid = 0;
+                reply.stat.st_size = 0;
+                reply.stat.st_blksize = 4096;
+               break;
            case EACCES:
            case ELOOP:
            case ENAMETOOLONG:
@@ -1247,6 +1272,7 @@
            case EPERM:
            case EROFS:
            case ETXTBSY:
+           case EBUSY:
                state->offset = (off_t) (-1);
                smb_conn_srv_send_reply(ctx, FTRUNCATE, errno, NULL, 0);
                return;
@@ -1287,6 +1313,7 @@
            case ENOTDIR:
            case EPERM:
            case EROFS:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, CHMOD, errno, NULL, 0);
                return;
            default:
@@ -1321,6 +1348,7 @@
            case ENOENT:
            case EPERM:
            case EROFS:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, UTIMES, errno, NULL, 0);
                return;
            default:
@@ -1370,6 +1398,7 @@
            case ELOOP:
            case ENAMETOOLONG:
            case ENOTDIR:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, SETXATTR, errno, NULL, 0);
                return;
            default:
@@ -1418,6 +1447,7 @@
            case ELOOP:
            case ENAMETOOLONG:
            case ENOTDIR:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, GETXATTR, errno, NULL, 0);
                return;
            default:
@@ -1459,6 +1489,7 @@
            case ENAMETOOLONG:
            case ENOENT:
            case ENOTDIR:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, LISTXATTR, errno, NULL, 0);
                return;
            default:
@@ -1505,6 +1536,7 @@
            case ELOOP:
            case ENAMETOOLONG:
            case ENOTDIR:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, REMOVEXATTR, errno, NULL, 0);
                return;
            default:


Можно уже радоваться. Разве еще рекомендую поставить stat_workaround_enable_default_entries "false", т.к. этот механизм сделан кривовато. Консольке нипочем, а вот тот же Thunar на шарах с файлами-исключениями тупит не по детски, хотя должен ускоряться.
Картина почти аналогична предыдущему случаю. Ну да гейтс с ней.

И в заключение. Кто хочет пакетики с годнотой, общайтесь с мантейнерами сами. Себе то соберу, даже поделюсь. Но это будет неофициально и в репах само не появится.
Вложения
smbnetfs_patches.tar.gz
(1.35 КБ) 41 скачивание
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Расковырял тут smbnetfs

Сообщение Bizdelnick »

dimbor писал(а):
29.02.2016 02:45
Игрища с параметром umask (от fuse) ожидаемо результатов не принесли. Снимать-то он биты снимает, да только у каталогов тоже

dmask/fmask не работают?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1569
Статус: Подвинутый участник

Re: Расковырял тут smbnetfs

Сообщение dimbor »

dmask/fmask это, как я понимаю, аргументы командной строки mount.cifs. А сабж совместно с fuse юзает голый libsmbclient.h, да еще похоже в deprecated его части. Там нетути такого высокого уровня абстракции. Да и вообще, не через стакан на него смотреть чревато для душевного здоровья.
Спасибо сказали:
test666
Сообщения: 11

Re: Расковырял тут smbnetfs

Сообщение test666 »

Огромное спасибо!

Два года пользовался smbnetfs 0.6.0, и терпел описанный вами глюк - когда после pagefile.sys отваливалось отображение оставшейся части каталога. Достало нереально. И вот, сегодня - дай, думаю, поищу рещение проблемы, и нашёл эту страницу. Патч супер, всё хоккей.

Причём до этого я пользовался smbnetfs 0.3.11a, и в нём такой проблемы не было.


А вот насчёт execute битов на каталоги - проблемы не ощущаю. Да, execute на каталоги не стоит, но в них заходит нормально.

Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1569
Статус: Подвинутый участник

Re: Расковырял тут smbnetfs

Сообщение dimbor »

Гут! Хоть кому-то понадобилось. А то чувствовал тут себя как невинная секретарша в окружении красноглазых чудовищ.
Спасибо сказали:
Ответить