跳轉到內容

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 掛載,你可以輕鬆擴展服務器存儲能力,實現數據集中管理和高效備份!💾✨


延伸阅读

免责声明

本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。

最後更新於: