我有一個帶有 APFS 檔案系統的 macOS 用戶端 (12.6.7),支援大型擴充屬性(測試中一個屬性值超過 68 MB)。
我有一台帶有 Ubuntu Server 22.04.2 LTS 的 NAS 伺服器,帶有 ZFS 檔案系統和 Samba 版本 4.15.13-Ubuntu。
ZFS 設定了 xattr=sa。因此NAS上啟用了擴充屬性。
我將 Samba 配置為運行vfs fruit
如下:
ea support = yes
vfs objects = catia fruit streams_xattr
fruit:resource = stream
fruit:metadata = stream
透過此配置,我能夠將較小的擴充屬性和資源分支(小於 64 KB)寫入 NAS 共用。
但對於更大的擴展屬性和資源分叉(超過 64 KB),它不起作用。
經過大量線程、手冊頁和程式碼後,我偶然發現了這個小東西筆記在 zfs 手冊頁中:
xattr = 開 |關閉 |薩
on 的預設值啟用基於目錄的擴充屬性。這種類型的擴充屬性對可在檔案上設定的屬性的大小或數量沒有任何實際限制。儘管在 Linux 下,getxattr(2) 和 setxattr(2) 系統呼叫將最大大小限制為 64K。
太酷了,我們在 Linux 上有一個「沒有實際限制」的 ZFS,只是 Linux 核心(是一個實際的東西)在實踐中限制了擴展屬性的大小。
好的,所以我無法在 ZFS 端或 Linux 端修復它。
下一步是森巴舞具體來說。
由於擴充屬性的大小限制,我需要為它們提供替代儲存。對於資源分叉,有一個設定可以將它們寫入檔案:
fruit:resource = file
啟用此功能後,我可以將大型資源分叉寫入共用。
但 Fruit 無法將其他元資料(如擴充屬性)寫入伴隨文件:
水果:元資料= [流|網路談話]
- netatalk(預設)- 使用 Netatalk 相容的 xattr
- 流 - 將流傳遞到 VFS 堆疊中的下一個模組
stream
不起作用,因為streams_xattr嘗試將其寫入擴充屬性。
netatalk
不起作用,因為fruit嘗試將其寫入netatalk相容的命名擴充屬性中。
為什麼沒有選項將元資料也寫入檔案?
這將使 Samba 更加獨立於所提供的底層檔案系統(即使它根本沒有擴展屬性)。
我目前的解決方案是使用:
ea support = no
這會強制 macOS 客戶端創建AppleDouble 文件對於他們的資源分叉和擴展屬性。
這樣,來自客戶端的資源分叉和擴展屬性將被保留。
當然,這與 Windows 用戶端不相容,目前這對我來說沒問題,但這對我如何使用這個盒子來說是一個重大限制。
也因為vfs fruit
需要ea support = yes
,我無法使用它。根據我對水果的了解,這意味著會降低 NAS 效能,而且我也無法輕鬆設定時間機。我甚至不知道其他後果。 Fruit 似乎實現了 FULLSYNC 功能(請參閱 參考資料fruit:time machine
)。來自舊版 Apple 文檔它看起來像是斷電時需要一個乾淨的時間機器備份。
我還考慮過將流寫入資料庫,但是如果此 vfs 物件出現問題,那麼修復問題就會變得更加困難(了解更多信息看)。請注意“請勿在生產中使用此模組”。
切換到沒有擴展屬性限制的作業系統來讓 Samba 工作並不是一個選擇……至少目前是這樣。
是否有另一種選擇可以完全支援 Linux 系統上的 macOS 資源分支和擴充屬性,而無需停用 samba 共享上的擴充屬性(以及 vfs Fruit)?