这里我选用的版本是3.6.10,交叉编译比较容易,后面有说明,先说说编译完后调试需要注意的几个问题!
问题1:SamInfo3_for_guest: Unable to locate guest account [nobody]!
我估计是没有nobody这个用户导致的,于是在passwd文件中加入了nobody这个用户后果然好了。(注意:这里的/etc/passwd文件在android下本来是没有的,是我手动加的,里面的记录也是我手工加的,至于怎么加,需要重新mount system分区为rw才能完成,如我是执行:mount -o remount,rw /dev/block/mmcblk0p9 system命令。当然也可以在Adb下直接执行adb remount)
vi /etc/passwd加入如下两条记录(红色):
root@android:/data/data/test/etc # cat /etc/passwd
root::0:0:root:/data/data/test:/system/bin/sh
nobody::65534:65534:nobody:/nonexistent:/system/bin/sh
root@android:/data/data/test/etc #
问题2:能看到共享目录,但一进入就卡死,查看smbd日志有如下错误打印:
[2013/01/10 08:49:16.335483, 0] smbd/vfs.c:173(vfs_init_custom)
error probing vfs module 'fake_perms': NT_STATUS_UNSUCCESSFUL
[2013/01/10 08:49:16.336495, 0] smbd/vfs.c:315(smbd_vfs_init)
smbd_vfs_init: vfs_init_custom failed for fake_perms
[2013/01/10 08:49:16.337105, 0] smbd/service.c:902(make_connection_snum)
vfs_init failed for service test
我看见日志中有“fake_perms”的打印,想到自己从网上拷贝的smb.conf文件中也有这么一项估计是这个导致的,于是注释掉,OK。
[test]
#vfs objects = fake_perms
comment = Android /mnt/sdcard
#path = /mnt/sdcard
path = /data/data/test
#path = /etc
force user = root
read only = no
writable = yes
samba-3.6.10交叉编译的配置文件及调试方法:
echo samba_cv_CC_NEGATIVE_ENUM_VALUES=yes > my.cache
echo "samba_cv_HAVE_Werror=yes" >> my.cache
echo "samba_cv_HAVE_Werror_implicit_function_declaration" >> my.cache
echo "samba_cv_CC_NEGATIVE_ENUM_VALUES=yes" >> my.cache
./configure --prefix=/home/rebi/cross_tools/samba-3.6.10/source3/_install --host=arm-unknown-linux-gnueabi -cache-file=my.cache --with-quotas=no --with-sys-quotas=no --enable-swat=no --enable-smbtorture4=no --enable-cups=no --enable-pie=no --enable-relro=no --enable-fam=no --enable-avahi=no --with-rootsbindir=/data/data/test --with-statedir=/data/data/test/etc --with-cachedir=/data/data/test/etc --with-ncalrpcdir=/data/data/test/etc --with-nmbdsocketdir=/data/data/test/etc --with-logfilebase=/data/data/test/etc --with-privatedir=/data/data/test/etc --with-privatedir=/data/data/test/etc --with-swatdir=/data/data/test/etc --with-lockdir=/data/data/test/etc --with-piddir=/data/data/test/etc --with-configdir=/data/data/test/etc LDFLAGS="-Wl,-dynamic-linker=/data/app/ld-linux.so.3"
注意,我把privatedir、piddir等全部都指定到/data/data/test/etc目录下去了,所以需要在手机上建立这个目录。
编成功后无需make install,直接去source3下的bin目录下将smbd,nmbd, smbpasswd, testparm拷贝出来就行了。
传到手机上后,先执行./smbpasswd -a root,增加一个root用户并给它设置上密码。
考虑到调试需要反复启动杀死smbd及nmbd我先了一个脚本文件调试samba.sh:
#!/bin/sh
case "$1" in
restart)
killall -9 smbd nmbd 2>/dev/null
./smbd
./nmbd
;;
stop)
killall -9 smbd nmbd
;;
start)
./smbd
./nmbd
;;
*)
echo "invalid param: $1"
;;
esac
脚本在使用时带参数:如sh samba.sh restart就是重启samba服务。
我使用的完整的smb.conf如下(由于我修改了代码中的路径,所以这个文件需要放在/data/data/test/etc目录下),对这个文件修改后如果不确定,可以执行./testparm来检测一下,这也是为什么要把它拷过来的原因。
root@android:/data/data/test/etc # cat smb.conf
[global]
interfaces = 192.168.1.11/24
workgroup = WORKGROUP
server string = Samba on Android
netbios name = ANDROID
remote announce = 255.255.255.255
encrypt passwords = yes
security = user
#security = share
restrict anonymous = 1
load printers = no
printcap name = /dev/null
disable spoolss = yes
deadtime = 5
delete readonly = yes
nt acl support = no
inherit permissions = yes
socket options = SO_SNDBUF=16384 SO_RCVBUF=16384
[test]
#vfs objects = fake_perms
comment = Android /mnt/sdcard
#path = /mnt/sdcard
path = /data/data/test
#path = /etc
force user = root
read only = no
writable = yes
#guest ok = no
browseable = yes