Scroll to navigation

MKSWAP(8) Linux Programmer's Manual MKSWAP(8)

名前

mkswap - Linux のスワップ領域を準備する

書式

mkswap [-c] [-vN] [-f] [-p PSZ] [-L label] device [size]

説明

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) を使ってはならない)。

オプション

スワップ領域を作る前に、デバイスに対して不良ブロックのチェックを行う。 不良ブロックが見つかった場合は、そのカウント数を表示する。
強制する。馬鹿なコマンドでも実行する。 これを指定すると、ファイルまたはパーティションの実際の大きさよりも 大きなスワップファイルを作る動作ができてしまう。 SPARC ではスワップ領域を強制的に作成する。 このオプションを付けないと、 mkswap は正しい SPARC のスーパーブロックを持ったデバイスには v0 のスワップを作成しない。パーティションテーブルを 消してしまう可能性があるからである。
用いるページサイズを指定する。
ラベルを指定し、そのラベルで swapon できるようにする。 (新しい形式のスワップ領域のみ。)
古い形式のスワップ領域を作成する。
新しい形式のスワップ領域を作成する。

-v オプションを省略して mkswap を実行すると、 デフォルトでは新しい形式を作成する。しかし使用中のカーネルが 2.1.117 より古い場合 (あるいは PAGE_SIZE が 2048 より小さい場合) には、 古い形式で作成する。 新しい形式のヘッダは、最初のブロックには書き込まない。 したがってブートローダやディスクラベルを置く場合にはこちらが望ましい。 2.0 と 2.2 のカーネルを両方用いる必要がある場合は、 スワップ領域を作成する際には -v0 オプションを用いること。

関連項目

fdisk(8), swapon(8)

25 March 1999 Linux 2.2.4