Diretórios mostrados como arquivos, ao compartilhar uma unidade CIFs montada

8

Eu tenho um problema em que um diretório é mostrado como um arquivo ao acessar um compartilhamento de samba (no Ubuntu 12.10) em uma máquina Windows.

A saída de ls -ll na pasta no linuxbox é a seguinte:

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

A entrada em / 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

Quando acesso o compartilhamento diretamente do NAS no meu Windows, não há problemas.

A versão do Samba é 3.6.6, mas não consegui encontrar nada nos changelogs que pareçam relevantes.

Tentei montá-lo em locais diferentes, com permissões, usuários e grupos diferentes, mas não progredi

Devido à minha baixa reputação em falha do servidor (principalmente usuário de stackoverflow), não consigo postar uma captura de tela que mostre que os diretórios são mostrados como arquivos.

Se eu digitar o caminho completo no explorer, a listagem de diretórios funcionará de maneira excelente, exceto os subdiretórios que serão mostrados como arquivos.

Qualquer vetor de ataque para esse problema seria muito apreciado.

Informe-me se forneci detalhes insuficientes.

Editar: O mesmo compartilhamento, quando acessado a partir de um OS X, funciona perfeitamente na listagem dos diretórios como diretórios. Cumprimentos!

Johan Sigfred Abildskov
fonte

Respostas:

7

Finalmente resolvi o problema.

Vou tentar escrever mais essa resposta quando tiver tempo.

O problema está relacionado ao compartilhar novamente um sistema de arquivos cifs e acessá-lo em um computador com Windows7.

O bug do samba está aqui: https://bugzilla.samba.org/show_bug.cgi?id=9346

Aparentemente, isso decorre da maneira como as informações são definidas no inode nos CIFs.

Veja o bug aqui: https://bugzilla.kernel.org/show_bug.cgi?id=52791

Portanto, a maneira como o Samba determina (para seus clientes Windows) é contando o número de hardlinks, em vez de testar o atributo. Como cifs (por algum motivo obscuro) sempre define isso como zero, onde um diretório sempre terá pelo menos dois, o diretório aparecerá como um arquivo para clientes Windows.

Então, para "consertar" isso, instalei meus cabeçalhos atuais do kernel e o código fonte do linux:

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

Eu fui /usr/src/linux-source-3.5.0e extraí o arquivo lá.

Localizando a pasta /usr/src/linux-source-3.5.0/linux-source-3.5.0/fs/cifs , altero o seguinte no arquivo inode.c(linha 135):

set_nlink(inode, fattr->cf_nlink);

para:

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

Criei um makefile para facilitar a compilação (e evitar erros insmod irritantes) Makefile2::

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

Isso nos permite fazer (na mesma pasta): sudo make -f Makefile2

Isso nos dá um arquivo chamado cifs.ko.

Portanto, agora podemos parar o Samba, desmontar todos os compartilhamentos que temos, remover os CIFs atuais e instalar o nosso recompilado.

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

Para mim, isso fez o truque, se você reiniciar a caixa, essa alteração não persistirá. Acrescentarei a este post quando descobrir uma boa maneira de fazer isso.

Por favor, jogue quaisquer perguntas ou esclarecimentos que você precisar do meu jeito, provavelmente vou aprender com isso :)

Também graças aos kukks no #samba no freenode, eu aprendi muitas coisas lá, apesar de ter acabado me movendo em outra direção.

Johan Sigfred Abildskov
fonte
3
Uau, esse é o tipo de bug que me faz pensar "que diabos eles estavam pensando quando escreveram isso?" Se você deseja detectar um atributo, consulte-o, não procure um correlato solto. É como escrever um método: bool isPirate () {return pegLegs == 1;}. Você estará certo na maioria das vezes, mas há momentos significativos em que não.
precisa saber é o seguinte
1
Obrigado, o patch funcionou para mim, executando Ubuntu 12.04 kernel 3.11e samba 3.6.3. Apenas alguns problemas que encontrei: 1) Eu tive que correr apt-get source linux-image-$(uname -r)para obter as fontes adequadas. 2) Para poder executar o make com sucesso, copiei a fs/cifspasta sources na pasta de headers com o mesmo subcaminho e compilei a partir da raiz dos cabeçalhos make M=fs/cifs, conforme explicado aqui: http://www.debian-administration.org/article/640 / Rebuilding_a_single_kernel_module
drodsou