FreeBSD Samba
Samba是使用SMB/CIFS协议提供文件和打印服务共享的开源软件。Samba实现了Windows系统的SMB/CIFS协议,能够在网络中提供一个像本地硬盘和本地打印机一样共享服务。
在FreeBSD上,Samba客户端使用过 net/samba416
软件包安装的,安装以后就可以作为客户端访问Windows网络的SMB/CIFS共享。在同一个samba软件包中,也提供了一个Samba服务,这样FreeBSD也能向网络提供SMB/CIFS共享服务。
备注
根据 pkg search samba
可以找到当前发行版提供了3个版本的Samba,我最初选择安装最新的 net/samba420
,但是实践发现macos客户端访问时 smbd
会crash。网上查到的资料显示,当前FreeBSD整个系统编译都是围绕 net/samba416
完成的,所以我回退到 net/samba416
之后就能正常工作了。果然,按照官方手册是正确。
备注
根据 OpenZFS: System Administration 说明,目前只有 Illumos
(也就是Solaris 11)在ZFS上完整实现了 iSCSI/NFS/SMB
:
Linux平台OpenZFS同时实现了 NFS 和 SMB
FreeBSD凭爱OpenZFS只实现了 NFS
由于我是在FreeBSD上部署ZFS,所以Samba是单独安装软件包进行配置
安装
pkg install net/samba416
服务器配置
Samba配置文件是 /usr/local/etc/smb4.conf
/usr/local/etc/smb4.conf
[global]
workgroup = CLOUDATLAS
server string = Samba Server Version %v
netbios name = XCloud
wins support = Yes
security = user
passdb backend = tdbsam
# Example: share /usr/src accessible only to 'developer' user
[docs]
path = /zdata/docs
valid users = admin
writable = yes
browsable = yes
read only = no
guest ok = no
public = no
create mask = 0666
directory mask = 0755
设置用户密码(这里案例是
admin
用户):
admin
用户密码pdbedit -a -u admin
修订
/etc/rc.conf
配置启动操作系统时启动Samba:
samba_server_enable="YES"
启动 samba:
service samba_server start
输出提示:
Performing sanity check on Samba configuration: OK
Starting nmbd.
Starting smbd.
备注
默认只启动 nmbd
和 smbd
服务。
如果要启动 winbindd
服务,则配置 /etc/rc.conf
添加:
winbindd
服务启动winbindd_enable="YES"
SMB/CIFS协议端口和iptables端口转发
在我的局域网实验环境中,提供Samba服务的FreeBSD(192.168.7.200)和桌面电脑(192.168.1.x)不是一个网段,所以需要通过一个Linux网关实现端口转发。
Samba所实现的SMB/CIFS协议端口可以通过 /etc/services
查到( grep -i NETBIOS /etc/services
以及 grep -i microsoft-ds /etc/services
):
netbios-ns 137/tcp #NETBIOS Name Service
netbios-ns 137/udp #NETBIOS Name Service
netbios-dgm 138/tcp #NETBIOS Datagram Service
netbios-dgm 138/udp #NETBIOS Datagram Service
netbios-ssn 139/tcp #NETBIOS Session Service
netbios-ssn 139/udp #NETBIOS Session Service
microsoft-ds 445/tcp
microsoft-ds 445/udp
以上述端口 138
为例配置端口转发:
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
# 提供samba的服务器IP地址: 192.168.7.200
# 提供Linux网关转发的局域网IP地址: 192.168.7.221
sudo iptables -t nat -A PREROUTING -p tcp --dport 138 -j DNAT --to-destination 192.168.7.200:138
sudo iptables -A FORWARD -p tcp -d 192.168.7.200 --dport 138 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -p tcp -d 192.168.7.200 --dport 138 -j SNAT --to-source 192.168.7.221
为了能够快速完成设置,使用如下脚本:
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
gw_host=192.168.7.221
smb_host=192.168.7.200
for smb_port in 137 138 139 445; do
for protocol in tcp udp; do
sudo iptables -t nat -A PREROUTING -p ${protocol} --dport ${smb_port} -j DNAT --to-destination ${smb_host}:${smb_port}
sudo iptables -A FORWARD -p ${protocol} -d ${smb_host} --dport ${smb_port} -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -p ${protocol} -d ${smb_host} --dport ${smb_port} -j SNAT --to-source ${gw_host}
done
done
异常排查
我在使用macOS连接访问FreeBSD的samba服务,遇到非常奇怪的问题,提示连接,但是仅显示第一层目录之后就一直转菊花。观察后台
smbd.log
日志显示服务crash[2025/06/29 10:45:27.441651, 0] ../../lib/util/fault.c:178(smb_panic_log)
===============================================================
[2025/06/29 10:45:27.441787, 0] ../../lib/util/fault.c:185(smb_panic_log)
INTERNAL ERROR: async open timeout in smbd () (client [192.168.7.221]) pid 42783 (4.20.7)
[2025/06/29 10:45:27.441826, 0] ../../lib/util/fault.c:190(smb_panic_log)
If you are running a recent Samba version, and if you think this problem is not yet fixed in the latest versions, please consider reporting this bug, see https://wiki.samba.org/index.php/Bug_Reporting
[2025/06/29 10:45:27.441875, 0] ../../lib/util/fault.c:191(smb_panic_log)
===============================================================
[2025/06/29 10:45:27.441910, 0] ../../lib/util/fault.c:193(smb_panic_log)
PANIC (pid 42783): async open timeout in 4.20.7
[2025/06/29 10:45:27.443633, 0] ../../lib/util/fault.c:304(log_stack_trace)
BACKTRACE: 20 stack frames:
#0 0x129b613faec7 <log_stack_trace+0x37> at /usr/local/lib/samba4/private/libgenrand-private-samba.so
#1 0x129b613faf9e <smb_panic+0xe> at /usr/local/lib/samba4/private/libgenrand-private-samba.so
#2 0x129b55b7f324 <smbd_exit_server+0x1b4> at /usr/local/lib/samba4/private/libsmbd-base-private-samba.so
#3 0x129b55b7f181 <smbd_exit_server+0x11> at /usr/local/lib/samba4/private/libsmbd-base-private-samba.so
#4 0x129b5f7f1bcc <exit_server+0x1c> at /usr/local/lib/samba4/private/libsmbd-shim-private-samba.so
#5 0x129b55b2a300 <delete_all_streams> at /usr/local/lib/samba4/private/libsmbd-base-private-samba.so
#6 0x129b62b9bdff <tevent_common_invoke_timer_handler+0x18f> at /usr/local/lib/libtevent.so.0
#7 0x129b62b9bfa4 <tevent_common_loop_timer_delay+0x94> at /usr/local/lib/libtevent.so.0
#8 0x129b62b997c5 <tevent_context_same_loop+0xb15> at /usr/local/lib/libtevent.so.0
#9 0x129b62b9536a <_tevent_loop_once+0xea> at /usr/local/lib/libtevent.so.0
#10 0x129b62b955f2 <tevent_common_loop_wait+0x32> at /usr/local/lib/libtevent.so.0
#11 0x129b55b44b4b <smbd_process+0x83b> at /usr/local/lib/samba4/private/libsmbd-base-private-samba.so
#12 0x1293331ffaad <main+0x436d> at /usr/local/sbin/smbd
#13 0x129b62b9667e <tevent_common_invoke_fd_handler+0x9e> at /usr/local/lib/libtevent.so.0
#14 0x129b62b99a44 <tevent_context_same_loop+0xd94> at /usr/local/lib/libtevent.so.0
#15 0x129b62b9536a <_tevent_loop_once+0xea> at /usr/local/lib/libtevent.so.0
#16 0x129b62b955f2 <tevent_common_loop_wait+0x32> at /usr/local/lib/libtevent.so.0
#17 0x1293331fe02f <main+0x28ef> at /usr/local/sbin/smbd
#18 0x1293331fcc2c <main+0x14ec> at /usr/local/sbin/smbd
#19 0x129b63c2de34 <__libc_start1+0x124> at /lib/libc.so.7
[2025/06/29 10:45:27.444092, 0] ../../source3/lib/dumpcore.c:310(dump_core)
unable to change to %N.core
refusing to dump core
我之前看到网上有人询问安装 net/samba419
为何会提示有软件包冲突,有人答复是因为当前整个FreeBSD系统是围绕 net/samba416
编译的依赖。果然,我回退到 net/samba416
之后就能够正常工作了。