前段时间项目中碰到从windows机器上传多媒体文件至linux服务器的需求(人工审核并触发同步),调研了几种上传机制或实现方案:
1) http方式上传至WebServer
用PHP或Python脚本上传给WebServer,但由于多媒体文件动辄几百兆,PHP由于最长执行时间的限制首先被排除,另外由于用脚本上传需要增加失败重试等控制逻辑,Python虽然可以实现这些功能,但考虑到开发成本及服务的稳定性,并不是最优方案
2) flash方式上传
例如百度云web端就使用了flash方式上传,通过chrome调试工具可以看到,百度云web端的上传按钮调用的是swfupload,关于swfupload的介绍,可以参考这里或这里),但由于之前对该方案完全没有了解,开发成本太高,所以只能放弃 -_-
3) ftp方式上传
在Linux服务器搭建ftp服务器,在Windows客户机安装ftp客户端工具,鼠标拖拽即可实现文件上传。但由于厂里网络拓扑的特殊性及服务器运维规范,这种方式虽然技术是可以实现业务需求,但实现起来比较麻烦
4) 其它开源的文件同步工具
开源工具中首先想到Samba,在考虑业务需求和机器业务规范后,发现samba可以方便地实现需求。
本文下面的部分是关于Samba源码安装及基本配置方法的笔记。
1. Samba是什么
Samba是一套开源软件,可以在安装了不同操作系统的机器间共享文件或打印机。尤其是需要在Window客户机与Linux服务器间共享文件时,samba显得尤为方便。更系统性的介绍可以参考官网或wiki pedia
2. 源码安装步骤
以v4.1.9为例,源码编译/安装步骤(安装需要root权限)如下:
1) 从samba官网下载最新版本源码,解压,进入源码目录
2) 确保系统默认的python版本为2.7+且编译python时配置了--enable-shared,否则后续编译samba时会报错
3) 执行命令: ./configure && make && make install,samba会被默认安装在/usr/local/samba/路径下
4) 根据实际业务需求,配置/usr/local/samba/etc/smb.conf,如设置共享目录及用户等
5) 依次启动samba相关的2个守护进程:
shell> /usr/local/samba/sbin/smbd -s /usr/local/samba/etc/smb.conf -D shell> /usr/local/samba/sbin/nmbd -s /usr/local/samba/etc/smb.conf -D备注1:上述启动命令中的/xxx_path/smb.conf是安装完samba后配置文件的实际路径
官方的Install Guide可以参考这里
3. Samba基本配置
samba的配置文件典型路径为/etc/samba/smb.conf或/usr/local/samba/etc/smb.conf,文件语法与windows的.ini类似:文件包含以"[]"为期数标识的多个sections,每个section下配置项遵守key = value的格式。
samba.conf中,每个section代表samba服务器的一个meta-service或共享配置。其中,[global]较为特殊,它包含的配置项会影响整个samba服务器的配置;[homes]或[printers]被称为meta-service,前者默认将每个用户自己的home目录设置为该用户可写的共享目录,后者则提供了打印队列支持并配置了来自各samba客户端的打印任务的存放路径。
我们可以根据实际需要,配置多个section,比如:
[Shared] comment = Global Share - All Users path = /samba/shared read only = No guest ok = Yes public = Yes browseable = Yes create mask = 0666 directory mask = 0777上述配置的作用是:所有用户(包括guest和public用户)均可浏览或读写/samba/shared目录,在该共享目录下创建新目录的默认权限是777,创建新文件的默认权限是666
load printers = no printcap name = /dev/null ## hide printers and faxes share disable spoolss = yes其它隐藏文件或文件夹的配置方法,可以参考官网文档的说明
4. Samba用户管理
Samba的用户管理与linux系统的用户管理有一定依赖,即Samba的用户必须也是Linux系统添加的用户,但密码可以独立。
添加新用户的典型步骤是:
1) 以linux root帐号执行adduser命令添加linux系统用户和登录linux系统的密码(该用户名也是登录samba的用户名)
2) 用smbapasswd工具为上步添加的新用户设置登录samba的密码
3) 在smb.conf正确的section中,设置共享目录的有效用户,典型配置如下
[video-upload] comment = Shared Director for 3rd-party videos path = /home/slvher/cooperate-uploads valid users = slvher public = no writable = yes printable = no hide dot files = yes create mask = 0766更新完配置文件smb.conf后,重启smbd和nmbd进程,此时,我们就可以在windows客户机通过登录samba服务器来共享文件了
5. Windows客户机访问Samba服务
在前述步骤均正确执行的前提下,可以通过在windows机器运行命令行输入\\samba-svr-ip\slvher并在弹出的对话框中输入用户名/密码来登录samba服务器。
登录成功后,会打开一个共享文件夹,用鼠标拖拽文件即可触发samba自动同步
【参考资料】
1. Samba官网
2. Installing Samba on a Unix System
3. online-doc: using_samba: ch09. Users and Security