一套 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 不需要PVE 主機先掛接 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 檔案系統名稱可能都不一樣。後面的指令要填的是 Pool 名稱與檔案系統名稱,不是 PVE 儲存 ID,不要搞混。username 若是 admin,代表那是管理員帳號,不要拿給外部叢集使用。
建立外部 PVE 用的 RBD 帳號
給第二部分加入外部 RBD 使用。不要把來源叢集的 client.admin 複製出去:超融合 PVE 自動建立的 RBD 儲存用的就是 admin 帳號,/etc/pve/priv/ceph/ 底下的金鑰檔通常就是管理員金鑰。Proxmox 官方文件也建議另建只具備儲存所需權限的帳號:
ceph auth get-or-create client.pve-ext-rbd \
mon 'profile rbd' \
osd 'profile rbd pool=pve-ext' \
mgr 'profile rbd pool=pve-ext'
pve-ext 換成給這套叢集專用的 Pool,要先在來源叢集建立(原因見第二部分的撞名提醒)。輸出就是完整的 Keyring,包含 [client.pve-ext-rbd] 標頭;之後要再取得用 ceph auth get client.pve-ext-rbd。每套外部 PVE 各建一個帳號,撤銷時互不影響。
建立外部 PVE 用的 CephFS 帳號
給第二部分加入外部 CephFS 使用,同樣另建帳號:
ceph fs authorize cephfs client.pve-ext-fs / rw
ceph auth get-key client.pve-ext-fs
範例授權整個 CephFS。只想讓它使用某個目錄的話,把 / 換成該目錄(目錄要先建立),加入儲存後再以 pvesm set <儲存ID> --subdir <目錄> 指定掛接的子目錄。get-key 輸出的是單純的 Secret 字串。
注意: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
findmnt -rn -t ceph --mountpoint /mnt/pve/cephfs1 >/dev/null && \
mkdir -p /mnt/pve/cephfs1/shared_data
注意:不要只看到目錄存在就認定 CephFS 已經掛接。沒有掛接的話,mkdir 會在本機磁碟建立目錄,後面的資料也會寫錯地方。FSTYPE 要是 ceph;第二行只有確認是 CephFS 掛接時才會建立目錄。
建立限定這個目錄的專用帳號:
ceph fs authorize cephfs client.ftp /shared_data rw
ceph auth get client.ftp
輸出的完整 Keyring 保存起來,第三部分要放進 CT。用專用帳號,權限比 client.admin 小得多,要撤銷時也只影響這個帳號。範例中兩台 CT 共用同一個帳號,需要分別撤銷的話,可以各建一個帳號授權同一個目錄。
注意:Ceph Reef 起,對已存在的帳號執行 fs authorize 是追加授權,不會移除原有的其他路徑。請用新的帳號名稱,並以 ceph auth get 確認 caps 只有預期的路徑。
不過這個路徑限制不等於資料隔離,CT 被入侵、Keyring 外洩時,仍要考慮下面幾點:
- 路徑限制只管 MDS 的目錄樹
ceph fs authorize產生的 OSD 權限涵蓋整個 CephFS 資料集區。Ceph 官方文件說明,用戶端仍可直接透過 RADOS 存取底層的檔案資料,其他目錄的檔案內容有被讀取或覆寫的風險 - 要完整隔離得用 RADOS namespace
以檔案配置(file layout)把這個目錄的資料放進獨立的 namespace,再把帳號的 OSD 權限限制在該 namespace。不信任的用戶端,Ceph 官方建議用這種方式 - 共享目錄本身沒有保護
帳號有讀寫權限,入侵者可以讀取、修改、刪除/shared_data的全部內容,兩台 CT 共用時另一台的檔案也一樣。這個目錄要另外備份 - CT 要連得到 Ceph 的公用網路
CT 會直接連到 MON、MDS 與每一台 OSD,等於把儲存網路開放給這台 CT;帳號對 Monitor 雖然只有讀取權限,仍能看到叢集的節點位址等資訊
另一套 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,多個以空格分隔 |
| 帳號 | 第一部分建立的帳號,例如 pve-ext-rbd,不加 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 |
| 帳號 | 第一部分建立的帳號,例如 pve-ext-fs |
| 檔案系統名稱 | 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 叢集,PVE 主機不用掛接。範例是兩台跑 FTP 的 CT 共用 /shared_data。
注意:Proxmox VE 官方文件強烈不建議在 CT 裡使用 FUSE 掛接。原因是 suspend 與 snapshot 模式的備份需要凍結容器,而 Linux 核心的凍結機制遇到 FUSE 可能會卡住。採用這個做法,CT 的備份一律要用 stop 模式。
官方建議的替代做法是在PVE 主機掛接,再用 bind mount 給 CT。我這次選擇在 CT 內直接掛接,是因為:PVE 主機不需要另外保存 Ceph 帳號、每台 CT 可以用自己的專用帳號、CT 移轉到別的節點時不用每台 PVE 主機都準備掛接。兩種做法各有取捨,請依環境評估。
範例參數
| 項目 | 範例 |
|---|---|
| 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 套件版本可能比來源叢集舊。一般來說較舊的用戶端可以連較新的叢集,但功能可能受限;CephFS 若用 ceph fs required_client_features 設了用戶端不支援的功能,舊用戶端會直接無法連線(已連線的會被踢掉)。遇到問題時,可以改用 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 虛擬帳號的話,要確認它實際對應到哪個本機帳號
- 不要對整個目錄遞迴修改權限,多使用者的環境要分別規劃
- 不同帳號、同一群組協作時,
2770的 setgid 只讓新檔案繼承群組,不保證群組可寫,還要搭配 vsftpd 的local_umask、file_open_mode或預設 ACL
雙台驗證
- 從 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 能被接手:CT 的根磁碟也要在接手節點存取得到。放在外部 RBD 這類共享儲存才符合 HA 條件;放在故障節點的 local-lvm 無法接手;本機 ZFS 搭配儲存複寫可以配合 HA,但會遺失最後一次複寫之後的變更
- CT 沒有線上移轉,移轉是先關機再搬(restart migration),進行中的 FTP 連線會中斷
- 所有可能接手的節點,都要允許 CT 使用 FUSE,網路也要連得到 Ceph
- 實際測試移轉、節點重新開機、HA 接手之後,掛接與 FTP 的啟動順序都正常
對外連線
兩台 FTP 前面放同一個 VIP 或負載平衡器時,要確保控制連線與被動模式的資料連線導向同一台,並設定好被動模式的通訊埠範圍與對外 IP,否則會出現登入成功、但列目錄或傳檔失敗的狀況。
結論
讓另一套 PVE 叢集或 CT 當成 Ceph 的用戶端,就能共用來源叢集的儲存空間,不用合併叢集。PVE 掛接外部 RBD/CephFS 是官方支援的標準做法;CT 內直接用 ceph-fuse 掛接則要接受備份只能用 stop 模式的限制,評估清楚再採用。
另外兩個重點:每套叢集用獨立的 Pool 避免磁碟撞名,CT 用的帳號只授權它需要的目錄。路徑限制只管目錄樹、不隔離底層資料,CT 對外提供服務、有被入侵的風險時,要搭配 RADOS namespace 或改用 PVE 主機掛接再 bind mount 的做法。
參考資料
- 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/ - Ceph 文件:CephFS Client Capabilities
https://docs.ceph.com/en/latest/cephfs/client-auth/ - PVE Ceph 叢集退出節點流程
https://blog.jason.tools/2026/02/pve-ceph-remove-node.html



