smb
配置smb访问服务器资源
Finder也能当FileZilla用
smb概述
smb是一个文件共享协议,常常用在NAS上,不过也可以用在服务器上。smb最大的好处就是Finder支持,亲测Finder不能挂ssh连接的文件系统。FileZilla是基于ssh的,但是界面太丑了。
配置好smb后,用Finder连接服务器,甚至可以用VSCode打开目录,直接编辑原始文件。对于GUI用户来说这比git确实好用多了。
直接用公网ip作为smb地址的话似乎不太安全,所以我的服务器管理都在tailscale内网里。不过网络配置这块对smb配置是基本透明的,不用太操心这个。
服务器端配置
初始化
sudo apt update
sudo apt install samba
smb的用户系统
smb有一个自己的用户系统,和系统的用户不一样。然而,smb的用户系统是依赖于系统的用户的。smb的用户是系统的用户的子集。我就不追求结构化的语言了,直接给实际例子。
假设服务器现在只有一个用户me,他具有root权限(这是绝大多数服务器的常见情景)。如果想部署smb,必须添加一个新用户,因为smb用户不能是拥有root权限的用户。这一点有待考证,但我实测如此。
- 添加系统用户。添加用户smbu作为smb专用的用户。
sudo useradd -M -s /sbin/nologin smbu
adduser也是可以的,不过这会导致多出来一个/home/smbu,参数少的代价就是混乱。
sudo adduser smbu
现在我们有系统用户:
- me,有root权限
- smbu,无root权限,不需要设置shell和home目录
- 添加smb用户
sudo smbpasswd -a smbu
sudo smbpasswd -e smbu
sudo pdbedit -L
过程中需要输入密码,这个密码是smb管理的,独立于系统中这个用户的密码。
- 验证
getent passwd smbu
如果有输出,则添加成功了。
创建smb目录
smb分享的目录的权限是一个复杂的问题,所以在简单的情境下,我们先创建一个smb专用的目录。一会还会讨论共享已有目录的方法。
sudo mkdir -p /srv/samba
sudo chown smbu:smbu /srv/samba
sudo chmod -R 777 /srv/samba
配置smb.conf
sudo nano /etc/smaba/smb.conf
smb的几乎所有行为都在这里配置。它主要分为两个模块:
- [global],全局行为,基本不用管,用默认配置就可以
- [share],配置每个分享
默认配置中会有几个share,不用管,直接在最下面添加自己的就可以。
[samba]
path = /srv/samba
valid users = smbu
guest ok = no
read only = no
browsable = yes
每次修改后都重启一遍服务
sudo systemctl restart smbd nmbd
sudo systemctl status smbd
这就完事了!
客户端配置
linux客户端
使用linux客户端测试是最方便的,命令简单直观。
sudo apt install smbclient
smbclient -L 100.64.x.x -U smbu
这会列出服务器提供的share,此时应该出现samba的条目。
smbclient 100.64.x.x -U smbu
这将进入smb交互界面。
mac客户端
当然,我们的终极目标是在mac上访问。打开访达,在菜单栏中找到“前往-连接服务器”(cmd+K),在弹出的窗口的地址栏输入
smb://100.64.x.x/samba
弹出认证界面,输入smbu和密码就可以了。此时就可以在访达中看到共享的目录,可以往里拖入文件,就像这个目录在本机上一样。
然而,访达时常出问题。也可以用命令行测试smb的连通性。
sudo mkdir /Volumes/test
mount_smbfs //[email protected]/samba /Volumes/test
smbutil似乎也是能用的,可以试试。
共享其他目录
如果只能共享一个中转站,那smb就太鸡肋了。所幸它可以共享已经存在的、属于其他用户的目录,而且也能随意操作,同时不破坏原有的权限。为什么能这样?因为smb是拥有sudo权限的(大概)。
在下面这个例子里,我们要共享/home/me/site,从而实现在mac上操作网站相关的文件。在smb.conf的末尾添加:
[site]
path = /home/me/site
valid users = smbu
force user = me
guest ok = no
read only = no
browsable = yes
writable = yes
create mask = 0644
directory mask = 0755
关键就在与force user字段,这会告诉smb,在操作时“假装”用的是用户me。也就是说,smbu用户smb认证,me用户用来操作文件。后面的两个mask则确保了创建文件时不会出现权限问题。
在用访达连接时,大概率不用再输入用户密码,因为它默认一个服务器上只用一个用户来连接smb。这也就又说明了一开始创建新用户的必要性。
Debug
搞砸了,没连上,怎么办?我真是折腾了一番,十分崩溃。所以记录一些Debug的方法。
看日志
systemd的日志:
journalctl -u smbd.service -e
smb自己的日志:
cd /var/log/samba
这是smb存放日志的地方,都可以看一看。log.smbd是smb服务的日志。log.100.64.x.x是某个ip访问smb的日志,里面记录了认证过程等关键信息。
防火墙?
有可能ufw禁用了端口,不过概率不大
sudo ufw allow from 100.0.0.0/8 to any port 445
sudo ufw allow from 100.0.0.0/8 to any port 139
最小化配置
smb.conf可能变得十分混乱。gpt给出了一个最小化配置,但是我并没使用,仅供参考。
[global]
workgroup = WORKGROUP
server string = Samba Server
security = user
map to guest = never
server min protocol = SMB2
server max protocol = SMB3
[public]
path = /srv/samba
valid users = samba
read only = no
browsable = yes
guest ok = no
用户问题
可以删掉smbu重新添加试试。
sudo smbpasswd -x smbu
注意workgroup没有任何作用,不用花时间研究它。
目录的权限也是个问题,一定要chown到smbu。
重新安装smb
这是真正works的方法!
sudo systemctl stop smbd nmbd
sudo apt purge samba samba-common samba-common-bin smbclient
sudo rm -rf /etc/samba/
sudo rm -rf /var/lib/samba/
sudo rm -rf /var/cache/samba/
sudo rm -rf /var/log/samba/
然后再重新来一遍就可以了!