2647 字
13 分鐘

【NAS DIY】Proxmox VE + Debian 13 LXC + Cockpit 打造 Samba NAS 教學

家裡的 NAS 原本是在 Proxmox VE 上跑一台 OpenMediaVault(OMV)虛擬機,再透過 NFS 把 PVE 上的 ZFS 掛進去,最後才由 OMV 提供 SMB 給 Windows 與 Mac 使用。能用,但資料要多繞一層,速度也上不去。

後來 Kent 改成 Debian 13 LXC + Cockpit + Samba,讓 PVE 專心管 ZFS,LXC 只負責檔案分享。換完之後,10GbE 的 SMB 讀取速度從約 500MB/s 提升到約 1GB/s。

這篇文章整理完整的建置過程,同時也把目前實際運作中那台 NAS 的 Samba 與 45Drives 套件狀態檢查了一遍,一併記錄下來,想把 NAS 整合進 Proxmox VE 的朋友可以參考!


⚡ 30 秒速查:OpenMediaVault VM + NFS vs Debian LXC + Bind Mount#

比較維度舊架構:OpenMediaVault VM + NFS新架構:Debian 13 LXC + Bind Mount
🧱 資料路徑Client ➔ OpenMediaVault VM ➔ NFS ➔ PVE ZFSClient ➔ Debian LXC ➔ Bind Mount ➔ PVE ZFS
🚀 10GbE SMB 讀取約 500MB/s約 1GB/s
✍️ 10GbE SMB 寫入約 500MB/s約 800~900MB/s
💾 資源占用需要一台完整 VMLXC 只需 2 Core、1~2GB RAM
🖥️ 管理介面OMV 網頁介面Cockpit(Web 管理)
🛠️ 技術門檻低中(需要熟悉 Linux 與 Samba)
📌 先說結論

這套架構的核心原則很簡單:Proxmox VE 管理儲存空間,Debian LXC 負責檔案分享。 ZFS 的 Pool、Snapshot、Quota 都在 PVE 處理,LXC 裡面只放 Samba 與管理介面。


一、NAS 架構規劃#

目前的架構如下:

Proxmox VE 9
│
├── ZFS Pool:tank
│ └── tank/nas
│ └── Share
│ └── Bind Mount → LXC /mnt/share
│
└── Debian 13 LXC
├── Cockpit
├── Cockpit Files
├── 45Drives File Sharing
├── 45Drives Identities
└── Samba ➔ Windows SMB / macOS SMB

這樣設計有幾個好處:

  • ZFS Pool 完全由 PVE 管理。
  • 不需要額外的 NAS VM,也不需要 NFS 中繼。
  • Samba 直接存取 Bind Mount 的目錄。
  • Cockpit 提供 Web 管理介面。

其中 Share 就是一般的 ZFS 資料夾,之後要再切 Dataset、加 Quota 都可以在 PVE 端處理,不影響 LXC。


二、建立 Debian 13 LXC#

到 Proxmox VE 下載 Debian 13 Standard 的 Container Template,接著按 Create CT,建議配置如下:

項目設定
CT ID1002
Hostnamecockpitnas
OSDebian 13
CPU2 Cores
RAM1024~2048MB
Swap512MB
RootFS20GB
Networkvmbr0
UnprivilegedNo
NestingEnabled
⚠️ 關於 Privileged LXC

本文採用 Privileged LXC,主要是為了簡化 ZFS Bind Mount 與 Linux UID/GID 的對應。但它的隔離程度比較低,只適合可信任的內部服務。安全需求較高的話,請改用 Unprivileged LXC 搭配 UID/GID Mapping。

Debian 13 使用 systemd 257,建立時可能會看到 You may need to enable nesting 的警告,在 PVE Host 執行下面的指令即可:

Terminal window
pct set 1002 -features nesting=1
pct config 1002

本文的 NAS 不需要額外開啟 FUSE 或 Keyctl。


三、更新系統並安裝 Samba#

啟動並進入 LXC:

Terminal window
pct start 1002
pct enter 1002

更新套件並安裝基本工具:

Terminal window
apt update
apt full-upgrade -y
apt install -y sudo curl wget nano acl attr samba smbclient
systemctl enable --now smbd

四、安裝 Cockpit 與 Cockpit Files#

Terminal window
apt install -y cockpit
systemctl enable --now cockpit.socket

用瀏覽器開啟 https://10.0.0.2:9090(IP 請換成你自己的 NAS),第一次登入會出現自簽憑證警告,屬於正常情況。

Cockpit 可以管理系統資源、使用者、Services、Journal、Terminal 與系統更新。想要在網頁上瀏覽檔案,可以再裝官方的 Cockpit Files:

Terminal window
apt install -y cockpit-files

如果 Debian 套件來源沒有提供,就依照官方專案的說明安裝。


五、安裝 45Drives File Sharing 與 Identities#

要在網頁上管理 Samba 分享與 Linux 使用者,可以安裝 45Drives 的兩個 Cockpit 擴充套件:

安裝方式請照官方 README,加入 45Drives 的 APT 來源後再安裝。我目前正在運作的 NAS 實際安裝的版本如下:

套件版本用途
cockpit-file-sharing4.6.3Samba / NFS 分享管理
cockpit-identities0.1.14使用者與群組管理
cockpit-45drives-branding1.0.2Cockpit 的 45Drives 外觀
⚠️ File Sharing v4 的變動

新版 File Sharing 已經沒有舊版「Valid Users / Groups」的圖形化選擇功能,要限制誰能登入,必須到 Advanced Settings 手動加入 Samba 參數(後面會示範)。


六、準備 ZFS 目錄並 Bind Mount 到 LXC#

回到 PVE Host,我的 ZFS Pool 叫 tank,NAS 主要目錄是 /tank/nas,底下的 Share 就是要分享的資料夾。全新環境可以先建立:

Terminal window
zfs create tank/nas
mkdir -p /tank/nas/Share
zfs list

若 tank/nas 已存在就不要重複建立,更不要覆蓋原有資料。

接著先停止 LXC,再把 Share 掛進去:

Terminal window
pct stop 1002
pct set 1002 -mp0 /tank/nas/Share,mp=/mnt/share
pct config 1002

重新啟動 LXC 並確認掛載:

Terminal window
pct start 1002
pct enter 1002
ls -lah /mnt/share

設定完成後,LXC 裡的 /mnt/share 就會對應到 PVE 的 /tank/nas/Share,Samba 只要分享 /mnt/share 就可以了。

📦 備份提醒

Bind Mount 的資料不會包含在一般的 LXC RootFS 備份裡,ZFS Dataset 請另外規劃 Snapshot、Replication 或異地備份。


七、使用者、群組與權限設計#

權限的做法是用 Linux 群組控管,Kent 實際使用的是「一個讀寫群組 + 一個唯讀群組」:

群組權限用途
data_rw讀寫日常管理者
data_ro唯讀只需要看資料的家人或裝置

建立群組、使用者與 Samba 密碼:

Terminal window
groupadd data_rw
groupadd data_ro
adduser user1
usermod -aG data_rw user1
smbpasswd -a user1
pdbedit -L
📌 Linux 密碼 ≠ Samba 密碼

Linux 使用者與 Samba 使用者的密碼是兩套機制,要用 SMB 登入前,一定要先用 smbpasswd -a 建立 Samba 帳號。

接著設定目錄的群組、setgid 與 ACL:

Terminal window
chown root:data_rw /mnt/share
chmod 2770 /mnt/share
setfacl -m g:data_rw:rwx /mnt/share
setfacl -d -m g:data_rw:rwx /mnt/share
setfacl -m o:--- /mnt/share
setfacl -d -m o:--- /mnt/share
getfacl /mnt/share

setgid 讓新建立的子目錄繼承 data_rw 群組。要注意 Default ACL 只影響之後新建的項目,既有的檔案與子目錄需要另外檢查。


八、用 File Sharing 建立 Samba 分享#

進入 Cockpit 的 File Sharing ➔ Samba,新增第一個分享:

項目設定
Share NameShare
Path/mnt/share
Guest AccessOff
Read OnlyOff
BrowsableOn

File Sharing v4 的分享是存在 Samba Registry 裡,所以 smb.conf 的 [global] 要有這一行(File Sharing 通常會自動加入,請先確認不要重複):

[global]
include = registry
🔎 為什麼 smb.conf 裡找不到分享?

因為分享定義在 Registry,不在 smb.conf。要檢查請用 testparm -s 或 net conf list,不要直接去改 smb.conf 裡的 share 區段,改了也不會生效。

接著在 Share 的 Advanced Settings 加入權限參數。這是我目前實際使用的寫法:

valid users = @data_rw @data_ro
read list = @data_ro
force group = data_rw
create mask = 0664
directory mask = 2775
force directory mode = 2775

意思是:兩個群組都能登入,但 data_ro 在 read list 裡,所以只能讀;寫入的檔案則統一歸 data_rw 群組。另外 [global] 加上 macOS 相容設定,Mac 上的檔名與中繼資料會比較正常:

vfs objects = catia fruit streams_xattr
fruit:metadata = stream
fruit:encoding = native
fruit:zero_file_id = yes
fruit:nfs_aces = no

設定完用 testparm 檢查語法有沒有問題。


九、Windows 與 macOS SMB 測試#

Windows 在檔案總管輸入 \\10.0.0.2\Share,macOS 在 Finder 輸入 smb://10.0.0.2/Share,建議測試這些項目:

  • 建立資料夾、中文檔名
  • 上傳、下載、修改、刪除
  • 不同群組使用者的權限(data_ro 要確認真的無法寫入)
  • 大檔案傳輸

十、10GbE SMB 實測#

完成遷移後,Kent 在原本的 10GbE 區網環境做了測試。NAS 這台主機使用的網卡是 Mellanox ConnectX-3 CX312B,在 PVE 上用 lspci 查到的資訊如下:

01:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]

這張卡是二手市場常見的 10GbE 網卡,Linux 內建驅動即可使用,價格也比較親民,很適合自組 NAS 的朋友參考。

架構SMB 讀取SMB 寫入
OpenMediaVault VM + NFS約 500MB/s約 500MB/s
Debian 13 LXC + Bind Mount約 1GB/s約 800~900MB/s

少了 NFS 這一層,也不用再透過 OpenMediaVault VM 提供 SMB,讀取速度幾乎快了一倍,寫入也有明顯改善。

不過這是我自己環境的觀察結果,Samba 設定、快取、ZFS I/O、檔案大小與測試方式都會影響數字,不能直接說所有提升都來自 LXC,各位當作參考就好。


十一、運作現況檢查:怎麼確認 Samba 與 45Drives 都正常?#

建置完成後,Kent 也登入目前正在跑的那台 NAS 做了一次完整檢查(全程唯讀,沒有改任何設定),結果如下:

檢查項目結果
作業系統Debian GNU/Linux 13 (trixie)
Samba 版本4.22.11,角色為 standalone server
smbd / nmbd運作中,且開機自動啟動
winbind已安裝但停用(不是網域成員,不影響)
Cockpitcockpit.socket 已啟用,監聽 9090
SMB 監聽埠445、139(IPv4 + IPv6)
分享設定位置Samba Registry(include = registry)

想自己檢查的話,這些指令就夠用了:

Terminal window
dpkg -l | grep -iE '45drives|cockpit|samba|winbind'
systemctl status smbd nmbd cockpit.socket
testparm -s
net conf list
pdbedit -L
smbstatus
⚠️ 別忘了限制網路存取

檢查時發現這台 NAS 沒有啟用任何防火牆規則,445、139 與 9090 對所有介面開放。NAS 只在家裡內網使用的話影響不大,但如果有任何對外路由或 Port Forward,建議用 PVE Firewall 或 LXC 內的防火牆,把這幾個埠限制在內網網段。

另外,如果 NAS 上同時有一顆不是 ZFS 的磁碟(例如我另外掛一顆 SSD 當下載區),要記得它沒有 ZFS 的 Snapshot 與冗餘保護,重要資料要另外備份。


十二、日常維護與舊 NAS VM 的移除#

日常維護可以分成兩邊:

Proxmox VE Host:ZFS Pool 健康、Scrub、Snapshot、Replication、Dataset Quota、空間監控。

Terminal window
zpool status
zfs list

Debian 13 LXC:Cockpit、Samba、使用者與群組、ACL、套件更新。

Terminal window
apt update && apt full-upgrade -y
systemctl status smbd
testparm
getfacl /mnt/share

新的 LXC NAS 穩定之後,才逐步淘汰舊的 NAS VM,建議流程:

  1. 完成所有 Samba 分享,確認使用者與 ACL。
  2. 測試 Windows、macOS。
  3. 確認其他設備不再使用舊 NAS 的 IP。
  4. 關閉舊 VM,觀察一段時間。
  5. 保留一份可還原的 VM 備份,最後才正式移除。
⚠️ 刪 VM 前先看清楚

如果舊 VM 只是透過 NFS 存取 PVE 上的 ZFS 資料,刪除前務必確認虛擬磁碟、掛載設定與實際資料的關係,避免誤刪真正的資料。


總結#

用 Proxmox VE 建 NAS,不一定要再裝一套完整的 NAS 作業系統。對已經由 PVE 管理 ZFS 的環境來說,Debian 13 LXC + Cockpit + Samba 是很值得考慮的組合:

  • PVE 管理 ZFS,LXC 提供 Samba,Cockpit 提供 Web 管理。
  • 群組加 ACL 管理檔案權限,一個讀寫群組加一個唯讀群組就很夠用。
  • 不再需要 NAS VM 與 NFS,10GbE SMB 讀取約 1GB/s、寫入約 800~900MB/s。

如果你也熟悉 Linux,又想把 NAS 整合進 Proxmox VE 的 Homelab,這是一套簡潔又容易長期維護的架構,推薦給大家試試看!

延伸閱讀#

👉 【NAS DIY】舊電腦先別丟!! 安裝 TrueNAS 15分鐘打造高效能網路硬碟
👉 【NAS DIY】QNAS MINI好用嗎? 入坑心得分享!!
👉 【NAS DIY】5分鐘添加TrueCharts軟體庫,讓TrueNAS有更多內建APP

【NAS DIY】Proxmox VE + Debian 13 LXC + Cockpit 打造 Samba NAS 教學
https://blog3c.net/blog/post/pve-debian-lxc-cockpit-samba-nas/
作者
Kent
發佈於
2026-10-28
許可協議
CC BY-NC-SA 4.0