Các thư mục được hiển thị dưới dạng tệp, khi chia sẻ ổ đĩa cifs được gắn


8

Tôi gặp sự cố trong đó một thư mục được hiển thị dưới dạng tệp khi truy cập vào chia sẻ samba (trên Ubuntu 12.10) từ máy Windows.

Đầu ra từ ls -ll trong thư mục trên linuxbox như sau:

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

Mục trong / etc / fstab là:

# 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

Khi tôi truy cập chia sẻ trực tiếp từ NAS trên hộp Windows của mình, không có vấn đề gì.

Phiên bản của Samba là 3.6.6, nhưng tôi không thể tìm thấy bất cứ thứ gì trong các thay đổi có vẻ phù hợp.

Tôi đã thử gắn nó ở các vị trí khác nhau với các quyền, người dùng và nhóm khác nhau nhưng tôi không đạt được tiến bộ nào

Do uy tín thấp của tôi trên serverfault (chủ yếu là người dùng stackoverflow), tôi không thể đăng ảnh chụp màn hình cho thấy các thư mục được hiển thị dưới dạng tệp.

Nếu tôi gõ đường dẫn đầy đủ trong explorer, danh sách thư mục hoạt động xuất sắc, ngoại trừ mọi thư mục con sau đó được hiển thị dưới dạng tệp.

Bất kỳ vector tấn công cho vấn đề này sẽ được đánh giá rất cao.

Xin vui lòng cho tôi biết nếu tôi đã cung cấp không đủ chi tiết.

Chỉnh sửa: Chia sẻ tương tự khi được truy cập từ OS X, hoạt động hoàn hảo liệt kê các thư mục dưới dạng thư mục. Trân trọng!

Câu trả lời:


7

Cuối cùng tôi đã giải quyết được vấn đề.

Tôi sẽ cố gắng viết câu trả lời này ra nhiều hơn khi tôi có thời gian.

Vấn đề được kết nối với việc chia sẻ lại hệ thống tập tin cifs và sau đó truy cập vấn đề này từ máy tính Windows7.

Lỗi samba có ở đây: https://ormszilla.samba.org/show_orms.cgi?id=9346

Điều này rõ ràng bắt nguồn từ cách thông tin được thiết lập trên inode trong cifs.

Xem lỗi tại đây: https://ormszilla.kernel.org/show_orms.cgi?id=52791

Vì vậy, cách Samba nói xác định (đối với các máy khách Windows của nó) là bằng cách đếm số lượng liên kết cứng, thay vì kiểm tra thuộc tính. Vì cifs (vì một số lý do mơ hồ) luôn đặt giá trị này thành 0, trong đó một thư mục luôn có ít nhất hai, thư mục sẽ xuất hiện dưới dạng tệp cho các máy khách Windows.

Vì vậy, để "khắc phục" điều này, tôi đã cài đặt các tiêu đề kernel hiện tại và mã nguồn linux:

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

Sau đó tôi đã đi đến /usr/src/linux-source-3.5.0và trích xuất các kho lưu trữ ở đó.

Tìm thư mục /usr/src/linux-source-3.5.0/linux-source-3.5.0/fs/cifs tôi thay đổi các mục sau trong tệp inode.c(dòng 135):

set_nlink(inode, fattr->cf_nlink);

đến:

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

Sau đó, tôi đã tạo một tệp thực hiện để dễ dàng biên dịch (và tránh các lỗi insmod gây phiền nhiễu) Makefile2::

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

Điều này cho phép chúng tôi làm (trong cùng một thư mục): sudo make -f Makefile2

Điều này cung cấp cho chúng tôi một tập tin được gọi là cifs.ko.

Vì vậy, bây giờ chúng tôi có thể ngăn Samba, hủy kết nối bất kỳ cổ phiếu nào chúng tôi có, loại bỏ các cif hiện tại và cài đặt một biên dịch lại.

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

Đối với tôi, đây là một mẹo nhỏ, nếu bạn khởi động lại hộp, thay đổi này sẽ không tồn tại. Tôi sẽ thêm vào bài viết này khi tôi tìm ra một cách tốt để làm điều này.

Vui lòng ném bất kỳ câu hỏi hoặc làm rõ bạn yêu cầu theo cách của tôi, tôi có thể sẽ học hỏi từ nó :)

Cũng nhờ vào kukks trong #samba trên freenode, tôi đã học được rất nhiều thứ ở đó, mặc dù cuối cùng tôi đã chuyển sang một hướng khác.


3
Wow, đó là loại lỗi khiến tôi tự hỏi "họ đang nghĩ cái quái gì khi họ viết vậy?" Nếu bạn muốn phát hiện một thuộc tính, truy vấn thuộc tính, đừng nhìn vào một mối tương quan lỏng lẻo. Nó giống như viết một phương thức: bool isPirate () {return pegLegs == 1;}. Bạn sẽ đúng hầu hết thời gian, nhưng có một số thời điểm đáng kể khi bạn sẽ không.
Kennet Belenky

1
Cảm ơn, các bản vá làm việc cho tôi chạy Ubuntu 12.04 kernel 3.11samba 3.6.3. Chỉ cần một vài vấn đề tôi tìm thấy: 1) Tôi phải chạy apt-get source linux-image-$(uname -r)để có được nguồn thích hợp. 2) Để có thể chạy thành công, tôi đã sao chép fs/cifsthư mục nguồn trong thư mục de headers với cùng một đường dẫn phụ và được biên dịch từ thư mục gốc với make M=fs/cifs, như được giải thích ở đây: http
lại_a_single_kernel_module
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.