smb移植到android手机
参考
http://blog.csdn.net/jk198310/article/details/15809341
https://blog.csdn.net/mmmccc000/article/details/52893141
samba现在迭代很快,版本间变化挺大,先整理一个网上已经有的3.5.9的版本,最新版本由于重构变化较大,后续在探索更新用法。
交叉编译工具包是arm-none-linux-gnueabi-xxx,网上版本很多,我用的arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2。下载安装方法此处不表。
首先解压samba-3.5.9.tar.gz,进入到samba-3.5.9目录下的source3目录下
:~/programfiles/samba-3.5.9/source3$
source3/lib/system.c作修改4个函数 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)
为了避免出错,建议先备份system.c为system.c_bak.然后拷贝一份进行修改
//结构体为需要新增部分,注释掉的为更改部分
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);
}
然后在source3目录下编写交叉编译的配置脚本insatll.sh:
#!/bin/bash
//注意这里是为了使用一系列的工具,后续会做拼接,注意写法
CROSS_COMPILE=你自己的交叉编译工具的绝对目录/bin/arm-none-linux-gnueabi-
//这里会定义执行时的目录,比如存放log的操作
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 \
如果出现如下错误:
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:
make LDFLAGS="-all-static -static"
上面这外是为把smbd, nmbd等编译为静态的。(不然在Android上执行会出现 no such file or directory问题)
我在执行这一步遇到了以下错误:
error:file not recognized;file format not recognized
或者
configure:error: require function not found
错误纠结了很长时间,最后才发现交叉编译gcc版本问题,make distclean清除,将交叉编译工具改为我上面说的工具,应该就没问题了。
随便在某个目录下(能快速找到就行)建一个smb.conf配置文件,比如我直接在source3下vim smb.conf
[global]
#interfaces设置samba将对哪些网络接口进行服务。
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
#这个目录即是使用samba共享出来的tmp目录,这里可以随意更改path
[test]
comment = Android /mnt/sdcard
path = /data/data/samba/var/tmp
force user = root
read only = no
writable = yes
browseable = yes
#这里的块都代表了一个共享目录,这个是sdcard的目录
[sdcard]
vfs objects = fake_perms
comment = Android /mnt/sdcard
path = /mnt/sdcard
force user = root
read only = no
writable = yes
guest ok = no
然后建立adb shell 进入到手机adb下
cd /data/data/
mkdir samba
cd samba
mkdir bin etc lib var
cd etc
mkdir samba
cd ../var
mkdir lock tmp log
文件夹建立完成后exit退出adb,然后在 source3目录下
adb push smb.conf /data/data/samba/etc/samba //将smb.conf导入手机/data/data/samba/etc/samba中
进入到bin目录下:
adb push smbd /data/data/samba/bin
adb push nmbd /data/data/samba/bin
adb push smbpasswd /data/data/samba/bin
这里放到data目录下待会儿启动samba服务会找不到smbd命令,所以,这里应该将smbd,nmbd,smbpasswd推到system bin下面去
在adb下用
//这里在手机里面修改临时目录路径,这个很容易就发生改变了,而且也不是必须
export TMPDIR=/data/data/samba/var/tmp/ //设置TMPDIR环境变量
echo $TMPDIR
smbd -D 启动samba服务,
nmbd -D 启动samba网络服务
smbpasswd -a accountname 添加用户/设置密码
你在tmp目录下建立一个目录share,
然后在adb下用ifconfig命令查看手机IP 地址;
这时候你就可以通过windows下,用win+R键调出运行框,或者在linux系统下通过smb://ip地址/ 就可输入accountname和密码,登录成功就可一看到share目录