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のおかげで、私はそこで多くのことを学びましたが、結局別の方向に進んでしまいました。