Каталоги, показанные в виде файлов, при совместном использовании смонтированного диска cifs

8

У меня есть проблема, когда каталог отображается в виде файла при доступе к общему ресурсу samba (в Ubuntu 12.10) с компьютера с Windows.

Вывод ls -ll в папке на linuxbox выглядит следующим образом:

chubby@chubby:/media/blackhole/_Arkiv$ ls -ll
total 0
drwxrwxrwx 0 jv users 0 Jun 18  2012 _20
drwxrwxrwx 0 jv users 0 Apr 17  2012 _2006
drwxrwxrwx 0 jv users 0 Apr 17  2012 _2007
drwxrwxrwx 0 jv users 0 May 12  2011 _2008
drwxrwxrwx 0 jv users 0 Feb 19 09:53 _2009
drwxrwxrwx 0 jv users 0 Dec 20  2011 _2010
drwxrwxrwx 0 jv users 0 May  8  2012 _2011
drwxrwxrwx 0 jv users 0 Mar  5 11:37 _2012
drwxrwxrwx 0 jv users 0 Feb 28 10:09 _2013
drwxrwxrwx 0 jv users 0 Feb 28 11:18 _Mailarkiv
drwxrwxrwx 0 jv users 0 Jan  3  2011 _Praktikanter

Запись в / etc / fstab:

# Mounting blackhole
//192.168.0.50/kunder/ /media/blackhole cifs uid=jv,gid=users,credentials=/home/chubby/.smbcredentials,iocharset=utf8,file_mode=0777,dir_mode=0777 0 0

Когда я получаю доступ к общему ресурсу напрямую из NAS на моем Windows-устройстве, проблем не возникает.

Версия Samba - 3.6.6, но в журналах изменений я не смог найти ничего подходящего.

Я пробовал монтировать его в разных местах с разными разрешениями, пользователями и группами, но я не добился никакого прогресса

Из-за моей низкой репутации на serverfault (в основном это пользователь stackoverflow) я не могу опубликовать скриншот, который показывает, что каталоги отображаются в виде файлов.

Если я ввожу полный путь в проводнике, список каталогов работает отлично, за исключением любых подкаталогов, которые затем отображаются в виде файлов.

Любая атака для этой проблемы будет принята с благодарностью.

Пожалуйста, дайте мне знать, если я предоставил недостаточно информации.

Изменить: тот же общий ресурс при доступе из OS X, отлично работает, перечисляя каталоги в качестве каталогов. Наилучшие пожелания!

Йохан Сигфред Абильдсков
источник

Ответы:

7

Я наконец-то решил проблему.

Я постараюсь написать этот ответ больше, когда у меня будет время.

Проблема связана с перераспределением файловой системы cifs и последующим доступом к ней с компьютера Windows7.

Ошибка самбы здесь: https://bugzilla.samba.org/show_bug.cgi?id=9346

По-видимому, это связано с тем, как информация указывается в inode в cifs.

Смотрите ошибку здесь: https://bugzilla.kernel.org/show_bug.cgi?id=52791

Таким образом, Samba определяет (для своих клиентов Windows) подсчет количества жестких ссылок, а не проверку атрибута. Поскольку cifs (по какой-то непонятной причине) всегда устанавливает это значение в ноль, где в каталоге всегда будет как минимум два, каталог будет отображаться как файл для клиентов Windows.

Поэтому, чтобы «исправить» это, я установил мои текущие заголовки ядра и исходный код linux:

sudo apt-get install linux-headers-$(uname -r) linux-source

Затем я пошел /usr/src/linux-source-3.5.0и извлек там архив.

Находя папку, /usr/src/linux-source-3.5.0/linux-source-3.5.0/fs/cifs я изменяю следующее в файле inode.c(строка 135):

set_nlink(inode, fattr->cf_nlink);

чтобы:

if(fattr->cf_cifsattrs & ATTR_DIRECTORY)
          set_nlink(inode, 2);
        else
          set_nlink(inode, fattr->cf_nlink);

Затем я создал make-файл, чтобы упростить компиляцию (и избежать надоедливых ошибок insmod) Makefile2:

obm-m := cifs.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

Это позволяет нам сделать (в той же папке): sudo make -f Makefile2

Это дает нам файл с именем cifs.ko.

Так что теперь мы можем остановить Samba, размонтировать все имеющиеся у нас общие ресурсы, удалить текущие файлы cif и установить нашу перекомпилированную.

sudo service smbd stop
sudo umount /path/to/share
sudo rmmod cifs
sudo insmod cifs.ko
sudo mount -a
sudo service smbd start

Для меня это сработало, если вы перезагрузите коробку, это изменение не будет сохраняться. Я добавлю к этому сообщению, когда я нашел хороший способ сделать это.

Пожалуйста, присылайте любые вопросы или разъяснения, которые вам нужны у меня, я, наверное, поучусь на этом :)

Также, благодаря kukks в #samba на freenode, я многому научился там, хотя в конечном итоге я пошел в другом направлении.

Йохан Сигфред Абильдсков
источник
3
Вау, это та ошибка, которая заставляет меня задуматься: "Какого черта они думали, когда писали это?" Если вы хотите обнаружить атрибут, запросите атрибут, не смотрите на свободный коррелят. Это похоже на написание метода: bool isPirate () {return pegLegs == 1;}. Вы будете правы большую часть времени, но бывают случаи, когда вы этого не сделаете.
Кеннет Беленький
1
Спасибо, патч работал для меня работает Ubuntu 12.04 kernel 3.11и samba 3.6.3. Просто пару проблем я обнаружил: 1) Мне пришлось бежать, apt-get source linux-image-$(uname -r)чтобы получить правильные источники. 2) Чтобы запустить make успешно, я скопировал fs/cifsпапку sources в папку de headers с тем же подпутьем и скомпилировал из корня заголовков make M=fs/cifs, как описано здесь: http://www.debian-administration.org/article/640 / Rebuilding_a_single_kernel_module
drodsou