一、前言

在嵌入式设备的使用过程中,有时候需要把远程服务器上的目录挂载到本地,方便数据的读写和管理。树莓派是一款常见的嵌入式开发板,要是能通过 SFTP(安全文件传输协议)把远程目录挂载到树莓派上,那可太方便了。不过,在挂载过程中可能会碰到挂载不稳定的问题。今天就和大家聊聊怎么通过 fstab 配置和自动重连脚本来解决这个问题。

二、应用场景

数据共享

比如一个监控系统,摄像头会把拍摄的视频存储在远程服务器上。树莓派可以挂载这个远程目录,实时查看视频数据,也能对这些数据进行分析和处理。假设公司有多个监控点,视频数据都存放在一个中心服务器上,树莓派小盒子可以挂载服务器上的视频存储目录,方便维护人员随时查看监控视频。

文件备份

要是树莓派上有重要的数据,为了防止数据丢失,可以把数据备份到远程服务器上的某个目录。通过挂载远程目录,就可以像操作本地文件一样把数据复制到远程目录。例如,个人开发者在树莓派上开发了一些重要的代码,把代码备份到公司的远程服务器上的备份目录。

远程开发

开发者可以在本地使用编辑器对挂载的远程目录进行开发,修改的代码会实时同步到远程服务器上。比方说,开发者在家里使用树莓派挂载公司服务器上的开发目录,使用本地的 VS Code 编辑代码,就好像在公司服务器上直接开发一样。

三、技术优缺点

优点

安全性高

SFTP 是基于 SSH 协议的,在数据传输过程中会对数据进行加密,防止数据被窃取或篡改。就像给数据穿上了一层防弹衣,黑客想窃取数据没那么容易。

跨平台

树莓派是 Linux 系统,远程服务器可以是 Windows、Linux 或者 macOS 等各种操作系统,只要支持 SFTP 协议,就能进行挂载。就像一个万能钥匙,可以打开不同类型的锁。

配置简单

相比其他挂载方式,通过 SFTP 挂载远程目录的配置过程相对简单,不需要复杂的网络设置。新手开发者也能快速上手。

缺点

性能相对较低

由于 SFTP 要经过加密和解密的过程,数据传输速度会比本地文件系统慢一些。如果需要大量数据的快速读写,可能会有一些影响。就像开车走了一条限速的路,速度快不起来。

稳定性问题

在网络不稳定的情况下,可能会出现挂载断开的情况,影响数据的正常读写。比如在网络不好的偏远山区,网络时不时地断开,挂载的远程目录就用不了了。

四、fstab 配置

前提条件

要保证树莓派和远程服务器之间的网络是连通的,并且在树莓派上安装了 sshfs 工具,如果没有安装,可以使用以下命令进行安装(这里使用 Linux 技术栈):

# 安装 sshfs 工具
sudo apt-get install sshfs

fstab 配置步骤

1. 创建挂载点

在树莓派上创建一个用来挂载远程目录的文件夹,例如创建一个名为 remote_dir 的文件夹:

# 创建挂载点文件夹
sudo mkdir /mnt/remote_dir

2. 编辑 fstab 文件

使用文本编辑器(如 nano 或 vim)打开 /etc/fstab 文件:

# 打开 fstab 文件进行编辑
sudo nano /etc/fstab

在文件末尾添加以下内容,这里以挂载 user 用户在 example.com 服务器上的 /home/user/data 目录到树莓派的 /mnt/remote_dir 为例:

# SFTP 挂载配置
user@example.com:/home/user/data /mnt/remote_dir fuse.sshfs noauto,x-systemd.automount,x-systemd.idle-timeout=1min,user,idmap=user,allow_other,reconnect,IdentityFile=/home/pi/.ssh/id_rsa 0 0

解释一下这些参数:

  • user@example.com:/home/user/data:远程服务器的目录地址,user 是用户名,example.com 是服务器地址,/home/user/data 是要挂载的目录。
  • /mnt/remote_dir:树莓派上的挂载点。
  • fuse.sshfs:使用的挂载类型,这里是 sshfs。
  • noauto:表示开机时不自动挂载,需要手动挂载。
  • x-systemd.automount:使用 systemd 进行自动挂载。
  • x-systemd.idle-timeout=1min:如果 1 分钟内没有使用该挂载点,自动卸载。
  • user:允许普通用户进行挂载和卸载操作。
  • idmap=user:用户和组 ID 映射。
  • allow_other:允许其他用户访问挂载点。
  • reconnect:在连接断开后自动重连。
  • IdentityFile=/home/pi/.ssh/id_rsa:指定 SSH 密钥文件的路径。

3. 保存并退出

在 nano 编辑器中,按 Ctrl + X,然后按 Y 确认保存,最后按 Enter 退出。

4. 挂载远程目录

使用以下命令手动挂载远程目录:

# 手动挂载远程目录
sudo mount /mnt/remote_dir

五、自动重连脚本

虽然 fstab 配置中有 reconnect 参数,但是在一些复杂的网络环境下,可能还需要一个自动重连脚本来保证挂载的稳定性。

脚本编写

创建一个名为 auto_reconnect.sh 的脚本文件:

# 创建脚本文件
nano auto_reconnect.sh

在文件中添加以下内容(这里使用 Shell 技术栈):

#!/bin/bash

# 定义挂载点
MOUNT_POINT="/mnt/remote_dir"

# 检查挂载点是否挂载
if ! mountpoint -q $MOUNT_POINT; then
    echo "挂载点未挂载,尝试重新挂载..."
    sudo mount $MOUNT_POINT
    if mountpoint -q $MOUNT_POINT; then
        echo "挂载成功!"
    else
        echo "挂载失败,请检查网络和配置。"
    fi
fi

解释一下脚本内容:

  • #!/bin/bash:指定脚本使用的 shell 类型。
  • MOUNT_POINT="/mnt/remote_dir":定义挂载点的路径。
  • mountpoint -q $MOUNT_POINT:检查挂载点是否已经挂载。
  • sudo mount $MOUNT_POINT:如果挂载点未挂载,尝试重新挂载。

脚本权限设置

给脚本添加执行权限:

# 添加执行权限
chmod +x auto_reconnect.sh

定期执行脚本

可以使用 cron 来定期执行自动重连脚本,例如每隔 5 分钟执行一次。编辑 cron 表:

# 编辑 cron 表
crontab -e

在文件末尾添加以下内容:

# 每隔 5 分钟执行一次自动重连脚本
*/5 * * * * /home/pi/auto_reconnect.sh

保存并退出,这样脚本就会每隔 5 分钟检查一次挂载点是否挂载,如果没有挂载就尝试重新挂载。

六、注意事项

SSH 密钥配置

为了避免每次挂载都输入密码,需要配置 SSH 密钥认证。可以使用以下命令生成 SSH 密钥:

# 生成 SSH 密钥
ssh-keygen -t rsa

然后把生成的公钥复制到远程服务器上:

# 复制公钥到远程服务器
ssh-copy-id user@example.com

网络稳定性

由于 SFTP 依赖网络进行数据传输,网络不稳定会导致挂载不稳定甚至断开。尽量保证树莓派和远程服务器之间的网络稳定,可以使用有线网络连接,避免使用无线网络。

权限问题

在配置 fstab 和执行自动重连脚本时,可能会碰到权限问题。确保使用 sudo 命令以管理员权限执行相关操作。

七、文章总结

通过 fstab 配置和自动重连脚本,我们可以实现树莓派通过 SFTP 挂载远程目录,并且解决挂载不稳定的问题。fstab 让我们可以方便地配置挂载信息,开机后能够快速挂载远程目录。自动重连脚本则在网络不稳定或其他原因导致挂载断开时,能够自动尝试重新挂载,保证数据的正常读写。不过,在使用过程中要注意 SSH 密钥配置、网络稳定性和权限问题等。希望这篇文章能帮助大家更好地使用树莓派挂载远程目录。