最近给机顶盒刷了第三方的 Android TV 7.1.2 ,系统不带 Samba 了,SambaDroid 也经常自己退出不太好用了,Entware 里面的 smbd 也跑不起来,这就很难受。于是就想自己编译一个。(感觉最近都在搞这些东西。。。

edited: 后来我发现清空 /opt/var/lib/samba//opt/var/lock/ 之后 Entware 的 smbd 就可以跑起来了……

  正好看到有人做了 Samba4.1.5 的编译脚本和补丁,改改就能拿来用了。
  如果用 WSL 的话一定要先去掉 $PATH 中 Windows 传进来的环境变量,不然碰到带空格的 Windows 变量会出错。
  还有就是 珍爱生命,不要用 WSL 编译任何东西,CPU 根本跑不满,浪费时间。

auto.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 第 42 行 
CC=aarch64-linux-gnu-gcc \
./configure \
--host=aarch64-linux-gnu \
--build=x86_64-linux \

# 第 103 行开始直到 make
CC=aarch64-linux-gnu-gcc AR=aarch64-linux-gnu-ar LD=aarch64-linux-gnu-ld \
CPP=aarch64-linux-gnu-cpp RANLIB=aarch64-linux-gnu-gcc-ranlib \
CFLAGS="-I$PYTHON_OBJ/include/python2.7 -I$SAMBA/lib/talloc/ -I$SAMBA/lib/tevent \
-I$SAMBA/lib/tdb/include -I$SAMBA/lib/ldb/include/ \
-I$SAMBA/lib/ldb/ -I$SAMBA/source3/include/autoconf/ \
-march=armv8-a+crypto+crc -mtune=cortex-a53" \
LDFLAGS="-Wl,-dynamic-linker,/system/samba/glibc/ld-linux-aarch64.so.1 -Wl,-rpath,/system/samba/glibc" \
LIBDIR="-L$PYTHON_OBJ/lib/" \
python_LDFLAGS="-L$PYTHON_OBJ/lib/ -lpython2.7" \
python_LIBDIR="$PYTHON_OBJ/lib/" \
./buildtools/bin/waf \
configure \
--cross-compile --cross-answers=arm.txt --hostcc=gcc \
--without-acl-support --without-ad-dc --without-ads --without-ldap \
--without-pam --without-pie --without-fam --without-dmapi --without-profiling-data \
--without-winbind --without-regedit --without-automount --without-utmp \
--without-dnsupdate --without-cluster-support \
--disable-cups --disable-iprint \
--disable-gnutls --disable-glusterfs --disable-avahi \
--enable-selftest \
--builtin-libraries=talloc,pytalloc-util \
--bundled-libraries=talloc,pytalloc-util,tdb,tevent,ldb \
--prefix=/system/samba \

make

# --with-aio-support \

  试过静态编译,可编译出来还是 dynamically linked ,后来换成动态的了。
  动态链接的话要在 CFLAGS 里加 -Wl,-dynamic-linker,/path/to/xx.so-Wl,-rpath,/path/to/xxdir ,不然会 No such file or directory
  marchmtune 可以在目标机器上用 gcc -c -Q -march=native --help=target | grep -E 'march=|mtune=' 获取。
  还有就是 --enable-debug--enable-selftest 。有这两个的话万一出错会报错报的很仔细,没有的话直接中断编译除了 error 什么也不留下。
  编译出来有 48 M,感觉有点太大了,我看 SambaDroid 里面的只有 8 MiB…因为 /data 空间很宝贵,我把东西都放到 /system/samba 里面了。
  还有要手动在 /etc 建个 passwd 文件。

/etc/passwd
1
2
3
root:x:0:0:root::/system/bin/sh
miu:x:0:0:root::/system/bin/sh
nobody:x:9999:9999

添加用户设置密码
/system/samba/bin/smbpasswd -a miu

配置文件

/system/samba/etc/smb.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[global]
netbios name = miu
server string = Samba on MIU
unix charset = utf-8
dos charset = ASCII
workgroup = WORKGROUP
#server min protocol = SMB2
wins support = no
security = user
guest ok = yes
guest only = no
browseable=yes
timestamp logs = no
preserve case = yes
short preserve case = yes
socket options = TCP_NODELAY SO_KEEPALIVE IPTOS_LOWDELAY SO_RCVBUF=65536 SO_SNDBUF=65536
log level = 3
passdb backend = smbpasswd
smb encrypt = disabled
load printers = no
printcap name = /dev/null
use sendfile = yes
read raw = yes
write raw = yes
large readwrite = yes
getwd cache = yes
strict locking = no
fake oplocks = yes
oplocks = no

[miu]
comment = Android /storage/emulated/0
path = /storage/emulated/0
read only = no
writable = yes
guest ok = no

[nya]
path = /media/nya
read only = no
writable = yes
guest ok = no

然后再写个脚本开机自动启动。

/system/etc/init.d/99smbd.sh
1
2
3
4
export TMPDIR=/data/local/tmp
/system/bin/mount -o rw,remount /system
/system/samba/sbin/smbd -D
/system/samba/sbin/nmbd -D

脚本开机启动的时候要指定下 TMPDIR ,不然设置开机启动后连接不上,会报错canonicalize_connect_path failed for service IPC$, path /tmp

编译完成的文件,用 tar xvf samba-4.1.5.tar.gz -C / 解压,默认用户名是 miu ,默认密码是 1234