跳转到内容

Ubuntu 开机自动挂载 NAS 磁盘完全指南 | CIFS/NFS 网络存储教程

Ubuntu NAS Mount Configuration

为什么需要挂载 NAS?

在网络存储时代,将 NAS(Network Attached Storage)挂载到 Linux 服务器可以:

  • 💾 扩展存储空间:突破 VPS 本地磁盘限制
  • 🔄 数据集中管理:多服务器共享同一存储池
  • 🛡️ 数据备份冗余:重要文件异地备份
  • 📊 媒体库统一管理:Plex/Jellyfin/Emby 直接读取
  • 💰 成本优化:大容量 HDD 比 SSD 便宜得多

常见网络文件系统对比

协议适用场景性能安全性配置难度
CIFS/SMBWindows 共享、通用场景⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐(简单)
NFSLinux 之间、高性能需求⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
SSHFS临时挂载、加密传输⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
iSCSI块级存储、数据库⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

推荐选择:

  • 🟢 通用场景: CIFS/SMB(兼容性最好)
  • 🔵 Linux 集群: NFS(性能最优)
  • 🔴 安全传输: SSHFS(加密通道)

方法一:CIFS/SMB 挂载(推荐)

1. 创建挂载点

首先在 Ubuntu 的 /mnt 目录下新建一个 NAS 挂载目录 nas_share

sh
sudo mkdir -p /mnt/nas_share

目录命名建议:

  • /mnt/nas-media - 媒体文件
  • /mnt/nas-backup - 备份数据
  • /mnt/nas-docs - 文档资料
  • /mnt/nas-docker - Docker 数据卷

2. 安装 cifs-utils

sh
sudo apt update
sudo apt install cifs-utils -y

验证安装:

bash
# 检查版本
mount.cifs --version

# 查看支持的选项
man mount.cifs

3. 查看用户的 uid 和 gid

sh
id root

Ubuntu

在此处要查看的用户,就是你希望使用 Ubuntu 上的哪个用户去挂载NAS磁盘。

比如我希望以 root 去挂载NAS磁盘,等挂载成功后,磁盘里的文件所有者就是root,这样便对磁盘的内容具有相应的读写和执行权限。

在此记下此用户的 uid 和 gid,分别是 0 和 0 ,在编辑 /etc/fstab 的时候要写进去。

查看其他用户:

bash
# 查看特定用户
id www-data

# 查看所有用户
cat /etc/passwd | grep -E "/bin/bash|/bin/sh"

4. 创建凭证文件(安全推荐)

⚠️ 重要: 不要在 /etc/fstab 中明文写入密码!

创建凭证文件:

bash
sudo nano /etc/samba/credentials

添加以下内容:

text
username=your_nas_username
password=your_nas_password
domain=WORKGROUP  # 如果需要

设置严格权限:

bash
sudo chmod 600 /etc/samba/credentials
sudo chown root:root /etc/samba/credentials

5. 编辑启动挂载文件 fstab

sh
sudo nano /etc/fstab

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

方式 1:使用凭证文件(推荐)

text
//192.168.2.10/share /mnt/nas_share cifs credentials=/etc/samba/credentials,uid=0,gid=0,vers=3.0,_netdev 0 0

方式 2:直接写入(不推荐)

text
//192.168.2.10/share /mnt/nas_share cifs username=NAS的用户名,password=NAS用户名的密码,uid=0,gid=0,vers=3.0,_netdev 0 0

参数详解

参数说明推荐值
//192.168.2.10/shareNAS 的共享路径,格式为 //IP/共享名根据实际修改
/mnt/nas_share本地挂载点自定义
cifs使用 CIFS/SMB 协议固定
credentials凭证文件路径/etc/samba/credentials
uid挂载后文件所有者 UID0 (root) 或 1000 (普通用户)
gid挂载后文件所属组 GID0 (root) 或 1000
versSMB 协议版本3.0(最新)或 2.0
_netdev等待网络就绪后再挂载必须添加
iocharset=utf8字符编码(中文支持)utf8
file_mode文件权限0644
dir_mode目录权限0755
rw读写模式rw(默认)
soft软挂载(超时不卡死)soft
timeo超时时间(十分之一秒)600(60秒)
retrans重试次数3

完整示例:

text
//192.168.2.10/media /mnt/nas-media cifs credentials=/etc/samba/credentials,uid=1000,gid=1000,vers=3.0,iocharset=utf8,file_mode=0644,dir_mode=0755,_netdev,soft,timeo=600,retrans=3 0 0

6. 测试并挂载

测试 fstab 配置(不会真的挂载):

bash
sudo mount -a

如果没有报错,说明配置正确。

查看挂载状态:

bash
# 查看所有挂载
df -h

# 查看特定挂载
mount | grep nas_share

# 查看详细信息
ls -la /mnt/nas_share

预期输出:

Filesystem              Size  Used Avail Use% Mounted on
//192.168.2.10/share    4.0T  2.1T  1.9T  53% /mnt/nas_share

方法二:NFS 挂载(Linux 专用,高性能)

1. 安装 NFS 客户端

bash
sudo apt install nfs-common -y

2. 创建挂载点

bash
sudo mkdir -p /mnt/nfs-share

3. 查看 NFS 共享

bash
# 查看远程 NFS 服务器的共享列表
showmount -e 192.168.2.10

# 预期输出:
# Export list for 192.168.2.10:
# /volume1/share *

4. 配置 fstab

bash
sudo nano /etc/fstab

添加:

text
192.168.2.10:/volume1/share /mnt/nfs-share nfs defaults,_netdev,soft,timeo=600 0 0

NFS 常用参数:

  • rsize/wsize: 读写缓冲区大小(默认 1048576)
  • hard/soft: 硬/软挂载
  • intr: 允许中断(已废弃)
  • noatime: 不更新访问时间(提升性能)
  • nfsvers: NFS 版本(3 或 4)

高性能配置示例:

text
192.168.2.10:/volume1/share /mnt/nfs-share nfs rsize=1048576,wsize=1048576,hard,intr,nfsvers=4,_netdev,noatime 0 0

5. 挂载并验证

bash
sudo mount -a
df -h | grep nfs

方法三:SSHFS 挂载(加密传输)

1. 安装 SSHFS

bash
sudo apt install sshfs -y

2. 创建挂载点

bash
sudo mkdir -p /mnt/sshfs-share

3. 手动挂载测试

bash
sshfs user@192.168.2.10:/remote/path /mnt/sshfs-share \
  -o IdentityFile=~/.ssh/id_ed25519 \
  -o allow_other \
  -o reconnect \
  -o ServerAliveInterval=15 \
  -o ServerAliveCountMax=3

参数说明:

  • IdentityFile: SSH 私钥路径
  • allow_other: 允许其他用户访问
  • reconnect: 断线自动重连
  • ServerAliveInterval: 心跳间隔(秒)

4. 配置 fstab(可选)

text
user@192.168.2.10:/remote/path /mnt/sshfs-share fuse.sshfs _netdev,IdentityFile=/root/.ssh/id_ed25519,allow_other,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 0 0

注意: SSHFS 需要安装 fuse 模块支持。


权限管理

1. 修改挂载点所有者

bash
# 更改所有者
sudo chown -R www-data:www-data /mnt/nas_share

# 更改权限
sudo chmod -R 755 /mnt/nas_share

2. 在 fstab 中指定权限

text
//192.168.2.10/share /mnt/nas_share cifs credentials=/etc/samba/credentials,uid=33,gid=33,file_mode=0644,dir_mode=0755,_netdev 0 0

常用 UID/GID:

  • 0:0 - root
  • 33:33 - www-data(Web 服务器)
  • 1000:1000 - 第一个普通用户
  • 998:996 - docker(Docker 用户)

3. 验证权限

bash
# 查看文件权限
ls -la /mnt/nas_share

# 测试写入
touch /mnt/nas_share/test.txt
echo "test" > /mnt/nas_share/test.txt
cat /mnt/nas_share/test.txt
rm /mnt/nas_share/test.txt

故障排查

Q1: 挂载失败,提示 "mount error(115): Operation now in progress"?

原因: 网络未就绪或 NAS 不可达

解决方案:

bash
# 1. 检查网络连接
ping 192.168.2.10

# 2. 检查 NAS 服务
smbclient -L //192.168.2.10 -U username

# 3. 确保添加 _netdev 选项
# 在 fstab 中添加 _netdev

# 4. 手动测试挂载
sudo mount -t cifs //192.168.2.10/share /mnt/nas_share -o credentials=/etc/samba/credentials

Q2: 挂载成功但无法写入?

原因: 权限问题

解决方案:

bash
# 1. 检查挂载权限
mount | grep nas_share

# 2. 修改 fstab 中的 uid/gid
//192.168.2.10/share /mnt/nas_share cifs credentials=/etc/samba/credentials,uid=1000,gid=1000,_netdev 0 0

# 3. 重新挂载
sudo umount /mnt/nas_share
sudo mount -a

# 4. 或在 NAS 端调整共享权限

Q3: 重启后挂载失败?

原因: 网络服务启动顺序问题

解决方案:

bash
# 1. 确保使用 _netdev 选项
# 2. 添加 nofail(挂载失败不阻止启动)
//192.168.2.10/share /mnt/nas_share cifs credentials=/etc/samba/credentials,_netdev,nofail 0 0

# 3. 或创建 systemd 挂载单元
sudo nano /etc/systemd/system/mnt-nas_share.mount
ini
[Unit]
Description=Mount NAS Share
After=network-online.target
Wants=network-online.target

[Mount]
What=//192.168.2.10/share
Where=/mnt/nas_share
Type=cifs
Options=credentials=/etc/samba/credentials,uid=1000,gid=1000,vers=3.0

[Install]
WantedBy=multi-user.target
bash
# 启用服务
sudo systemctl enable mnt-nas_share.mount

Q4: 中文文件名乱码?

解决方案:

text
//192.168.2.10/share /mnt/nas_share cifs credentials=/etc/samba/credentials,iocharset=utf8,_netdev 0 0

Q5: 如何卸载 NAS?

bash
# 正常卸载
sudo umount /mnt/nas_share

# 强制卸载(如果繁忙)
sudo umount -l /mnt/nas_share

# 从 fstab 删除对应行
sudo nano /etc/fstab
# 删除或注释掉相关行

# 删除挂载点(可选)
sudo rmdir /mnt/nas_share

自动化脚本

批量挂载多个共享

bash
#!/bin/bash
# /usr/local/bin/mount-nas.sh

# NAS 配置
NAS_IP="192.168.2.10"
CREDENTIALS="/etc/samba/credentials"

# 定义共享列表
declare -A SHARES=(
    ["/mnt/nas-media"]="media"
    ["/mnt/nas-backup"]="backup"
    ["/mnt/nas-docs"]="documents"
)

# 创建挂载点并挂载
for mount_point in "${!SHARES[@]}"; do
    share_name="${SHARES[$mount_point]}"
    
    # 创建挂载点
    mkdir -p "$mount_point"
    
    # 挂载
    if mountpoint -q "$mount_point"; then
        echo "$mount_point 已挂载"
    else
        echo "🔄 正在挂载 $mount_point..."
        mount -t cifs "//${NAS_IP}/${share_name}" "$mount_point" \
            -o credentials=$CREDENTIALS,uid=1000,gid=1000,vers=3.0,_netdev
        
        if [ $? -eq 0 ]; then
            echo "$mount_point 挂载成功"
        else
            echo "$mount_point 挂载失败"
        fi
    fi
done

echo "所有 NAS 共享挂载完成!"

设置为开机自启:

bash
sudo chmod +x /usr/local/bin/mount-nas.sh

# 添加到 crontab
sudo crontab -e
@reboot /usr/local/bin/mount-nas.sh >> /var/log/nas-mount.log 2>&1

性能优化

1. 调整 CIFS 参数

text
//192.168.2.10/share /mnt/nas_share cifs credentials=/etc/samba/credentials,rsize=65536,wsize=65536,cache=strict,_netdev 0 0

优化参数:

  • rsize/wsize: 读写缓冲区(默认 16384,可增至 65536)
  • cache: 缓存策略(strict/loose/none)
  • actimeo: 属性缓存时间(秒)

2. 禁用访问时间更新

text
//192.168.2.10/share /mnt/nas_share cifs credentials=/etc/samba/credentials,noatime,_netdev 0 0

3. 使用异步写入

text
//192.168.2.10/share /mnt/nas_share cifs credentials=/etc/samba/credentials,async,_netdev 0 0

监控与维护

1. 查看挂载状态

bash
# 查看所有挂载
df -h

# 查看 CIFS 挂载
mount -t cifs

# 查看 NFS 挂载
mount -t nfs

# 详细统计
smbstatus

2. 测试连接速度

bash
# 写入测试
dd if=/dev/zero of=/mnt/nas_share/test bs=1M count=100 conv=fdatasync

# 读取测试
dd if=/mnt/nas_share/test of=/dev/null bs=1M

# 清理测试文件
rm /mnt/nas_share/test

3. 定期检查脚本

bash
#!/bin/bash
# /usr/local/bin/check-nas.sh

MOUNT_POINT="/mnt/nas_share"

if mountpoint -q "$MOUNT_POINT"; then
    echo "✅ NAS 挂载正常"
else
    echo "❌ NAS 未挂载,尝试重新挂载..."
    mount -a
    
    if [ $? -eq 0 ]; then
        echo "✅ 重新挂载成功"
        # 发送告警通知(可选)
        # curl -s "https://api.telegram.org/botXXX/sendMessage" -d "chat_id=YYY&text=NAS已重新挂载"
    else
        echo "❌ 重新挂载失败,请手动检查"
    fi
fi

添加到 crontab:

bash
# 每 5 分钟检查一次
*/5 * * * * /usr/local/bin/check-nas.sh >> /var/log/nas-check.log 2>&1

应用场景示例

1. Docker 数据卷挂载

bash
# 挂载 NAS 作为 Docker 数据目录
sudo mkdir -p /mnt/nas-docker

# 修改 Docker 数据根目录
sudo nano /etc/docker/daemon.json
json
{
  "data-root": "/mnt/nas-docker"
}
bash
# 重启 Docker
sudo systemctl restart docker

2. Plex/Jellyfin 媒体库

bash
# 挂载媒体目录
sudo mkdir -p /mnt/nas-media/{movies,tv,music}

# 在 Plex/Jellyfin 中添加库时指向 /mnt/nas-media

3. 网站备份

bash
# 挂载备份目录
sudo mkdir -p /mnt/nas-backup

# 定时备份脚本
#!/bin/bash
BACKUP_DATE=$(date +%Y%m%d_%H%M%S)
tar czf /mnt/nas-backup/website_$BACKUP_DATE.tar.gz /var/www/html

# 保留最近 7 天的备份
find /mnt/nas-backup -name "website_*.tar.gz" -mtime +7 -delete

安全最佳实践

必须做:

禁止做:


相关教程推荐

通过合理配置 NAS 挂载,你可以轻松扩展服务器存储能力,实现数据集中管理和高效备份!💾✨


免责声明

本文仅供技术交流和学习参考,请遵守当地法律法规,合理合法使用网络服务。