一套 Proxmox VE 超融合叢集上跑了 Ceph,另一套 PVE 叢集想直接用它的儲存空間;或是兩台跑 FTP 的 CT 要共用同一份檔案。這兩種需求,都可以讓 PVE 或 CT 當成 Ceph 的用戶端,直接連到來源的 Ceph 叢集,不用合併叢集,也不用另外架 NFS。
這篇分成三個部分:從來源 Ceph 取得連線資訊、在另一套 PVE 叢集掛接外部 RBD 與 CephFS、以及讓非特權 CT 在容器內直接掛載 CephFS。
架構與使用方式
| 部分 | 在哪裡操作 | 用途 |
|---|---|---|
| 一、來源 Ceph | 提供儲存的 PVE/Ceph 叢集 | 取得 Monitor 位址、帳號與金鑰,建立專用帳號 |
| 二、外部 PVE | 另一套 PVE 叢集 | 以 PVE 儲存的方式加入 RBD(VM/CT 磁碟)與 CephFS(ISO、範本) |
| 三、CT 直接掛載 | 非特權 LXC CT 內 | CT 用 ceph-fuse 直接掛載 CephFS 的某個目錄,多台 CT 共用 |
第二部分與第三部分是兩種不同的用戶端方式,彼此獨立。第三部分的 CT 不需要宿主機先掛載 CephFS,也不用 mp0、bind mount。
來源 Ceph 叢集
以下在提供儲存服務的來源叢集上執行。
查詢 Monitor 位址
grep mon_host /etc/pve/ceph.conf
記下所有 Monitor 的 IP,用戶端連線時都要用到。
確認儲存名稱與帳號
cat /etc/pve/storage.cfg
ceph fs ls
| 類型 | 要確認的項目 |
|---|---|
| RBD | PVE 儲存 ID、pool、username |
| CephFS | PVE 儲存 ID、fs-name、username |
注意:PVE 儲存 ID、RBD Pool 名稱、CephFS 檔案系統名稱可能都不一樣。下面金鑰檔的檔名用的是 PVE 儲存 ID,不一定是 Pool 名稱,不要搞混。
取得 RBD 的 Keyring
給第二部分加入外部 RBD 使用:
cat /etc/pve/priv/ceph/<RBD儲存ID>.keyring
複製完整內容,包含 [client.xxx] 的標頭。檔案不存在的話,先確認儲存使用的 Ceph 帳號,再取得:
ceph auth get client.<帳號>
取得 CephFS 的 Secret
給第二部分加入外部 CephFS 使用:
cat /etc/pve/priv/ceph/<CephFS儲存ID>.secret
檔案不存在的話:
ceph auth get-key client.<帳號>
注意:PVE 的 RBD 設定要填完整的 Keyring;CephFS 的私鑰欄位只要單純的 Secret 字串。兩者格式不同,填錯就連不上。
為 CT 準備共享目錄與專用帳號
給第三部分使用。範例設定:
| 項目 | 範例 |
|---|---|
| CephFS 檔案系統名稱 | cephfs |
| 來源 PVE 上的 CephFS 掛載路徑 | /mnt/pve/cephfs1 |
| CephFS 裡的共享目錄 | /shared_data |
| CT 使用的 Ceph 帳號 | client.ftp |
先確認 CephFS 真的有掛載,再建立目錄:
findmnt --mountpoint /mnt/pve/cephfs1 -o TARGET,SOURCE,FSTYPE,OPTIONS
mkdir -p /mnt/pve/cephfs1/shared_data
注意:不要只看到目錄存在就認定 CephFS 已經掛載。沒有掛載的話,mkdir 會在本機磁碟建立目錄,後面的資料也會寫錯地方。FSTYPE 要是 ceph。
建立只能存取這個目錄的專用帳號:
ceph fs authorize cephfs client.ftp /shared_data rw
ceph auth get client.ftp
輸出的完整 Keyring 保存起來,第三部分要放進 CT。用專用帳號的好處是權限只限這個目錄,CT 被入侵也碰不到其他資料;要撤銷時也只影響這個帳號。範例中兩台 CT 共用同一個帳號,需要分別撤銷的話,可以各建一個帳號授權同一個目錄。
另一套 PVE 叢集掛接外部 Ceph
以下在使用儲存的那一套 PVE 叢集上操作。這只是新增儲存連線,不會合併兩套叢集,也不會讓這套叢集變成來源 Ceph 的 MON 或 OSD。
前置條件
- 各節點有安裝與來源相容的 Ceph 用戶端套件
- 使用 RBD 的節點連得到來源的 MON 與 OSD
- 使用 CephFS 的節點連得到來源的 MON、MDS 與 OSD
Ceph 的用戶端會直接連到每一台 OSD,不是只連 Monitor,防火牆要開放到整個 Ceph 的公用網路。
加入外部 RBD
「資料中心 → 儲存 → 增加 → RBD」:
| 欄位 | 設定 |
|---|---|
| ID | 這套叢集的儲存名稱,例如 ceph-ext |
| 集區 | 來源的 RBD Pool 名稱 |
| Monitor | 來源 Monitor 的 IP,多個以空格分隔 |
| 帳號 | 與 Keyring 對應的帳號,例如 admin,不加 client. |
| 內容 | 磁碟映像、容器 |
| KRBD | 一般不勾 |
| Keyring | 第一部分取得的完整 Keyring |
| 節點 | 允許使用的節點 |
CT 使用 RBD 時一律走核心的 krbd,不受 KRBD 勾選與否影響;KRBD 選項影響的是 VM。
加入後在各節點確認:
pvesm status
注意:不同的 PVE 叢集不會互相協調 VM/CT 的 ID。兩套叢集共用同一個 RBD Pool 的話,都有 vm-100-disk-0 時就會撞名,甚至可能刪到對方的磁碟。建議每套叢集用獨立的 Pool,或規劃好的 RBD namespace,絕對不能讓兩套叢集同時使用同一顆磁碟。
加入外部 CephFS
「資料中心 → 儲存 → 增加 → CephFS」:
| 欄位 | 設定 |
|---|---|
| ID | 例如 cephfs-ext |
| Monitor | 來源 Monitor 的 IP |
| 帳號 | 與 Secret 對應的帳號 |
| 檔案系統名稱 | ceph fs ls 查到的名稱 |
| 內容 | ISO 映像、容器範本等 |
| 私鑰 | 第一部分取得的 Secret 字串 |
| 節點 | 需要使用的節點 |
- 檔案系統名稱不是 data pool 或 metadata pool 的名稱
- 儲存 ID 是
cephfs-ext時,會掛載在/mnt/pve/cephfs-ext
確認:
pvesm status
findmnt --mountpoint /mnt/pve/cephfs-ext -o TARGET,SOURCE,FSTYPE,OPTIONS
FSTYPE 是 ceph 代表使用核心的 CephFS 用戶端掛載成功。
非特權 CT 直接掛載 CephFS
這個方式由 CT 裡的 ceph-fuse 直接連到 Ceph 叢集,宿主機不用掛載。範例是兩台跑 FTP 的 CT 共用 /shared_data。
注意:Proxmox VE 官方文件強烈不建議在 CT 裡使用 FUSE 掛載。原因是 suspend 與 snapshot 模式的備份需要凍結容器,而 Linux 核心的凍結機制遇到 FUSE 可能會卡住。採用這個做法,CT 的備份一律要用 stop 模式。
官方建議的替代做法是在宿主機掛載,再用 bind mount 給 CT。我這次選擇在 CT 內直接掛載,是因為:宿主機不需要另外保存 Ceph 帳號、每台 CT 可以用自己的專用帳號、CT 移轉到別的節點時不用每台宿主機都準備掛載。兩種做法各有取捨,請依環境評估。
範例參數
| 項目 | 範例 |
|---|---|
| CT ID | 100、101 |
| Monitor IP | 10.10.10.11、10.10.10.12、10.10.10.13 |
| CephFS 檔案系統名稱 | cephfs |
| Ceph 帳號 | client.ftp |
| CephFS 共享目錄 | /shared_data |
| CT 內的掛載路徑 | /mnt/shared |
CT 的網路要能連到來源的 MON、MDS 與 OSD。兩台 CT 都要做以下設定。
啟用 CT 的 FUSE 功能
先把 CT 關機,「CT → 選項 → 功能 → 編輯」,勾選 FUSE,保留原本已勾的其他功能,再啟動 CT。
安裝套件
在 CT 內執行:
apt update
apt install ceph-fuse ceph-common
install -d -m 755 /etc/ceph
mkdir -p /mnt/shared
發行版內建的 Ceph 套件版本可能比來源叢集舊。一般來說較舊的用戶端可以連較新的叢集,但功能可能受限;遇到問題時,可以改用 Ceph 官方套件庫安裝相同版本的用戶端。
設定連線資訊
/etc/ceph/ceph.conf:
[global]
mon_host = 10.10.10.11,10.10.10.12,10.10.10.13
/etc/ceph/ceph.client.ftp.keyring:貼上第一部分 ceph auth get client.ftp 的完整內容。
chmod 600 /etc/ceph/ceph.client.ftp.keyring
這裡用的是完整的 Keyring,不是第二部分 CephFS 私鑰欄位的單純 Secret。
手動掛載測試
ceph-fuse -n client.ftp --client_fs cephfs -r /shared_data -o allow_other /mnt/shared
| 參數 | 用途 |
|---|---|
-n client.ftp | Ceph 帳號 |
--client_fs cephfs | CephFS 檔案系統名稱 |
-r /shared_data | 只掛載 CephFS 裡的這個目錄 |
-o allow_other | 允許 CT 內其他使用者存取(仍受檔案權限限制) |
/mnt/shared | 掛載點 |
findmnt --mountpoint /mnt/shared
ls -ldn /mnt/shared
開機自動掛載
在 CT 的 /etc/fstab 加入:
none /mnt/shared fuse.ceph ceph.id=ftp,ceph.client_fs=cephfs,ceph.client_mountpoint=/shared_data,_netdev,allow_other 0 0
這行是透過 Ceph 的 mount.fuse.ceph 掛載輔助程式執行。在 FTP 還沒使用這個目錄時測試:
umount /mnt/shared
systemctl daemon-reload
mount /mnt/shared
findmnt --mountpoint /mnt/shared
再重新啟動 CT,確認開機後會自動掛載。
FTP 服務等掛載完成才啟動
以 vsftpd 為例:
systemctl edit vsftpd
[Unit]
RequiresMountsFor=/mnt/shared
[Service]
ExecStartPre=/usr/bin/mountpoint -q /mnt/shared
systemctl daemon-reload
systemctl restart vsftpd
這樣 CephFS 沒掛上時 FTP 不會啟動,避免使用者把檔案上傳到 CT 本機的空目錄。不過它只保證啟動時有掛載,執行中 CephFS 斷線還是要靠監控發現。
檔案權限
兩台 CT 的 FTP 帳號 UID、GID 必須一致:
id ftpuser
兩台都是 1000:1000 的話,在其中一台設定共享目錄:
chown 1000:1000 /mnt/shared
chmod 2770 /mnt/shared
- 這是 CT 內直接掛載,不會有 bind mount 那種非特權 CT 的 UID 偏移(
100000) - Ceph 帳號的授權和 Unix 檔案權限都要允許,才能存取
- 用 FTP 虛擬帳號的話,要確認它實際對應到哪個本機帳號
- 不要對整個目錄遞迴修改權限,多使用者的環境要分別規劃
雙台驗證
- 從 CT 100 的 FTP 上傳測試檔
- 從 CT 101 確認看得到、可以下載
- 依權限測試修改、改名、刪除
- 反過來由 CT 101 上傳、CT 100 驗證
- 重新啟動兩台 CT,確認掛載與 FTP 都正常啟動
共用 CephFS 只共用檔案,兩台 FTP 的帳號、密碼、設定與記錄不會自動同步。也要避免兩台同時寫入同一個檔案。
備份、移轉與 HA
CT 的備份
- 一律用 stop 模式,不要用 snapshot 或 suspend 模式
- stop 模式備份時,該 CT 的 FTP 服務會暫時中斷
CephFS 資料的備份
- CT 的備份不包含 CephFS 裡的共享資料,要另外安排備份
- 還原 CT 也不會還原 CephFS 的資料
移轉與 HA
- CT 在其他節點啟動後會重新掛載 CephFS
- 所有可能接手的節點,都要允許 CT 使用 FUSE,網路也要連得到 Ceph
- 實際測試移轉、節點重新開機、HA 接手之後,掛載與 FTP 的啟動順序都正常
對外連線
兩台 FTP 前面放同一個 VIP 或負載平衡器時,要確保控制連線與被動模式的資料連線導向同一台,並設定好被動模式的通訊埠範圍與對外 IP,否則會出現登入成功、但列目錄或傳檔失敗的狀況。
結論
讓另一套 PVE 叢集或 CT 當成 Ceph 的用戶端,就能共用來源叢集的儲存空間,不用合併叢集。PVE 掛接外部 RBD/CephFS 是官方支援的標準做法;CT 內直接用 ceph-fuse 掛載則要接受備份只能用 stop 模式的限制,評估清楚再採用。
另外兩個重點:每套叢集用獨立的 Pool 避免磁碟撞名,CT 用的帳號只授權它需要的目錄。
參考資料
- Proxmox VE 文件:Ceph RADOS Block Devices(RBD)
https://pve.proxmox.com/pve-docs/chapter-pvesm.html#ceph_rados_block_devices - Proxmox VE 文件:Proxmox Container Toolkit(FUSE Mounts)
https://pve.proxmox.com/pve-docs/chapter-pct.html - Ceph 文件:Mount CephFS using FUSE
https://docs.ceph.com/en/latest/cephfs/mount-using-fuse/ - Ceph 文件:mount.fuse.ceph
https://docs.ceph.com/en/latest/man/8/mount.fuse.ceph/ - PVE Ceph 叢集退出節點流程
https://blog.jason.tools/2026/02/pve-ceph-remove-node.html



