前言
最近需要,Linux的服务器同步Windows的一个目录。查了下,大概有三种方法:网盘同步;rsync同步;挂载目录。
网盘同步,可以选择搭建一个Nextcloud 。但是问题在于,我需要的是,客户端和服务端的同步,而不是客户端和客户端的同步。服务端没有界面,安装客户端的网盘软件可能不太好使。所以没有选择这种方法。
rsync同步。这种方法,需要存储两份文件。本地存储一份,然后同步到服务端。
samba挂在目录。像在本地一样操作服务端目录里面的内容,数据也只需要存储一份。
samba挂载目录
我首先尝试的是挂载服务端的目录。但是,效果不好,因为网络延迟比较严重,操作挂载目录里面的文件有点难受。
# ubuntu中安装samba服务
sudo apt install samba
我没去看官方的文档,因为好长。我网上翻了翻博客,看了下samba配置中的注释,基本可以搞定个人使用的samba配置。
首先,需要修改samba的配置文件 /etc/samba/smb.conf
:
# 这里只列出需要修改的部分
## 更多的参数查询:https://www.samba.org/samba/docs/current/man-html/smb.conf.5.html
# 每个用户的家目录设置位共享目录,可以通过\\server\username访问
[homes]
comment = Home Directories # 共享目录的描述
browseable = no # \\server 看不到这个目录;知道username的人,可以通过\\server\username尝试连接 https://unix.stackexchange.com/questions/377516/what-does-browseable-in-samba-configuration-mean
read only = yes # home目录只读
create mask = 0700 # 创建文件的默认权限
directory mask = 0700 # 创建目录的默认权限
; valid users = %S # 默认任何人都可以连接,每个人使用自己的用户名和密码验证。这里可以限制只有允许的人可以访问
[music]
comment = navidrome music
valid users = root # 只用root用户可以访问这个共享目录
force user = root
force group = root
; public = yes # 不用验证直接访问
path = /root/navidrome/music # 共享路径
browseable = yes # 每个人都能看到存在此共享目录
read only = no
available = yes # 这个共享目录可以使用
create mask = 0755
directory mask = 0755
# smb添加用户
smbpasswd -a root
# 重启服务
systemctl restart smdb.service
需要注意的是,需要设置下root密码,否则samba无法访问这个music
共享目录。passw root
即可。如果遇到设置的密码太简单,无法设置成功,可以关闭这个验证,见:linux - Enable simple password for root user on CentOS - Super User
windows访问linux共享目录,可以参考:Win10访问Ubuntu的samba共享文件
rsync同步
Linux作为服务端rsync的安装和配置
配置之前,可以看下/etc/default/rsync
,这个配置用不到,因为它是for init.d
。我们使用systemctl
管理rsync服务。
我们先创建一份配置文件:cp /usr/share/doc/rsync/examples/rsyncd.conf /etc
。之后systemctl status rsync
、systemctl start rsync
启动服务了。但是默认的配置需要修改。安全起见,总得设置,哪个用户可以同步哪个目录。没有看到很好的中文介绍,所以只能看官方文档。所幸,官方文档只有一长页:Ubuntu Manpage: rsyncd.conf - configuration file for rsync in daemon mode
下面是我的一个配置,我简单注释下。
root@vultr:~/navidrome/music# cat /etc/rsyncd.conf
# sample rsyncd.conf configuration file
# 这部分是全局设置,对下面所有模块都有效,是所有模块共有。
# 每个模块,指用方括号括起来的部分
# 这个配置中只有一个模块,music模块
# GLOBAL OPTIONS
#motd file=/etc/motd
#log file=/var/log/rsyncd
# for pid file, do not use /var/run/rsync.pid if
# you are going to run rsync out of the init.d script.
# The init.d script does its own pid file handling,
# so omit the "pid file" line completely in that case.
# pid file=/var/run/rsyncd.pid
#syslog facility=daemon
#socket options=
# MODULE OPTIONS
[music]
comment = navidrome music
path = /root/navidrome # 指定这个模块可以操作的目录
use chroot = no # 不要使用chroot. docker的原理之一是用来chroot
# max connections=10
lock file = /var/lock/rsyncd
# the default for read only is yes...
read only = no # 允许上传
list = yes
uid = %RSYNC_USER_NAME% # 文件传输者的uid,不清楚干啥的
gid = *
# exclude =
# exclude from =
# include =
# include from =
# auth users =
# secrets file = /etc/rsyncd.secrets
strict modes = yes
# hosts allow =
# hosts deny =
ignore errors = no
ignore nonreadable = yes
transfer logging = no
# log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
timeout = 600
refuse options = checksum dry-run
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
这里有个示例,也可以看下:Linux系统Rsync服务及配置
windows作为客户端rsync的安装和配置
首先需要在windows上安装rsync。我尝试了下,winget
中没有rsync。
winget.exe search rsync
名称 ID 版本 匹配 源
Rclone Rclone.Rclone 1.62.2 Tag: rsync winget
# https://github.com/rclone/rclone/
winget.exe install Rclone.Rclone
winget.exe uninstall Rclone.Rclone
网上查了下,windows使用cwRsync Client。而关于rsync命令的使用,可以参考 rsync 用法教程 - 阮一峰的网络日志。
# 本地与服务端同步
rsync.exe -av local_src_dir/ user_name@your_server:/server_dst_dir
有个比较坑的是,会如下错误:
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.2]
rsync: [Receiver] safe_read failed to read 4 bytes: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(283) [Receiver=3.2.2]
参考这个Why is this rsync connection unexpectedly closed on Windows?。在使用cwRsync
的时候,要用-e参数,指定cwRsync
目录下的ssh.exe
而不是系统的ssh.exe
。
后面觉得保存这个命令的用法有点麻烦,写个脚本即可。