为Linux服务器安装SMB服务
最近笔者组里新添了服务器。由于组里没人会玩,可以愉快地进行瞎搞😸
由于笔者先前已经用NAS爽过SMB服务,为了极致偷懒充分发挥局域网连接的优势,笔者决定给服务器也装上,这样就可以在本地操作计算文件,而不必ssh连过去,再下载到本地,再传回去了。
Linux端配置
安装SAMBA软件
笔者的服务器是Rocky8.10,使用dnf安装:
1
sudo dnf install samba samba-common samba-client
装好后,备份配置文件:
1
2
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
sudo vi /etc/samba/smb.conf
我们只需要挂载计算目录。编辑配置文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
[global]
workgroup = WORKGROUP
security = user
map to guest = Never
[{share_name}]
path = {path}
valid users = {user}
writeable = yes
create mask = 0664
directory mask = 0775
force user = {user}
force group = {user}
其中:
- {share_name}是分享名称;
- {path}是计算文件夹,也是要共享出去的路径;
- {user}是你的用户。
记住这三个变量,后续会反复提及。
另外,还需要为SMB登录用户{user}设置SMB密码:
1
sudo smbpasswd -a {user}
注意,这并不是标准的SMB配置。对于公用的服务器,通常需要在服务器上建立一个专门用于访问Samba服务的账户,并限制权限,避免一些安全风险。笔者这边一是自用且并不在公网服务,二是需要联动一些计算相关套件,就没那么讲究
开启服务
为SELinux设置上下文:
1
2
3
4
sudo setsebool -P samba_enable_home_dirs on
sudo setsebool -P samba_export_all_rw on
sudo semanage fcontext -a -t samba_share_t "{path}(/.*)?"
sudo restorecon -Rv {path}
允许SMB服务通过防火墙:
1
2
sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --reload
开启systemctl服务:
1
2
sudo systemctl enable smb nmb
sudo systemctl start smb nmb
检查状态:
1
sudo systemctl status smb
到这里,理论上就可以使用了。
Windows端配置
连接
在Windows资源管理器打开此电脑
界面,从上方工具栏找到展开按钮···
,点击后在弹出的菜单里选择映射网络驱动器
盘符可以自己挑喜欢的,文件夹需要输入:
1
\\{linux服务器的ip}\{share_name}
点击完成,弹出一个登录凭据输入界面,笔者这里没有截图了。在这里需要输入{user}和之前设置的SMB密码,可以勾选记住凭据,以后就不用再输入了。
完成后,点击连接,应当会弹出网络位置文件夹,表示windows已经成功将{path}映射成一个本地驱动器,可以自由操作了。
tricks
由于笔者是笔记本电脑,有时需要离开局域网环境,此时失去网络连接的映射盘符会变为失效状态。
假装有图
如果只是失效也无所谓了,麻烦的是如果在拖动文件时不小心经过了这个盘符,资源管理器就会卡一会,估计是试图计算把这个文件拖动到上面松开会发生什么。虽然触发概率不高,但是一旦触发,体验差的一批。
跟Claude商量一番后,笔者发现可以用批处理脚本切换网络驱动器连接状态:
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
@echo off
setlocal enabledelayedexpansion
set DRIVE=W:
set SHARE=\\{linux服务器的ip}\{share_name}
REM Check if drive is already mounted
net use | find "%DRIVE%" > nul
if %errorlevel% equ 0 (
echo Drive %DRIVE% is already mounted, disconnecting...
net use %DRIVE% /delete
if %errorlevel% equ 0 (
echo Drive %DRIVE% has been successfully disconnected.
) else (
echo Error disconnecting %DRIVE%.
)
) else (
echo Drive %DRIVE% is not mounted, connecting...
net use %DRIVE% %SHARE%
if %errorlevel% equ 0 (
echo Drive %DRIVE% has been successfully mounted to %SHARE%.
) else (
echo Error mounting %SHARE% to %DRIVE%.
)
)
pause
这个脚本运行时会先检查挂载状态,如果是已挂载,就断开连接;如果未挂载,就尝试连接。使用该脚本就可以快速切换挂载状态了。