「スワップ」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
12行目: 12行目:
 
{{Related|fstab}}
 
{{Related|fstab}}
 
{{Related|サスペンドとハイバネート}}
 
{{Related|サスペンドとハイバネート}}
  +
{{Related|Dm-crypt/スワップの暗号化}}
 
{{Related articles end}}
 
{{Related articles end}}
 
このページでは GNU/Linux でのスワップとページングを紹介します。また、スワップパーティションとスワップファイルの作成と有効化について説明しています。
 
このページでは GNU/Linux でのスワップとページングを紹介します。また、スワップパーティションとスワップファイルの作成と有効化について説明しています。
32行目: 33行目:
 
== スワップパーティション ==
 
== スワップパーティション ==
   
ほとんどの GNU/Linux パーティションツール (例: {{Ic|fdisk}}, {{Ic|cfdisk}}) でスワップパーティションの作成ができます。スワップパーティションタイプ '''82'''指定されます。
+
ほとんどの GNU/Linux パーティションツール (例: {{Ic|fdisk}}, {{Ic|cfdisk}}) でスワップパーティションの作成ができます。スワップパーティションタイプ {{ic|82}} を使用するこを推奨します。systemd は自動的にタイプを識別しマウントします。
   
 
Linux のスワップ領域をセットアップする時には、{{Ic|mkswap}} コマンドが使われます。例えば:
 
Linux のスワップ領域をセットアップする時には、{{Ic|mkswap}} コマンドが使われます。例えば:
38行目: 39行目:
   
 
{{Warning|指定したパーティションに保存されている全てのデータが消失します。}}
 
{{Warning|指定したパーティションに保存されている全てのデータが消失します。}}
 
''mkswap'' ユーティリティはデフォルトでパーティションの UUID を生成します。特定の UUID を指定したい場合は {{ic|-U}} フラグを使って下さい:
 
# mkswap -U ''custom_UUID'' /dev/sda2
 
   
 
デバイスのページングを有効にするには:
 
デバイスのページングを有効にするには:
46行目: 44行目:
   
 
起動時にスワップパーティションを有効にするには、エントリを [[fstab]] に追加します:
 
起動時にスワップパーティションを有効にするには、エントリを [[fstab]] に追加します:
/dev/sda2 none swap defaults 0 0
+
UUID=<UUID> none swap defaults 0 0
  +
  +
[[UUID]] は次のコマンドで確認できます:
  +
$ lsblk -no UUID /dev/sda2
  +
  +
{{Tip|カーネルによって割り当てられるデバイス名は将来的に順番が変わってしまう可能性があるため UUID や LABEL を使うことを推奨します。[[fstab]] を参照してください。}}
   
  +
{{Note|
{{Note|TRIM をサポートした SSD を使っている場合、スワップのための正しいマウントオプションは discard です。手動でスワップを作成するとき、-d や --discard を使うことで同じことができます。discard などのマウントオプションの詳しい情報は、swapon の man ページを見て下さい。}}
 
  +
* GPT パーティションテーブルを使用するデバイス上にスワップパーティションがある場合は fstab エントリは必ずしも必要ではありません。次のセクションを見てください。
  +
* [[TRIM]] をサポートした SSD を使っている場合、スワップのための正しいマウントオプションは discard です。手動でスワップを作成するとき、-d や --discard を使うことで同じことができます。discard などのマウントオプションの詳しい情報は、swapon の man ページを見て下さい。}}
   
 
{{Warning|mdadm を使用する RAID セットアップで discard を有効にすると起動時や swapon を使ったときにシステムがフリーズします。}}
 
{{Warning|mdadm を使用する RAID セットアップで discard を有効にすると起動時や swapon を使ったときにシステムがフリーズします。}}
54行目: 59行目:
 
=== systemd による有効化 ===
 
=== systemd による有効化 ===
   
systemd は2つの異なる仕組みを使ってスワップパーティションを有効化します。どちらも実行可能ファイルは {{ic|/usr/lib/systemd/system-generators}} にあります。ジェネレータは起動時に実行され、マウントごとにネイティブの systemd ユニットを作成します。まず {{ic|systemd-fstab-generator}} が fstab を読み込んでユニットを生成します (スワップのユニットも)。次に {{ic|systemd-gpt-auto-generator}} が root ディスクを調査してユニットを生成します。後者は GPT ディスクでしか動作しません。スワップパーティションはタイプコード '''82''' で識別されます。
+
systemd は2つの異なる仕組みを使ってスワップパーティションを有効化します。どちらも実行可能ファイルは {{ic|/usr/lib/systemd/system-generators}} にあります。ジェネレータは起動時に実行され、マウントごとにネイティブの systemd ユニットを作成します。まず {{ic|systemd-fstab-generator}} が fstab を読み込んでユニットを生成します (スワップのユニットも)。次に {{ic|systemd-gpt-auto-generator}} が root ディスクを調査してユニットを生成します。後者は GPT ディスクでしか動作しません。スワップパーティションはタイプコード {{ic|82}} で識別されます。
   
 
以下の方法を使うことでスワップユニットは作られなくなります:
 
以下の方法を使うことでスワップユニットは作られなくなります:
   
 
* {{ic|/etc/fstab}} からスワップのエントリを削除。
 
* {{ic|/etc/fstab}} からスワップのエントリを削除。
* スワップパーティションのタイプコードを '''82''' から別のタイプコードに変更。
+
* スワップパーティションのタイプコードを {{ic|82}} から別のタイプコードに変更。
 
* スワップパーティションの属性を "'''63''': do not automount" に設定。
 
* スワップパーティションの属性を "'''63''': do not automount" に設定。
   
116行目: 121行目:
   
 
最後に {{ic|/etc/fstab}} からエントリを削除します。
 
最後に {{ic|/etc/fstab}} からエントリを削除します。
  +
  +
=== systemd-swap ===
  +
  +
{{pkg|systemd-swap}} パッケージを[[インストール]]してください。{{ic|/etc/systemd-swap.conf}} のスワップファイルセクションにある {{ic|swapf}} から始まる行をアンコメントします。その後 {{ic|systemd-swap}} サービスを[[起動]]・[[有効化]]してください。
   
 
== USB デバイスとスワップ ==
 
== USB デバイスとスワップ ==
127行目: 136行目:
 
{{Warning|パーティションの書き込み先のディスクが正しいか確認しましょう!}}
 
{{Warning|パーティションの書き込み先のディスクが正しいか確認しましょう!}}
   
  +
{{Ic|fstab}} を編集してスワップエントリのマウントオプションに以下を追加してください:
次に {{Ic|fstab}} を編集します
 
 
# nano /etc/fstab
 
 
今のスワップエントリの下に、新しいエントリを加え、現在のスワップパーティションに新しい USB のパーティションを接収させます
 
 
UUID=... none swap defaults,pri=10 0 0
 
 
UUID は次のコマンドの出力から決めて下さい
 
 
ls -l /dev/disk/by-uuid/ | grep /dev/sdc1
 
 
sdc1 をあなたの新しい USB スワップパーティションに置き換えます。 {{Ic|sdb1}}
 
 
{{Tip|他のデバイスをコンピュータに接続するとデバイスの順番が狂うことがあるので UUID を使っています}}
 
 
最後に、''元の''スワップエントリに
 
   
 
pri=0
 
pri=0
   
を加え、fstab に USB がいっぱいの時はハードディスクのスワップのみ使うように知らせます。
+
USB が満杯の時はハードディスクのスワップのみ使うようになります。
   
ガイドは SD カードなどの他のメモリでも使うことができます。
+
上記設定は SD カードなどでも使うことができます。
   
 
== スワップの暗号化 ==
 
== スワップの暗号化 ==
181行目: 174行目:
 
[http://askubuntu.com/questions/103915/how-do-i-configure-swappiness この] Q&A には swappiness について多くの情報が載っています。
 
[http://askubuntu.com/questions/103915/how-do-i-configure-swappiness この] Q&A には swappiness について多くの情報が載っています。
   
他にもスワップのパフォーマンスに影響する ''sysctl'' パラメータとして {{ic|vm.vfs_cache_pressure}} が存在します。このパラメータはカーネルがページキャッシュやスワップに対して VFS キャッシュに使用されているメモリを回収する傾向をコントロールします。この値を増やすことで VFS キャッシュの回収がされやすくなります [http://doc.opensuse.org/products/draft/SLES/SLES-tuning_sd_draft/cha.tuning.memory.html#cha.tuning.memory.vm.reclaim]。詳しい情報は、[https://www.kernel.org/doc/Documentation/sysctl/vm.txt Linux カーネルドキュメント] を見て下さい。
+
他にもスワップのパフォーマンスに影響する ''sysctl'' パラメータとして {{ic|vm.vfs_cache_pressure}} が存在します。このパラメータはカーネルがページキャッシュやスワップに対して VFS キャッシュに使用されているメモリを回収する傾向をコントロールします。この値を増やすことで VFS キャッシュの回収がされやすくなります [http://doc.opensuse.org/documentation/leap/tuning/html/book.sle.tuning/cha.tuning.memory.html#cha.tuning.memory.vm.reclaim]。詳しい情報は、[https://www.kernel.org/doc/Documentation/sysctl/vm.txt Linux カーネルドキュメント] を見て下さい。
   
 
=== Priority ===
 
=== Priority ===

2016年10月29日 (土) 15:37時点における版

関連記事

このページでは GNU/Linux でのスワップとページングを紹介します。また、スワップパーティションとスワップファイルの作成と有効化について説明しています。

All about Linux swap space より:

Linux は物理 RAM (random access memory) をページと呼ばれるメモリのかたまりに分割します。スワッピングとは、メモリを開放するために、ページがスワップ領域という名の事前設定領域にコピーされることを言います。物理メモリとスワップ領域の合計が利用できる仮想メモリのサイズになります。

スワップ領域

スワップ領域は普通ディスクパーティションとして作られますが、ファイルにすることもできます。Arch Linux のインストール中にユーザーはスワップ領域を作成することができ、場合によっては後でそれが必要になるでしょう。スワップ領域は一般的に RAM が 1GB より少ないユーザーに推奨されます、PC に物理メモリが余分にあるならスワップ領域を作るかは好みの問題になります (ただ suspend-to-disk をするには必要になります)。

スワップの状態を確認するには、次を実行:

$ swapon -s

もしくは:

$ free -h
ノート: スワップファイルとパーティションにパフォーマンスの違いはありません、どちらも同じように扱われます。

スワップパーティション

ほとんどの GNU/Linux パーティションツール (例: fdisk, cfdisk) でスワップパーティションの作成ができます。スワップのパーティションタイプは 82 を使用することを推奨します。systemd は自動的にタイプを識別してマウントします。

Linux のスワップ領域をセットアップする時には、mkswap コマンドが使われます。例えば:

# mkswap /dev/sda2
警告: 指定したパーティションに保存されている全てのデータが消失します。

デバイスのページングを有効にするには:

# swapon /dev/sda2

起動時にスワップパーティションを有効にするには、エントリを fstab に追加します:

UUID=<UUID> none swap defaults 0 0

UUID は次のコマンドで確認できます:

$ lsblk -no UUID /dev/sda2
ヒント: カーネルによって割り当てられるデバイス名は将来的に順番が変わってしまう可能性があるため UUID や LABEL を使うことを推奨します。fstab を参照してください。
ノート:
  • GPT パーティションテーブルを使用するデバイス上にスワップパーティションがある場合は fstab エントリは必ずしも必要ではありません。次のセクションを見てください。
  • TRIM をサポートした SSD を使っている場合、スワップのための正しいマウントオプションは discard です。手動でスワップを作成するとき、-d や --discard を使うことで同じことができます。discard などのマウントオプションの詳しい情報は、swapon の man ページを見て下さい。
警告: mdadm を使用する RAID セットアップで discard を有効にすると起動時や swapon を使ったときにシステムがフリーズします。

systemd による有効化

systemd は2つの異なる仕組みを使ってスワップパーティションを有効化します。どちらも実行可能ファイルは /usr/lib/systemd/system-generators にあります。ジェネレータは起動時に実行され、マウントごとにネイティブの systemd ユニットを作成します。まず systemd-fstab-generator が fstab を読み込んでユニットを生成します (スワップのユニットも)。次に systemd-gpt-auto-generator が root ディスクを調査してユニットを生成します。後者は GPT ディスクでしか動作しません。スワップパーティションはタイプコード 82 で識別されます。

以下の方法を使うことでスワップユニットは作られなくなります:

  • /etc/fstab からスワップのエントリを削除。
  • スワップパーティションのタイプコードを 82 から別のタイプコードに変更。
  • スワップパーティションの属性を "63: do not automount" に設定。

スワップの無効化

特定のスワップ領域を無効にするには:

# swapoff /dev/sda2

もしくは -a スイッチを使って全てのスワップ領域を無効化することもできます。

スワップが systemd によって管理されている場合、次の起動時に自動的に有効化されてしまいます。スワップ領域の自動有効化を無効にするには、systemctl --type swap を実行して問題の .swap ユニットを確認してマスクしてください。

スワップファイル

パーティションを作るかわりに、オンザフライでサイズを変えたり簡単に削除できるものとしてスワップファイルが選択肢になりえます。特にディスク容量が貴重な場合 (例: 小容量の SSD) はこちらが理想的でしょう。

ノート: 今のところ Btrfs ファイルシステムはスワップファイルをサポートしていません。このことに気をつけておかないとファイルシステムの破壊をもたらす可能性があります。ただし loop デバイスを使ってマウントしている場合 btrfs でもスワップファイルを使うことが可能です。この方法は多少スワップのパフォーマンスが落ちます。

スワップファイルの作成

root 権限で fallocate を使ってあなたが決めたサイズでスワップファイルを作成します (M = メガバイト, G = ギガバイト) (dd を使うこともできますが作成時間は長くなります)。例えば、512 MB のスワップファイルを作成するなら:

# fallocate -l 512M /swapfile

または:

# dd if=/dev/zero of=/swapfile bs=1M count=512
ノート: F2FSXFS などのファイルシステムでは fallocate を使うと問題が発生します [1]

正しいパーミッションを設定します (スワップファイルを全てのユーザーが読めるようにすると深刻な脆弱性になります)

# chmod 600 /swapfile

正確なサイズのファイルを作成した後、ファイルをスワップにフォーマット:

# mkswap /swapfile

スワップファイルを有効に:

# swapon /swapfile

fstab を編集してスワップファイルのエントリを加えて下さい:

/etc/fstab
/swapfile none swap defaults 0 0

スワップファイルの削除

スワップファイルを削除するには、現在使っているスワップファイルを無効にしなければなりません。

root 権限で:

# swapoff -a

スワップファイルの削除:

# rm -f /swapfile

最後に /etc/fstab からエントリを削除します。

systemd-swap

systemd-swap パッケージをインストールしてください。/etc/systemd-swap.conf のスワップファイルセクションにある swapf から始まる行をアンコメントします。その後 systemd-swap サービスを起動有効化してください。

USB デバイスとスワップ

Linux によるモジュール性のおかげで、私達は他のデバイスにわたる複数のスワップパーティションを使うことができます。あなたがひとつの完全なハードディスクを持っている場合、USB デバイスを一時パーティションとして使うことができます。ただしこのメソッドにはいくつか欠点も存在します:

  • USB デバイスはハードディスクより低速です。
  • フラッシュメモリには書き込み回数の上限があります。スワップパーティションとして使うと急速に書き込み可能回数を消費します。
  • 他のデバイスをコンピュータに接続したときに、スワップが使われません。

USB デバイスをスワップに加えるには、まず USB フラッシュをスワップパーティションとしてパーティショニングします。Gparted などのグラフィカルツールや fdisk などのコンソールツールが使えます。パーティションテーブルを書き込む前にパーティションをスワップとしてラベル付けすることを忘れないで下さい。

警告: パーティションの書き込み先のディスクが正しいか確認しましょう!

fstab を編集してスワップエントリのマウントオプションに以下を追加してください:

pri=0

USB が満杯の時はハードディスクのスワップのみを使うようになります。

上記の設定は SD カードなどでも使うことができます。

スワップの暗号化

dm-crypt/スワップの暗号化を見て下さい。

パフォーマンスチューニング

スワップ値を変えることでパフォーマンスを向上できるかもしれません。

Swappiness

swappiness sysctl パラメータはカーネルのスワップ領域の優先(もしくは回避)を表しています。Swappiness は 0 から 100 の間の値にすることができます。デフォルトの値は60です。このパラメータを低い値に設定すると RAM からのスワッピングが減り、多くのシステムでレスポンスが向上することが知られています。

現在の swappiness 値をチェックするには:

$ cat /proc/sys/vm/swappiness

swappiness 値を一時的にセットするには:

# sysctl vm.swappiness=10

swappiness 値を永続的にセットするには、sysctl 設定ファイルを編集します:

/etc/sysctl.d/99-sysctl.conf
vm.swappiness=10

テストしたり、なぜこれが働くのか知るには、この記事 を見て下さい。

この Q&A には swappiness について多くの情報が載っています。

他にもスワップのパフォーマンスに影響する sysctl パラメータとして vm.vfs_cache_pressure が存在します。このパラメータはカーネルがページキャッシュやスワップに対して VFS キャッシュに使用されているメモリを回収する傾向をコントロールします。この値を増やすことで VFS キャッシュの回収がされやすくなります [2]。詳しい情報は、Linux カーネルドキュメント を見て下さい。

Priority

複数のスワップファイルやスワップパーティションを使っている場合、priority 値 (0 から 32767) をそれぞれのスワップ領域に割り当てることを考えて下さい。システムは優先度が低いスワップ領域を使う前に高い優先度が付けられたスワップ領域を使います。例えば、もしあなたが高速なディスク (/dev/sda) と低速なディスク (/dev/sdb) を持っている場合、高速なデバイス上のスワップ領域に高い優先度をあててください。priority は fstab で pri パラメータを使って設定できます:

/dev/sda1 none swap defaults,pri=100 0 0
/dev/sdb2 none swap defaults,pri=10  0 0

もしくは swapon の -p (もしくは --priority) パラメータを使います:

# swapon -p 100 /dev/sda1

もし2つ以上の領域が同じ priority を持ち、それが一番高い priority の場合、その領域間ではラウンド・ロビン方式でページが配分されます。

ストライピング

スワップの性能を上げるために RAID を使う必要はありません。/etc/fstab ファイルでスワップの優先度が同じに設定されている場合、複数のデバイスにスワップをストライプ処理するのはカーネルだけで行うことができます。詳しくは The Software-RAID HOWTO を参照してください。