ブログの説明

学校に通わないで学んだことを記しています。間違っているところが何かありましたらご指摘下さると幸いです。コメントに対する返信が遅れる可能性があります。その場合は申し訳ありません。

このブログではサイドバーに広告を表示しています。このブログ内の投稿記事を検索するには右上の拡大鏡のアイコンを、アーカイブやラベル付けから投稿記事を閲覧するには左上の三重線のアイコンをクリックして下さい。

数式の表示にはMathJaxを利用させていただいています。数式の表示のためにJavaScriptが有効である必要があります。そうでない場合、訳の分からないLatexのコードが表示されます。幾何学図形やチャートの表示にはHTML5 CanvasやGoogle Chartを使用しています。その表示のためにもJavaScriptが有効である必要があります。

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ギガバイトのスワップファイルを確保したいので次のように入力する。

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進数の対応表
パーミッション 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

コメント

このブログの人気の投稿

Visual Studio 2019にはC++のためのフォームデザイナーがない件

10の補数と9の補数と2の補数と1の補数

LATEXで数式:指数と順列などで使う添数・添字