Direktori ditampilkan sebagai file, saat berbagi drive cif yang terpasang

8

Saya memiliki masalah di mana direktori ditampilkan sebagai file ketika mengakses share samba (di Ubuntu 12.10) dari mesin Windows.

Output dari ls -ll dalam folder di linuxbox adalah sebagai berikut:

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

Entri di / etc / fstab adalah:

# 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

Ketika saya mengakses bagian langsung dari NAS di kotak Windows saya, tidak ada masalah.

Versi Samba adalah 3.6.6, tetapi saya tidak dapat menemukan apa pun di changelogs yang tampaknya relevan.

Saya sudah mencoba memasangnya di lokasi yang berbeda dengan izin, pengguna, dan grup yang berbeda tetapi saya belum membuat kemajuan

Karena reputasi saya yang rendah pada serverfault (sebagian besar pengguna stackoverflow), saya tidak dapat memposting tangkapan layar yang menunjukkan bahwa direktori ditampilkan sebagai file.

Jika saya mengetik path lengkap di explorer, daftar direktori berfungsi dengan baik, kecuali untuk subdirektori yang kemudian ditampilkan sebagai file.

Setiap vektor serangan untuk masalah ini akan sangat dihargai.

Harap beri tahu saya jika saya memberikan detail yang tidak mencukupi.

Sunting: Bagian yang sama ketika diakses dari OS X, berfungsi dengan baik mendaftar direktori sebagai direktori. Salam Hormat!

Johan Sigfred Abildskov
sumber

Jawaban:

7

Saya akhirnya memecahkan masalah.

Saya akan mencoba menulis jawaban ini lebih banyak ketika saya punya waktu.

Masalahnya terhubung untuk membagikan ulang sistem file cif, dan kemudian mengaksesnya dari komputer Windows7.

Bug samba ada di sini: https://bugzilla.samba.org/show_bug.cgi?id=9346

Ini tampaknya berasal dari cara informasi diatur pada inode di cifs.

Lihat bug di sini: https://bugzilla.kernel.org/show_bug.cgi?id=52791

Jadi cara Samba memberitahu menentukan (untuk klien Windows-nya) adalah dengan menghitung jumlah hardlink, bukan pengujian untuk atribut. Karena cifs (karena alasan yang tidak jelas) selalu menetapkan ini ke nol, di mana direktori selalu memiliki setidaknya dua, direktori akan muncul sebagai file untuk klien Windows.

Jadi untuk "memperbaiki" ini saya menginstal header-kernel dan kode sumber linux saya saat ini:

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

Saya kemudian pergi /usr/src/linux-source-3.5.0dan mengekstrak arsip di sana.

Menemukan folder /usr/src/linux-source-3.5.0/linux-source-3.5.0/fs/cifs saya mengubah yang berikut di file inode.c(baris 135):

set_nlink(inode, fattr->cf_nlink);

untuk:

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

Saya kemudian membuat makefile untuk memudahkan kompilasi (dan menghindari kesalahan insmod yang mengganggu) Makefile2::

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

Ini memungkinkan kami melakukan (dalam folder yang sama): sudo make -f Makefile2

Ini memberi kita sebuah file bernama cifs.ko.

Jadi sekarang kita dapat menghentikan Samba, unmount semua saham yang kita miliki, hapus cif saat ini, dan instal yang telah dikompilasi ulang.

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

Bagi saya ini berhasil, jika Anda me-restart kotak, perubahan ini tidak akan bertahan. Saya akan menambahkan ke posting ini ketika saya sudah menemukan cara yang baik untuk melakukan ini.

Tolong ajukan pertanyaan atau klarifikasi yang Anda butuhkan dengan cara saya, saya mungkin akan belajar darinya :)

Juga berkat kukks di #samba di freenode, saya belajar banyak hal di sana, meskipun akhirnya saya pindah ke arah lain.

Johan Sigfred Abildskov
sumber
3
Wow, itu jenis bug yang membuat saya bertanya-tanya "apa yang mereka pikirkan ketika mereka menulis itu?" Jika Anda ingin mendeteksi suatu atribut, kueri atribut tersebut, jangan melihat korelasi yang longgar. Ini seperti menulis metode: bool isPirate () {return pegLegs == 1;}. Anda akan benar sebagian besar waktu, tetapi ada beberapa waktu yang signifikan ketika Anda tidak akan melakukannya.
Kennet Belenky
1
Terima kasih, tambalan bekerja untuk saya berlari Ubuntu 12.04 kernel 3.11dan samba 3.6.3. Hanya beberapa masalah yang saya temukan: 1) Saya harus berlari apt-get source linux-image-$(uname -r)untuk mendapatkan sumber yang tepat. 2) Untuk dapat menjalankan make berhasil saya menyalin fs/cifsfolder sumber di bawah folder de header dengan subpath yang sama dan dikompilasi dari root header make M=fs/cifs, seperti yang dijelaskan di sini: http://www.debian-administration.org/article/640 / Rebuilding_a_single_kernel_module
drodsou