マウントされたCIFSドライブを共有するときに、ディレクトリがファイルとして表示される


8

Windowsマシンから(Ubuntu 12.10で)Samba共有にアクセスすると、ディレクトリがファイルとして表示されるという問題があります。

linuxboxのフォルダーにあるls -llからの出力は次のとおりです。

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

WindowsボックスのNASから直接共有にアクセスしても問題はありません。

Sambaのバージョンは3.6.6ですが、変更ログに関連性のあるものは見つかりませんでした。

権限、ユーザー、グループが異なる別の場所にマウントしてみましたが、進捗はありません

serverfault(ほとんどの場合、stackoverflowユーザー)に対する評判が低いため、ディレクトリがファイルとして表示されていることを示すスクリーンショットを投稿できません。

エクスプローラーでフルパスを入力すると、サブディレクトリがファイルとして表示される場合を除いて、ディレクトリリストは適切に機能します。

この問題の攻撃ベクトルは大歓迎です。

詳細が不十分な場合はお知らせください。

編集:OS Xからアクセスしたときの同じ共有は、ディレクトリをディレクトリとして完全にリストして機能します。宜しくお願いします!

回答:


7

ようやく問題を解決しました。

時間があれば、この答えをもっと書き出そうと思います。

この問題は、cifsファイルシステムを再共有し、Windows7コンピューターからこれにアクセスすることに関連しています。

Sambaのバグはこちら:https : //bugzilla.samba.org/show_bug.cgi?id=9346

これは明らかに、CIFSのiノードで情報が設定される方法に由来します。

こちらのバグをご覧くださいhttps : //bugzilla.kernel.org/show_bug.cgi?id=52791

したがって、Sambaが(Windowsクライアントに対して)判断する方法は、属性をテストするのではなく、ハードリンクの数をカウントすることです。cifs(あいまいな理由により)は常にこれをゼロに設定するため、ディレクトリには常に少なくとも2つが存在し、ディレクトリは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);

次に、コンパイルを容易にするためのmakefileを作成しました(そして、煩わしい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

私にとってはこれでうまくいきましたが、ボックスを再起動すると、この変更は持続しません。これを行う良い方法がわかったら、この投稿に追加します。

私の方法で必要な質問や説明を投げてください。おそらくそれから学びます:)

また、freenodeの#sambaのkukksのおかげで、多くのことを学びましたが、結局別の方向に進んでしまいました。


3
うわー、それは「彼らがそれを書いたときに彼らは一体一体何を考えていたのか」と私に疑問を抱かせる種類のバグです。属性を検出する場合は、属性をクエリし、緩やかな相関関係を調べないでください。これは、メソッドの記述に似ています:bool isPirate(){return pegLegs == 1;}。ほとんどの場合、あなたは正しいでしょうが、そうでない場合もあります。
ケネットベレンキー2014年

1
おかげで、パッチは私Ubuntu 12.04 kernel 3.11とのために動作しましたsamba 3.6.3。私が見つけたいくつかの問題:1)apt-get source linux-image-$(uname -r)適切なソースを取得するために実行する必要がありました。2)makeを正常に実行できるようにするにfs/cifsmake M=fs/cifs、ここで説明するように、同じサブパスを使用して、de headersフォルダーの下のsourcesフォルダーをコピーし、ヘッダーのルートからコンパイルしました。http
drodsou 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.