Post

为Linux服务器安装SMB服务

为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

这个脚本运行时会先检查挂载状态,如果是已挂载,就断开连接;如果未挂载,就尝试连接。使用该脚本就可以快速切换挂载状态了。

This post is licensed under CC BY 4.0 by the author.
Total 28 hits!