web-dev-qa-db-ja.com

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を追加しました) RAMの4GBから16GBになり、現在休止状態にできません)。

9
Petr

2019年の状況

BtrfsとLinuxカーネルの開発により、元の回答は廃止されましたこの他の答え をご覧ください。


2016年からの元の回答

btrfs FAQ から:

Btrfsはスワップファイルをサポートしていますか?現在はありません。 NOCOWファイルを作成するだけでは効果がありません。スワップファイルのサポートは、破損の可能性があるため、btrfsが意図的に実装していない1つの関数に依存しています。 (...)パフォーマンスは低いですが、回避策は、ループデバイスを介してスワップファイルをマウントすることです。

したがって、btrfsパーティションにスワップファイルを作成する良い方法はまだありません。

7

コミットで確認できるように、スワップファイルのサポートがカーネルバージョン5.0に追加されました https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id = ed46ff3d423780fa5173b38a844bf0fdb210a2a7 btrfsでスワップファイルをアクティブにするには、ファイルを1つのデバイスで圧縮せずにNOCOWとして完全に割り当てる必要があります。

5
arvati

上記のように、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ギガバイト
  5. mkswap /swap && chmod 600 /swap && swapon /swap

または、ディレクトリを作成し、chattr +Cをそのディレクトリに移動し、その下にスワップファイルを作成します。

chattr +C既存の空でないファイルへ。これは未定義の動作であることが文書化されています(実際には属性を変更しません)。したがって、空のファイルを作成してからchattrを作成するか、chattrを使用してディレクトリを作成し、その中にファイルを作成する必要があります(この場合、chattringディレクトリにはnocow属性があります)。

警告:前述のとおり、これにはバージョン5.0以降のカーネルが必要です。たとえばRaspberry Piは4.19。*カーネルを使用しているため、この手法を使用することはできません。

4
MarSoft

私は here を読みました。スワップにzramを使用することは可能です。まだ試していません。

お役に立てれば幸いです。チェリオ。

1
Robin Banerjee

Btrfsでループバックを介してスワップをセットアップする方法は次のとおりです。

# dd if=/dev/zero of=/swapfile bs=1M count=1k
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.23138 s, 872 MB/s

# losetup --find --show /swapfile
/dev/loop0

# mkswap /dev/loop0
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=04b048e2-47ab-4ab0-a79e-7e1c481a10c9

# swapon /dev/loop0

これは理想ですか?いいえ。本番環境での使用は避けてください。しかし、それは一種の最後の手段として機能します。

1
w00t