samba开发篇–框架
Samba在设计和编写受到了内核代码的影响,它的代码风格与内核类似。Samba的目标之一是提供类似于Windows的功能,并且能够在各种Unix和Linux操作系统上运行。为此,需要处理系统调用和各种操作系统相关的问题,这些问题与内核代码中的问题非常相似。因此,Samba采用了类似于内核的代码风格,以便更容易地与操作系统交互并进行维护。此外,Samba也广泛使用了Unix编程的最佳实践,例如使用系统调用而不是库函数,以获得更好的性能和可移植性。
文章目录
前言
本篇主体也是以samba-4.13.17版本为例,但是框架可以在整套大体一致
一、samba源码框架介绍
在samba源码里。samba源码树可以分为以下几个组
- Top-level libraries
- source3
- source4
- Infrastructure components
- Autogenerated code
这不是全部的目录,只涵盖主要组件。以下为更详细的布局。
Top-level libraries
- Third-party:Samba需要一些特定的库来构建。其中一些包含在 Samba 源代码树中,以帮助在旧的和非 Linux 平台上构建。
- General purpose libraries(lib):像所有用C编写的大型程序一样,Samba有许多内部帮助函数,它们不实现协议,但是需要共享代码并使Samba的其余部分变得可能。talloc、tdb、tevent和ldb子项目位于lib目录下。
- Common RPC client library (librpc): Samba的RPC客户端实现的共同部分(source3和source4之间)。
- Common client library (libcli):Samba协议的客户端实现的共同部分(source3和source4之间)。
- Common authentication library (auth):Samba身份验证实现的共同部分(source3和source4之间)。
- PIDL :Samba的代码自动生成系统,用于从IDL生成C代码和C-Python绑定。
- python:包含Samba的Python库。它通常不用于文件服务器,但对于AD DC至关重要。
- CTDB:Samba的集群数据库(使集群文件服务器成为可能)。
source3
source3目录是主要由文件服务器和域成员使用的代码目录,我们能够正常使用samba,source3部分的代码至关重要。
source3包含以下主要组件:
- The SMB file server (smbd):大多数人在想到Samba时想到的文件服务器。
- The NBT name server (nmbd):为希望使用NetBIOS over TCP/IP(NBT)的用户提供服务。
- Winbindd:提供Samba与其加入的AD域之间的连接,用于认证和名称查找。它还管理IDMAP,即在Unix UID/GID值和Windows SID值之间的映射。winbindd在域成员和AD域控制器模式下都使用。
- RPC client library (librpc):包含Samba的RPC客户端实现的特定于source3子树的部分。
- SMB client library (libsmb):包含在source3子树中使用的Samba的SMB客户端实现的部分。
- Authentication server (auth):包含在source3子树中使用的Samba的NTLM认证服务器的部分。当Samba是AD DC时,一个shim模块将其连接到source4认证代码。
- Password database (passdb): 包含在source3子树中使用的NTLM密码数据库。当Samba是AD DC时,一个shim模块将其连接到sam.ldb数据存储。
- RPC server:包含source3 RPC服务器。然而,大部分此部分在AD DC中不使用,而是重定向到source4/rpc_server的相应部分。当使用时,这提供了经典的或类似NT4的DC,无论是作为DC还是为每个成员或独立服务器上的SAM提供服务(每台Windows机器都有一个以自己的名称命名的数据库,Samba也是如此)。
- Print server:功能位于打印目录中。还相关的是source3/rpc_server/spoolss代码。
source4
- Active Directory Database templates:位于setup目录中。这些模板填充了sam.ldb中Active Directory DC的基本结构,包括完整的模式定义。
- Heimdal:是一个旧的分支/分叉,带有一些更改。尝试将此Samba分支与一个名为lorikeet-heimdal的树进行同步(这是一个真正的Heimdal分支/分叉)。应先将补丁应用于上游,但并非总是这样做。
- General purpose libraries (lib):尚未迁移到顶级目录。
- Client library (libcli):包含Samba的客户端实现部分,针对source4代码库的特定协议。
- RPC client library (librpc):包含Samba的RPC客户端实现部分,针对该代码库的特定部分。
- libgpo:包含组策略对象支持。
- smbtorture:二进制文件,用于测试Samba和Windows。由于历史原因,有两个smbtorture框架,source4框架是当前扩展的框架,但某些测试将保留在source3/torture中。
- Old NTVFS file server and VFS layer. 尝试了一个新的文件服务器架构,这些目录展示了一个围绕SMB和NTFS语义而不是Samba在smbd中使用的POSIX语义的新VFS层(smbd现在使用混合方法)。
source4/ntvfs。
source4/smb_server。 - AD Services.核心AD DC在每个组件的命名文件夹中实现:
source4/ldap_server
source4/cldap_server (Connectionless LDAP)
source4/rpc_server
source4/dns_server
source4/nbt_server (NetBIOS over TCP/IP)
source4/kdc - Authentication server (auth):包含Samba的认证服务器部分,用于AD DC。当Samba作为AD DC时,一个shim模块将smbd连接到此身份验证代码。
- The Directory Services DB (DSDB):提供了sam.ldb数据库背后的主要实现(下面将更详细地介绍)。
Directory Services DB (DSDB)
实现主要AD数据库的代码位于source4/dsdb目录中。dsdb目录包含以下值得注意的组件:
- LDB modules: LDB库提供了一个通用框架,可以添加自定义插件模块来修改数据库的行为。DSDB使用LDB库框架,并定义了自己的一组插件模块(位于dsdb/samdb/ldb_modules中),这些模块特定于Active Directory。结果是提供完整AD语义的数据库。
- Schema handling: sam.ldb数据库遵循并符合AD模式。负责加载和使用完整AD模式的处理位于source4/dsdb/schema中。
- Replication handling (part):一些与处理AD的DRS复制相关的代码位于source4/dsdb/repl中。
- KCC The Knowledge Consistency Checker (KCC):是一个进程,确保维护有效的复制图并进行其他定期清理工作。实现的部分位于source4/dsdb/kcc中,主要是出于历史原因。其他KCC处理也位于python/samba/kcc中。
- Infrastructure components
Infrastructure components
源代码树包含用于构建和测试Samba的以下组件。
- Selftest:是一个定制的单元和集成测试框架。测试本身位于源代码树的许多不同部分中。
python/samba/tests包含许多Python单元测试。
selftest/selftest.pl是用于运行make test的运行程序。
selftest/target是构建Samba测试环境的Perl代码。
selftest/tests.py声明了所有Samba测试(包括单元测试和集成测试)以及它们应该运行的测试环境。请注意,make test也分布在source3和source4中。 - Wintest:是一个位于Samba自测之外的系统。Wintest构建和安装Samba,并针对Windows自动运行一些有限的测试。请注意,此系统目前未维护和使用。
- Build system:buildtools中的代码使用源代码树中每个目录中的wscript文件来构建Samba。
- Documentation:Samba的man页是从XML构建的,位于docs-xml目录中。特别是smb.conf man页是从此处的整个子目录中的文件构建的。
- 请注意,Samba中有效参数的内部列表是从每个配置参数的XML文档中创建的,确保代码和文档始终保持一致。文档中记录的默认值也会在自动化测试套件中进行一致性检查。
Autogenerated code
Samba代码库的大部分都是从IDL(接口定义语言)文件自动生成的。这些代码分布在源代码树中(即source3、source4和顶级库)。
PIDL为使用IDL描述的所有结构生成拉(序列化或打包)和推(反序列化或解包)函数,并且标记为[public]的结构暴露在C和Python的公共函数中。这对于解析不仅仅是DCE/RPC数据包,而是任何其他具有规律结构的缓冲区非常有帮助。IDL文件位于:
- librpc/idl
- source3/librpc/idl
- source4/librpc/idl
对于不太适合IDL的复杂结构,可以指定标记[nopull]、[nopush]或[noprint]。然后可以编写手写解析器来处理这些结构。这些手动解析器位于: - librpc/ndr
- source3/librpc/ndr
- source4/librpc/ndr
二、浅谈source3
source3是文件服务器和域成员主要是用的代码
下图就是samba-4.13.17的source3目录下的文件夹和相关waf脚本
auth Doxyfile include libads librpc locking nmbd printing rpc_client script smbadduser.in utils wscript
build exports intl libgpo libsmb mainpage.dox param profile rpcclient selftest smbd web wscript_build
client groupdb lib libnet locale modules passdb registry rpc_server services torture winbindd wscript_configure_system_ncurses
auth: 包含用于身份验证的代码和模块,如Kerberos和NTLM。
client: 包含SMB客户端代码,用于与远程SMB服务器进行通信。
groupdb: 提供组管理功能。
include: 包含用于构建Samba库和应用程序的头文件。
lib: 包含Samba库的代码和头文件。
libads: 提供Active Directory集成支持。
libgpo: 提供组策略支持。
libnet: 提供用于管理网络的API。
librpc: 实现远程过程调用(RPC)功能。
libsmb: 包含SMB协议的实现。
locale: 包含Samba支持的各种语言的本地化文件。
locking: 提供文件锁定功能。
modules: 提供用于加载Samba模块的代码和头文件。
nmbd: 提供NetBIOS名称解析器(nmb)服务。
param: 包含Samba配置文件的示例。
passdb: 提供用户身份验证的密码数据库。
printing: 提供打印支持功能。
rpc_client: 实现RPC客户端。
rpc_server: 实现RPC服务器。
script: 包含用于管理脚本的代码和头文件。
selftest: 提供Samba测试套件。
smbd: 提供SMB服务器功能。
smbadduser.in: 提供向Samba中添加用户的脚本。
torture: 提供Samba性能和稳定性测试的代码。
utils: 包含各种Samba工具,如smbpasswd和smbstatus。
web: 提供Web界面支持。
wscript: Samba构建系统的主要脚本。
wscript_build: 提供用于构建Samba的辅助脚本。
wscript_configure_system_ncurses: 提供用于配置Samba的ncurses界面脚本。
1.smbd
smbd目录是samba核心代码之一,实现了SMB协议的服务端。
整个目录下文件如下
aio.c fileio.c notify_msg.c seal.c smb2_glue.c smb2_write.c
avahi_register.c filename.c ntquotas.c sec_ctx.c smb2_ioctl.c smbd_cleanupd.c
blocking.c files.c nttrans.c server.c smb2_ioctl_dfs.c smbd_cleanupd.h
close.c globals.c open.c server_exit.c smb2_ioctl_filesys.c smbd.h
conn.c globals.h oplock.c server_reload.c smb2_ioctl_named_pipe.c smbXsrv_client.c
connection.c ipc.c oplock_linux.c service.c smb2_ioctl_network_fs.c smbXsrv_open.c
conn_idle.c lanman.c password.c session.c smb2_ioctl_private.h smbXsrv_session.c
conn_msg.c mangle.c perfcount.c sesssetup.c smb2_keepalive.c smbXsrv_tcon.c
dfree.c mangle_hash2.c pipes.c share_access.c smb2_lock.c smbXsrv_version.c
dir.c mangle_hash.c posix_acls.c signing.c smb2_negprot.c srvstr.c
dmapi.c message.c process.c smb1_utils.c smb2_notify.c statcache.c
dnsregister.c msdfs.c proto.h smb1_utils.h smb2_query_directory.c statvfs.c
dosmode.c negprot.c pysmbd.c smb2_break.c smb2_read.c trans2.c
durable.c notify.c quotas.c smb2_close.c smb2_server.c uid.c
error.c notifyd/ reply.c smb2_create.c smb2_sesssetup.c utmp.c
fake_file.c notify_fam.c scavenger.c smb2_flush.c smb2_setinfo.c vfs.c
file_access.c notify_inotify.c scavenger.h smb2_getinfo.c smb2_tcon.c
smbd的框架主要分为以下几个部分:
- server.c:是smbd的主要入口程序,提供smbd的主要处理逻辑,也就是我们的服务器端程序。初始化:包括解析命令行参数、读取配置文件、初始化日志系统等。
- vfs.c:提供了smbd的虚拟文件系统(VFS)层,可以将Samba连接到各种不同类型的文件系统上。
- 以下暂时省略
2.lib库
如下图所示,库文件包含了一些常用的功能,如字符串处理、内存分配、配置库。此外,还包括一些特定功能的实现,如文件ID、SID(安全标识符)管理、ACL(访问控制列表)管理等等。在Samba的各个模块中被广泛使用,为Samba提供了一些基础的支持和通用的功能。
ABI ctdb_dummy.c ldap_escape.c recvfile.c srprs.h tevent_barrier.c util_file.h util_transfer_file.c
addrchange.c dbwrap lsa.c sendfile.c string_replace.c tevent_barrier.h util_macstreams.c util_tsock.c
addrchange.h dmallocmsg.c messages.c serverid.c string_replace.h tevent_glib_glue.c util_macstreams.h util_tsock.h
adouble.c dumpcore.c messages_ctdb.c server_id_db_util.c substitute.c tevent_glib_glue.h util_malloc.c util_unixsids.c
adouble.h errmap_unix.c messages_ctdb.h server_id_db_util.h substitute_generic.c tevent_glib_glue_tests.c util_names.c util_unixsids.h
adt_tree.c eventlog messages_ctdb_ref.c server_id_watch.c sysacls.c time.c util_nscd.c util_wellknown.c
audit.c file_id.c messages_ctdb_ref.h server_id_watch.h sysquotas_4A.c tldap.c util_nttoken.c version.c
avahi.c file_id.h messages_util.c server_mutex.c sysquotas_4B.c tldap_gensec_bind.c util_path.c version_test.c
background.c filename_util.c messages_util.h server_prefork.c sysquotas.c tldap_gensec_bind.h util_path.h winbind_util.c
background.h fstring.c ms_fnmatch.c server_prefork.h sysquotas_jfs2.c tldap_util.c util_procid.c winbind_util.h
cbuf.c gencache.c namearray.c server_prefork_util.c sysquotas_linux.c username.c util_procid.h wins_srv.c
cbuf.h gencache.h namemap_cache.c server_prefork_util.h sysquotas_nfs.c util_builtin.c util_sd.c xattr_tdb.c
charcnv.c global_contexts.c namemap_cache.h sessionid_tdb.c sysquotas_xfs.c util.c util_sec.c xattr_tdb.h
cleanupdb.c g_lock.c netapi sharesec.c system.c util_cluster.c util_sid.c
cleanupdb.h id_cache.c per_thread_cwd.c smbconf system_smbd.c util_cluster.h util_sid_passdb.c
cluster_support.c id_cache.h popt_common.c smbd_shim.c tallocmsg.c util_cmdline.c util_sid_passdb.h
cluster_support.h idmap_cache.c popt_common_cmdline.c smbd_shim.h tdb_validate.c util_ea.c util_sock.c
cmdline_contexts.c idmap_cache.h privileges.c smbldap.c tdb_validate.h util_ea.h util_specialsids.c
cmdline_contexts.h interface.c privileges.h smbrun.c test_adouble.c util_event.c util_str.c
ctdbd_conn.c ldap_debug_handler.c readdir_attr.h srprs.c test_tldap.c util_file.c util_tdb.c
还有部分是提供给smbd服务端的对外的接口,比如message.c,smbconf目录等等。不过这个目录一般来说是不太需要用到的,samba有一个top-level库会对source3,source4,等等还有其他库进行进一步封装,然后供开发者使用。
1)message.c
这个文件封装了一些接口来对smbd进行控制,比如debug功能,强制关闭,重新加载配置,关闭共享,休眠等等一些控制信号。
2)smbconf目录
smbconf目录是用来对smbd的smb.conf文件进行的一些配置修改的api。比如创建共享,删除共享等等修改共享的操作。
3.param目录
这里主要是对配置文件的加载部分做的一个中间件,就类似于smbd和smb.conf之间的,当然也不仅仅是这些,和nmbd也有相关。
loadparm.c loadparm_ctx.c pyparam.c service.c test_lp_load.c util.c wscript_build
4.module目录
这里主要是针对于samba的vfs层的一些可用模块,可以通过相关文档来编写新的vfs模块。
developer.c nfs4acl_xattr_util.c util_reparse.c vfs_cacheprime.c vfs_fake_acls.c vfs_not_implemented.c vfs_solarisacl.h vfs_virusfilter_utils.h
getdate.c nfs4acl_xattr_util.h util_reparse.h vfs_cap.c vfs_fake_dfq.c vfs_offline.c vfs_streams_depot.c vfs_vxfs.c
getdate.h nfs4acl_xattr_xdr.c vfs_acl_common.c vfs_catia.c vfs_fake_perms.c vfs_posixacl.c vfs_streams_xattr.c vfs_vxfs.h
getdate.y nfs4acl_xattr_xdr.h vfs_acl_common.h vfs_ceph.c vfs_fileid.c vfs_posixacl.h vfs_syncops.c vfs_widelinks.c
hash_inode.c non_posix_acls.c vfs_acl_tdb.c vfs_ceph_snapshots.c vfs_fruit.c vfs_posix_eadb.c vfs_time_audit.c vfs_worm.c
hash_inode.h non_posix_acls.h vfs_acl_xattr.c vfs_commit.c vfs_full_audit.c vfs_prealloc.c vfs_tru64acl.c vfs_xattr_tdb.c
lib_vxfs.c offload_token.c vfs_afsacl.c vfs_crossrename.c vfs_glusterfs.c vfs_preopen.c vfs_tru64acl.h vfs_zfsacl.c
nfs41acl.x offload_token.h vfs_aio_fork.c vfs_default.c vfs_glusterfs_fuse.c vfs_readahead.c vfs_tsmsm.c wscript_build
nfs4_acls.c perfcount_test.c vfs_aio_pthread.c vfs_default_quota.c vfs_gpfs.c vfs_readonly.c vfs_unityed_media.c
nfs4_acls.h posixacl_xattr.c vfs_aixacl2.c vfs_delay_inject.c vfs_hpuxacl.c vfs_recycle.c vfs_virusfilter.c
nfs4acl_xattr.h posixacl_xattr.h vfs_aixacl.c vfs_dfs_samba4.c vfs_hpuxacl.h vfs_shadow_copy2.c vfs_virusfilter_clamav.c
nfs4acl_xattr_ndr.c README-gpfs-acl.txt vfs_aixacl_util.c vfs_dirsort.c vfs_io_uring.c vfs_shadow_copy.c vfs_virusfilter_common.h
nfs4acl_xattr_ndr.h README.nfs4acls.txt vfs_aixacl_util.h vfs_error_inject.c vfs_linux_xfs_sgid.c vfs_shell_snap.c vfs_virusfilter_fsav.c
nfs4acl_xattr_nfs.c test_nfs4_acls.c vfs_audit.c vfs_expand_msdfs.c vfs_media_harmony.c vfs_snapper.c vfs_virusfilter_sophos.c
nfs4acl_xattr_nfs.h test_vfs_full_audit.c vfs_btrfs.c vfs_extd_audit.c vfs_nfs4acl_xattr.c vfs_solarisacl.c vfs_virusfilter_utils.c
VFS(Virtual File System)是Samba中的一个核心模块,它提供了一个抽象层,使得Samba可以与不同的文件系统交互,而不需要知道底层文件系统的细节。VFS提供了一组API,这些API允许Samba操作文件系统中的文件和目录,包括文件读写、文件元数据的读写、权限控制等等。Samba中的VFS模块包括很多文件,这些文件实现了各种不同的VFS操作,例如处理ACL、文件系统快照、文件压缩等等。其中一些常见的VFS模块包括:
- vfs_acl_tdb.c:处理ACL(访问控制列表)的模块,将ACL存储在TDB(Trivial Database)数据库中。
- vfs_zfsacl.c:提供了对ZFS文件系统的ACL支持。
- vfs_full_audit.c:提供了samba共享的用户操作的日志功能。
除了这些模块,Samba还提供了很多其他的VFS模块,开发人员可以根据需要选择和定制。
5.passdb 目录
source3下的passdb目录包含了Samba服务器中用于身份验证和授权的passdb接口和模块。
ABI lookup_sid.h passdb.c pdb_ldap.c pdb_ldap_util.c pdb_samba_dsdb.c pdb_smbpasswd.h py_passdb.c
account_pol.c machine_account_secrets.c pdb_compat.c pdb_ldap.h pdb_ldap_util.h pdb_secrets.c pdb_tdb.c secrets.c
login_cache.c machine_sid.c pdb_get_set.c pdb_ldap_schema.c pdb_nds.c pdb_secrets.h pdb_tdb.h secrets_lsa.c
lookup_sid.c machine_sid.h pdb_interface.c pdb_ldap_schema.h pdb_nds.h pdb_smbpasswd.c pdb_util.c wscript_build
通俗讲,也就是我们常用的创建用户,删除用户,修改密码的数据库端实现以及对外接口,当然这些对外接口依然是提供给samba内部的,通过内部封装再提供一层对外API可以给开发人员使用。
6.nmbd目录
此目录和smbd目录是类似的,作为nmbd的服务器端,负责处理NetBIOS名字服务(NetBIOS Name Service)。NetBIOS是一个早期的计算机网络协议,它使用一种名字服务来将网络上的计算机映射到易于理解的名字(如“COMPUTER1”)。nmbd提供了NetBIOS名字注册和解析功能,使得Samba服务器可以被其他计算机使用NetBIOS名字访问。除此之外,nmbd还处理了一些其他的NetBIOS相关的任务,例如查询网络上的Master Browser,以及响应NetBIOS广播和查询请求等。
asyncdns.c nmbd_browsesync.c nmbd_incomingdgrams.c nmbd_mynames.c nmbd_namerelease.c nmbd_proto.h nmbd_subnetdb.c nmbd_workgroupdb.c
nmbd_become_dmb.c nmbd.c nmbd_incomingrequests.c nmbd_namelistdb.c nmbd_nodestatus.c nmbd_responserecordsdb.c nmbd_synclists.c wscript_build
nmbd_become_lmb.c nmbd_elections.c nmbd_lmhosts.c nmbd_namequery.c nmbd_packets.c nmbd_sendannounce.c nmbd_winsproxy.c
nmbd_browserdb.c nmbd.h nmbd_logonnames.c nmbd_nameregister.c nmbd_processlogon.c nmbd_serverlistdb.c nmbd_winsserver.c
可以很清楚看到主程序入口是nmbd.c
7.include目录
这是samba的source3下的include目录。其中包含了一些常见的头文件,例如passdb.h用于管理用户账号和密码的存储、client.h用于连接到远程smb服务器等等。另外,还有一些特定功能的头文件,如smbldap.h用于支持LDAP账号存储、vfs.h用于实现虚拟文件系统,smb.h是smb协议结构体的实现,貌似没有像dpdk一样单独做出一个守护进程。
ads.h client.h idmap_autorid_tdb.h libsmb_internal.h messages.h nt_printing.h proto.h serverid.h smbldap.h sysquotas.h util_sd.h
adt_tree.h ctdbd_conn.h idmap.h local.h msdfs.h ntquotas.h registry.h session.h smb_macros.h tldap.h util_tdb.h
async_smb.h ctdb_srvids.h includes.h locking.h nameserv.h passdb.h rpc_dce.h smb_acls.h smb_perfcount.h tldap_util.h vfs.h
auth_generic.h debugparse.h intl.h lsa.h nss_info.h popt_common_cmdline.h rpc_misc.h smb.h smbprofile.h trans2.h vfs_macros.h
auth.h fake_file.h krb5_env.h MacExtensions.h ntdomain.h popt_common.h safe_string.h smb_krb5.h srvstr.h transfer_file.h
auth_info.h g_lock.h libsmbclient.h mangle.h ntioctl.h printing.h secrets.h smb_ldap.h stamp-h.in util_event.h
1)includes.h文件
当然这里面最主要的还是includes.h文件,includes.h是Samba软件源代码中source3/include目录下的一个头文件。该文件被许多其他Samba源代码中的头文件包含,它本身也包含了许多其他常用的头文件,这些头文件在整个Samba组件中都需要。
includes.h的目的是提供一个集中的位置,包含通用系统头文件和Samba特定的头文件,这些头文件在整个代码库中都需要。通过在其他头文件或源文件中包含此文件,开发人员可以避免手动逐个包含每个头文件。
includes.h包含的一些头文件包括stdio.h、stdlib.h、string.h、sys/types.h、sys/stat.h、fcntl.h、unistd.h、stdarg.h、errno.h、stdbool.h等等。此外,includes.h还包括一些Samba特定的头文件,例如config.h,其中包含Samba的各种配置选项,以及replace.h,它提供了各种可移植代码的函数。
(1)注意:
因为samba里面有很多自动化生成的代码文件,如果单独做一个耦合性低的工具单独使用includes.h,需要编译samba源码来使用,因为有些头文件需要编译完才会出现。
8.utils目录
samba source3下的utils目录中包含了许多实用工具程序。这些程序的功能各不相同,包括文件操作、网络连接、配置管理、用户管理等等,我们常用的工具都是由这里的文件生成的。
async-tracker.c mdfind.c net_eventlog.c netlookup.c net_rpc_registry.c net_usershare.c regedit_dialog.h smbcontrol.c
clirap2.c mvxattr.c net_file.c net_notify.c net_rpc_rights.c net_util.c regedit.h smbcquotas.c
clirap2.h net_ads.c net_g_lock.c net_printing.c net_rpc_samsync.c net_vfs.c regedit_hexedit.c smbfilter.c
conn_tdb.c net_ads_gpo.c net_group.c net_proto.h net_rpc_service.c nmblookup.c regedit_hexedit.h smbget.c
conn_tdb.h net_afs.c net_groupmap.c net_rap.c net_rpc_sh_acct.c ntlm_auth.c regedit_list.c smbpasswd.c
dbwrap_tool.c net_afs.h net.h net_registry.c net_rpc_shell.c ntlm_auth_diagnostics.c regedit_list.h smbtree.c
dbwrap_torture.c net.c net_help.c net_registry_check.c net_rpc_trust.c ntlm_auth.h regedit_samba3.c split_tokens.c
debug2html.c net_cache.c net_help_common.c net_registry_check.h net_sam.c ntlm_auth_proto.h regedit_treeview.c status.c
debugparse.c net_conf.c net_help_common.h net_registry_util.c net_serverid.c passwd_proto.h regedit_treeview.h status_profile.c
destroy_netlogon_creds_cli.c net_conf_util.c net_idmap.c net_registry_util.h net_share.c passwd_util.c regedit_valuelist.c status_profile_dummy.c
eventlogadm.c net_conf_util.h net_idmap_check.c net_rpc_audit.c net_status.c pdbedit.c regedit_valuelist.h status_profile.h
interact.c net_dns.c net_idmap_check.h net_rpc.c net_tdb.c profiles.c regedit_wrap.c testparm.c
interact.h net_dns.h net_join.c net_rpc_conf.c net_time.c regedit.c sharesec.c wscript_build
log2pcaphex.c net_dom.c net_lookup.c net_rpc_printer.c net_user.c regedit_dialog.c smbcacls.c
例如,smbpasswd.c是一个用于管理Samba用户密码的命令行工具。它可以添加、删除、修改和列出Samba用户的密码。此外,它还提供了一些其他功能,如更改密码策略、强制用户重置密码等。
pdbedit.c是一个命令行工具,它用于管理Samba用户数据库。它可以添加、删除和修改用户、组、机器帐户等。此外,它还可以显示用户和组信息、设置密码和帐户锁定策略等。它还可以与LDAP、MySQL等外部数据库集成使用。
9.libsmb目录
source3下的libsmb目录包含了许多用于实现SMB/CIFS协议的库函数。这些函数封装了许多底层细节,使得Samba应用程序能够使用这些协议来实现文件和打印机共享等功能。
ABI clidgram.h climessage.c clireadwrite.c clisymlink.c errormap_wbc.c libsmb_file.c libsmb_setget.c namequery.c proto.h smberr.c
async_smb.c clientgen.c clioplock.c clisecdesc.c clitrans.c errormap_wbc.h libsmb.h libsmb_stat.c namequery_dc.c pylibsmb.c smbsock_connect.c
auth_generic.c clierror.c cliprint.c cli_smb2_fnum.c conncache.c libsmb_cache.c libsmb_misc.c libsmb_thread_impl.c namequery.h reparse_symlink.c trusts_util.c
cliconnect.c clifile.c cliquota.c cli_smb2_fnum.h dsgetdcname.c libsmb_compat.c libsmb_path.c libsmb_thread_posix.c nmblib.c samlogon_cache.c unexpected.c
clidfs.c clifsinfo.c clirap.c clispnego.c dsgetdcname.h libsmb_context.c libsmb_printjob.c libsmb_xattr.c nmblib.h samlogon_cache.h unexpected.h
clidgram.c clilist.c clirap.h clistr.c errormap.c libsmb_dir.c libsmb_server.c namecache.c passchange.c smbclient.pc.in wscript
当然你可以调用这些库来自己实现一个基于SMB协议的连接,它的主要功能如下:
网络连接管理、认证授权、文件/目录操作、打印作业操作、以及一些辅助函数。其中,网络连接管理提供了与SMB/CIFS服务器进行连接、关闭连接、发送接收数据等功能。认证授权提供了SMB/CIFS协议所需的各种认证和授权功能。文件/目录操作提供了SMB/CIFS协议下的文件和目录访问操作,包括读写文件、打开/关闭文件、创建/删除目录等。打印作业操作提供了SMB/CIFS协议下的打印作业操作功能,包括打印作业提交、查询打印作业状态等。
libsmb还提供了一些辅助函数,例如解析SMB/CIFS消息、打印调试信息、处理SMB/CIFS错误码等。这些函数可以方便地被应用程序使用,从而使得应用程序开发者可以更加方便地实现SMB/CIFS客户端功能。
9.其他模块
samba source3下还有很多模块,这里就不一个个去介绍了。如auth,client目录等等。web目录,web目录下的swat管理工具已经在samba-4.13.17被移除。我目前主体也是介绍常用的目录。
三、浅谈source4目录
Samba source3和source4是Samba软件的两个主要版本。Samba source3是旧版本,它在发布后长时间被广泛使用。Samba source4则是新版本,是对Samba软件进行了重构和重写。Samba source4在设计和实现上与Samba source3有很大不同,它包含了许多新的功能和改进。Samba source4中使用的是Active Directory兼容的协议。
总的来说,Samba source4是一个更为现代化和功能更加丰富的Samba版本,但Samba source3在很多组织中仍然广泛使用,并且在某些情况下,Samba source3可能会更加适合特定的用例。
目前后续也是说,据说要把source4给取消掉,貌似是个失败的构造,当然我也找不到那句话在哪了,毕竟samba实在是太臃肿了。
四、顶级库 (top-level)中的 General purpose libraries(lib)
在samba源码根目录下有个lib库目录,这个库目录是samba架构里面顶级库的其中之一的通用库,这里面包含多个通用库文件,是对外可以使用的api,整体samba用了分层处理,对外经过了一个top封装来可以使用各种api来调用实现对samba的处理。
addns async_req compression dbwrap krb5_wrap ldb-samba mscat printer_driver README smbconf talloc tdb_wrap tevent torture util
afs audit_logging crypto fuzzing ldb messaging param pthreadpool replace socket tdb tdr texpect tsocket wscript_build
- addns:实现DNS解析、转换等功能。
- afs:实现AFS(Andrew File System)文件系统访问协议。
- async_req:提供异步请求处理的支持。
- audit_logging:实现审计日志记录功能。compression:提供数据压缩和解压缩功能。
- crypto:提供加密和解密功能。
- dbwrap:提供数据库访问的封装,支持多种后端。
- fuzzing:提供模糊测试相关的工具和库。
- krb5_wrap:提供对Kerberos认证协议的支持。
- ldb-samba:基于LDB库的Samba扩展库。
- messaging:提供消息传输相关的工具和库。
- mscat:提供多个库文件打包为一个库文件的支持。
- param:提供解析命令行参数的支持。
- printer_driver:提供打印机驱动相关的工具和库。
- pthreadpool:提供多线程线程池的支持。
- replace:提供字符串替换相关的工具和库。
- smbconf:提供解析和生成Samba配置文件的支持。
- talloc:提供内存分配和管理相关的工具和库。
- tdb_wrap:提供对TDB(Trivial Database)的封装。
- tevent:提供事件处理的支持。
- torture:提供测试工具和库。
- tsocket:提供对套接字的封装。
- util:提供常用工具函数的支持。
talloc内存池
这里说明下talloc内存池,samba源码中的内存池是以talloc为中心。
Samba使用talloc内存池是为了提高内存分配和管理的效率和可靠性。
talloc是一个C语言的内存管理库,它可以自动追踪分配的内存和关联的上下文。使用talloc,开发者可以轻松地创建和管理内存池,从而简化了内存管理的复杂性。与标准的内存分配方式相比,talloc可以更好地支持内存分配的追踪和垃圾回收,从而避免了内存泄漏和野指针等问题。
对于Samba这样的大型开源软件项目来说,使用talloc内存池可以减少内存管理的工作量,提高开发效率,同时也能够减少内存泄漏等问题的发生,提高代码的稳定性和可靠性。因此,talloc内存池被广泛应用于Samba的各个组件中。
所以如果要参与samba开发可以去了解下talloc内存池如何使用。samba毕竟是C语言写的。
总结
主要还是讲解了samba源码框架的介绍,主体还是以source3为目标。