一杯清茶~
分类: LINUX
2014-03-04 16:58:39
这几天在跟踪一个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 fcntl64(4, F_SETLKW64, {type=F_WRLCK, whence=SEEK_SET, start=0, len=1}, 0x7ff7aa78) = -1 EACCES (Permission denied) 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
这里简单说明一下这个选项:
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或文件写操作,一定要勾选此配置,换句话说只要配置文件系统这个选项就勾上!