説明
mkswap は Linux のスワップ領域をデバイス上またはファイル上に準備する。
(スワップ領域を準備した後にこの領域の利用を開始するには、
swapon コマンドを用いる必要がある。通常スワップ領域は
/etc/fstab にリストされ、起動スクリプトに記述されている
swapon -a コマンドによって、起動時から利用できるようになっている。)
引き数
device は通常はディスクパーティション (
/dev/hda4 や
/dev/sdb7 のようなもの) であるが、ファイルを指定することもできる。 Linux カーネルはパーティション ID を参照しないが、インストールスクリプトの多くでは、パーティション形式が 16 進の 82 (LINUX_SWAP) となっているものをスワップパーティションとみなしている。 (警告: Solaris もこの形式を使う。 Solaris のパーティションを破壊しないように注意すること。)
size パラメータは不要であるが、過去との互換性のために残してある。 (スワップ領域にしたいサイズを 1024 バイトブロック単位で指定する。このパラメータが省略されると、
mkswap はパーティション全体を用いる。このパラメータは指定しないほうが賢い。タイプミスをするとディスクを壊してしまう。)
PSZ 引き数は、用いるページサイズを指定する。ほとんどの場合は指定しなくてもよい (というか指定するのは賢くない) が、古い libc のあるバージョンはページサイズの値を間違えて返すことがあり、
mkswap の動作をおかしくしてしまうことがある。これに伴う症状として、
swapon が "no swap signature is found"といって失敗する。
PSZ に与える通常の値は 4096 または 8192 である。
Linux はスワップ領域として 2 つの形式を認識する。古い形式と新しい形式とである。これらは、スワップ領域先頭ページの末尾 10 バイトによって区別される。古い形式では `SWAP_SPACE'、新しい形式では `SWAPSPACE2' がそれぞれサインとなる。
古い形式では、先頭ページの残りの部分はビットマップであり、 1 ビットがスワップ領域で利用できるそれぞれのページに対応する。先頭のページはこのビットマップを保持するので、先頭ビットは 0 である。また最後の 10 バイトはサインになっている。したがってページサイズを S とすれば、古い形式のスワップ領域は最大で 8*(S-10)-1 ページをスワップに用いることができる。 S=4096 (i386 の値) ならば、利用できる領域の最大値は 133890048 バイト (ほぼ 128 MiB) であり、残りの部分は無駄となる。 alpha と sparc64 では S=8192 なので、最大値は 535560992 バイト (ほぼ 512 MiB) となる。
古い形式では、このビットマップページの大部分を無駄にしていることになる。なぜならマップ中のビット 0 は、不良ブロックかスワップ領域の境界後にあるブロックを示すためのものだからである。スワップ領域のサイズは簡単な計算で求まる値に制限されるかわり、不良ブロックがあればリストするのが簡単になっている。しかし不良ブロックがたくさんあるような領域をスワップにしたい人など誰もいないだろう (筆者は 1 つの不良ブロックでさえ許したくない)。新しい形式のスワップ領域では、これはもっとしかるべく扱われている。利用できるスワップ領域の最大値は、現在ではアーキテクチャ依存である。 i386, PPC, m68k, ARM では約 2GiB、 sparc では 1GiB、 mips では 512MiB, alpha では 128GiB, sparc64 では 3TiB である。
2.1.117 以前のカーネルでは、 1 ページあたり 1 バイトを割り当てていたが、現在では 2 バイトを割り当てている。したがって 2 GiB のスワップ領域には 2 MiB のカーネルメモリが必要となる。
現時点では、 Linux は 32 個のスワップ領域を持つことができる (Linux 2.4.10 より前は 8 個であった)。利用している領域は
/proc/swaps ファイルで見ることができる (2.1.25 以降)。
mkswap では 10 ページより小さい領域を作ることはできない。
使っているマシンのページサイズがわからない場合は、"cat /proc/cpuinfo"によって調べることができるかもしれない。 (できないかもしれない - このファイルの内容はアーキテクチャとカーネルのバージョンに依存しているので。)
スワップファイルを作成する場合は、
mkswap による初期化を行う前に、ファイルを作成しておく必要がある。この目的には、以下のようなコマンドを用いれば良い:
# dd if=/dev/zero of=swapfile bs=1024 count=65536
スワップファイルには "hole" (未確保の領域) が存在してはならないことに注意せよ (したがってファイルを作成する際に
cp(1) を使ってはならない)。