详解Samba下的Trivial Database文件(1)


Samba 使用 Trivial Database 文件来存储永久性和临时性数据,作为其在 Linux 和 Windows 之间的工作集成文件和打印共享的一部分。本文将主要讲解有关 Samba 用来存储信息的 Samba Trivial Database (TDB) 格式、如何查看 TDB 文件内部以及如何将它们备份的所有信息。

了解 TDB 文件

在运行时,Samba 存储许多信息,从本地密码到希望从中收到信息的一系列客户端。这类数据其中一些是暂时的,在 Samba 重启时可能会被丢弃,但是另一些却是永久的,不会被丢弃。这类数据可能是很大的,也可能是不经常访问只是在内存中保留,或者在重启时保持存在。要满足这些要求,Samba 团队创建了 Trivial Database。它实际上是一个键值存储,这意味着数据通过惟一键的方式存储和检索,且没有像在关系数据库中那样的表联接。键值存储 — 尤其是 TDB — 被设计成将数据存储到磁盘并将其取回的一种快速方式。

键值存储

虽然有许多 TDB 的替代品,例如 GNU 数据库管理器(GNU Database Manager,GDBM),但是 Samba 项目特别需要多个进程同时向数据库写入以及支持锁定数据的内部片段。因此,该团队构建了它们自己的数据库管理器并称其为 Trivial Database 管理器。通过集群 TDB(Clustered TDB,CTDB)项目,TDB 已经扩展为支持集群的操作且可用于其他项目。

如果您熟悉关系数据库,例如 IBM DB2、MySQL 或 PostgreSQL,则相比之下您将发现键值存储非常简单。关系数据库可能有包含多个列的表,而键值存储实际上有两列:键列和值列。关系数据库使用结构化查询语言(Structured Query Language,SQL)以便从多个表和列中提取信息,但是键值存储仅限于对键列的操作。

由于其简单,键值存储对于较小系列的作业非常有用,而且可以非常快速地执行那些作业。键值存储从基本上说就是磁盘上的哈希表,因此在无需借助索引的情况下可以猜测一块数据的位置。

TDB 特别被编写来处理许多并发的编写器和二进制数据,例如内部数据结构。因此,存储并检索此数据的最快方式是运用二进制格式。二进制存储意味着数据库文件可以更小,且在数据移入和移出数据库时无需在不同格式之间转换数据。

用于 Samba 的 TDB 文件

Samba 在几个不同的地方存储其 TDB 文件。找到这些文件的最容易方式是查看 smbd -b 的输出,如清单 1 所示。

清单 1. 显示 smbd 构建信息

# smbd -b
...
Paths:
SBINDIR: /usr/sbin
BINDIR: /usr/bin
SWATDIR: /usr/share/swat
CONFIGFILE: /etc/samba/smb.conf
LOGFILEBASE: /var/log/samba
LMHOSTSFILE: /etc/samba/lmhosts
LIBDIR: /usr/lib
MODULESDIR: /usr/lib/samba
SHLIBE1T: so
LOCKDIR: /var/lib/samba
STATEDIR: /var/lib/samba
CACHEDIR: /var/lib/samba
PIDDIR: /var/run
SMB_PASSWD_FILE: /var/lib/samba/private/smbpasswd
PRIVATE_DIR: /var/lib/samba/private

清单 1 中的多个路径均指向带有 TDB 文件的位置。幸运的是,许多都是相同的,这会减少您需要查看的位置。例如,LOCKDIR、STATEDIR 和 CACHEDIR 都指向 /var/lib/samba,且 PRIVATE_DIR 位于称为私有 的子目录中。您可以进入那些子目录并查看自己需要的文件。

TDB 文件大致可分为两组:持久的和临时的。表 1 显示了持久文件的名称和功能。

Table 1. 持久的 TDB 文件

文件名 目的
account_policy.tdb 存储帐户策略,例如锁定阈值和密码长度
group_mapping.tdb 存储 Windows NT 用户标识符 (SID) 和 UNIX® 用户 ID 之间的关系
ntdrivers.tdb 存储有关打印机驱动程序的信息
ntforms.tdb 存储有关打印队列形式的信息 — 例如,纸张大小
ntprinters.tdb 存储有关打印机初始化设置的信息
passdb.tdb 仅用于一些安全模式以便存储认证证书
registry.tdb 可通过其他 Windows 系统访问的骨架注册表
secrets.tdb 存储本地秘密,例如类似轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)密码的工作站计算机密钥和凭证
share_info.tdb 为每一个本地共享存储访问控件列表(Access Control List,ACL)信息
winbindd_idmap.tdb 如果您正在使用 winbind,那么持久存储 Windows NT SID 和动态创建的用户之间的映射信息

应该备份如表 1 所示的 TDB 文件。本文后面会提供此操作的过程。

另外,存在许多存储状态信息和缓存数据的临时 TDB 文件。因为在 Samba 启动时会重建这些文件,所以无需备份它们。


相关内容