スワップ

提供: ArchWiki
2015年1月5日 (月) 20:05時点におけるKusakata (トーク | 投稿記録)による版 (ページの作成:「Category:ファイルシステム en:Swap es:Swap fr:Swap it:Swap pt:Swap zh-CN:Swap {{Related articles start (日本語)}} {{Related3|Swap on...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

テンプレート:Related articles start (日本語)

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

    All about Linux swap space より:

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

    スワップ領域

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

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

    $ swapon -s
    

    もしくは:

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

    スワップパーティション

    ほとんどの GNU/Linux パーティションツール (例: fdisk, cfdisk) でスワップパーティションの作成ができます。スワップパーティションはタイプ 82 と指定されています。

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

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

    mkswap ユーティリティはデフォルトでパーティションの UUID を生成します。特定の UUID を指定したい場合は -U フラグを使って下さい:

    # mkswap -U custom_UUID /dev/sda2
    

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

    # swapon /dev/sda2
    

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

    /dev/sda2 none swap defaults 0 0
    
    ノート: TRIM をサポートした SSD を使っている場合、スワップのための正しいマウントオプションは discard です。手動でスワップを作成するとき、-d や --discard を使うことで同じことができます。discard などのマウントオプションの詳しい情報は、swapon の man ページを見て下さい。

    スワップファイル

    パーティションを作るかわりに、オンザフライでサイズを変えたり簡単に削除できるものとしてスワップファイルが選択肢になりえます。特にディスク容量が貴重な場合 (例: 小容量の 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
    

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

    # chmod 600 /swapfile
    

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

    # mkswap /swapfile
    

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

    # swapon /swapfile
    

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

    /swapfile none swap defaults 0 0
    

    スワップファイルの削除

    警告: スワップは systemd によって管理されているため、後でまた有効になります。

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

    root 権限で:

    # swapoff -a
    

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

    # rm -f /swapfile
    

    USB デバイスとスワップ

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

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

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

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

    次に 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 スワップパーティションに置き換えます。 sdb1

    ヒント: 他のデバイスをコンピュータに接続するとデバイスの順番が狂うことがあるので UUID を使っています

    最後に、元のスワップエントリに

    pri=0
    

    を加え、fstab に USB がいっぱいの時はハードディスクのスワップのみ使うように知らせます。

    このガイドは SD カードなどの他のメモリでも使うことができます。

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

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

    Swappiness

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

    /etc/sysctl.d/99-sysctl.conf
    vm.swappiness=1
    vm.vfs_cache_pressure=50

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

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

    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 の場合、その領域間ではラウンド・ロビン方式でページが配分されます。