Samba回收站共享的实现
在 CentOS 上并不存在系统级的“回收站”概念,但可以通过 Samba 的 VFS recycle 模块为每个共享启用回收站,使通过 SMB 删除的文件按用户或共享集中暂存,便于误删恢复与统一清理。该机制是在共享层实现,客户端(如 Windows)删除文件时会被 Samba 转入回收站目录,而非直接 rm 到磁盘。
前提准备
- 安装 Samba 组件(示例以 CentOS 7 为例):sudo yum install -y samba samba-client samba-common
- 创建共享根目录并设定权限(示例:/data/share),确保运行 Samba 的用户(常见为 smbuser 或共享目录属主)对该目录具备读写权限。
- 如需面向 Windows 客户端访问,建议统一工作组(如 WORKGROUP)并准备可登录的 Samba 账户。
配置步骤
- 编辑 Samba 主配置 /etc/samba/smb.conf,在 [global] 下确保有用户级认证与安全设置,然后在共享段启用 VFS recycle。示例:
[global]
workgroup = WORKGROUP
security = user
passdb backend = tdbsam
…
[shared]
path = /data/share
browseable = yes
read only = no
valid users = alice,bob
create mask = 0775
directory mask = 0775
vfs objects = recycle
recycle:repository = .deleted/%U
recycle:keeptree = Yes
recycle:versions = Yes
recycle:maxsize = 0
recycle:exclude = .tmp|.bak
recycle:noversions = *.doc
说明:
- recycle:repository 指定回收站根目录,使用 %U 可按登录用户分目录存放(如 .deleted/alice、.deleted/bob),避免互相覆盖。
- keeptree 保留删除时的目录结构;versions 同名文件保留版本;maxsize=0 表示不限制回收站容量(可按需设置上限);exclude/noversions 用于过滤或指定不保留版本的文件类型。
- 创建回收站根目录并修正属主属组(与共享目录保持一致,示例属主/组为 smbuser:smbgroup):
- mkdir -p /data/share/.deleted
- chown -R smbuser:smbgroup /data/share/.deleted
- chmod 0770 /data/share/.deleted
- 创建 Samba 用户并设置密码:
- smbpasswd -a alice
- smbpasswd -a bob
- 启动/重启 Samba 服务并放行防火墙:
- systemctl enable --now smb nmb
- firewall-cmd --permanent --add-service=samba && firewall-cmd --reload
客户端访问与验证
- Windows:在资源管理器地址栏输入 \服务器IP\shared,使用 alice/bob 登录后执行删除操作;随后在共享根目录可见隐藏文件夹 .deleted,其下按用户子目录(如 .deleted/alice)存放被删除文件,结构与权限保持原样,便于还原。
- Linux:可通过 smbclient //服务器IP/shared -U alice 登录验证删除后 .deleted 是否生成并包含对应文件。
运维与注意事项
- 权限与 SELinux:回收站目录的属主/属组应与共享目录一致;若遇到写入或可见性问题,检查 SELinux 是否限制(必要时设为 permissive 或配置相应布尔值/策略)。
- 容量与清理:当 recycle:maxsize 不限制或为较大值时,建议定期清理旧文件,例如在 /etc/crontab 加入:30 8 * * * root find /data/share/.deleted/ -mtime +30 -exec rm -rf {} ;(按 30 天保留示例)。
- 共享粒度:建议每个共享单独配置回收站目录,便于权限与配额管理,避免不同业务或用户之间的回收内容互相影响。