마운트 된 CIFS 드라이브를 공유 할 때 파일로 표시되는 디렉토리


8

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에서 직접 공유에 액세스 할 때 아무런 문제가 없습니다.

삼바의 버전은 3.6.6이지만 변경 로그에서 관련성이없는 것을 찾을 수 없습니다.

권한, 사용자 및 그룹이 다른 다른 위치에 마운트하려고 시도했지만 아무런 진전이 없었습니다.

serverfault (주로 stackoverflow user)에 대한 평판이 낮아서 디렉토리가 파일로 표시되는 스크린 샷을 게시 할 수 없습니다.

탐색기에 전체 경로를 입력하면 파일로 표시되는 하위 디렉토리를 제외하고 디렉토리 목록이 훌륭하게 작동합니다.

이 문제에 대한 공격 벡터는 대단히 감사하겠습니다.

세부 정보가 충분하지 않은 경우 알려주십시오.

편집 : OS X에서 액세스 할 때 동일한 공유가 디렉토리를 디렉토리로 완벽하게 나열합니다. 친애하는!

답변:


7

마침내 문제를 해결했습니다.

시간이있을 때이 답변을 더 많이 쓰려고 노력할 것입니다.

이 문제는 cifs 파일 시스템을 다시 공유 한 다음 Windows7 컴퓨터에서이 파일에 액세스하는 데 연결되어 있습니다.

삼바 버그는 여기에 있습니다 : https://bugzilla.samba.org/show_bug.cgi?id=9346

이것은 정보가 cifs로 inode에 설정되는 방식에서 비롯된 것입니다.

여기에서 버그를 참조하십시오 : https://bugzilla.kernel.org/show_bug.cgi?id=52791

따라서 Samba가 Windows 클라이언트에 대해 결정하는 방식은 속성을 테스트하는 대신 하드 링크 수를 세는 것입니다. cifs (어떤 모호한 이유로)가 항상이 값을 0으로 설정하므로 디렉토리에 항상 2 개 이상이 있으면 디렉토리는 Windows 클라이언트 용 파일로 나타납니다.

그래서 이것을 "수정"하기 위해 현재 커널 헤더와 리눅스 소스 코드를 설치했습니다 :

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를 중지하고 보유한 공유를 마운트 해제하고 현재 cifs를 제거하고 다시 컴파일 된 것을 설치할 수 있습니다.

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;} 메소드를 작성하는 것과 같습니다. 당신은 대부분의 시간에 옳을 것이지만, 그렇지 않을 때가 있습니다.
Kennet Belenky

1
감사합니다, 패치 나 실행 근무 Ubuntu 12.04 kernel 3.11하고 samba 3.6.3. 내가 찾은 몇 가지 문제 : 1) apt-get source linux-image-$(uname -r)적절한 출처를 얻기 위해 달려야 했습니다. 2) make를 성공적으로 실행하려면 fs/cifs동일한 하위 경로가있는 de headers 폴더 아래에 sources 폴더를 복사하고 http://www.debian-administration.org/article/640make M=fs/cifs 과 같이 헤더 루트에서 컴파일했습니다 . / Rebuilding_a_single_kernel_module
drodsou
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.