详解Samba下的Trivial Database文件

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

 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 启动时会重建这些文件,所以无需备份它们。

#p#

使用 TDB 文件

Samba 附带了三种用于处理 TDB 文件的工具:

●tdbdump:打印 TDB 文件的内容。

●tdbbackup:备份并验证 TDB 文件。

●tdbtool:创建、查看并修改 TDB 文件。

快速查看 TDB 文件内部

查看 TDB 文件中的内容的最快方式是通过 tdbdump 命令将其转储。清单 2 显示了 ntprinters.tdb 文件的转储。

清单 2. 在 TDB 文件上使用 tdbdump

[root@bob ~]# tdbdump /var/lib/samba/ntprinters.tdb
{
key(21) = "GLOBALS/c_setprinter\00"
data(4) = "\00\00\00\00"
}
{
key(13) = "SECDESC/test\00"
data(140) = "\80\00\00\00\00\00\02\00\80\00\00\00\01\00\04\80\14\00\00\00$\00\00
\00\00\00\00\004\00\00\00\01\02\00\00\00\00\00\05 \00\00\00 \02\00\00\01\02\00\00
...
\00 \02\00\00\00\02\18\00\0C\00\0F\10\01\02\00\00\00\00\00\05 \00\00\00 \02\00\00"
}
{
key(17) = "SECDESC/cups-pdf\00"
data(140) = "\80\00\00\00\00\00\02\00\80\00\00\00\01\00\04\80\14\00\00\00$\00\00
\00\00\00\00\004\00\00\00\01\02\00\00\00\00\00\05 \00\00\00 \02\00\00\01\02\00\00
...
\00 \02\00\00\00\02\18\00\0C\00\0F\10\01\02\00\00\00\00\00\05 \00\00\00 \02\00\00"
}

从清单 2 的输出,您可以看到在数据库中有三个键。第一个键为 21 字节(字节长度显示在括号中 [()]),被称为GLOBALS/c_setprinter,后跟 NULL,其为 ASCII 码零。非输出字符用十六进制格式显示,其是后跟两个十六进制字符的反斜线。第一个键的值为 4 字节且其完全为 NULL。

接下来的两个键被称为 SECDESC/test 和 SECDESC/cups-pdf 且两个都是以 NULL 结束。因为该数据完全是二进制且不可输出,所以已经以十六进制格式的非输出字符输出了。

备份并恢复 TDB 文件

表 1 显示了几种在重启持久存在并应该备份的 TDB 文件。像大多数数据库那样,您不能只复制文件,因为复制可能会损坏。如果文件正在被写入时您复制该文件,会发生备份损坏,从而您具有处于不一致状态的备份。一个替代办法是关闭 Samba 守护进程,然后复制这些文件。

备份 TDB 文件最容易的方式是使用 Samba 附带的 tdbbackup 实用工具。此实用工具可以安全复制 TDB 文件,即使其正在被积极地写入。tdbbackup 的另一帮助功能是可以查看 TDB 文件是否损坏,且如果发现损坏则自动恢复为备份文件。清单 3 显示了正在备份的 TDB 文件。

清单 3. 备份 TDB 文件

[root@bob samba]# ls -l account_policy.*
-rw------- 1 root root 8192 Apr 7 2008 account_policy.tdb
[root@bob samba]# tdbbackup account_policy.tdb
[root@bob samba]# ls -l account_policy.*
-rw------- 1 root root 8192 Apr 7 2008 account_policy.tdb
-rw------- 1 root root 36864 Dec 8 21:42 account_policy.tdb.bak
[root@bob samba]# tdbdump account_policy.tdb | md5sum
53ea608f0d93061480549c511756b778 -
[root@bob samba]# tdbdump account_policy.tdb.bak | md5sum
53ea608f0d93061480549c511756b778 -

清单 3 中的第一个命令简要列出了所有以 account_policy 开始的文件,以便确认只存在一份副本。接下来通过运行 tdbbackup account_policy.tdb 来备份帐户策略数据库。第三个命令寻找任何以 account_policy 开始的文件,以便显示已经创建的带有 .bak 扩展名的新文件。虽然大小不同于原文件,但是转储每一个文件并计算 MD5 哈希显示了它们的校验和是相同的。因此更大的文件大小并不是问题,因为每个键值对的内容是相同的。

如果由于某种原因原始的 account_policy.tdb 文件受到损坏,例如在系统不正常关机期间,您可以从其备份恢复旧的文件。清单 4 显示了此过程。

清单 4. 验证并恢复 TDB 文件

[root@bob samba]# ls -l account_policy.tdb
-rw------- 1 root root 1213 Dec 8 21:49 account_policy.tdb
[root@bob samba]# tdbbackup -v account_policy.tdb
tdb_oob len 1256 beyond eof at 1213
restoring account_policy.tdb
[root@bob samba]# ls -l account_policy.tdb*
-rw------- 1 root root 36864 Dec 8 21:49 account_policy.tdb
-rw------- 1 root root 36864 Dec 8 21:42 account_policy.tdb.bak
[root@bob samba]# tdbbackup -v account_policy.tdb
account_policy.tdb : 17 records
[root@bob samba]# tdbdump account_policy.tdb | md5sum
53ea608f0d93061480549c511756b778 -

清单 4 中的第一个命令显示文件大小已经显著地减少。tdbbackup 命令再次运行,但是带有 -v 标记,其验证 TDB 文件。如果该文件受到损坏,您将看到错误摘要,后面是文件已经恢复的通知。通过 ls 命令比较文件的大小,您可以看到备份被用于替换当前的数据库。

您可以安全地多次运行 tdbbackup 命令。在有效的数据库文件上运行它,类似 清单 4 中的倒数第二个命令, 则会提供文件中的记录数。MD5 总和与损坏之前所看到的相匹配。

注意:tdbbackup 命令接受通配,所以您可以同时备份并验证多个文件。

变更 TDB 文件

tdbtool 实用工具使您可以更改 TDB 文件内部的数据。此实用工具还检查文件内的个别键和值,而不必转储整个文件并对整个输出排序。

tdbtool 可在命令行上接受命令,或者您可以打开交互式控制台。要在命令行上完成任务,请运行 tdbtool example.tdb command options,其中 example.tdb 是文件名,command 是命令,针对命令的选项位于最后。要使用 tdb shell,只需单独运行 tdbtool 或在命令行上传递文件的名称。

要创建数据库,请单独运行 tdbtool,然后输入 create test.tdb。这样做可以在磁盘上创建名为 test.tdb 的数据库并打开它以便您在此会话中进行的任何变更都在该文件上。如果您有现成的 TDB 文件,您可以在命令行上指定该名称或使用 open 命令。奇怪的是,直接从命令行创建 TDB 文件的惟一方式涉及指定名称两次,例如 tdbtool test.tdb create test.tdb,其返回一个错误但成功地创建一个数据库。

在您创建完数据库或者打开现有数据库时,可以使用以下选项:

●dump:显示数据库中的所有内容,就像 tdbdump。

●keys:只以 ASCII 显示键,或通过 hexkeys 命令,用十六进制格式显示它们。

●erase:在没有提示的情况下删除数据库中的所有内容。

●info:显示数据库使用的键和字节数的概要。

●check:查看数据库是否有效。

●speed:执行测试以便查看数据以多快的速度读取并写入数据库。

●show key:输出与键存储在一起的值。

●delete key:删除键和值。

要添加并处理数据,您需要有 insert 和 store 命令。它们每一个都接受键和值的参数,值为可选。如果您不指定一个值,那么您将看到键在值中存储零字节数据。

插入记录 意味着创建新的记录,而存储记录 可以覆盖现有的条目。清单 5 显示了这两个命令之间的差异。

清单 5. 存储与插入记录

tdb> insert mykey myvalue
tdb> insert mykey newvalue
insert failed
tdb> store mykey newvalue
Storing key:
key 5 bytes
mykey
data 8 bytes
[000] 6E 65 77 76 61 6C 75 65 newvalue
tdb> store newkey someothervalue
Storing key:
key 6 bytes
newkey
data 14 bytes
[000] 73 6F 6D 65 6F 74 68 65 72 76 61 6C 75 65 someothe rvalue

清单 5 中的事件顺序是:

1、插入名为 mykey 的键,具有值 myvalue。此操作成功。

2、插入与以前名称相同的键但是具有新的值。此操作失败,因为键已经存在。

3、存储键而不是插入它。此操作成功,且您将获得更详细的输出。

4、存储具有新值的新键。即使键不存在此操作也会成功。

您可以在 tdb shell 中使用事务,以便允许您运行一系列命令并作为一个组应用它们,或者作为一个组取消它们。清单 6 显示了两个事务。

清单 6. 使用事务

tdb> transaction_start
tdb> insert somekey somevalue
tdb> show somekey
key 7 bytes
somekey
data 9 bytes
[000] 73 6F 6D 65 76 61 6C 75 65 somevalu e
tdb> transaction_cancel
tdb> show somekey
fetch failed
tdb> transaction_start
tdb> insert somekey somevalue
tdb> transaction_commit
tdb> show somekey
key 7 bytes
somekey
data 9 bytes
[000] 73 6F 6D 65 76 61 6C 75 65 somevalu e

该事务首先以 transaction_start 命令开始。下一步是插入一个键。如果另一个进程要读取数据库,则不会看到此键,因为它是没有提交。打开该事务的进程确实可以看到该键。然后,通过 transaction_cancel 取消该事务。该键不再出现。

然后重新运行该进程,但是通过 transaction_commit 提交事务。然后该键对于所有读取器都存在。

如果您位于事务中,则其他读取器可能受阻,这意味着它们将挂起直到事务完成。所以当在生产数据库中使用事务时请小心!虽然它们是非常安全的功能,但是如果过度使用就会潜在地伤害性能。#p#

超越 TDB

根据您的配置,用户帐户可存储在各种不同的位置,两种工具为您提供一种命令行界面,同时也考虑到后端通信。例如,您可以使用相同的命令,即使用户数据存储在 LDAP 中而不是 TDB 文件中。

使用 smbpasswd

smbpasswd 实用工具可添加并删除用户或计算机帐户并变更密码。其最常用于执行后面的任务,更改当前用户的密码,或者根本更改其他用户的密码。

在后面的文章中,您将更深入地了解有关不同密码后端的信息,但是在较高的等级上,Samba 密码可以用几种不同的方式进行存储,这取决于 Samba 的制作时间和您正在集成的系统。smbpasswd 和 pdbedit(下面将进行描述)可以针对任何后端(即使它不是 TDB)执行其操作。

Microsoft 客户端以 Microsoft 专用的哈希而不是纯文本或 UNIX 密码哈希形式在网络中传递密码。这意味着无法采用 Microsoft 密码哈希并确定该密码是否与存储在 UNIX 密码数据库中的密码相同。因此,Samba 必须为 Microsoft 哈希保留单独的密码数据库;这就被称为密码后台。

使用 pdbedit

pdbedit 管理 Samba 用户数据库和帐户策略。它可以做任何事情,从而 smbpasswd 可以增加管理策略并在不同后台之间迁移帐户。

要显示数据库中的所有用户,请运行 pdbedit -L。通过传递 -v 标记,您可以获得有关用户的更多详细资料,如清单 7 所示。

清单 7. 用户的详细清单

[root@bob tmp]# pdbedit -L -v
---------------
Unix username: sean
NT username:
Account Flags: [U ]
User SID: S-1-5-21-2287037134-1443008385-640796334-1001
Primary Group SID: S-1-5-21-2287037134-1443008385-640796334-513
Full Name: Sean
Home Directory: \\bob\sean
HomeDir Drive:
Logon Script:
Profile Path: \\bob\sean\profile
Domain: BOB
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: never
Kickoff time: never
Password last set: Mon, 24 May 2010 21:28:49 CDT
Password can change: Mon, 24 May 2010 21:28:49 CDT
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

您必须作为 root 用户登录,pdbedit 命令才能工作。您可以编辑各种用户设置,例如最后登录时间、密码变更以及主目录,就像您正在使用 Microsoft 实用工具一样。

每一个用户参数都有自己的命令行选项,为了获得细节,请查看 pdbedit(8) 联机帮助页。

同样重要的是,要注意 Samba 用类似的方式处理计算机帐户和用户帐户。清单 8 显示了配置为域控制器的 Samba 服务器的密码数据库。

清单 8. 密码数据库,包括计算机帐户

[root@sergeant ~]# pdbedit -L
root:0:root
mythupstairs$:4294967295:MYTHUPSTAIRS
BOB$:1043:Machine
sean:1002:Sean,,,
sergeant$:4294967295:Machine

以美元符号 ($) 结束的名称都是计算机帐户,用于向域验证计算机。相应的秘密将存储在远程服务器中的 secrets.tdb 上和域控制器中的 passdb.tdb 上。

【编辑推荐】

  1. 活用三种权限 理解Samba的权限控制
  2. Samba实用技巧:更换用户、端口监听、列表控制
  3. 使用GFS和DRBD在CentOS 5.5上进行Samba CTDB集群部署
责任编辑:黄丹 来源: 51CTO.com
相关推荐

2009-12-02 11:39:15

samba设置用户

2011-09-15 14:43:27

CentOSsamba

2009-04-28 19:02:23

2023-07-27 09:11:32

ZONEINFO时区数据库

2009-11-27 13:11:31

Samba做文件服务器

2010-08-05 11:03:55

创建分区文件系统

2022-01-04 09:36:24

Samba文件共享工具Linux

2010-01-07 10:34:28

Ubuntu samb

2009-11-26 09:02:30

Suse Linux

2010-01-08 17:32:11

Ubuntu samb

2010-08-26 17:11:50

DB2database Pa

2011-03-25 09:35:07

2009-10-15 10:02:39

linuxyum命令详解

2011-03-02 13:32:11

Samba 3.5.7文件共享软件

2015-07-14 10:45:16

SambaLinuxWindows

2011-08-16 17:32:15

sambalinux

2010-05-27 09:04:25

MEF架构.NET 4

2010-03-30 16:26:09

Oracle

2011-01-19 15:03:24

Qmail控制文件

2009-06-16 10:10:40

JavaMail AP
点赞
收藏

51CTO技术栈公众号