FreeBSD の swapping2006年10月31日 11時55分15秒

FreeBSD では伝統的に b パーティションがスワップデバイスに使われる。

スワッピングとページングは少々意味が違うが、現代的な OS は両方とも実装していることが多い。スワッピングとは、プロセスをメモリからディスクに退避することを言う。古典的な OS のスワッピングだと、プロセス全体のメモリがディスクに退避させられた。それでは効率が悪いので、実メモリとディスク領域を固定長の長さを定義して、この固定長サイズのメモリを任意にディスクに書き出せるようにする仕組みがページングである。ディスクへの退避をプロセス毎ではなく、固定長のメモリ単位で行なうのである。

そのため、ページングを実装すると、プロセスを全て退避する必要が無くなるので、効率が上がる。もしプロセスが大量のメモリを要求したとしても、現時点で必要な量のみを実メモリに残し、頻繁に使用しない領域をディスクに置いておくということも出来る。`

今回、やってしまった操作だ。


# newfs -U /dev/ad3s2c
/dev/ad3s2c: 10240.0MB (xxxx sectors) block size 16384, fragment size 2048
super-block backups (for fsck -b #) at:
 160, 1184, ....
# mount /dev/ad3s2c /mnt/tmp
mount: /dev/ad3s2c: Operation not permitted

とてもわかりづらいエラーだった。df で確かめても、a や d 等を既にマウントしているわけでもない。newfs は成功したのに、mount は失敗する。

問題を解決したのはこれだった。


# swapoff /dev/ad3s2b
# mount /dev/ad3s2c /mnt/tmp
# ls /mnt/tmp
.snap
#

つまり、ad3s2 スライスの中の b パーティションをスワップデバイスとして使っていたから、mount が失敗していたわけだ。このデバイス自体は、この時点では何も書き込まれてはいなかった。

スワップデバイスとして、登録されていたにもかかわらず、newfs が出来たのだ。もし、この時点でこのデバイスにページアウトされていたら、newfs が出来たかは点検していないが、とても危険な操作が許されてしまっている。もし、ページアウトされている領域に、newfs が書き込んでしまったら、どんな挙動を起こすかわからない。おそらく、最終的には panic になるのだろうが。

次回