赞
踩
Samba在设计和编写受到了内核代码的影响,它的代码风格与内核类似。Samba的目标之一是提供类似于Windows的功能,并且能够在各种Unix和Linux操作系统上运行。为此,需要处理系统调用和各种操作系统相关的问题,这些问题与内核代码中的问题非常相似。因此,Samba采用了类似于内核的代码风格,以便更容易地与操作系统交互并进行维护。此外,Samba也广泛使用了Unix编程的最佳实践,例如使用系统调用而不是库函数,以获得更好的性能和可移植性。
本篇主体也是以samba-4.13.17版本为例,但是框架可以在整套大体一致
在samba源码里。samba源码树可以分为以下几个组
source3目录是主要由文件服务器和域成员使用的代码目录,我们能够正常使用samba,source3部分的代码至关重要。
source3包含以下主要组件:
实现主要AD数据库的代码位于source4/dsdb目录中。dsdb目录包含以下值得注意的组件:
源代码树包含用于构建和测试Samba的以下组件。
Samba代码库的大部分都是从IDL(接口定义语言)文件自动生成的。这些代码分布在源代码树中(即source3、source4和顶级库)。
PIDL为使用IDL描述的所有结构生成拉(序列化或打包)和推(反序列化或解包)函数,并且标记为[public]的结构暴露在C和Python的公共函数中。这对于解析不仅仅是DCE/RPC数据包,而是任何其他具有规律结构的缓冲区非常有帮助。IDL文件位于:
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界面脚本。
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的框架主要分为以下几个部分:
如下图所示,库文件包含了一些常用的功能,如字符串处理、内存分配、配置库。此外,还包括一些特定功能的实现,如文件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,等等还有其他库进行进一步封装,然后供开发者使用。
这个文件封装了一些接口来对smbd进行控制,比如debug功能,强制关闭,重新加载配置,关闭共享,休眠等等一些控制信号。
smbconf目录是用来对smbd的smb.conf文件进行的一些配置修改的api。比如创建共享,删除共享等等修改共享的操作。
这里主要是对配置文件的加载部分做的一个中间件,就类似于smbd和smb.conf之间的,当然也不仅仅是这些,和nmbd也有相关。
loadparm.c loadparm_ctx.c pyparam.c service.c test_lp_load.c util.c wscript_build
这里主要是针对于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模块包括:
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可以给开发人员使用。
此目录和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
这是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
当然这里面最主要的还是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,它提供了各种可移植代码的函数。
因为samba里面有很多自动化生成的代码文件,如果单独做一个耦合性低的工具单独使用includes.h,需要编译samba源码来使用,因为有些头文件需要编译完才会出现。
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等外部数据库集成使用。
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客户端功能。
samba source3下还有很多模块,这里就不一个个去介绍了。如auth,client目录等等。web目录,web目录下的swat管理工具已经在samba-4.13.17被移除。我目前主体也是介绍常用的目录。
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实在是太臃肿了。
在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
这里说明下talloc内存池,samba源码中的内存池是以talloc为中心。
Samba使用talloc内存池是为了提高内存分配和管理的效率和可靠性。
talloc是一个C语言的内存管理库,它可以自动追踪分配的内存和关联的上下文。使用talloc,开发者可以轻松地创建和管理内存池,从而简化了内存管理的复杂性。与标准的内存分配方式相比,talloc可以更好地支持内存分配的追踪和垃圾回收,从而避免了内存泄漏和野指针等问题。
对于Samba这样的大型开源软件项目来说,使用talloc内存池可以减少内存管理的工作量,提高开发效率,同时也能够减少内存泄漏等问题的发生,提高代码的稳定性和可靠性。因此,talloc内存池被广泛应用于Samba的各个组件中。
所以如果要参与samba开发可以去了解下talloc内存池如何使用。samba毕竟是C语言写的。
主要还是讲解了samba源码框架的介绍,主体还是以source3为目标。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。