OpenWrt/LEDE的samba服务器配置

在路由器上设置samba服务器,分享插入U盘的内容,兼容Windows读写权限。

安装USB驱动

不同USB控制器,有不同的USB控制器驱动

  • xhci for USB3.0
  • ehci for USB2.0
  • uhci or ohci for USB1.1

首先要成功挂载USB盘符,根据不同的文件系统,可选安装不同的驱动,比如下面只安装ext4和FAT32驱动。若要读写NTFS分区,参考Openwrt Wiki: Writeable NTFS,即安装ntfs-3g软件包

opkg update

opkg install \
  kmod-usb-storage \
  kmod-fs-ext4 \
  kmod-fs-vfat \
  mkf2fs \
  f2fsck

检查USB控制器是否工作正常

opkg install usbutils
lsusb -t

结果如下(以USB3.0控制器为例)

root@OpenWrt:~# lsusb -t
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/0p, 5000M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M

安装完后,插入USB磁盘,应该可以观察到/dev/下面多了sda sda1 sda2等块设备,测试一下是否挂载成功:

mkdir /tmp/sda1
mount /dev/sda1 /tmp/sda1
umount /tmp/sda1

自动挂载/卸载U盘

可以直接安装block-mount软件包,这样在luci web的system->mount points界面勾选“Anonymous Mount, Mount filesystems not specifically configured”即可自动挂载。

opkg install block-mount

若不安装block-mount软件包,也可以通过hotplud脚本实现自动挂载(但是umount部份显得太暴力)。从网上抄的一段代码:

# 编辑
vi /etc/hotplug.d/block/10-mount

# 插入以下代码
case "$ACTION" in
    add)
        for i in $(ls /dev/ | grep 'sd[a-z][1-9]')
        do
            mkdir -p /mnt/$i
            mount -o iocharset=utf8,rw /dev/$i /mnt/$i
            if [ $? -ne 0 ]
            then
                mount -o rw /dev/$i /mnt/$i
            fi
        done
        ;;
    remove)
        MOUNT=`mount | grep -o '/mnt/sd[a-z][1-9]'`
        for i in $MOUNT
        do
            umount $i
            if [ $? -eq 0 ]
            then
                rm -r $i
            fi
        done
        ;;
esac

实现U盘热插拔自动挂载卸载。

配置samba

本文以samba3为例(较老的版本,占用空间较少,但性能一般,若追求性能可以选用samba4,从openwrt 18.06开始官方支持samba4)

安装luci程序,它会自动安装samba36。

opkg install luci-app-samba

在Luci web的Service->Network share中General settings取消这个选项,不让其显示多余的HOME目录

Share home-directories

由于我是使用root用户进行u盘读写,设置允许root登陆samba才能实现写权限(若追求权限管理安全,请不要开启root登陆,本文贪图一时方便。)

vi /etc/samba/smb.conf.template

# 注释这句 invalid users = root

# 添加NTLMv2认证,否则samba在NT6内核以上(win7,8,10)登陆samba认证失败
client ntlmv2 auth = yes

# 若要监听所有接口(0.0.0.0),将bind only设置为no
bind interfaces only = no

新建一个samba用户root,并设置合适的密码

smbpasswd -a root

日后修改密码

smbpassed root

然后luci界面中Services->Network Share设置分享的目录。下面的文件掩码设置为最大(不安全)

Name Path Allowed users Read-Only Allow Guest CreateMask DirMask
mnt /mnt root 0777 0666
tmp /tmp/ 0022 0022

上述设置代表分享两个目录

  • mnt: 只允许root登陆,对应/mnt(上面smbpasswd命令中设置的密码)
  • tmp: 允许匿名登陆,对应/tmp(实际上匿名只有只读权限,因为/tmp的所有者是root)

点击luci底部的save & apply或者/etc/init.d/samba restart重启samba服务。

添加用户

若不想使用root用户作为samba的使用者,可以自行增加用户。但是对相应的目录有对应的读写权限。

因为openwrt默认设计成单用户(root),故手工编辑文件增加用户

这里以新用户newuser和新的组newuser为例,假设新的UID=734和GID=734均未被系统使用。 对以下3个文件,分别添加一行

文件 添加一行
/etc/passwd newuser:x:734:734:newuser:/tmp:/bin/false
/etc/group newuser:x:734:
/etc/shadow newuser:xyzDummyString:16666:0:99999:7:::

给Linux系统用户重新修改密码

pass newuser

然后按照正常的samba命令添加用户

smbpasswd -a newuser

将用户填入Luci界面中的Allowed Users即可。

samba性能

最好使用LAN有线测试性能,确认为最佳性能再使用无线测试。

修改smb.conf.template文件

# No NTLMv1, force NTLMv2
ntlm auth = no
client ntlmv2 auth = yes
client use spnego principal = no
client max protocol = SMB3
server max protocol = SMB3

# buffer size
socket options = TCP_NODELAY SO_KEEPALIVE IPTOS_LOWDELAY SO_RCVBUF=131072 SO_SNDBUF=131072
use sendfile = yes
aio read size = 16384
aio write size = 16384
write raw = yes
read raw = yes

其它优化:对sysctl.conf文件增加读写缓冲内存(会显著增加内存使用),这里就不列出了,感觉都没什么效果。