
私は 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 ディスクなので問題にはならないのではないでしょうか。穴を無視する方法はありますか。または、これを修正するにはどうすればよいですか。
話題から外れますが、なぜこれが必要なのか (コメントで無関係な質問を避けるため): 暗号化されたディスクがあり、サイズ変更が非常に面倒なので、スワップ パーティションのサイズを変更する代わりに、スワップファイルを作成することにしました (RAM を 4 GB から 16 GB に 14 GB 追加したため、現在は休止状態にはできません)。
答え1
2019年の状況
BtrfsとLinuxカーネルの開発により、私の当初の答えは廃止。 参照してくださいこの他の答え。
2016年の元の回答
btrfs はスワップ ファイルをサポートしていますか? 現時点ではサポートしていません。ファイルを NOCOW にするだけでは役に立ちません。スワップ ファイルのサポートは、破損の可能性があるため btrfs が意図的に実装していない 1 つの機能に依存しています。(...) 回避策としては、パフォーマンスは劣りますが、ループ デバイス経由でスワップ ファイルをマウントする方法があります。
したがって、btrfs パーティションにスワップファイルを作成する良い方法はまだありません。
答え2
上記のように、Linux 5.0以降BTRFS 上にスワップ ファイルを作成できるようになりました。ただし、非圧縮で NoCOW である必要があります。このようなファイルを実際に作成する方法は次のとおりです。
- 空のファイルを作成します。
touch /swap
- 属性を
chattr
設定するために使用します:NoCOW
chattr +C /swap
- 属性が表示されたことを確認します
C
。lsattr /swap
- 記入してください:
dd if=/dev/zero of=/swap bs=1M count=1024
# 1ギガバイト 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 上のスワップ ファイルをアクティブ化するには、ファイルを 1 つのデバイス上で圧縮なしで NOCOW として完全に割り当てる必要があります。
答え4
btrfs 上の swap について知っておくと便利なことは、バックアップ スナップショット/サブボリュームを実行する場合は、スナップショットを作成しない専用のサブボリュームを作成する必要があるということです。
スナップショット サブボリュームでは、スワップファイルは再び COW になり、再起動後は使用できなくなりますswapon
。https://www.spinics.net/lists/linux-btrfs/msg96790.html
最後のサブボリュームを書き込み可能にして、sudo btrfs property set -ts /.sxbackup/sx-20210211-092159-utc/ ro false
を削除しswap
、swapon
メイン ボリュームで再び できるようになりました。ただし、次は専用のサブボリュームを作成します。