问题
在使用IIS并把samba的目录设置为网站目录的时候,文件不能访问,目录可以访问,文件使用本地的samba挂载目录打开以后,网页就可以访问
问题分析
通过挂载目录可以访问到,说明本身的通信是没有问题的,那么需要通过日志来分析问题
开启samba的日志
log level = 5
log file = /var/log/samba/log.tuine.%m
访问文件得到的日志是
dbwrap_lock_order_unlock: release lock order 1 for /var/lib/samba/lock/smbXsrv_tcon_global.tdb
[2021/10/25 10:12:34.743888, 5] ../../source3/smbd/filename.c:481(unix_convert)
unix_convert called on file "NEWIMAGE/A/A.TXT"
[2021/10/25 10:12:34.743896, 5] ../../source3/smbd/filename.c:682(unix_convert)
unix_convert begin: name = NEWIMAGE/A/A.TXT, dirpath = ., start = NEWIMAGE/A/A.TXT
[2021/10/25 10:12:34.743915, 3] ../../source3/smbd/smb2_server.c:3213(smbd_smb2_request_error_ex)
smbd_smb2_request_error_ex: smbd_smb2_request_error_ex: idx[1] status[NT_STATUS_OBJECT_PATH_NOT_FOUND] || at ../../source3/smbd/smb2_create.c:296
比较关键的是,文件名称被转换成大写
NT_STATUS_OBJECT_PATH_NOT_FOUND]
对象找不到
排查发现配置里面设置了
case sensitive = yes
我们改成no看下
[2021/10/25 10:15:48.653209, 5] ../../source3/smbd/filename.c:481(unix_convert)
unix_convert called on file "NEWIMAGE/A/A.TXT"
[2021/10/25 10:15:48.653411, 5] ../../source3/smbd/vfs.c:1368(check_reduced_name)
check_reduced_name: NEWIMAGE/a/a.txt reduced to /share/NEWIMAGE/a/a.txt
[2021/10/25 10:15:48.653596, 5] ../../lib/dbwrap/dbwrap.c:130(dbwrap_lock_order_lock)
dbwrap_lock_order_lock: check lock order 1 for /var/lib/samba/lock/smbXsrv_open_global.tdb
[2021/10/25 10:15:48.653657, 5] ../../lib/dbwrap/dbwrap.c:159(dbwrap_lock_order_unlock)
dbwrap_lock_order_unlock: release lock order 1 for /var/lib/samba/lock/smbXsrv_open_global.tdb
[2021/10/25 10:15:48.653706, 5] ../../source3/smbd/files.c:137(file_new)
allocated file structure fnum 2517753316 (2 used)
可以看到有一个check_reduced_name,把大写转换成了小写
这个地方的问题是,IIS的请求在后端是大写的请求,而通过samba访问的时候,设置case sensitive = yes,请求也是小写的
print_impersonation_info: Impersonated user: uid=(1001,1001), gid=(0,1001), cwd=[/share]
[2021/10/25 10:18:44.941729, 3] ../../source3/smbd/smb2_read.c:421(smb2_read_complete)
smbd_smb2_read: fnum 3131582861, file NEWIMAGE/a/a.txt, length=8 offset=0 read=8
所以这个地方是在samba与IIS结合的时候,这个case sensitive 不能设置为yes,否则找不到文件
背景介绍
case sensitive是samba是否支持区分大小写的,windows是不支持文件区分大小写的,linux是支持区分大小写的,这个地方实际就是告诉后台是否要跟linux一样不区分大小写,默认情况下是auto,也就是等价与no,不区分大小写
默认情况下,是不区分大小写的,那么后台需要经过转换,请求会需要多次,所以为了性能,我们有的时候会把这个开启为case sensitive = yes来避免性能的衰弱,大部分情况使用也没有问题,但是碰上IIS这种请求都转换成大写的情况,就存在异常的问题,找不到文件
所以通过日志可以抓到这个文件访问不到的问题