【实用指南】win10、linux文件共享服务(完备)

前言

搭建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.'

完结。

你可能感兴趣的:(samba,linux运维,win10)