storage R&D guy.
全部博文(1000)
分类: 服务器与存储
2015-06-10 13:44:27
一、source3为samba3的源代码,里面的Makefile.in为make主文件;
1.所有代码起始: 搜索Makefile.in中all,得到all:: ......
2.查找all中的SBIN_PROGS,得到 SBIN_PROGS = @ @ @SWAT_SBIN_TARGETS@ @EXTRA_SBIN_PROGS@
3.smbd为共享文件的进程,查找bin/smbd得到1549行 @: $(BINARY_PREREQS) $(SMBD_OBJ) ......;
4.第834行:SMBD_OBJ = $(SMBD_OBJ_BASE) $(SMBD_OBJ_MAIN);
4.1 第814行:SMBD_OBJ_BASE =
$(PARAM_WITHOUT_REG_OBJ) ......
4.1.1 PARAM_WITHOUT_REG_OBJ = dynconfig.o param/loadparm.o param/util.o lib/sharesec.o lib/ldap_debug_handler.o,对应同名的.c文件;
4.1.2 SMBD_OBJ_SRV = smbd/files.o smbd/chgpasswd.o smbd/connection.o...,对应同名的.c文件;
...
4.1.30 PRIVILEGES_BASIC_OBJ = .o...,对应同名的.c文件;
4.2 第768行:SMBD_OBJ_MAIN = smbd/server.o ;
4.2.1 server.o对应同名的server.c,位置在/source3/smbd/server.c;
cifs打开流程
一、linux客户端发出打开请求
1.fs/cifs:cifs_open,输入*inode,file,返回int;
1.1 list_for_each遍历cifs节点打开的文件列表;
1.1.1 list_entry取出flist指针指向的cifs信息;
1.2 full_path:根据文件的dentry成员构建path;
1.3 cifssmbopen,输入xid,full_path,buf...,CMD=SMB_COM_NT_CREATE_ANDX;
1.4 sendreceive函数发出pSMB,接收返回给pSMBr;
1.4.1 smb_send;
1.4.1.1 sock_sendmsg
1.4.1.1.1 _sock_sendmsg
1.4.1.1.1.1 security_socket_sendmsg
1.4.1.1.1.1.1 socket_sendmsg,发送给另一端的socket;
1.5 cifs_init_private,将netfid、进程id、文件、节点拷贝给pCifsfile的私有数据;
1.6 list_add将指针加入openfile_list;
1.7 cifs_open_inode_helper?;
二、samba服务端流程
2.1 server.c:smbd_init_globals初始化连接、poptGetContext由"smbd"和main的入参得到 poptContext_s参数
2.1.1 popt.c: poptGetNextOpt(pc)返回一个整型的操作选项;
2.1.2 sec_init得到用户ID和组ID;
2.1.3 substitute.c: set_remote_machine_name(smbd)给一个静态变量赋值为smbd;
2.1.4 generate_random_buffer产生64字节的随机缓存为了节省空间;
2.1.5 fault_setup建立退出信号处理;
2.1.6 dump_core_setup在出错时写入core文件;
2.1.7 BlockSignals(True,SIGPIPE)禁用管道通信、自定义信号、结束信号;
2.1.8 CatchChild确保没有僵尸进程(zombies);
2.1.9 init_sec_ctx初始化用户ID等上下文信息;
2.1.10 lp_load_initial_only打开配置文件;
2.1.11 reload_services重新加载服务;
2.1.12 如果没从配置文件中读取则用init_structs设置netbios名字;
2.1.13 启动时-D表示标准输入为socket;
2.1.14 reinit_after_fork将消息初始化;
2.1.15 smbd_setup_sig_term_handler建立SIGTERM处理句柄;
2.1.16 smbd_setup_sig_hup_handler建立进程退出信号处理句柄;
2.1.17 smbd_memcache初始化缓存;
2.1.18 memcache_set_global获取全局静态缓存;
2.1.19 session_init会话初始化(数据库保存);
2.1.20 connections_init连接初始化(数据库保存);
2.1.21 locking_init加锁;
2.1.22 namecache_enable通过设置命名缓存超时确定是否使用命名缓存;
2.1.23 初始化guest信息;
2.1.24 share_info_db_init加载共享信息,位于/var/lib/samba/share_info.tdb;
2.1.25 start_background_queue启动LPQ打印队列线程,
2.1.26 若为daemon方式,文件ID设为0,关闭0,1文件ID(I/O),打开目录/dev/null;
2.1.27 process.c:smbd_process 处理客户端过来的smb命令;
2.1.27.1 set_blocking将进程设为阻塞;
2.1.27.2 set_socket_options将该文件ID选项设为SO_KEEPALIVE ;
2.1.27.3 set_remote_machine_name为远程机器名分配内存;
2.1.27.4 get_peer_addr 返回远程socket的IP并赋值给本地静态内存中的字符串remote_machine;
2.1.27.4.1 get_peer_addr_internal 的getpeername的swrap_getpeername从静态内存的socket列表中 查找该文件ID对应的socket地址;
2.1.27.5 接收包之前check_access检查允许的主机列表防止攻击;
2.1.27.6 static_init_rpc初始化rpc,如何实现的?
2.1.27.7 init_modules从模块数组中预加载模块;
2.1.27.8 smb_perfcount_init加载perfcounter模块?
2.1.27.9 init_account_policy初始化账户;
2.1.27.10 将根目录设为/
2.1.27.11 srv_init_signing初始化smb_signing?
2.1.27.12 init_oplocks初始化机会锁;
2.1.27.13 initialize_async_io_handler初始化异步IO处理句柄;
2.1.27.14 注册消息MSG_SMB_FORCE_TDIS、MSG_SMB_RELEASE_IP、MSG_SMB_CLOSE_FILE;
2.1.27.15 lp_keepalive添加激活事件;
2.1.27.16 event_add_idle添加限时事件;
2.1.27.17 event_add_idle添加清理(housekeeping)事件;
2.1.27.18 连接最大接收和发送为128K;
2.1.27.19 conn_init初始化连接结构体;
2.1.27.20 init_dptrs初始化位图?
2.1.27.21 smb1.fde = event_add_fd将连接加入事件中并返回fde,若fde不为空则成功创建连接;
2.1.27.22 smbd_server_connection_loop_once创建连接循环;
2.1.28 exit_server_cleanly退出服务器;
2.1.29 open_sockets_smbd打开smbd的socket;
2.1.29.1 使用445和139端口监听;
2.1.29.2 返回每个interface接口的IP;
2.1.29.3 smbd_open_one_socket打开端口;
2.1.29.4 lp_socket_address获取socket地址,从全局变量Glabals(global类型)
2.1.29.5 interpret_string_addr将主机名或IP映射为socket地址;
2.1.29.6 smbd_open_one_socket打开一次socket;
2.1.29.7 claim_connection连接声明;
2.1.29.8 注册命令MSG_SMB_SAM_SYNC、MSG_SHUTDOWN、MSG_SMB_FILE_RENAME、 MSG_SMB_CONF_UPDATED、MSG_SMB_STAT_CACHE_DELETE、MSG_DEBUG;
2.1.30 talloc_stackframe分配栈空间;
2.1.31 smbd_parent_loop(parent)接收连接,为每个新连接fork产生一个进程;
2.1.32 exit_server_cleanly退出;