Répertoires affichés sous forme de fichiers, lors du partage d'un lecteur cifs monté

8

J'ai un problème où un répertoire est affiché sous forme de fichier lors de l'accès à un partage samba (sur Ubuntu 12.10) à partir d'une machine Windows.

La sortie de ls -ll dans le dossier sur linuxbox est la suivante:

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

L'entrée dans / etc / fstab est:

# 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

Lorsque j'accède au partage directement depuis le NAS sur ma boîte Windows, il n'y a aucun problème.

La version de Samba est 3.6.6, mais je n'ai rien trouvé de pertinent dans les journaux des modifications.

J'ai essayé de le monter à différents endroits avec des autorisations, des utilisateurs et des groupes différents mais je n'ai fait aucun progrès

En raison de ma faible réputation sur serverfault (principalement utilisateur stackoverflow), je ne peux pas poster une capture d'écran qui montre que les répertoires sont affichés sous forme de fichiers.

Si je tape le chemin complet dans l'explorateur, la liste des répertoires fonctionne parfaitement, à l'exception des sous-répertoires qui sont ensuite affichés sous forme de fichiers.

Tout vecteur d'attaque pour ce problème serait grandement apprécié.

Veuillez me faire savoir si j'ai fourni des détails insuffisants.

Edit: le même partage lorsque vous y accédez depuis un OS X, fonctionne parfaitement en répertoriant les répertoires en tant que répertoires. Meilleures salutations!

Johan Sigfred Abildskov
la source

Réponses:

7

J'ai finalement résolu le problème.

J'essaierai d'écrire cette réponse plus quand j'aurai le temps.

Le problème est lié au partage d'un système de fichiers cifs, puis à l'accès à celui-ci à partir d'un ordinateur Windows7.

Le bug de samba est ici: https://bugzilla.samba.org/show_bug.cgi?id=9346

Cela découle apparemment de la façon dont les informations sont définies sur l'inode en cifs.

Voir le bug ici: https://bugzilla.kernel.org/show_bug.cgi?id=52791

Ainsi, la façon dont Samba indique (pour ses clients Windows) est de compter le nombre de liens physiques, plutôt que de tester l'attribut. Comme cifs (pour une raison obscure) définit toujours cela à zéro, où un répertoire en aura toujours au moins deux, le répertoire apparaîtra comme un fichier pour les clients Windows.

Donc, pour «corriger» cela, j'ai installé mes en-têtes de noyau actuels et le code source linux:

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

Je suis ensuite allé /usr/src/linux-source-3.5.0là-bas et j'y ai extrait les archives.

Trouver le dossier, /usr/src/linux-source-3.5.0/linux-source-3.5.0/fs/cifs je change ce qui suit dans le fichier inode.c(ligne 135):

set_nlink(inode, fattr->cf_nlink);

à:

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

J'ai ensuite créé un makefile pour faciliter la compilation (et éviter les erreurs insmod ennuyeuses) Makefile2::

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

Cela nous permet de faire (dans le même dossier): sudo make -f Makefile2

Cela nous donne un fichier appelé cifs.ko.

Alors maintenant, nous pouvons arrêter Samba, démonter tous les partages que nous avons, supprimer les cifs actuels et installer notre fichier recompilé.

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

Pour moi, cela a fait l'affaire, si vous redémarrez la boîte, ce changement ne persistera pas. J'ajouterai à cet article lorsque j'aurai trouvé un bon moyen de le faire.

Veuillez jeter toutes les questions ou clarifications dont vous avez besoin à ma façon, je vais probablement en apprendre :)

Aussi grâce aux kukks dans #samba sur freenode, j'ai appris beaucoup de choses là-bas, même si j'ai fini par aller dans une autre direction.

Johan Sigfred Abildskov
la source
3
Wow, c'est le genre de bug qui me fait me demander "à quoi pensaient-ils quand ils ont écrit ça?" Si vous voulez détecter un attribut, interrogez l'attribut, ne regardez pas un corrélat lâche. C'est comme écrire une méthode: bool isPirate () {return pegLegs == 1;}. Vous aurez raison la plupart du temps, mais il y a des moments importants où vous ne le ferez pas.
Kennet Belenky
1
Merci, le patch a fonctionné pour moi en cours d'exécution Ubuntu 12.04 kernel 3.11et samba 3.6.3. Juste quelques problèmes que j'ai trouvés: 1) J'ai dû courir apt-get source linux-image-$(uname -r)pour obtenir les bonnes sources. 2) Pour pouvoir exécuter make avec succès, j'ai copié le fs/cifsdossier sources sous le dossier de headers avec le même sous-chemin et compilé à partir de la racine des en-têtes avec make M=fs/cifs, comme expliqué ici: http://www.debian-administration.org/article/640 / Rebuilding_a_single_kernel_module
drodsou