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)
を使ってはならない)。
- -c
- スワップ領域を作る前に、デバイスに対して不良ブロックのチェックを行う。
不良ブロックが見つかった場合は、そのカウント数を表示する。
- -f
- 強制する。馬鹿なコマンドでも実行する。
これを指定すると、ファイルまたはパーティションの実際の大きさよりも
大きなスワップファイルを作る動作ができてしまう。
SPARC
ではスワップ領域を強制的に作成する。
このオプションを付けないと、
mkswap は正しい SPARC
のスーパーブロックを持ったデバイスには
v0
のスワップを作成しない。パーティションテーブルを
消してしまう可能性があるからである。
-
-p PSZ
- 用いるページサイズを指定する。
-
-L label
- ラベルを指定し、そのラベルで
swapon
できるようにする。
(新しい形式のスワップ領域のみ。)
- -v0
- 古い形式のスワップ領域を作成する。
- -v1
- 新しい形式のスワップ領域を作成する。
-v
オプションを省略して
mkswap を実行すると、
デフォルトでは新しい形式を作成する。しかし使用中のカーネルが
2.1.117 より古い場合
(あるいは PAGE_SIZE が 2048
より小さい場合)
には、
古い形式で作成する。
新しい形式のヘッダは、最初のブロックには書き込まない。
したがってブートローダやディスクラベルを置く場合にはこちらが望ましい。
2.0 と 2.2
のカーネルを両方用いる必要がある場合は、
スワップ領域を作成する際には
-v0
オプションを用いること。
fdisk(8),
swapon(8)