如何使用 Samba 搭建共享服务器

工作依赖Win7共享文件夹,经常抽风死机,需要人工手动重启。想要将其迁移至Ubuntu。

后话:实践证明,ntfs挂载方式+wps linux办公会很慢,不合适。另外,wps linux居然不支持emoji

安装Samba

1
sudo apt install samba

创建共享目录

找到磁盘

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
28
sudo fdisk -l

# 如果是Linux的ext4文件系统

# Disk /dev/sda:931.51 GiB,1000204886016 字节,1953525168 个扇区
# 磁盘型号:WDC WD10SPZX-22Z
# 单元:扇区 / 1 * 512 = 512 字节
# 扇区大小(逻辑/物理):512 字节 / 4096 字节
# I/O 大小(最小/最佳):4096 字节 / 4096 字节
# 磁盘标签类型:gpt
# 磁盘标识符:F22FBE2A-71CB-4618-B90B-C7E4928AFDE5

# 设备 起点 末尾 扇区 大小 类型
# /dev/sda1 2048 1953523711 1953521664 931.5G Linux 文件系统

# 如果是Windows的NTFS文件系统

# Disk /dev/sda:931.51 GiB,1000204886016 字节,1953525168 个扇区
# 磁盘型号:WDC WD10SPZX-22Z
# 单元:扇区 / 1 * 512 = 512 字节
# 扇区大小(逻辑/物理):512 字节 / 4096 字节
# I/O 大小(最小/最佳):4096 字节 / 4096 字节
# 磁盘标签类型:dos
# 磁盘标识符:0xd88aa425

# 设备 启动 起点 末尾 扇区 大小 Id 类型
# /dev/sda1 2048 1953523711 1953521664 931.5G f W95 扩展 (LBA)
# /dev/sda5 4096 1953523711 1953519616 931.5G 7 HPFS/NTFS/exFAT

记录该设备ID

挂载共享盘

创建挂载位置

1
2
# 挂载位置
sudo mkdir /mnt/samba

ext4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# ext4文件系统,直接mount
sudo mount /dev/sda1 /mnt/samba/

# 修改为当前账户所有
sudo chown -R $USER:$USER /mnt/samba/

# 设置开机自动挂载

# 找到UUID
sudo blkid /dev/sda1
# /dev/sda1: UUID="ed708253-4d05-4124-8464-973a80501fe9" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="Linux filesystem" PARTUUID="82f4f867-8023-4d49-a951-046e31648f74"

# 写到/etc/fstab文件末尾
# 不需要指定用户
UUID="ed708253-4d05-4124-8464-973a80501fe9" /mnt/samba ext4 defaults 0 2

# fstab修改后需要重新加载
sudo systemctl daemon-reload

# 测试验证
sudo umount /mnt/samba
# 根据fstab的条目自动mount
sudo mount -a

不同于NTFS文件系统,可以直接通过数据线拷贝,不方便在原始机器上安装软件时,也只能通过网络的方式复制了

1
2
3
4
5
6
# 原始共享机器
sudo mount -t cifs //192.168.0.57/folder1 /mnt/Win7/folder1 -o username=admin,password=

# 增量同步的方式下载,最好放在tmux里面,避免session断开导致中断
# rsync能复制绝大部分文件,包括因为路径太长无法复制到移动硬盘的,但实际发现打开时会提示无效文件
rsync -av /mnt/Win7/folder1/ /mnt/samba/folder1/

NTFS

即便跟Windows有同样的文件系统,也要小心,有些文件名太长会导致数据复制失败

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
id
# uid=1000(noname) gid=1000(noname) 组=1000(noname),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),114(lpadmin)

# uid、gid与你当前账户的uid、gid一致
# 最终权限 = 默认权限 - umask
# 对于文件:666 - 022 = 644
# 对于目录:777 - 022 = 755
sudo mount -t ntfs-3g /dev/sda5 /mnt/samba -o uid=1000,gid=1000,umask=0022

# 设置开机自动挂载

# 找到UUID
sudo blkid /dev/sda5
# /dev/sda5: LABEL="M-fM-^VM-0M-eM-^JM- M-eM-^MM-7" BLOCK_SIZE="512" UUID="46C41001C40FF24B" TYPE="ntfs" PARTUUID="d88aa425-05"

# 写到/etc/fstab文件末尾
UUID="46C41001C40FF24B" /mnt/samba ntfs-3g defaults,uid=1000,gid=1000,umask=0022 0 0

# fstab修改后需要重新加载
sudo systemctl daemon-reload

# 测试验证
sudo umount /mnt/samba
# 根据fstab的条目自动mount
sudo mount -a

配置Samba

创建用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 添加Samba用户,名字跟当前账户一致,密码可以跟Linux用户不一样
sudo smbpasswd -a noname

# 先创建Linux用户,否则无法添加Samba用户
sudo useradd manager1
# 添加Samba用户
sudo smbpasswd -a manager1

sudo useradd worker1
sudo smbpasswd -a worker1

# 查看所有用户
sudo pdbedit -L
# noname:1000:
# worker1:1001:
# manager1:1002:

# 修改密码
# sudo smbpasswd username
# 删除用户
# sudo smbpasswd -x username
# 禁用用户
# sudo smbpasswd -d username

修改配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# /etc/samba/smb.conf

# 共享文件夹的名称
[folder1]
path = /mnt/samba/folder1 # 实际目录,可以不一样
valid users = manager1, worker1 # 允许访问的用户
read only = no # 可读写
force user = noname # 所有操作都会变成用户noname执行
force group = noname # 所有操作都会变成用户noname执行

[folder2]
path = /mnt/samba/folder2
valid users = manager1, worker1
read only = yes # 其他用户只读
write list = manager1 # manager1可写
force user = noname
force group = noname

查看/验证配置文件

1
testparm

重启Samba

1
sudo systemctl restart samba smbd nmbd

测试验证

Linux本机验证

1
2
# 连接Samba服务器
smbclient //localhost/folder1 -U manager1

客户端命令

smbclient 命令 类似 Linux
ls ls
cd cd
get file 下载文件
put file 上传文件
rm rm
mkdir mkdir
rmdir rmdir
rename mv

Windows验证

文件资源管理器直接输入

1
\\192.168.0.72\folder1

[!IMPORTANT]
注意:Windows只支持一个账号登录,不支持切换账号,要更换账号,要么更换为主机名称连接,要么删除会话重新登录

1
\\samba_server\folder1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 使用Powershell或者CMD
# 列出所有连接

net use
# 会记录新的网络连接。
#
#
# 状态 本地 远程 网络
#
# -------------------------------------------------------------------------------
# OK \\192.168.0.72\folder1 Microsoft Windows Network
# 命令成功完成。

# 删除连接
net use \\192.168.0.72\folder1 /delete

服务器管理

查看所有客户端连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo smbstatus

# Samba version 4.19.5-Ubuntu
# PID Username Group Machine Protocol Version Encryption Signing
# ----------------------------------------------------------------------------------------------------------------------------------------
# 4551 worker1 worker1 192.168.0.22 (ipv4:192.168.0.22:59083) SMB3_11 - partial(AES-128-GMAC)

# Service pid Machine Connected at Encryption Signing
# ---------------------------------------------------------------------------------------------
# folder1 4551 192.168.0.22 五 4月 10 14时32分44秒 2026 HKT - -


# Locked files:
# Pid User(ID) DenyMode Access R/W Oplock SharePath Name Time
# --------------------------------------------------------------------------------------------------
# 4551 1000 DENY_NONE 0x100080 RDONLY NONE /mnt/samba/folder1 . Fri Apr 10 14:38:10 2026

踢掉某个用户

1
2
3
4
5
# 根据smbstatus展示的PID,直接杀死对应的进程
sudo kill -9 4551

# 踢掉所有人
sudo systemctl restart smbd