「スワップ」の版間の差分
(ページの作成:「Category:ファイルシステム en:Swap es:Swap fr:Swap it:Swap pt:Swap zh-CN:Swap {{Related articles start (日本語)}} {{Related3|Swap on...」) |
細 (文字列「[[zh-CN:」を「[[zh-hans:」に置換) |
||
(3人の利用者による、間の18版が非表示) | |||
3行目: | 3行目: | ||
[[es:Swap]] |
[[es:Swap]] |
||
[[fr:Swap]] |
[[fr:Swap]] |
||
+ | [[hu:Swap]] |
||
[[it:Swap]] |
[[it:Swap]] |
||
[[pt:Swap]] |
[[pt:Swap]] |
||
− | [[zh- |
+ | [[zh-hans:Swap]] |
− | {{Related articles start |
+ | {{Related articles start}} |
+ | {{Related|Zswap}} |
||
− | {{Related3|Swap on video ram|ビデオ ram にスワップ}} |
||
+ | {{Related|ビデオメモリにスワップ}} |
||
+ | {{Related|ZFS#スワップボリューム}} |
||
{{Related|fstab}} |
{{Related|fstab}} |
||
+ | {{Related|サスペンドとハイバネート}} |
||
+ | {{Related|Dm-crypt/スワップの暗号化}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
このページでは GNU/Linux でのスワップとページングを紹介します。また、スワップパーティションとスワップファイルの作成と有効化について説明しています。 |
このページでは GNU/Linux でのスワップとページングを紹介します。また、スワップパーティションとスワップファイルの作成と有効化について説明しています。 |
||
23行目: | 28行目: | ||
もしくは: |
もしくは: |
||
− | $ free - |
+ | $ free -h |
{{Note|スワップファイルとパーティションにパフォーマンスの違いはありません、どちらも同じように扱われます。}} |
{{Note|スワップファイルとパーティションにパフォーマンスの違いはありません、どちらも同じように扱われます。}} |
||
− | == スワップパーティション == |
+ | === スワップパーティション === |
− | ほとんどの GNU/Linux パーティションツール (例: {{Ic|fdisk}}, {{Ic|cfdisk}}) でスワップパーティションの作成ができます。スワップパーティション |
+ | ほとんどの GNU/Linux パーティションツール (例: {{Ic|fdisk}}, {{Ic|cfdisk}}) でスワップパーティションの作成ができます。スワップのパーティションタイプは {{ic|82}} を使用することを推奨します。systemd は自動的にタイプを識別してマウントします。 |
Linux のスワップ領域をセットアップする時には、{{Ic|mkswap}} コマンドが使われます。例えば: |
Linux のスワップ領域をセットアップする時には、{{Ic|mkswap}} コマンドが使われます。例えば: |
||
35行目: | 40行目: | ||
{{Warning|指定したパーティションに保存されている全てのデータが消失します。}} |
{{Warning|指定したパーティションに保存されている全てのデータが消失します。}} |
||
− | |||
− | ''mkswap'' ユーティリティはデフォルトでパーティションの UUID を生成します。特定の UUID を指定したい場合は {{ic|-U}} フラグを使って下さい: |
||
− | # mkswap -U ''custom_UUID'' /dev/sda2 |
||
デバイスのページングを有効にするには: |
デバイスのページングを有効にするには: |
||
# swapon /dev/sda2 |
# swapon /dev/sda2 |
||
− | 起動時にスワップパーティションを有効にするには、エントリを [[ |
+ | 起動時にスワップパーティションを有効にするには、エントリを [[fstab]] に追加します: |
− | + | UUID=<UUID> none swap defaults 0 0 |
|
+ | |||
+ | [[UUID]] は次のコマンドで確認できます: |
||
+ | $ lsblk -no UUID /dev/sda2 |
||
+ | |||
+ | {{Tip|カーネルによって割り当てられるデバイス名は将来的に順番が変わってしまう可能性があるため UUID や LABEL を使うことを推奨します。[[fstab]] を参照してください。}} |
||
+ | |||
+ | {{Note| |
||
+ | * GPT パーティションテーブルを使用するデバイス上にスワップパーティションがある場合は fstab エントリは必ずしも必要ではありません。次のセクションを見てください。 |
||
+ | * [[TRIM]] をサポートした SSD を使っている場合、スワップのための正しいマウントオプションは discard です。手動でスワップを作成するとき、-d や --discard を使うことで同じことができます。discard などのマウントオプションの詳しい情報は、swapon の man ページを見て下さい。}} |
||
+ | |||
+ | {{Warning|mdadm を使用する RAID セットアップで discard を有効にすると起動時や swapon を使ったときにシステムがフリーズします。}} |
||
+ | |||
+ | ==== systemd による有効化 ==== |
||
+ | |||
+ | 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|82}} から別のタイプコードに変更。 |
||
+ | * スワップパーティションの属性を "'''63''': do not automount" に設定。 |
||
+ | |||
+ | ==== スワップの無効化 ==== |
||
+ | |||
+ | 特定のスワップ領域を無効にするには: |
||
+ | # swapoff /dev/sda2 |
||
+ | |||
+ | もしくは {{ic|-a}} スイッチを使って全てのスワップ領域を無効化することもできます。 |
||
+ | スワップが systemd によって管理されている場合、次の起動時に自動的に有効化されてしまいます。スワップ領域の自動有効化を無効にするには、{{ic|systemctl --type swap}} を実行して問題の ''.swap'' ユニットを確認して[[systemd#ユニットを使う|マスク]]してください。 |
||
− | {{Note|TRIM をサポートした SSD を使っている場合、スワップのための正しいマウントオプションは discard です。手動でスワップを作成するとき、-d や --discard を使うことで同じことができます。discard などのマウントオプションの詳しい情報は、swapon の man ページを見て下さい。}} |
||
− | == スワップファイル == |
+ | === スワップファイル === |
パーティションを作るかわりに、オンザフライでサイズを変えたり簡単に削除できるものとしてスワップファイルが選択肢になりえます。特にディスク容量が貴重な場合 (例: 小容量の SSD) はこちらが理想的でしょう。 |
パーティションを作るかわりに、オンザフライでサイズを変えたり簡単に削除できるものとしてスワップファイルが選択肢になりえます。特にディスク容量が貴重な場合 (例: 小容量の SSD) はこちらが理想的でしょう。 |
||
− | {{Note|今のところ |
+ | {{Note|今のところ [[Btrfs]] ファイルシステムはスワップファイルをサポートしていません。このことに気をつけておかないとファイルシステムの破壊をもたらす可能性があります。ただし loop デバイスを使ってマウントしている場合 btrfs でもスワップファイルを使うことが可能です。この方法は多少スワップのパフォーマンスが落ちます。}} |
+ | ==== 手動設定 ==== |
||
− | === スワップファイルの作成 === |
||
+ | ===== スワップファイルの作成 ===== |
||
− | root 権限で {{Ic|fallocate}} を使ってあなたが決めたサイズでスワップファイルを作成します (M = メガバイト, G = ギガバイト) ({{Ic|dd}} を使うこともできますが作成時間は長くなります)。例えば、512 MB のスワップファイルを作成するなら: |
||
+ | |||
+ | root 権限で {{Ic|fallocate}} を使ってあなたが決めたサイズでスワップファイルを作成します (M = メガバイト, G = ギガバイト) ({{Ic|dd}} を使うこともできますが作成時間は長くなります)。例えば、512 MB のスワップファイルを作成するなら: |
||
# fallocate -l 512M /swapfile |
# fallocate -l 512M /swapfile |
||
− | + | または: |
|
# dd if=/dev/zero of=/swapfile bs=1M count=512 |
# dd if=/dev/zero of=/swapfile bs=1M count=512 |
||
+ | |||
+ | {{Note|1=[[F2FS]] や [[XFS]] などのファイルシステムでは ''fallocate'' を使うと問題が発生します [https://bugzilla.redhat.com/show_bug.cgi?id=1129205#c3]。}} |
||
正しいパーミッションを設定します (スワップファイルを全てのユーザーが読めるようにすると深刻な脆弱性になります) |
正しいパーミッションを設定します (スワップファイルを全てのユーザーが読めるようにすると深刻な脆弱性になります) |
||
73行目: | 107行目: | ||
# swapon /swapfile |
# swapon /swapfile |
||
− | + | [[Fstab#ファイル例|fstab]] を編集してスワップファイルのエントリを加えて下さい: |
|
− | + | {{hc|/etc/fstab|/swapfile none swap defaults 0 0}} |
|
− | === スワップファイルの削除 === |
+ | ===== スワップファイルの削除 ===== |
− | |||
− | {{Warning|スワップは systemd によって管理されているため、後でまた有効になります。}} |
||
スワップファイルを削除するには、現在使っているスワップファイルを無効にしなければなりません。 |
スワップファイルを削除するには、現在使っているスワップファイルを無効にしなければなりません。 |
||
90行目: | 122行目: | ||
# rm -f /swapfile |
# rm -f /swapfile |
||
+ | |||
+ | 最後に {{ic|/etc/fstab}} からエントリを削除します。 |
||
+ | |||
+ | ==== systemd-swap ==== |
||
+ | |||
+ | {{pkg|systemd-swap}} パッケージを[[インストール]]してください。{{ic|/etc/systemd/swap.conf}} のスワップファイルセクションにある {{ic|swapf}} から始まる行をアンコメントします。その後 {{ic|systemd-swap}} サービスを[[起動]]・[[有効化]]してください。 |
||
== USB デバイスとスワップ == |
== USB デバイスとスワップ == |
||
101行目: | 139行目: | ||
{{Warning|パーティションの書き込み先のディスクが正しいか確認しましょう!}} |
{{Warning|パーティションの書き込み先のディスクが正しいか確認しましょう!}} |
||
+ | {{Ic|fstab}} を編集してスワップエントリのマウントオプションに以下を追加してください: |
||
− | 次に {{Ic|fstab}} を編集します |
||
+ | pri=0 |
||
− | # nano /etc/fstab |
||
+ | USB が満杯の時はハードディスクのスワップのみを使うようになります。 |
||
− | 今のスワップエントリの下に、新しいエントリを加え、現在のスワップパーティションに新しい USB のパーティションを接収させます |
||
+ | 上記の設定は SD カードなどでも使うことができます。 |
||
− | UUID=... none swap defaults,pri=10 0 0 |
||
+ | == スワップの暗号化 == |
||
− | UUID は次のコマンドの出力から決めて下さい |
||
+ | [[dm-crypt/スワップの暗号化]]を見て下さい。 |
||
− | ls -l /dev/disk/by-uuid/ | grep /dev/sdc1 |
||
+ | == パフォーマンスチューニング == |
||
− | sdc1 をあなたの新しい USB スワップパーティションに置き換えます。 {{Ic|sdb1}} |
||
+ | スワップ値を変えることでパフォーマンスを向上できるかもしれません。 |
||
− | {{Tip|他のデバイスをコンピュータに接続するとデバイスの順番が狂うことがあるので UUID を使っています}} |
||
+ | === Swappiness === |
||
− | 最後に、''元の''スワップエントリに |
||
+ | ''swappiness'' [[sysctl]] パラメータはカーネルのスワップ領域の優先(もしくは回避)を表しています。Swappiness は 0 から 100 の間の値にすることができます。デフォルトの値は60です。このパラメータを低い値に設定すると RAM からのスワッピングが減り、多くのシステムでレスポンスが向上することが知られています。 |
||
− | pri=0 |
||
+ | 現在の swappiness 値をチェックするには: |
||
− | を加え、fstab に USB がいっぱいの時はハードディスクのスワップのみ使うように知らせます。 |
||
+ | $ cat /proc/sys/vm/swappiness |
||
− | このガイドは SD カードなどの他のメモリでも使うことができます。 |
||
+ | swappiness 値を一時的にセットするには: |
||
− | == パフォーマンスチューニング == |
||
+ | # sysctl vm.swappiness=10 |
||
− | スワップ値を変えることでパフォーマンスを向上できるかもしれません。 |
||
− | |||
− | === Swappiness === |
||
+ | swappiness 値を永続的にセットするには、''sysctl'' 設定ファイルを編集します: |
||
− | ''swappiness'' [[sysctl (日本語)|sysctl]] パラメータはカーネルのスワップ領域の優先(もしくは回避)を表しています。Swappiness は 0 から 100 の間の値にすることができます。このパラメータを低い値に設定すると RAM からのスワッピングが減り、多くのシステムでレスポンスが向上することが知られています。 |
||
{{hc|/etc/sysctl.d/99-sysctl.conf|2= |
{{hc|/etc/sysctl.d/99-sysctl.conf|2= |
||
− | vm.swappiness= |
+ | vm.swappiness=10 |
− | vm.vfs_cache_pressure=50 |
||
}} |
}} |
||
− | テストしたり、なぜこれが働くのか知るには、 |
+ | テストしたり、なぜこれが働くのか知るには、[http://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that この記事] を見て下さい。 |
[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/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 === |
||
149行目: | 186行目: | ||
/dev/sdb2 none swap defaults,pri=10 0 0 |
/dev/sdb2 none swap defaults,pri=10 0 0 |
||
− | もしくは swapon の {{Ic| |
+ | もしくは swapon の {{Ic|-p}} (もしくは {{Ic|--priority}}) パラメータを使います: |
# swapon -p 100 /dev/sda1 |
# swapon -p 100 /dev/sda1 |
||
もし2つ以上の領域が同じ priority を持ち、それが一番高い priority の場合、その領域間ではラウンド・ロビン方式でページが配分されます。 |
もし2つ以上の領域が同じ priority を持ち、それが一番高い priority の場合、その領域間ではラウンド・ロビン方式でページが配分されます。 |
||
+ | |||
+ | == ストライピング == |
||
+ | |||
+ | スワップの性能を上げるために [[RAID]] を使う必要はありません。{{ic|/etc/fstab}} ファイルでスワップの優先度が同じに設定されている場合、複数のデバイスにスワップをストライプ処理するのはカーネルだけで行うことができます。詳しくは [http://unthought.net/Software-RAID.HOWTO/Software-RAID.HOWTO-2.html#ss2.3 The Software-RAID HOWTO] を参照してください。 |
2017年1月29日 (日) 00:36時点における版
このページでは 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
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) はこちらが理想的でしょう。
手動設定
スワップファイルの作成
root 権限で fallocate
を使ってあなたが決めたサイズでスワップファイルを作成します (M = メガバイト, G = ギガバイト) (dd
を使うこともできますが作成時間は長くなります)。例えば、512 MB のスワップファイルを作成するなら:
# fallocate -l 512M /swapfile
または:
# dd if=/dev/zero of=/swapfile bs=1M count=512
正しいパーミッションを設定します (スワップファイルを全てのユーザーが読めるようにすると深刻な脆弱性になります)
# 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 を参照してください。