ubuntu20.04使用nfs, samba, syncthing实现文件共享或同步

3/1/2022 运维UbuntuNFSSambaSyncthingZfile

记录个人在日常使用或工作中对多设备进行数据共享或同步的方案。

# 前言

  本文记录个人使用Ubuntu 20.04 LTS作为本地数据中心,使用腾讯云主机作为云端服务器,并使用WireGuard连接本地nat网络,以此进行数据共享及同步的过程,其中,linux系统之间使用nfs服务器和客户端挂载磁盘进行数据共享,linux使用Samba服务器向Windows客户端提供数据共享,Windows和linux之间使用Syncthing (opens new window)进行数据自动同步,同时,可以使用Zfile (opens new window)或其他私人网盘软件挂载NFS共享的"本地驱动器",变相增加云服务器的存储空间。

# 前置

  Server: Ubuntu 20.04 LTS本地服务器,ip: 192.168.1.102,为WireGuard地址10.0.0.10的nat子网。

  Client 1: Ubuntu 20.04 LTS腾讯云云服务器,ip: 10.0.0。

  Client 2: Windows 10 21H2本地主机,ip: 192.168.1.101,主要进行日常工作。

  $text$中text文本默认为自定义替换文本,如使用8080替换$port$。

  不要占用nfs固定使用的111和2049端口。

  默认linux系统用户拥有sudo权限。

# NFS

# Ubuntu 20.04 安装NFS服务器

# 安装

$ sudo apt update
$ sudo apt install nfs-kernel-server
1
2

# 配置

更新配置服务器/etc/exports文件

$ sudo vim /etc/exports
/data 10.0.0.*(rw,sync,no_root_squash,no_subtree_check)
1
2
  • /data:共享文件夹
  • 10.0.0.*:客户端ip,此处网段为WireGuard设定的网段
  • rw:读写
  • sync:此选项强制NFS在回复之前写入更改。这意味着NFS将首先完成写入主机目录,然后响应客户端。这样可以确保反映主机服务器的实际状态,但会减慢文件操作的速度
  • no_subtree_check:此选项禁用子树检查。子树检查是一项操作,其中对于每个NFS请求,服务器必须检查所访问的文件是否存在以及该文件是否在导出的树中。当客户端访问的文件被重命名时,此操作会导致问题。因此,在大多数情况下,最好将其禁用。它对安全性有一些轻微影响,但可以提高可靠性
  • no_root_squash:默认情况下,NFS会将客户端以root用户身份执行的所有操作转换为服务器上的非特权用户。这样做是为了提高安全性。此选项禁用某些共享的行为

重启服务

$ sudo systemctl restart nfs-kernel-server
1

若考虑安全性,可使用ufw等开放端口(未验证)

$ sudo ufw allow from $client_ip$ to any port nfs
1

# Ubuntu 20.04 安装NFS客户端

# 安装

$ sudo apt update
$ sudo apt install nfs-common
1
2

# 配置

在挂载目录前,首先创建目录

$ sudo mkdir /data -p
1

使用mount指令挂载

$ sudo mount 192.168.1.102:/data /data
1
  • 192.168.1.102:/data,即指定的ip地址和目标文件夹
  • /data,即挂载的本地目录

上述操作默认没有输出,如果成功是不会有太大延迟,如果长时间没有成功请检查是否ip地址

可以使用df -h进行检查是否成功挂载

$ df -h
Filesystem           Size  Used Avail Use% Mounted on
udev                 1.9G     0  1.9G   0% /dev
tmpfs                394M  772K  393M   1% /run
/dev/vda2             79G  6.8G   69G   9% /
tmpfs                2.0G   24K  2.0G   1% /dev/shm
tmpfs                5.0M     0  5.0M   0% /run/lock
tmpfs                2.0G     0  2.0G   0% /sys/fs/cgroup
tmpfs                394M     0  394M   0% /run/user/0
192.168.1.102:/data  450G  105G  345G  24% /data
1
2
3
4
5
6
7
8
9
10

可以使用du -sh查看文件夹实际使用空间,由于本文共享整个磁盘,故二者结果基本相同,但实测由于经过网络,小文件较多的时候需要耗费挺多时间

root@peanuty-tvps:/# du -sh /data
106G	/data
1
2

由于设置了no_root_squash,现在可以像使用本地磁盘一样使用挂载的/data目录,任何权限操作基本与本地相同

# 系统引导时挂载目录(可选)

如果你和我一样是使用WireGuard进行挂载,请忽略此步骤。(此步骤暂未验证)

$ sudo nano /etc/fstab
mount 192.168.1.102:/data /data  nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
1
2

若需要卸载共享的nfs磁盘,使用umount指令卸载

umonut /data
1

# Samba

# Ubuntu 20.04 安装Samba服务器

# 安装

$ sudo apt update
$ sudo apt install samba samba-common
1
2

# 添加用户

添加 Samba 用户,用于在访问共享目录时使用。这里添加的用户在 Linux 中必须存在。

$ sudo smbpasswd -a $user$
1

# 配置

$ sudo vim /etc/samba/smb.conf
1

更改或添加以下配置

usershare allow guests = no # 默认打开,可以选择关闭以提高安全性
# ...
# 在最后添加
[home]
    comment = home directories	# 描述,自定义
    path = /home/				# 共享目录路径,需存在
    browseable = yes			# 是否可浏览
    writable = yes				# 是否可写
    available = yes				# 是否可用
    valid users = $user$		# 允许访问用户
    # public = yes/no			# 是否允许guest账户访问
    # guest ok = yes/no			# 同"public"
1
2
3
4
5
6
7
8
9
10
11
12

重启服务

$ sudo systemctl restart smbd
1

# Windows 10 挂载网络驱动器

右键此电脑-映射网络驱动器,驱动器盘符随意选择,不与本机磁盘冲突即可,文件夹按照实例填写即可

挂载成功后即可看到相应网络磁盘,当作本地磁盘使用即可(若目录下有$user$权限无法访问的资源仍然无法访问,需在服务端chmod或chown更改权限)

若想要卸载时,右击此电脑-断开网络驱动器的连接-选择目标驱动器即可

# Syncthing

# Ubuntu 20.04 安装Syncthing

# 安装

下载syncthing (opens new window)

$ wget https://github.com/syncthing/syncthing/releases/download/v1.19.1/syncthing-linux-amd64-v1.19.1.tar.gz
$ tar -zxvf syncthing*
cp	syncthing*/syncthing /usr/bin/syncthing
1
2
3

syncthing默认监听以下端口,其中两个tcp端口一定要打开防火墙

22000 (TCP) # 节点访问端口
8384 (TCP)	# Web访问端口
21027 (UDP)
44647 (UDP)
37269 (UDP)
1
2
3
4
5

开启syncthing,将在~/.config/syncthing目录生成配置文件

$ syncthing
1

使用Ctrl+C退出,再编辑配置文件

$ vim ~/.config/syncthing/config.xml
1
  • 更改127.0.0.1:83840.0.0.0:$port$,使外网能够通过web访问控制界面(注意防火墙设置)

# 配置

将软件自带的.service文件复制到系统目录下,打开服务

  • 若为root用户(syncthing默认不推荐root用户运行syncthing)

    cp syncthing*/etc/linux-systemd/system/syncthing@.service \
    /lib/systemd/system/syncthing@root.service
    systemctl enable syncthing@root.service
    systemctl start syncthing@root.service
    
    1
    2
    3
    4
  • 若用户名为user

    $ sudo cp syncthing*/etc/linux-systemd/system/syncthing@.service \
    /lib/systemd/system/syncthing@user.service
    $ sudo systemctl enable syncthing@user.service
    $ sudo systemctl start syncthing@user.service
    
    1
    2
    3
    4

浏览器访问http://$ip$:$port$,进入syncthing的web管理界面,具体密码设置等不在赘述。

在设置-连接里可以更改协议监听地址为tcp://0.0.0.0:$port$将上述22000端口设置为特定的端口(此端口需防火墙放行)。

如果该端有公网ip,则可以选择关闭NAT穿透本地发现全局发现,与非公网端进行连接时在高级-地址列表直接输入上述修改的tcp://$ip$:$port$tcp://$domain$:port$即可。

其他如共享文件夹设置不再赘述,官方中文版描述得足够详细,注意版本控制只对其他设备的更改有效,对本机更改不做控制。

# Windows 10 安装SyncTrayzor

下载官方自带工具SyncTrayzor (opens new window),随意置放于任意文件夹,打开文件夹下SyncTrayzor.exe运行即可,配置文件存放在data\syncthing文件夹,开机自启等设置比较傻瓜式,此处不再赘述。

当Syncthing更新时,从官网上下载新的Syncthing.exe文件替换文件夹根目录的文件即可,或在控制台进行更新。

# Android安装Syncthing

Google Play Store (opens new window)翻墙获取Syncthing,或从我的分享站 (opens new window)获取Syncthing (opens new window)

# Zfile

使用Zfile (opens new window)挂载NFS共享的"本地驱动器"做资源下载站,具体流程请查看官方文档 (opens new window),效果可参考本人的分享站 (opens new window),其中对于本地驱动器的图片模式在Zfile v3.2基础上自行修改了缩略图功能(受限于云服务器的带宽),预计有空再添加图片懒加载功能。

Last Updated: 4/12/2022, 10:13:27 PM