smb移植到android手机

2018-10-23  本文已影响369人  Ed_Lannister

参考
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目录

上一篇 下一篇

猜你喜欢

热点阅读