如何使用 btrfs 在 ssd 磁盘上创建交换文件

Pet*_*etr 11 linux swap

我有带 btrfs 的 SSD,我尝试创建一个交换文件,如:

dd if=/dev/zero of=swapfile01  bs=1M count=10240
mkswap swapfile01
chmod 600 swapfile01
swapon swapfile01
Run Code Online (Sandbox Code Playgroud)

在 dmesg 我看到

[238434.731654] swapon: swapfile has holes
Run Code Online (Sandbox Code Playgroud)

我知道可能有一些由磁盘碎片引起的漏洞,但这是 SSD 磁盘,所以它可能无关紧要?有没有办法忽略这些漏洞?或者我该如何解决这个问题?

题外话 - 为什么我想要这个(为了避免评论中的不相关问题):我加密了磁盘,这在调整大小时很痛苦,所以我决定创建一个交换文件而不是调整交换分区的大小(我添加了 14GB ram,从 4gb 到 16gb,现在不能休眠)。

Mar*_*oft 11

如上所述,从 Linux 5.0 开始,现在可以在 BTRFS 上创建交换文件。但它们应该是非压缩和 NoCOW。以下是您如何实际创建这样的文件:

  1. 创建一个空文件: touch /swap
  2. 用于chattr为其设置NoCOW属性:chattr +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然后在其中创建一个文件(在这种情况下,在chattring 目录之后创建的所有文件都将具有 nocow 属性)。

警告:如前所述,这需要内核版本 5.0 或更高版本。例如,Raspberry Pi 使用 4.19.* 内核,因此您将无法在其上使用此技术。


Kam*_*ski 8

2019年状况

Btrfs 和 Linux 内核的发展使我原来的答案过时了。请参阅此其他答案


2016 年的原始答案

来自btrfs 常见问题解答

btrfs 支持交换文件吗?目前没有。仅创建文件 NOCOW 没有帮助,交换文件支持依赖于 btrfs 由于潜在损坏而有意未实现的一项功能。(...) 尽管性能不佳,但解决方法是通过循环设备挂载交换文件。

所以目前还没有在 btrfs 分区上创建交换文件的好方法。

  • 好吧,这是我使用 btrfs 多年后第一次发现缺少一些非常重要的功能,与其他 FS 相比可能是第一个缺点:( (2认同)

小智 7

交换文件支持已添加到内核版本 5.0,可以在提交https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ed46ff3d423780fa5173b38a844bf0fdb210a2a7 中看到 以激活btrfs 上的交换文件,文件必须完全分配为 NOCOW,在一台设备上没有压缩。

  • 请注意,它不适用于格式化为 raid 阵列的 btrfs 文件系统。 (3认同)

Ole*_*nge 7

在 Linux 5.0 或更高版本中:

file='/swapfile'
# create file
touch "$file"
# No Copy-on-Write
chattr +C "$file"
# Allocate 10 GB  (much faster than dd)
fallocate -l 10G "$file"
# Set permissions to make mkswap happy
chmod 600 "$file"
# Set swap file signature
mkswap "$file"
# change owner if not already root to make swapon happy
sudo chown root "$file"
# Activate
sudo swapon "$file"
Run Code Online (Sandbox Code Playgroud)

  • @0xC0000022L 复制粘贴友好并且没有`dd`=更快。 (2认同)