
我有一個帶有 btrfs 的 SSD,我嘗試建立一個交換文件,例如:
dd if=/dev/zero of=swapfile01 bs=1M count=10240
mkswap swapfile01
chmod 600 swapfile01
swapon swapfile01
在 dmesg 中我看到
[238434.731654] swapon: swapfile has holes
我知道可能存在一些由磁碟碎片引起的漏洞,但這是 SSD 磁碟,所以可能不重要?有沒有辦法忽略這些洞?或者我該如何解決這個問題?
題外話 - 為什麼我想要這個(以避免評論中出現不相關的問題):我已經加密了磁盤,調整大小非常痛苦,所以我決定創建一個交換文件而不是調整交換分區的大小(我添加了 14GB內存,從4GB 到16GB,現在無法休眠)。
答案1
2019年狀況
Btrfs 和 Linux 核心的發展呈現了我最初的答案過時的。請參見這個另一個答案。
2016年的原始答案
btrfs 支援交換文件嗎?目前沒有。僅僅創建一個檔案 NOCOW 沒有幫助,交換文件支援依賴 btrfs 由於潛在損壞而故意不實現的一項功能。 (...) 一種解決方法是透過循環設備掛載交換文件,儘管性能較差。
所以目前還沒有好的方法在 btrfs 分割區上建立交換文件。
答案2
正如剛才所提到的,從Linux 5.0開始現在可以在 BTRFS 上建立交換文件。但它們應該是非壓縮且NoCOW的。以下是實際建立此類文件的方法:
- 建立一個空文件:
touch /swap
- 用於為其
chattr
設定屬性:NoCOW
chattr +C /swap
- 驗證
C
屬性是否出現:lsattr /swap
- 填寫:
dd if=/dev/zero of=/swap bs=1M count=1024
# 為 1 GB mkswap /swap && chmod 600 /swap && swapon /swap
或者,您可以建立目錄,設定chattr +C
為該目錄,然後在其下方建立交換檔案。
請注意,您不能chattr +C
對已經存在的非空文件執行此操作。它被記錄為未定義的行為(實際上它只是不更改屬性)。因此,您應該建立一個空文件chattr
,然後建立目錄,chattr
然後在其中建立一個文件(在這種情況下,在chattr
該目錄之後建立的所有文件都會具有 nocow 屬性)。
警告:如前所述,這需要核心版本 5.0 或更高版本。例如,Raspberry Pi 使用 4.19.* 內核,因此您將無法在其上使用此技術。
答案3
交換檔案支援已新增至核心版本 5.0,如提交時所示https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ed46ff3d423780fa5173b38a844bf0fdb210a2a7 要啟動 btrfs 上的交換文件,文件必須完全分配為 NOCOW,並且在一台設備上不進行壓縮。
答案4
關於 btrfs 上的交換,需要了解的有用資訊是:如果您正在執行備份快照/子卷,則應該建立一個不進行快照的專用子卷。
在快照子磁碟區上,您的交換檔案將再次變為 COW,並且在重新啟動後您將無法這樣做swapon
:https://www.spinics.net/lists/linux-btrfs/msg96790.html
我使我的最後一個子卷可寫,例如sudo btrfs property set -ts /.sxbackup/sx-20210211-092159-utc/ ro false
,刪除swap
,並且能夠swapon
再次在主卷上 - 但接下來我將製作一個專用的子卷。