Btrfsでのスワップ作成方法

How to create swap with btrfs

事の発端

OpenSUSE Tumbleweedで、追加のスワップ空間を確保するためにスワップファイルを作成しようとしたところ、以下のエラーに遭遇しました。

原因特定

  1. 属性確認
  2. ファイルシステムの確認
  3. カーネルログ確認
ls -lf /swapfile
-rw------- 1 root root 16G Oct 19 20:12 /swapfile

指定したファイルサイズで権限も600になっていた

sudo lsattr /swapfile
---------------------- /swapfile

特別な属性も設定されていない。正常にみえるけど理由わからず

df -Th 
/dev/sda2      btrfs     112G   30G   81G  27% /

Btfrsでスワップを作った部分が関係しているかもと感じました。

sudo dmesg | grep -i swap
[ 0.114128] [ T0] Spectre V1 : Mitigation: usercopy/swapgs barriers and __user pointer sanitization
[ 1.388004] [ T1] systemd[1]: Reached target Swaps.
[ 8.764858] [ T798] Adding 2097148k swap on /dev/sdb1. Priority:-2 extents:1 across:2097148k
[107772.672920] [ T143757] BTRFS warning (device sda2): swapfile must not be copy-on-write

最後の行の”swapfile must not be copy-on-write”(スワップファイルはCoWであってはいけない)で原因がわかりました。
BtrfsはデフォルトでCoWを使用しているため、スワップの正常な機能を妨げていたみたいです。Btrfsでスワップを作るにはCoWを無効にする必要があることに気づきました。

解決方法

#空でファイル作成
sudo truncate -s 0 /swapfile

#ファイルのCoW属性無効
sudo chattr +C /swapfile

#btrfsのファイルの圧縮を無効に指定
sudo btrfs property set /swapfile compression none

#スワップ作成
sudo dd if=/dev/zero of=/swapfile bs=1M count=16384

#権限変更・スワップを有効にする
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

#永続的に有効にする
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

#認識確認
sudo swapon --show

参考:
https://superuser.com/questions/1067150/how-to-create-swapfile-on-ssd-disk-with-btrfs
https://btrfs.readthedocs.io/en/latest/Swapfile.html

まとめ

Btrfsのファイルシステムの機能や制限をちゃんと学んでおこうと思った今日この頃でした。
おわり


Categories:

, ,

Tags: