前言
搭建samba文件共享服务器,可以在windows的网络邻居上登录、映射磁盘,便于使用。rsync是linux系统下的数据镜像备份工具,支持增量同步。操作使用系统:Win10(教育版) + VM: deepin[debian] + VM: win10。
1、Samba:Linux_Server + win10_Client
a.安装、配置文件修改
用户使用本机用户,密码需要单独设置
apt-get install samba
vim /etc/samba/smb.conf:
[global]
server string = Samba Server Version %v
hosts allow=192.168.0.0/255.255.0.0
[home]
-+
read only = no
-create mask = 0755
-directory mask = 0755
valid users = @cfycls, @guest
write list = @cfycls
#可见
[deepin]
comment = deepin share
#共享描述
path = /home/wwwroot
#共享目录
public = yes
#允许guest用户访问
writable = yes
#允许在heijunma目录下写入
directory mask = 0755
#默认创建目录权限
create mask = 0755
#默认创建文件权限
valid users = @cffycls, @guest
#允许访问该共享的用户
write list = @cffycls
#可写入共享的用户列表
browseable = yes
#该指定共享目录可浏览
available = yes
#该指定共享资源可使用
smbpasswd -a cffycls
添加用户和密码到smb,这里cffycls是主机的用户
/etc/init.d/smbd restart
b.防火墙配置
Samba服务所使用的端口和协议
https://blog.csdn.net/wangsifu2009/article/details/6780749/:
1)Port 137 (UDP) - NetBIOS 名字服务 ; nmbd
2)Port 138 (UDP) - NetBIOS 数据报服务
3)Port 139 (TCP) - 文件和打印共享 ; smbd (基于SMB(Server Message Block)协议,主要在局域网中使用,文件共享协议)
4)Port 389 (TCP) - 用于 LDAP (Active Directory Mode)
5)Port 445 (TCP) - NetBIOS服务在windos 2000及以后版本使用此端口, (Common Internet File System,CIFS,它是SMB协议扩展到Internet后,实现Internet文件共享)
6)Port 901 (TCP) - 用于 SWAT,用于网页管理Samba
linux: Server端添加防火墙规则:
iptables -I INPUT -p tcp -m multiport --dports 139,389,445,901 -j ACCEPT
iptables -I INPUT -p udp -m multiport --dports 137,138 -j ACCEPT
win10端无需配置。
c.连接
win10_Client客户端:
- 在网络邻居连接;或地址栏:file://192.168.1.111
[输入linux机器上的用户名.密码],可以看到访问的文件列表,进入需要映射文件夹的根目录、复制地址栏地址。
- 映射网络驱动器:192.168.1.111/deepin
systemctl enable samba
vim /etc/init.d/samba
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
## 了解:**Linux系统有7个运行级别(runlevel)**
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
2、Samba:win10_Server + win10_Client
win10自带了很多服务,Server服务端须要 > home版,局域网启用文件共享测试。
a.启用samba
服务器端主机:
设置 -- 应用 -- [右上角]程序和功能 -- 启用和关闭windows功能 -- 勾选“samba1.0/...”[服务器];
根据提示重启
客户端主机:不动;
b.防火墙配置
服务器端主机(必须),客户端主机(虚拟机不通时设置):
设置 -- 网络和internet -- [状态]Windows防火墙 -- [防火墙和网络保护]高级设置 -- 出站规则/入站规则;
《参考)》选中“出站规则”,右键: 入站规则 -》 新建规则 -》 自定义 -》 下一步 ,填写远程
的IP或域如:192.168.1/24。作用域可以只选择“专用网络”。
出站规则同理。即服务端的出+入、客户端的出+入,完成。
c.登录
- 服务器端主机[192.168.1.112]:
选择相应分享的文件夹,属性 -- 共享,建议共享给一个可以登录的用户名(guest、everyone没试)。
- 客户端主机[192.168.1.100]:
在网络邻居连接;或资源管理器地址栏,file://192.168.1.112,查看文件夹列表,进入复制地址,映射磁盘。
问题:win10_Client无法连接
这里主要主动让系统记住“登录凭据”,参考《win10家庭版连接samba服务器无响应并且windows资源管理器被自动刷新问题解决》
第一步:
windows左下角图标点击-> 搜索 运行[快捷键win+R]–> 输入: control userpasswords2–> 用户账户->高级-> 管理密码-> windows凭据-> 添加Windows凭据-> 填写 samba服务器IP[只需填写ip即可、samba用户名、samba密码-> 保存即可
第二步:
windows左下角图标点击-> 搜索 运行[快捷键win+R]-> 输入:\\192.168.1.217 [samba的ip]->重新访问
3、Samba:win10_Server + linux_Client
为了实现代码保存在主机(Win10),编码在虚拟机(Linux+Win10)的理想环境。
win10_Server服务端启用、防火墙设置,同上。
a.linux_Client连接
# linux_Client连接测试
smbclient -L 192.168.1.100 -U [email protected]
win10_Client的情况下,添加网络登录的凭据可以连接。而在linux下时,,总是提示 NT_STATUS_LOGON_FAILURE
。
解决
在win10_Server的命令行输入 net user
,查看可用于网络连接的用户,竟然是 cffyc !!。命令行连接时被截取了。
ls 查看列表
smbclient -L 192.168.1.100 -U cffyc
Domain=[DESKTOP-6BO3J9V] OS=[Windows 10 Education 18362] Server=[Windows 10 Education 6.3]
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk 远程管理
C$ Disk 默认共享
D$ Disk 默认共享
E$ Disk 默认共享
F$ Disk 默认共享
IPC$ IPC 远程 IPC
WorkPlace Disk
Connection to 192.168.1.100 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
NetBIOS over TCP disabled -- no workgroup available
smbclient //192.168.1.100/WorkPlace -U cffyc
b.linux_Client的samba磁盘映射
# 安装包含samba的协议包
apt-get install cifs-utils
# 查看目标使用者权限
id cffycls
# linux旧位置文件备份移动,挂载准备和挂载
systemctl stop docker && cd /home/ && tar cvf wr.tgz wwwroot/
mv wwwroot/ wwwroot0 && mkdir wwwroot && chmod 0777 wwwroot
vim /root/.bashrc :<+>
mount -t cifs //192.168.1.100/WorkPlace/wwwroot/ /home/wwwroot/ -o username=cffyc,\
password=,uid=1000,gid=1000,nounix,iocharset=utf8
# 开机启动
vim /etc/fstab :<+>
//192.168.1.100/WorkPlace/wwwroot/ /home/wwwroot/ cifs username=cffyc,\
password=,uid=1000,gid=1000,nounix,iocharset=utf8
此处参考了《linux访问windows共享文件夹的两种方法》、《centos中w使用smbclient连接window出现:session setup failed: NT_STATUS_LOGON_FAILURE》等。
注意
mount -o 后面的参数 __千万__ 不能加引号,特殊字符用转义
不然呵呵【mount error(13): Permission denied】
【问题】
win10_Server使用网络账户登录、映射短名字账户后,需要:
运行netplwiz -》 ...必须重新输入密码 -》 选中,再取消,以达到和往常一样的单账户自动登录。
deepin测试重启samba目录挂载失败:
查看/var/logs/boot.log,看到“Mount process exited, code=exited status=32”,单独执行没毛病。
//192.168.1.100/WorkPlace/wwwroot/ /home/wwwroot/ cifs defaults,credentials=/etc/samba/credentials,uid=1000,gid=1000,iocharset=utf8 0 0
即把用户名和密码单独放到一个文件,本机上测试通过了:
username=cffyc
password=
4、Win10连接问题汇总
允许非安全访客(非必须)
计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters
从其右键菜单中选择“新建”-“DWORD值(32位)”项 AllowInsecureGuestAuth
,数值 1
。
win10共享互访检查要点
a. 服务Server、Workstation
启动(默认)
等同于防火墙开启
b. 高级共享设置:开启网络发现
网上邻居可见
c. 活动网卡以太网-文件和打印机共享
(手动开启)
无法访问
根结
网卡支持
5、rsync安装配置
由于虚拟机使用Samba远程时IDE的频繁刷新,使得磁盘性能紧张,所以,需要对映射目录进行改造。
目标:
Linux本机编辑时,使用自身硬盘目录A,对映射的Samba客户端目录B'进行主动rsync同步,主机目录为B。
a.目录准备
# a.首先:文件准备
Client_Linux:拷贝挂载文件到本机目录,解除旧挂载,目录还原为本地文件
cp -rp /home/wwwroot /home/remote
//查看挂载
df -h
//-l在该目录空闲后再umount,-v显示详情
umount -l /home/wwwroot
mv /home/remote /home/wwwroot
# b.其次:重新挂载到根目录
vim /etc/fstab:
//192.168.1.100/WorkPlace/ /WorkPlace/ cifs defaults,credentials=/etc/samba/credentials,uid=1000,gid=1000 0 0
mkdir /WorkPlace/
mount -a
df -h
# c.然后:本机rsync主动同步【备份】
rsync -azvr /home/wwwroot/ --delete --exclude='*.git/' --exclude='*.idea/' /WorkPlace/wwwroot/
#inotify-tools与rsync集成
apt-get install rsync inotify-tools -y
//手动同步
rsync -azvr /home/wwwroot/ --delete --exclude='*.git/' --exclude='*.idea/' /WorkPlace/wwwroot/
b.inotify脚本
使用参考《真正的inotify+rsync实时同步 彻底告别同步慢》原版,inotify_rsync.sh:
#!/bin/bash
src=/data/ # 需要同步的源路径
des=data # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单。
rsync_passwd_file=/etc/rsyncd.passwd # rsync验证的密码文件
ip1=192.168.0.18 # 目标服务器1
ip2=192.168.0.19 # 目标服务器2
user=root # rsync --daemon定义的验证用户名
cd ${src} # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
# -m|--monitor Keep listening for events forever
# -r|--recursive Watch directories recursively
# -q|--quiet Print less (only print events)
# 把监控到有发生更改的"文件路径列表"循环
/usr/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file
do
INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
INO_FILE=$(echo $file | awk '{print $2}') # 把inotify输出切割 把文件路径部分赋值给INO_FILE
echo "-------------------------------$(date)------------------------------------"
echo $file
#增加、修改、写入完成、移动进事件
#增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # 判断事件类型
then
echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && # INO_FILE变量代表路径哦 -c校验文件内容
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
#仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) 然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
fi
#删除、移动出事件
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
echo 'DELETE or MOVED_FROM'
rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&
rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
#看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。这里有更好方法的同学,欢迎交流。
fi
#修改属性事件 指 touch chgrp chmod chown等操作
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
echo 'ATTRIB'
if [ ! -d "$INO_FILE" ] # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
then
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
fi
fi
done
c.自定义同步脚本
对于多级目录+很多文件的情况,启动准备很慢
inotify_watch.sh:
#!/bin/bash
src=/home/wwwroot/
dst=/WorkPlace/wwwroot/
cd ${src} # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
# rsync -h
# -a, ––archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
# -v, ––verbose 详细输出模式
# -z, ––compress 在传输文件时进行压缩处理
# -c, --checksum 基于校验跳过,而不是模式时间和大小
# -R, --relative 使用相对路径名
# -C, --cvs-exclude 动忽略文件的方式与CVS相同
# inotifywait -h
# -m|--monitor 保持对事件的关注
# Keep listening for events forever. Without
# this option, inotifywait will exit after one
# event is received.
# -r|--recursive 递归地观察目录
# -q|--quiet 少打印(仅打印事件)
# -t|--timeout strftime-compatible format string for use with
# %T in --format string.
#upper limit on inotify watches reached!
echo 8192000 > /proc/sys/fs/inotify/max_user_watches
excludeStr=".*"
echo "excludeStr done"
# 把监控到有发生更改的"文件路径列表"循环,60s退出 -t 60
trap "Ctrl+c 停止监听" 2 #-m时:启动期间信号无法正常响应
/usr/bin/inotifywait -rqm --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file
do
INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
INO_FILE=$(echo $file | awk '{print $2}') # 把inotify输出切割 把文件路径部分赋值给INO_FILE
echo "-------------------------------$(date)------------------------------------"
#增加、修改、写入完成、移动进事件
#增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # 判断事件类型
then
echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
# INO_FILE变量代表路径哦 -c校验文件内容
echo "$(dirname ${INO_FILE}) ==> ${dst} ..."
rsync -avRC $(dirname ${INO_FILE}) ${dst} --exclude=${excludeStr}
fi
#删除、移动出事件
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
echo 'DELETE or MOVED_FROM'
echo "$(dirname ${INO_FILE}) ==> ${dst} ..."
rsync -avRC --delete $(dirname ${INO_FILE}) ${dst} --exclude=${excludeStr}
fi
#修改属性事件 指 touch chgrp chmod chown等操作
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
# 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
echo 'ATTRIB'
if [ ! -d "$INO_FILE" ]
then
echo "$(dirname ${INO_FILE}) ==> ${dst} ..."
rsync -avRC $(dirname ${INO_FILE}) ${dst} --exclude=${excludeStr}
fi
fi
done
echo "-------------------------------$(date) DONE!!!------------------------------------"
d.定时&手动同步
#!/bin/bash
echo '/home/wwwroot/ start sync...'
rsync -azvr /home/wwwroot/ --delete --exclude='.*' /WorkPlace/wwwroot/
echo 'Done.'
echo '/home/wwwroot/ start sync...'
rsync -azvr /home/golang/ --delete --exclude='.*' /WorkPlace/goland/
echo 'Done.'
完结。