最近给机顶盒刷了第三方的 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 CC=aarch64-linux-gnu-gcc \ ./configure \ --host=aarch64-linux-gnu \ --build=x86_64-linux \ 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
试过静态编译,可编译出来还是 dynamically linked ,后来换成动态的了。 动态链接的话要在 CFLAGS 里加 -Wl,-dynamic-linker,/path/to/xx.so
和 -Wl,-rpath,/path/to/xxdir
,不然会 No such file or directory
。 march
和 mtune
可以在目标机器上用 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 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 [global] netbios name = miuserver string = Samba on MIU unix charset = utf-8 dos charset = ASCII workgroup = WORKGROUP 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 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
。