android 移植 samba 服务
from: http://hi.baidu.com/left99/item/1932f412063629011894ecc9参考这篇文章,根据自己的情况贴一遍。本文中使用的源码是samba-3.5.9,交叉编译工具是arm-linux-gcc-4.4.3。本文件中使用的路径为相对于源码根目录的路径。第一步要修改一下源码,不然不能正常运行,因为在android中不知什么原因get
from: http://hi.baidu.com/left99/item/1932f412063629011894ecc9
参考这篇文章,根据自己的情况贴一遍。
本文中使用的源码是samba-3.5.9,交叉编译工具是arm-linux-gcc-4.4.3。
本文件中使用的路径为相对于源码根目录的路径。
第一步要修改一下源码,不然不能正常运行,因为在android中不知什么原因getpwnam等不能使用的,总是失败。
把
lib/system.c
中的4个函数
struct passwd *sys_getpwnam(const char *name)
struct passwd *sys_getpwuid(uid_t uid)
struct group *sys_getgrnam(const char *name)
struct group *sys_getgrgid(gid_t gid)
改为:
static struct passwd rootpw = {
"root",
"root",
0,
0,
"root",
"/root"
"/system/bin/sh",
};
struct passwd *sys_getpwnam(const char *name)
{
// return getpwnam(name);
return &rootpw;
}
struct passwd *sys_getpwuid(uid_t uid)
{
// return getpwuid(uid);
return &rootpw;
}
static char *rootmem[] = {
"root"
};
static struct group rootgr = {
"root",
"root",
0,
rootmem,
};
struct group *sys_getgrnam(const char *name)
{
return &rootgr;
// return getgrnam(name);
}
struct group *sys_getgrgid(gid_t gid)
{
return &rootgr;
// return getgrgid(gid);
}
配置脚本:
#!/bin/bash
CROSS_COMPILE=/home/wzh/work/cross/4.4.3/bin/arm-none-linux-gnueabi-
RUNTIME_DIR=/data/data/samba
./configure \
CC="$CROSS_COMPILE"gcc \
AR="$CROSS_COMPILE"ar \
LD="$CROSS_COMPILE"ld \
RANLIB="$CROSS_COMPILE"ranlib \
--host=i686 \
--target=arm-linux \
--disable-cups \
--disable-iprint \
--prefix=$RUNTIME_DIR \
--exec-prefix=$RUNTIME_DIR \
--with-logfilebase=$RUNTIME_DIR/var/log \
--with-swatdir=$RUNTIME_DIR/usr/local/swat \
--with-rootsbindir=$RUNTIME_DIR/sbin \
--with-lockdir=$RUNTIME_DIR/var/lock \
--with-piddir=$RUNTIME_DIR/var/lock \
--with-privatedir=$RUNTIME_DIR/etc/samba \
--with-configdir=$RUNTIME_DIR/etc/samba \
--cache-file=armsel-linux.cache \
--with-static-modules=vfs_fake_perms \
把它放到source3目录下执行。
执行该编译脚本过程中会出现问题,如下:
3.1 error: cannot run test program while cross compiling错误
checking that the C compiler understands negative enum values... configure: error: in `/root/samba-3.3.3/source':
configure: error: cannot run test program while cross compiling
解决方法:
echo samba_cv_CC_NEGATIVE_ENUM_VALUES=yes>armsel-linux.cache
再一下执行脚本
然后在source3目录下执行:
make LDFLAGS="-all-static -static"
上面这外是为把smbd, nmbd等编译为静态的。(不然在Android上执行会出现 no such file or directory问题)
对于samba的配置文件在:
/data/data/samba/etc/samba/smb.conf
内容如下:
[global]
interfaces = wlan0 eth0 lo
workgroup = WORKGROUP
server string = Samba on Android
netbios name = ANDROID
remote announce = 255.255.255.255
encrypt passwords = yes
security = USER
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
[sdcard]
vfs objects = fake_perms
comment = Android /mnt/sdcard
path = /mnt/sdcard
force user = root
read only = no
writable = yes
guest ok = no
注意下面这几行:
vfs objects = fake_perms
force user = root
samba的环境设置:
注意配置脚本中的:
RUNTIME_DIR=/data/data/samba
创建几个文件夹:
mkdir /data/data/samba/etc
mkdir /data/data/samba/var/log
mkdir /data/data/samba/var/lock
mkdir /data/data/samba/lib
mkdir /data/data/samba/etc/samba
mkdir /tmp
/tmp这个目录是必须的,不然看不到共享目录。
这个目录应该可以放到任一位置。
这个目录可能通过下面的命令来指定:
export TMPDIR=/data/data/samba/var/tmp/
在lib/util/util.c
中有这样的函数:
_PUBLIC_ const char *tmpdir(void)
{
char *p;
if ((p = getenv("TMPDIR")))
return p;
return "/tmp";
}
创建几个空文件:
/data/data/samba/etc/printcap
/data/data/samba/lib/valid.dat
要用编译生成的程序:
nmbd
smbd
smbpasswd
testparm
使用时首先要用smbpasswd新加一个用户,不然,在共享目录下不然看到文件夹。
$smbdpasswd -a root
$nmbd -D
$smbd -D
应用的话,可以参考Samba Filesharing,google play 可以下载。
更多推荐
所有评论(0)