How to create swap with btrfs
事の発端
OpenSUSE Tumbleweedで、追加のスワップ空間を確保するためにスワップファイルを作成しようとしたところ、以下のエラーに遭遇しました。
sudo swapon /swapfile
swapon: /swapfile: swapon failed: Invalid argument
原因特定
- 属性確認
- ファイルシステムの確認
- カーネルログ確認
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のファイルシステムの機能や制限をちゃんと学んでおこうと思った今日この頃でした。
おわり