Directorios mostrados como archivos, cuando se comparte una unidad cifs montada

8

Tengo un problema en el que un directorio se muestra como un archivo al acceder a un recurso compartido de samba (en Ubuntu 12.10) desde una máquina con Windows.

La salida de ls -ll en la carpeta en el linuxbox es la siguiente:

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

La entrada en / etc / fstab es:

# 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

Cuando accedo al recurso compartido directamente desde el NAS en mi caja de Windows, no hay problemas.

La versión de Samba es 3.6.6, pero no pude encontrar nada en los registros de cambios que parezca relevante.

He intentado montarlo en diferentes ubicaciones con diferentes permisos, usuarios y grupos, pero no he progresado.

Debido a mi baja reputación en el servidor predeterminado (principalmente usuario de stackoverflow), no puedo publicar una captura de pantalla que muestre que los directorios se muestran como archivos.

Si escribo la ruta completa en el explorador, la lista de directorios funciona de manera excelente, a excepción de los subdirectorios que luego se muestran como archivos.

Cualquier vector de ataque para este problema sería muy apreciado.

Avíseme si he proporcionado detalles insuficientes.

Editar: el mismo recurso compartido cuando se accede desde un OS X, funciona perfectamente enumerando los directorios como directorios. ¡Atentamente!

Johan Sigfred Abildskov
fuente

Respuestas:

7

Finalmente he resuelto el problema.

Intentaré escribir esta respuesta más cuando tenga tiempo.

El problema está relacionado con compartir un sistema de archivos cifs y luego acceder a esto desde una computadora con Windows 7.

El error de samba está aquí: https://bugzilla.samba.org/show_bug.cgi?id=9346

Aparentemente, esto se debe a la forma en que la información se establece en el inodo en cifs.

Ver error aquí: https://bugzilla.kernel.org/show_bug.cgi?id=52791

Entonces, la forma en que Samba lo determina (para sus clientes de Windows) es contando el número de enlaces duros, en lugar de probar el atributo. Como los cifs (por alguna oscura razón) siempre establecen esto en cero, donde un directorio siempre tendrá al menos dos, el directorio aparecerá como un archivo para clientes Windows.

Así que para "arreglar" esto instalé mis encabezados de kernel actuales y el código fuente de Linux:

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

Luego fui /usr/src/linux-source-3.5.0y extraje el archivo allí.

Al encontrar la carpeta /usr/src/linux-source-3.5.0/linux-source-3.5.0/fs/cifs , cambio lo siguiente en el archivo inode.c(línea 135):

set_nlink(inode, fattr->cf_nlink);

a:

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

Luego creé un archivo MAKE para facilitar la compilación (y evitar molestos errores insmod) Makefile2:

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

Esto nos permite hacer (en la misma carpeta): sudo make -f Makefile2

Esto nos da un archivo llamado cifs.ko.

Así que ahora podemos detener Samba, desmontar cualquier recurso compartido que tengamos, eliminar los cifs actuales e instalar nuestro 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 mí, esto funcionó, si reinicias el cuadro, este cambio no persistirá. Agregaré a esta publicación cuando haya descubierto una buena manera de hacer esto.

Lanza cualquier pregunta o aclaración que necesites a mi manera, probablemente aprenderé de ella :)

También gracias a kukks en #samba en freenode, aprendí muchas cosas allí, aunque terminé moviéndome en otra dirección.

Johan Sigfred Abildskov
fuente
3
Wow, ese es el tipo de error que me hace preguntarme "¿qué diablos estaban pensando cuando escribieron eso?" Si desea detectar un atributo, consulte el atributo, no mire un correlato suelto. Es como escribir un método: bool isPirate () {return pegLegs == 1;}. Tendrá razón la mayor parte del tiempo, pero hay algunos momentos importantes en los que no lo hará.
Kennet Belenky
1
Gracias, el parche funcionó para mí corriendo Ubuntu 12.04 kernel 3.11y samba 3.6.3. Solo encontré un par de problemas: 1) Tuve que correr apt-get source linux-image-$(uname -r)para obtener las fuentes adecuadas. 2) Para poder ejecutar make correctamente, copié la fs/cifscarpeta de fuentes en la carpeta de encabezados con el mismo subpath y compilé desde la raíz de los encabezados con make M=fs/cifs, como se explica aquí: http://www.debian-administration.org/article/640 / Rebuilding_a_single_kernel_module
drodsou