Debian GNU/Linux 8でスワップファイルを作ってみた
Debian GNU/Linux 8をインストールするときにHDDのパーティショニングをした。つまりHDDをいくつかの論理領域に切り分けた。しかし、その際にスワップ領域を作らなかった。メインメモリが1024MB以上あったので、スワップ領域は要らないと思ってしまった。
ところが、ClamAVでウイルス・スキャンをしていたら次のようなエラーメッセージが表示されて、容量の大きないくつかのファイルがウイルス・チェックに失敗してしまう問題にぶつかってしまった。
LibClamAV Warning: fmap: map allocation failed LibClamAV Error: CRITICAL: fmap() failed ****************.*: Can't allocate memory ERROR LibClamAV Warning: fmap: map allocation failed
スワップ・ファイルを作ってみた
スワップ・パーティションを作る代わりにスワップ・ファイルを作る方法があることをArch LinuxのWikiで知ったので、Debian GNU/Linux 8でも同じことがでいるのか試してみた。
まずコンピュータに搭載されているメモリの容量を調べた。
$ cat /proc/meminfo | grep MemTotal MemTotal: 1031756 kB
この結果から1031756キロバイトだと分かった。free -mコマンドを入力してもメモリの容量が分かる。Memとtotalが交わるところの値がそれ。オプションの-mはメガバイト単位で表示することを指示するもの。
$ free -m total used free shared buffers cached Mem: 1007 793 213 5 24 481 -/+ buffers/cache: 287 720 Swap: 0 0 0
1031756キロバイトをメガバイトにすると1031756割る1024で1007.5742になるが、小数点以下が切り捨てられて1007と表示される。
Arch LinuxのWikiによれば、スワップの容量は物理メモリのおよそ2倍程度にするのが普通らしいので、それにしたがえば1007掛ける2で2014メガバイトになる。しかし少し余裕をとって1024掛ける2で2048メガバイトのスワップファイルを作ることにしてみた。
まずはddコマンドを使用してswapfileを書き出す。実行するにはルート権限が必要になる。ここではおよそ2ギガバイトのスワップファイルを確保したいので次のように入力する。ルート権限を得るためにsudoを利用した。
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 2048+0 レコード入力 2048+0 レコード出力 2147483648 バイト (2.1 GB) コピーされました、 49.1907 秒、 43.7 MB/秒
bs=1Mはブロック単位で1メガバイト。count=2048はそのブロック単位をいくつコピーするか指定する。1メガバイト、つまり1048576バイトを2048個だから、1048576掛ける2048で2147483648バイト(つまり2.1ギガバイト)のswapfileが作られた。
$ ls -al /swapfile -rw-r--r-- 1 root root 2147483648 11月 1 18:57 /swapfile
パーミッション(許可)が-rw-------になっていれば変更の必要はないが、そうなっていなければchmodコマンドを使って次のようにパーミッションを設定しなくてはならない。swapfileファイルの所有者はrootなので、chmodコマンドを実行する際にルート権限になる必要がある。
$ sudo chmod 600 /swapfile
600はrw-------を8進数で指定したもの。パーミッションと8進数との対応関係は次の表のようになっている。
パーミッション | 8進数 |
---|---|
--- | 0 |
--x | 1 |
-w- | 2 |
-wx | 3 |
r-- | 4 |
r-x | 5 |
rw- | 6 |
rwx | 7 |
まず所有者の許可がrw-だから6、次にグループの許可が---だから0、最後にその他の許可が---だから0となる。よって600と指定することでrw-------を表すことができるというわけだ。
次にmkswapコマンドでswapfileファイルを対象にしてスワップを作成する。オプションに-cを指定すればそのデバイスの不良をチェックできる。これもルート権限で行う。
$ sudo mkswap /swapfile Setting up swapspace version 1, size = 2097148 KiB ラベルはありません, UUID=********-****-****-****-************
うまくいけば上のように表示される。
余談だが、UUIDは次のようにblkidコマンドを使っても確認できる。
$ sudo blkid /swapfile /swapfile: UUID="********-****-****-****-************" TYPE="swap"
次にvimなどのテキスト・エディタを使って/etc/fstabを編集し、次のような行を追加する。#が行頭にある行はコメント行であることを表している。
# swap /swapfile none swap defaults 0 0
エディタを使わなくても、echoコマンドと>>を使って次のように入力して実行すればほぼ同じ結果を得られる。実行後、catコマンドでfstabの中身を確認しておく。
$ sudo echo "/swapfile none swap defaults 0 0" >> /etc/fstab $ cat /etc/fstab
最後にスワップを有効にする。
$ sudo swapon /swapfile
これで完了。
スワップ・ファイルを作った後にclamscanを実行したら、上述のようなエラーは出なくなった。これで一見落着。
ちなみに、swapfileファイルの作成からこの作業をやり直すときには、スワップを無効化してから行う必要がある。スワップを無効化するには次のように入力する。
$ sudo swapoff -a /swapfile
スワップファイルの削除は次のようにする。
$ sudo rm -f /swapfile
コメント
コメントを投稿