返回博客

记录一次在 Manjaro 下折腾 SMB 服务的经历

linuxmanjarosambasmbfile-sharing

本文记录于 2021 年,操作基于当时的 Manjaro 环境,具体细节可能随版本变化。

今年双十一,剁手买了不少东西,其中就包括了一块 2T 的西数蓝盘,由此开始了我的折腾之旅。

先介绍一下我的需求。我是一名大学生,平时出门主要还是带着一台 Windows 笔记本,所以硬盘文件系统优先考虑 NTFS,寒暑假估计会直接带着硬盘回家。对 SMB 服务我有三种需求:

  1. 自己使用,对整块硬盘有完整的权限
  2. 给舍友用,提供一些资料的下载,只读权限
  3. 给舍友用,提供下载与上传,读写权限均有

整理完需求,我们直接开干!

先前准备

下载相关软件:

sudo yay -S samba

貌似现在 Manjaro 都自带这个软件了,有的话也就不用下载了。

编写配置文件

配置文件其实并不是很难写,这里就贴一下我的配置文件好了。

# /etc/samba/smb.conf
# 全局配置
[global]
   # 工作组
   workgroup = WORKGROUP
   # 这个貌似是服务器的介绍字符串
   server string = C5-315 SMB Server
   # 这个名称将会显示在我们的本地网络当中
   netbios name = SMB Server
   # 匿名访问需要这个
   map to guest = bad user
   # 设定匿名账户在本地的映射,在 manjaro 上 nobody 本身就存在,照写就好了
   guest account = nobody
   # 日志文件位置,这个不多说,如果后面服务出问题请尽早在这里找找
   log file = /var/log/samba/%m.log
   # 日志文件的大小,单位是 kb,设置为 0 就是不限制了
   max log size = 0
   # 这个安全模式不多介绍,顺便一提,网上很多文章所提到的 share 模式已经弃用了
   security = user
   # 不太记得这行当时为什么写的了
   encrypt passwords = yes
   # 关闭 dns 代理
   dns proxy = no

# 这里是我的需求 1,要完全访问磁盘
# 这是共享文件夹名称
[kaoru-disk]
   # 共享文件夹的简介字符串,在 windows 会鼠标悬浮时显示
   comment = 管理员目录
   # 这是服务器本机实际的具体路径,在这里就是我磁盘挂载的实际位置,这里有坑,后面谈
   path = /run/media/kaoru/kaoru-disk/
   # browseable 表示是否显示在共享文件中,与可访问性无关
   browseable = yes
   # 这里我把自己设置为管理员,kaoru 是我的本地账户
   # SMB 服务账户和 Linux 本地账户是绑定的,但是密码可以是不一样的
   admin users = kaoru
   # 这里设置可写属性
   writeable = yes

# 这里开始是我的需求 2
# 重复的属性就不一一介绍了
[book]
   comment = 电子书目录
   path = /run/media/kaoru/kaoru-disk/book/
   public = yes
   guest ok = yes
   browseable = yes
   writeable = no

[movie]
   comment = 影片目录
   path = /run/media/kaoru/kaoru-disk/movie/
   public = yes
   guest ok = yes
   browseable = yes
   writeable = no

[iso]
   comment = 系统镜像目录
   path = /run/media/kaoru/kaoru-disk/iso/
   public = yes
   guest ok = yes
   browseable = yes
   writeable = no

[software]
   comment = 软件目录
   path = /run/media/kaoru/kaoru-disk/software/
   public = yes
   guest ok = yes
   browseable = yes
   writeable = no

# 这里开始是我的第三点需求
[shared]
   comment = 公用目录(可匿名上传与下载)
   path = /run/media/kaoru/kaoru-disk/shared/
   public = yes
   guest ok = yes
   browseable = yes
   # 变化在这,不仅可以匿名访问,还可以匿名上传文件了
   writeable = yes

写完配置文件,我们可以使用 samba 套件里的 testparm 来测试文件的正确性:

testparm /etc/samba/smb.conf

添加用户

我的第一点需求是只有我本人才有完整的权限,所以我们来新建一个 SMB 账户:

sudo smbpasswd -a kaoru

接下来就是要你输入密码什么的吧啦吧啦。注意在这里添加的用户首先是要在你的系统中存在的用户,上述代码中的 kaoru 就是我本人的账号。

保险起见,我们设置一下启用账户:

sudo smbpasswd -e kaoru

到这就基本完成添加用户部分了,下面讲一个坑。

文件权限

我先把挂载磁盘的根目录拿下来:

/run/media/kaoru/kaoru-disk/

/run/media/${username} 这个目录下,对于其他用户来说通常是没有权限的。没有权限在 SMB 连目录都打不开,而且应该会报 NT_STATUS_ACCESS_DENIED listing \* 这个错。

明白了原因,问题就很简单了,我们直接改一下目录权限即可:

sudo chmod 755 /run/media/kaoru

OK,到这里就全部完成了,可以直接在 Windows 下挂载远程磁盘咯。

最后

如果有不清楚的地方,欢迎交流。


更新于 11.16 日

经过我观察发现,现在仍然存在两个问题:

  1. 开机后从 SDDM 界面登录后才能连接网络,这里我使用的是无线的接入方式。
  2. 开机后不会自动挂载磁盘,并且磁盘挂载目录依旧没有足够的权限。

下面说说我的解决方式。

开机(未登录)不会自动接入网络

这个其实比较好解决,原因是 Manjaro 默认分用户对网络密码进行了加密。

打开 设置 -> 网络 -> 连接 -> 选择你所连接的网络 ->(常规设置)勾选“所有用户可以连接到此网络” ->(Wi-Fi 安全)为所有用户保存密码(不加密)。

重启,开机但不登录,能 ping 通,搞定!

开机自动挂载磁盘,以及权限问题

首先接入磁盘,查询磁盘的 UUID 并复制下来。有两种方法。

第一种是图形化:用 KDE 自带的 KDE 分区管理器查看,选中磁盘,选择对应分区右键属性,其中的 UUID 就是我们要找的了。记得是 UUID 不是分区 UUID

第二种方法比较简单:

ls -l /dev/disk/by-uuid

即可显示所有磁盘的 UUID。我的输出如下:

$ ls -l /dev/disk/by-uuid
总用量 0
lrwxrwxrwx 1 root root 10 11月 16 11:21 3088-EABB -> ../../sda1
lrwxrwxrwx 1 root root 10 11月 16 11:21 4A96EE3696EE2265 -> ../../sdb2
lrwxrwxrwx 1 root root 10 11月 16 11:21 f0396684-cc97-48c5-afcc-8860dbb5c366 -> ../../sda2

其中 4A96EE3696EE2265 就是我所需的 UUID。

获取到 UUID,接下来就是修改配置文件了:

我原始的文件大概长这样:

# /etc/fstab: static file system information.
# Use 'blkid' to print the universally unique identifier for a device; this may
# be used with UUID= as a more robust way to name devices that works even if
# disks are added and removed. See fstab(5).
#
# <file system>             <mount point>  <type>  <options>  <dump>  <pass>
UUID=3088-EABB                            /boot/efi       vfat    umask=0077 0 2
UUID=f0396684-cc97-48c5-afcc-8860dbb5c366 /               ext4    defaults,noatime 0 1
tmpfs                                     /tmp            tmpfs

修改一下,添加一行:

UUID=4A96EE3696EE2265                     /mnt/kaoru-disk ntfs    defaults 0 0

最后一行的 UUID 要填上面我们查询到的,/mnt/kaoru-disk 这个目录需要提前创建好,ntfs 是欲挂载磁盘的文件系统类型,具体使用什么文件系统就填啥。最后保存一下文件,轻松搞定。

/mnt/kaoru-disk 这个目录是自己创建的,可以改一下权限,权限 755 就好。之前使用的 Manjaro 自动挂载的目录在 /run/media/${user_name}/${disk_name},这个目录每次都会重新创建,权限也不对应。上面改为手动挂载,挂载到的文件夹权限也是由我们自己控制,这样一来权限问题也就解决了。

设置完磁盘挂载,修改一下 samba 配置文件,把共享目录的 path 属性重新设置一下,又可以愉快地玩耍了。

相关阅读

常见问题

为什么挂载后的目录在 SMB 里打不开?

因为 /run/media/${username} 目录对其它用户默认没有权限,连目录都进不去。给父目录加权限即可:sudo chmod 755 /run/media/kaoru,否则会报 NT_STATUS_ACCESS_DENIED listing *。

怎么让磁盘开机自动挂载?

查磁盘 UUID(ls -l /dev/disk/by-uuid 或 KDE 分区管理器),在 /etc/fstab 里加一行,例如 UUID=<你的 UUID> /mnt/kaoru-disk ntfs defaults 0 0。注意区分 UUID 与分区 UUID。

为什么开机未登录时没有网络?

Manjaro 默认按用户加密了网络密码。在 设置 -> 网络 -> 连接 里勾选‘所有用户可以连接到此网络’,并为所有用户保存密码(不加密),重启后开机不登录也能 ping 通。

smb.conf 里 security = user 能和匿名访问共存吗?

可以。map to guest = bad user + guest account = nobody 让未登录用户走匿名账户;security = user 仍允许已登记账户(如 smbpasswd -a kaoru)用密码登录。