Verzeichnisse, die als Dateien angezeigt werden, wenn ein bereitgestelltes cifs-Laufwerk freigegeben wird

8

Ich habe ein Problem, bei dem ein Verzeichnis als Datei angezeigt wird, wenn von einem Windows-Computer aus auf eine Samba-Freigabe (unter Ubuntu 12.10) zugegriffen wird.

Die Ausgabe von ls -ll im Ordner auf der Linuxbox lautet wie folgt:

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

Der Eintrag in / etc / fstab lautet:

# 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

Wenn ich direkt vom NAS auf meiner Windows-Box auf die Freigabe zugreife, treten keine Probleme auf.

Die Version von Samba ist 3.6.6, aber ich konnte in den Änderungsprotokollen nichts finden, was relevant erscheint.

Ich habe versucht, es an verschiedenen Orten mit unterschiedlichen Berechtigungen, Benutzern und Gruppen bereitzustellen, aber ich habe keine Fortschritte erzielt

Aufgrund meiner geringen Reputation bei Serverfehlern (meistens Stackoverflow-Benutzer) kann ich keinen Screenshot veröffentlichen, der zeigt, dass die Verzeichnisse als Dateien angezeigt werden.

Wenn ich den vollständigen Pfad im Explorer eingebe, funktioniert die Verzeichnisliste hervorragend, mit Ausnahme aller Unterverzeichnisse, die dann als Dateien angezeigt werden.

Jeder Angriffsvektor für dieses Problem wäre sehr dankbar.

Bitte lassen Sie mich wissen, wenn ich nicht genügend Details angegeben habe.

Bearbeiten: Dieselbe Freigabe funktioniert beim Zugriff von OS X aus perfekt, wenn die Verzeichnisse als Verzeichnisse aufgelistet werden. Freundliche Grüße!

Johan Sigfred Abildskov
quelle

Antworten:

7

Ich habe das Problem endlich gelöst.

Ich werde versuchen, diese Antwort mehr aufzuschreiben, wenn ich Zeit habe.

Das Problem hängt damit zusammen, dass ein cifs-Dateisystem erneut freigegeben und dann von einem Windows7-Computer aus darauf zugegriffen wird.

Der Samba-Fehler ist hier: https://bugzilla.samba.org/show_bug.cgi?id=9346

Dies ist anscheinend darauf zurückzuführen, wie Informationen in cifs auf dem Inode festgelegt werden.

Siehe Fehler hier: https://bugzilla.kernel.org/show_bug.cgi?id=52791

Die Art und Weise, wie Samba dies bestimmt (für seine Windows-Clients), besteht darin, die Anzahl der Hardlinks zu zählen, anstatt das Attribut zu testen. Da cifs (aus irgendeinem unbekannten Grund) dies immer auf Null setzt, wobei ein Verzeichnis immer mindestens zwei hat, wird das Verzeichnis als Datei für Windows-Clients angezeigt.

Um dies zu "beheben", habe ich meine aktuellen Kernel-Header und den Linux-Quellcode installiert:

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

Ich ging dann zu /usr/src/linux-source-3.5.0und extrahierte dort das Archiv.

Wenn /usr/src/linux-source-3.5.0/linux-source-3.5.0/fs/cifs ich den Ordner finde, ändere ich Folgendes in der Datei inode.c(Zeile 135):

set_nlink(inode, fattr->cf_nlink);

zu:

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

Ich habe dann eine Make - Datei zu erleichtern Kompilierung (und vermeiden lästigen insmod Fehler): Makefile2:

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

Dies ermöglicht es uns (im selben Ordner): sudo make -f Makefile2

Dies gibt uns eine Datei namens cifs.ko.

Jetzt können wir Samba stoppen, alle vorhandenen Freigaben entfernen, die aktuellen CIFs entfernen und unsere neu kompilierte installieren.

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

Für mich war dies der Trick. Wenn Sie die Box jedoch neu starten, bleibt diese Änderung nicht bestehen. Ich werde diesen Beitrag ergänzen, wenn ich einen guten Weg gefunden habe, dies zu tun.

Bitte werfen Sie alle Fragen oder Klarstellungen, die Sie benötigen, ich werde wahrscheinlich daraus lernen :)

Auch dank Kukks in #samba auf freenode habe ich dort viel gelernt, obwohl ich mich in eine andere Richtung bewegt habe.

Johan Sigfred Abildskov
quelle
3
Wow, das ist die Art von Fehler, die mich fragen lässt: "Was zum Teufel haben sie gedacht, als sie das geschrieben haben?" Wenn Sie ein Attribut erkennen möchten, fragen Sie das Attribut ab und sehen Sie sich kein loses Korrelat an. Es ist wie beim Schreiben einer Methode: bool isPirate () {return pegLegs == 1;}. Sie werden die meiste Zeit Recht haben, aber es gibt einige wichtige Zeiten, in denen Sie dies nicht tun.
Kennet Belenky
1
Danke, der Patch hat bei mir beim Laufen funktioniert Ubuntu 12.04 kernel 3.11und samba 3.6.3. Nur ein paar Probleme, die ich gefunden habe: 1) Ich musste rennen apt-get source linux-image-$(uname -r), um die richtigen Quellen zu finden. 2) Um make erfolgreich ausführen zu können, habe ich den fs/cifsQuellordner unter dem Ordner de headers mit demselben Unterpfad kopiert und aus dem Stammverzeichnis der Header mit kompiliert make M=fs/cifs, wie hier erläutert: http://www.debian-administration.org/article/640 / Rebuilding_a_single_kernel_module
drodsou