【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 ZFS | Client ➔ Debian LXC ➔ Bind Mount ➔ PVE ZFS |
| 🚀 10GbE SMB 讀取 | 約 500MB/s | 約 1GB/s |
| ✍️ 10GbE SMB 寫入 | 約 500MB/s | 約 800~900MB/s |
| 💾 資源占用 | 需要一台完整 VM | LXC 只需 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 ID | 1002 |
| Hostname | cockpitnas |
| OS | Debian 13 |
| CPU | 2 Cores |
| RAM | 1024~2048MB |
| Swap | 512MB |
| RootFS | 20GB |
| Network | vmbr0 |
| Unprivileged | No |
| Nesting | Enabled |
⚠️ 關於 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 執行下面的指令即可:
pct set 1002 -features nesting=1pct config 1002本文的 NAS 不需要額外開啟 FUSE 或 Keyctl。
三、更新系統並安裝 Samba
啟動並進入 LXC:
pct start 1002pct enter 1002更新套件並安裝基本工具:
apt updateapt full-upgrade -yapt install -y sudo curl wget nano acl attr samba smbclientsystemctl enable --now smbd四、安裝 Cockpit 與 Cockpit Files
apt install -y cockpitsystemctl enable --now cockpit.socket用瀏覽器開啟 https://10.0.0.2:9090(IP 請換成你自己的 NAS),第一次登入會出現自簽憑證警告,屬於正常情況。
Cockpit 可以管理系統資源、使用者、Services、Journal、Terminal 與系統更新。想要在網頁上瀏覽檔案,可以再裝官方的 Cockpit Files:
apt install -y cockpit-files如果 Debian 套件來源沒有提供,就依照官方專案的說明安裝。
五、安裝 45Drives File Sharing 與 Identities
要在網頁上管理 Samba 分享與 Linux 使用者,可以安裝 45Drives 的兩個 Cockpit 擴充套件:
- cockpit-file-sharing:管理 Samba / NFS 分享(Share Path、Read Only、Guest Access、Advanced Settings)。
- cockpit-identities:管理 Linux 使用者與群組。
安裝方式請照官方 README,加入 45Drives 的 APT 來源後再安裝。我目前正在運作的 NAS 實際安裝的版本如下:
| 套件 | 版本 | 用途 |
|---|---|---|
cockpit-file-sharing | 4.6.3 | Samba / NFS 分享管理 |
cockpit-identities | 0.1.14 | 使用者與群組管理 |
cockpit-45drives-branding | 1.0.2 | Cockpit 的 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 就是要分享的資料夾。全新環境可以先建立:
zfs create tank/nasmkdir -p /tank/nas/Sharezfs list若 tank/nas 已存在就不要重複建立,更不要覆蓋原有資料。
接著先停止 LXC,再把 Share 掛進去:
pct stop 1002pct set 1002 -mp0 /tank/nas/Share,mp=/mnt/sharepct config 1002重新啟動 LXC 並確認掛載:
pct start 1002pct enter 1002ls -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 密碼:
groupadd data_rwgroupadd data_roadduser user1usermod -aG data_rw user1smbpasswd -a user1pdbedit -L📌 Linux 密碼 ≠ Samba 密碼Linux 使用者與 Samba 使用者的密碼是兩套機制,要用 SMB 登入前,一定要先用
smbpasswd -a建立 Samba 帳號。
接著設定目錄的群組、setgid 與 ACL:
chown root:data_rw /mnt/sharechmod 2770 /mnt/sharesetfacl -m g:data_rw:rwx /mnt/sharesetfacl -d -m g:data_rw:rwx /mnt/sharesetfacl -m o:--- /mnt/sharesetfacl -d -m o:--- /mnt/sharegetfacl /mnt/sharesetgid 讓新建立的子目錄繼承 data_rw 群組。要注意 Default ACL 只影響之後新建的項目,既有的檔案與子目錄需要另外檢查。
八、用 File Sharing 建立 Samba 分享
進入 Cockpit 的 File Sharing ➔ Samba,新增第一個分享:
| 項目 | 設定 |
|---|---|
| Share Name | Share |
| Path | /mnt/share |
| Guest Access | Off |
| Read Only | Off |
| Browsable | On |
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_roread list = @data_roforce group = data_rwcreate mask = 0664directory mask = 2775force directory mode = 2775意思是:兩個群組都能登入,但 data_ro 在 read list 裡,所以只能讀;寫入的檔案則統一歸 data_rw 群組。另外 [global] 加上 macOS 相容設定,Mac 上的檔名與中繼資料會比較正常:
vfs objects = catia fruit streams_xattrfruit:metadata = streamfruit:encoding = nativefruit:zero_file_id = yesfruit: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 | 已安裝但停用(不是網域成員,不影響) |
| Cockpit | cockpit.socket 已啟用,監聽 9090 |
| SMB 監聽埠 | 445、139(IPv4 + IPv6) |
| 分享設定位置 | Samba Registry(include = registry) |
想自己檢查的話,這些指令就夠用了:
dpkg -l | grep -iE '45drives|cockpit|samba|winbind'systemctl status smbd nmbd cockpit.sockettestparm -snet conf listpdbedit -Lsmbstatus⚠️ 別忘了限制網路存取檢查時發現這台 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、空間監控。
zpool statuszfs listDebian 13 LXC:Cockpit、Samba、使用者與群組、ACL、套件更新。
apt update && apt full-upgrade -ysystemctl status smbdtestparmgetfacl /mnt/share新的 LXC NAS 穩定之後,才逐步淘汰舊的 NAS VM,建議流程:
- 完成所有 Samba 分享,確認使用者與 ACL。
- 測試 Windows、macOS。
- 確認其他設備不再使用舊 NAS 的 IP。
- 關閉舊 VM,觀察一段時間。
- 保留一份可還原的 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