Началось все с констатации факта, что детская мечта идиота таки сбылась, и в квартире незаметно образовался компьютерный класс из железок жены, детей, кошки, и моих виртуалок. И все это временами приходится админить (приходишь с работы, а тут опять станки, станки... ©) Сидят они под 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 на шарах с файлами-исключениями тупит не по детски, хотя должен ускоряться.
Картина почти аналогична предыдущему случаю. Ну да гейтс с ней.
И в заключение. Кто хочет пакетики с годнотой, общайтесь с мантейнерами сами. Себе то соберу, даже поделюсь. Но это будет неофициально и в репах само не появится.