如何使用 btrfs 在 SSD 磁碟上建立交換文件

如何使用 btrfs 在 SSD 磁碟上建立交換文件

我有一個帶有 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 常見問題解答:

btrfs 支援交換文件嗎?目前沒有。僅僅創建一個檔案 NOCOW 沒有幫助,交換文件支援依賴 btrfs 由於潛在損壞而故意不實現的一項功能。 (...) 一種解決方法是透過循環設備掛載交換文件,儘管性能較差。

所以目前還沒有好的方法在 btrfs 分割區上建立交換文件。

答案2

正如剛才所提到的,從Linux 5.0開始現在可以在 BTRFS 上建立交換文件。但它們應該是非壓縮且NoCOW的。以下是實際建立此類文件的方法:

  1. 建立一個空文件:touch /swap
  2. 用於為其chattr設定屬性:NoCOWchattr +C /swap
  3. 驗證C屬性是否出現:lsattr /swap
  4. 填寫:dd if=/dev/zero of=/swap bs=1M count=1024 # 為 1 GB
  5. 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,並且在重新啟動後您將無法這樣做swaponhttps://www.spinics.net/lists/linux-btrfs/msg96790.html

我使我的最後一個子卷可寫,例如sudo btrfs property set -ts /.sxbackup/sx-20210211-092159-utc/ ro false,刪除swap,並且能夠swapon再次在主卷上 - 但接下來我將製作一個專用的子卷。

相關內容