web-dev-qa-db-ja.com

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

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

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からアクセスしたときの同じ共有は、ディレクトリをディレクトリとして完全にリストして機能します。宜しくお願いします!

私はついに問題を解決しました。

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

この問題は、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);

次に、コンパイルを容易にするために(そして、迷惑な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のおかげで、私はそこで多くのことを学びましたが、結局別の方向に進んでしまいました。