向 NAS 引入 samba
最近感觉自己的 NAS 共享管理非常混沌,于是打算重新规整一下:引入 samba 和重新分级一下目录层次
原始目录结构
我的目录布局如下所示
root in 🌐 homelab in /pool❯ tree -L2.├── bulk│ ├── backup│ ├── ebooks│ ├── forks│ ├── mirrors│ └── scripts└── striping ├── Assets ├── Forks ├── ISO ├── Medias ├── Mirrors ├── Softwares └── Tmp
15 directories, 0 files我的 ZFS 子卷如下所示
root in 🌐 homelab in ~❯ zfs listNAME USED AVAIL REFER MOUNTPOINTbulk 2.88T 18.9T 2.86T /pool/bulkbulk/backup 128K 18.9T 128K /pool/bulk/backupbulk/torrent 160K 18.9T 160K /srv/torrentstriping 1.15T 2.23T 1.04T /pool/stripingstriping/QEMU 96K 2.23T 96K /var/lib/libvirt/imagesstriping/home 13.5G 2.23T 13.5G /homestriping/opt 72.6G 2.23T 72.6G /optstriping/podman 22.7G 2.23T 96K legacystriping/podman/containers 22.7G 2.23T 22.7G /var/lib/containers换句话来讲,实际上 home 都已经完全在一个子卷中了,因此如果可以利用这一点应该是更好的选择。
samba 规划
我的计划如下:
- 用户均将其自身的
home目录作为samba共享目录 - 除此之外
/pool/striping作为公共目录,默认情况下只读不能写 - 只有被添加到
smbusers组的用户可以登录和访问samba,同时具备smwriters组的用户可以对其读写
在 samba 的 wiki 中提到,samba 确实有能力使用系统账户来达到这一点,但是 samba 使用了自己的用户数据库,所以密码需要单独创建。
引入 samba
直接使用 Debian 源内的 samba 就好了,直接快速安装即可。
编写配置
结合一下官方给的最小化配置以及我的个人需求,我的配置如下所示
[global] workgroup = WORKGROUP server role = standalone server map to guest = never disable netbios = yes
[homes] comment = Home Directories browseable = no read only = no valid users = %S create mask = 0600 directory mask = 0700
[public] path = /pool/ browseable = yes read only = yes valid users = @smbusers write list = @smbwriters create mask = 0664 directory mask = 0775在实现这一点后,使用 testparam -s 测试一下 samba 的配置是否正确。
设置用户密码
在上文中提到过,samba 用户需要单独设置密码。
使用如下命令来设置密码:
root in 🌐 homelab in ~❯ smbpasswd -a krysztal配置自动发现
NOTE
经过我反复调试后我感觉自动发现 Linux 的自动发现做得很差,最好的方式还是按照诸如通过 smb://homelab.lan/krysztal 这样直接连接的方式链接
Debian 中存在两个包来实现自动发现,其中一个是 wsdd 另外一个是 wsdd-server:
wsdd: Python Web Services Discovery Daemon, Windows Net Browsingwsdd-server: Python Web Services Discovery Daemon, Windows Net serving
根据描述,安装 wsdd-server 即可
和系统用户同步密码?
Debian 安装的 samba 配置文件中其实有如下配置项:
# This boolean parameter controls whether Samba attempts to sync the Unix# password with the SMB password when the encrypted SMB password in the# passdb is changed. unix password sync = yes
# For Unix password sync to work on a Debian GNU/Linux system, the following# parameters must be set (thanks to Ian Kahan <<kahan@informatik.tu-muenchen.de> for# sending the correct chat script for the passwd program in Debian Sarge). passwd program = /usr/bin/passwd %u passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
# This boolean controls whether PAM will be used for password changes# when requested by an SMB client instead of the program listed in# 'passwd program'. The default is 'no'. pam password change = yes这些配置项实现的是:改 smb 密码时顺便修改 UNIX 密码,并不是反过来的。
至于到底怎么做联动,暂时没有想出来,在想出来之前直接用土法命令改好了:
passwd krysztalsmbpasswd krysztal