这几天在跟踪一个bug,跟踪了几天仍没有定位出原因。
描述一下bug的几个现象:
1.smbd/nmbd进程无法启动,启动后就退出;
2.简单查看发现运行”/sbin/smbpasswd -a admin admin“时,就会报出如下错误:
/mnt/rwfs/etc # /sbin/smbpasswd -a admin admin
tdb(unnamed): tdb_open_ex: failed to get global lock on /etc/secrets.tdb: Permission denied
Failed to open /etc/secrets.tdb
tdb(unnamed): tdb_open_ex: failed to get global lock on /etc/secrets.tdb: Permission denied
Failed to open /etc/secrets.tdb
tdb(unnamed): tdb_open_ex: failed to get global lock on /etc/secrets.tdb: Permission denied
Failed to open /etc/secrets.tdb
pdb_generate_sam_sid: Failed to store generated machine SID.
PANIC: Could not generate a machine SID
Aborted
也就是说这个错误影响了samba的功能;
根据问题现象和以往对samba的经验,我计划从以下几个部分入手:
1.移植到其他平台,查看samba本身是否有错误。(因为我新开发的平台是mips,手边恰好也有另一个mips平台的产品,我就直接搬上去了。samba没报错,可以用)
2.检查配置文件,包括smb.conf,smbpassword,group等,内容、权限等问题。(发现secrets.tdb内容为空,smbpassword也为空)
3.strace(我比较爱用)跟踪,发现问题出在open()前后,好吧,既然如此,只能进入代码去看了!
跟踪命令如下:
./strace -f /sbin/smbpasswd -a admin admin
截取重点信息如下:open("/lib/valid.dat", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
7564 geteuid() = 0
7564 getuid() = 0
7564 open("/etc/secrets.tdb", O_RDWR|O_CREAT|O_LARGEFILE, 0600) = 4
7564 <span style="color:#FF0000;"> fcntl64(4, F_SETLKW64, {type=F_WRLCK, whence=SEEK_SET, start=0, len=1}, 0x7ff7aa78) = -1 EACCES (Permission denied)</span>
7564 write(1, "tdb(unnamed): tdb_open_ex: faile"..., 92) = 92
7564 close(4)
嘿嘿,发现了,问题原因可能出在“fcntl64失败”。这个函数的具体用法找谷哥/度娘,这里不解释;
总之跟踪到最后找到“正解“,编译kernel时未配置file lock”有可能导致这个问题,查看/linux/fs下的lock和fcntl是否有编译,一看果然没有编译。勾选配置;
Linux Kernel v2.6.36 Configuration
File systems---->
[*] Enable POSIX file locking API
这里简单说明一下这个选项:
The Linux kernel configuration item CONFIG_FILE_LOCKING:
- prompt: Enable POSIX file locking API
- type: bool
- depends on:
CONFIG_EXPERT - defined in fs/Kconfig
- found in Linux kernels: 2.6.28–2.6.39, 3.0–3.12, 3.12+HEAD (重点哦!)
This option enables standard file locking support, required for filesystems like NFS and for the flock() system call. Disabling this option saves about 11k.
OK,刚好我kernel是2.6.36,在以前的版本如kernel2.6.21这个配置是不可选择的,也就是系统默认打开的。我想从2.6.28开始这个配置打开了。我并没想清楚kernel小组为什么要这么做呢?这是个疑问。这个配置知道就好,我觉得也没必要深究,有时间可以研究一下为什么要这么修改!
总之,如果你的需求中需要对device或文件写操作,一定要勾选此配置,换句话说只要配置文件系统这个选项就勾上,算是标配吧!
这篇博客介绍了作者在跟踪一个samba无法启动的bug时,发现错误提示'Failed to open /etc/secrets.tdb'。通过检查配置文件、使用strace跟踪和深入代码分析,确定问题可能源于Linux内核未配置'Enable POSIX file locking API'选项。在Linux Kernel v2.6.36中启用该选项后,解决了samba的问题。
11万+

被折叠的 条评论
为什么被折叠?



