跨设备、系统、网络的文件共享与文件系统挂载杂谈

刚放寒假那几天,有位朋友问了我一个问题: 有什么不限制文件格式的、基于网络的文件互传/同步工具或云储存,以便于代码/文档/图片等在不同设备之间的共享? 这个问题之前没有仔细研究过,模模糊糊也只是知道有一些技术可以实现这样的文件共享,于是想着专门学习一下。然而,寒假期间除了休息和给长辈帮忙,就没怎么给学习留下时间。这不,趁着寒假快要结束,刚好抽出点时间来探索一下这个问题。

一、一些比较麻烦的同步策略

(一)基于网盘的方法

这一类方法基本没有技术含量,但是也很繁琐,适合临时分享一些小文件,不适合长期的文件同步。

国内最广为人知的网盘就是百度网盘,其存储空间很大,并且有非常强悍的离线下载功能。然而极慢的下载速度和高昂的会员费用严重削弱了用户体验。近年来,一些替代品如夸克网盘、阿里云盘等的出现渐渐改善了用户体验,使用这些网盘进行文件同步,倒也不失为一种很好的选择。

除了上述网盘之外,还有一些小网盘在分享文件方面也很常用,例如 蓝奏云城通网盘奶牛快传 。这些小网盘虽然存在广告多、文件大小和存储时间有限等缺点,但在传输速度方面有着更大的优势。

此外,还有一些国外的网盘服务商,如dropbox、OneDrive等,但要么在国内无法访问,要么就是上传和下载速度极慢(点名OneDrive),因此不太推荐。

延伸阅读:

(二)基于坚果云等服务商的方法

从本质上讲,坚果云也是一个网盘。但和上面那些不一样的是,坚果云提供webDAV通信协议,因此可以更好的与软件/系统进行集成。例如,在文献管理软件Zotero中,我们可以选择webDAV的同步方式以存储更多的文献。在Windows系统中,也可也通过“添加一个网络位置”的功能,实现对坚果云的挂载。

image.png

image.png

在Linux系统上,我们可以先安装 davfs2 这个软件包(sudo apt install -y davfs2suod yum install -y davfs2 ),然后使用下面的指令进行挂载:

1
sudo mount -t davfs -o noexec https://dav.jianguoyun.com/dav/ /mnt/webDAV/

挂载过程中会要求输入坚果云的账号密码。如果出现 "/sbin/mount.davfs: mounting failed; the server does not support WebDAV" 这样的报错,可以直接修改 /etc/davfs2/davfs2.conf 配置文件,将 # ignore_dav_header 0 这一行内容解注释并改为:ignore_dav_header 1 (参考此文 )。这样以后,即可完成对坚果云的挂载。

坚果云的同步功能还是非常强大的,但有个缺点,就是免费版用户每个月上传和下载流量有限制。

(三)基于自建web服务器的方法

自建web服务器其实也是很大的一块内容,包括了架设简单的FTP服务器/HTTP文件服务器/网盘应用/网络附加存储(NAS)组网等等,受篇幅所限无法讲完,此处仅简单讲讲它们的区别与应用。

由于FTP协议的安全性问题,架设FTP服务器逐渐成为了一种过时的技术。架设FTP服务器的方法可以参考这篇文章:《使用Vsftpd服务传输文件》 。目前的大多数浏览器已经放弃了对FTP协议的支持,因此无法通过浏览器访问FTP服务器上的文件,但可以使用文件管理器或filezilla等第三方软件登录FTP服务器进行文件传递。

另一种思路是HTTP文件服务器,即将服务器变成网盘,并通过浏览器访问。例如, Tiny File Manager 是一个用PHP语言写就的单文件网页框架,将服务器上的某个特定目录作为网盘的存储位置,并提供了网盘的一些基本功能(如账户管理、文件浏览、文本编辑、下载管理)(如下图, ANOMS文件代理 )。这一类框架还包括Rich Filemanager、FileStash、KodExplorer等。更多内容可以参考文章 《17个基于 Web 的免费开源云文件管理器》

image.png

NAS (Network Attached Storage,网络附属存储)则是另一种更复杂的技术,说白了就是在自家的局域网里面专门开一个本地网盘,允许全家人共享。组建NAS需要自行购置硬盘和NAS专用服务器(目前的市场上主要有群晖和威联通两家公司提供方案),前期投入成本比较高,但由于NAS的高可靠性(通过Raid技术保证数据安全)和可拓展性(可以加硬盘),其可以为使用者带来很多方便。关于NAS服务器的选购和配置,网络上有许多教程,此处也不再赘述。

最后用一个表格来总结:

方案 FTP服务器 HTTP文件服务器 NAS
成本 中等
易用性 中等
安全性
设备兼容性 有限 广泛 广泛
维护需求 中等 中等

如果仅仅是为了文件共享,那么FTP服务器和HTTP文件服务器是比较方便的选择。而如果有上传文件或文件同步的需求,在成本有限的情况下可以选择HTTP文件服务器,不计成本的话NAS也挺好(手动狗头)。

二、挂载任意网络位置到本地

这一类方法可以算是比较通用的方法了,没有云存储服务商等诸多限制。

(一)NFS

NFS是一种基于TCP/IP传输的网络文件系统协议。通过使用NFS协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源。

这个协议听起来很陌生,然而在这两天的探索中我神奇地发现,其实自己早就在用它了。实验室的计算集群上,各个实验室的存储目录几乎都是靠NFS进行挂载的。这也间接证明了NFS的可靠性:挂载的NFS目录的使用体验就像本地目录一样流畅丝滑。

image.png

下面是一些配置和使用方法:

服务器端开启NFS文件系统(假设客户端的IP地址为192.168.184.0):

1
2
3
4
5
6
7
8
sudo yum install nfs-utils rpcbind # 安装一些必要的软件包
mkdir /text888 #创建共享目录
chmod 777 /text888 #修改共享目录权限
echo "/text888 192.168.184.0/24(rw,sync,no_root_squash)" >> /etc/exports
systemctl start rpcbind # 启动rpcbind服务
systemctl start nfs # 启动nfs服务。需要在rpcbind之后启动
systemctl enable rpcbind
systemctl enable nfs

其中, /etc/exports 是NFS的配置文件,其中的内容代表共享为NFS的文件目录以及允许连接的客户机地址,括号内的字段代表权限设置,其中rw 表示允许读写,ro 表示为只读。sync 表示同步写入到内存与硬盘,no_root_squash 表示当客户机以root身份访问时赋予本地root权限。

客户端挂载NFS文件系统(假设服务器端的IP地址为192.168.78.22):

1
2
3
4
5
6
7
sudo yum install nfs-utils rpcbind # 安装一些必要的软件包
systemctl start rpcbind # 启动rpcbind服务
systemctl enable rpcbind
showmount -e 192.168.78.22 # 查看 NFS 服务器端共享了哪些目录
mkdir /text777 #客户端创建挂载目录
mount 192.168.78.22:/test888 /text777 # 挂载目录
df -Th #确认挂载结果

更多内容参考:

(二)SSHFS

SSHFS(Secure SHell FileSystem)是一个客户端,可以让我们通过 SSH 文件传输协议(SFTP)挂载远程的文件系统并且在本地机器上和远程的目录和文件进行交互。

SFTP 是一种通过 SSH 协议提供文件访问、文件传输和文件管理功能的安全文件传输协议。因为 SSH 在网络中从一台电脑到另一台电脑传输文件的时候使用数据加密通道,并且 SSHFS 内置在 FUSE(用户空间的文件系统)内核模块,允许任何非特权用户在不修改内核代码的情况下创建他们自己的文件系统。

相比于NFS,SSHFS对服务器的需求更低一点,不需要在服务器端额外安装程序或服务,只需要服务器端支持ssh登录即可,因此更加方便。

1、 在windows上启用SSHFS并挂载远程服务器

windows下的sshfs工具是sshfs-win 。根据网站上的介绍,要安装这个工具,我们可以使用下面的命令行:

1
winget install -h -e --id "WinFsp.WinFsp" && winget install -h -e --id "SSHFS-Win.SSHFS-Win"

此后,在“此电脑”-“添加一个网络位置”中输入下面格式的路径(例如,\\sshfs\cyclin@legacy.anoms.top),并根据引导输入远程服务器的ssh密码,即可完成挂载

1
\\sshfs\REMUSER@HOST[\PATH]

image.png

image.png

2、在Linux上启用sshfs并挂载远程服务器

我们可以在linux上安装sshfs这一软件包,从而进行sshfs的挂载。

下面是一个示例,我们将远程服务器cyclin@anoms.top 上的家目录挂载到了本地的temp目录。

1
2
3
4
sudo apt install sshfs # 需要安装sshfs这个客户端才行
mkdir /home/cyclin/temp # 新建目录作为sshfs挂载点
sshfs cyclin@anoms.top:/home/cyclin /home/cyclin/temp # 挂载目录
df -hT # 查看挂载结果

结果如下图所示,可以看到sshfs成功实现了文件系统的挂载。使用df -hT 查看文件系统类型时,我们可以发现其类型被标记为fuse.sshfs,正是sshfs的文件系统。

image.png

几个小问题:

  • ① 在Windows WSL1上测试时发现无法进行sshfs的挂载,报错 "modprobe: FATAL: Module fuse not found in directory /lib/modules/4.4.0-19041-Microsoft" 。查询后得知,WSL1并非完整Linux内核,因此对fuse的支持存在问题,如果换成虚拟机则会好一点。不过说实话,在Windows系统上,sshfs-win完全够用了。
  • ② Hazel同学之前提到过,mac不能通过sshfs访问linux,似乎是mac上的sshfs已经被放弃了。由于手边没有mac设备,无法进行测试,查询一些资料后却发现在mac上使用sshfs似乎需要换源或者从源代码编译,总之是很麻烦。因此mac用户可能还需要想想其他办法。

三、其他思路

因为anoms.top 这个域名在我手里也有好几年的时间了,利用这个域名我也琢磨过一些用于数据同步的小应用。

  • ANOMS文件代理 :使用网页框架 Tiny File Manager 建立的一个网盘,如前文所述。有时候我会在服务器上挂着一些大文件的下载的任务干别的事情,等文件下载好了就用这个网盘传到本地。算是百度网盘离线下载的平替。

  • ANOMS online editor :最初是想开发一个网页端的markdown笔记本工具,以实现在不同设备上同时记笔记的需求。那时候年少轻狂,因此没有用任何框架,直接从0开始纯手写了一个极其简陋的页面(如下图)。后来渐渐摸索出了更多的功能,例如可以把文件使用base64工具进行转码,然后保存在这个工具里,就可以在其他设备上访问了。

image.png

以上。