【原創】samba移植到android流程

參考這一篇文章http://blog.csdn.net/jk198310/article/details/15809341
然後結合自己實際操作過程中遇到的一些問題總結出來這個流程
最近做一個關於把samba服務移植到安卓項目,網上不乏一些文章,但是照着文章做還是會出現好多問題,不得不各種百度,google,終於克服困難成功運行起來,
所以把自己記得的流程記錄下來,結合網上一些文章總結,並將自己實際遇到的問題貼出來;
廢話少說
下面是具體流程:
我用的samba包是samba-3.5.9,交叉編譯工具包是arm-linux-gcc-4.4.3.tar.gz
首先解壓samba-3.5.9.tar.gz,進入到samba-3.5.9目錄下的source3目錄下
:~/programfiles$ cd 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.文件,或者像我這樣把原始四個函數註釋掉,然後添加修改後的函數,如下:
/*
struct passwd *sys_getpwnam(const char *name)
{
return getpwnam(name);
}

struct passwd *sys_getpwuid(uid_t uid)
{
return getpwuid(uid);
}

struct group *sys_getgrnam(const char *name)
{
return getgrnam(name);
}

struct group *sys_getgrgid(gid_t gid)
{
return getgrgid(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);
}

然後在source3目錄下編寫交叉編譯的配置腳本insatll:
#!/bin/bash
CROSS_COMPILE=/home/sunfch/programfiles/opt/FriendlyARM/toolschain/4.4.3/bin/arm-none-linux-gnueabi-                                    //這個根據你自己解壓後交叉編譯工具的目錄,及選擇arm-none-linux-gnueabi-gcc   編譯,

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 LDFLAGS="-all-static -static"

上面這外是爲把smbd, nmbd等編譯爲靜態的。(不然在Android上執行會出現 n
o 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 = 192.168.0.103/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/samba/var/tmp
#path = /etc
force user = root
read only = no
writable = yes
#guest ok = no
browseable = yes

然後建立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 smbpasswd /data/data/samba/bin
 


在adb下用
export TMPDIR=/data/data/samba/var/tmp/              //設置TMPDIR環境變量

bin/smbd -D 啓動samba服務,
bin/smbpasswd -a root 添加root用戶

你在tmp目錄下建立一個目錄share,
然後在adb下用netcfg命令查看手機IP 地址;
這時候你就可以通過windows下,用win+R鍵調出運行框
輸入\\192.168.0.103
就可輸入root和密碼,登錄成功就可一看到share目錄

本人親測
有什麼問題可以聯繫我:qq:996340566
skype:zhou.lei1992


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> 閱讀(62) | 評論(0) | 轉發(0) |
評論熱議
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章