スワップを DOS に逃がしてディスク増量

97年10月8日


なんとか ppp も X もインストールできたが, ディスクがせますぎる。 プリンタサーバを始めとするサーバを動かそうと思ったら, ワークエリア用(スプール)にそれなりの大きさのディスクが必要である。

ということで, 何とかディスクを広げることを考える。 ここで真っ先に考えついたのが, すでに linux でやっている

MS-DOS と FreeBSD でスワップ領域を共有する
というテクニックである。

FreeBSD には vnode device という変わった疑似デバイスが存在する。 これはあるファイルシステム上にある 「ファイル」をデバイスとして扱うというものである (CD 焼く時の最終段階でのチェックなどに便利であろう)。

この仕組みを使って, DOS のファイルシステム上に適当なファイルを作り, そのファイルをスワップパーティションとしてマウントする。 また DOS で立ち上げた時は, そのファイルを消すようにする。こうすれば, DOS で立ち上げた時もディスクが狭くなるということはない。

などと書くと非常にすごいことをしているようだが, 例によって徹底入門の 4.4.3 に書かれている方法を真似して, 応用しただけである。 具体的な方法は下に記す。

まずは準備である。 いうまでもないがこの方法を使うには, カーネルが vnode デバイスを扱えないといけない。 ということで, そうでない場合は psuedo-device vn… という項目を 有効にして(アンコメントアウトして)カーネルを再構築する (もっとも私のカーネル PAO98Ne3は偶然にも vnode サポートありで構築されていたので, 再構築しなくて済んだ)。 でもって, vnode device をアクセスするのに使うスペシャルファイルを /dev に MAKEDEV する。

	# cd /dev ; sh ./MAKEDEV vn0
これで準備は終了である。

つづいて, dos パーティション(スライス)をマウントする。起動時に自動的に マウントされないといけないので, /etc/fstab を書き換え,

	/dev/wd0a	/dos	msdos	rw	0	0
というふうな行を付け加える(デバイスファイル名, マウントポインタは人によって違うので各自書き変えてください。以下同じ)。 この後マウントポインタを作り, (実験のため)手動でマウントする。
	# mkdir /dos ; mount /dos
で, スワップファイルを作る。これは本に書いてあるのをほとんど そっくりそのまま実行。
	# dd if=/dev/zero of=/dos/tmp/swap bs=1024k count=32
で, できたファイルをスワップ領域としてマウント。/etc/vntab に,
	/dev/vn0c	/dos/tmp/swap	swap
という記述をして,
	# vnconfig -ae
とやればおしまい。一応確認する。
	# swapinfo

これでとりあえずうまくいくはずである。新しいスワップ領域が使えていることが 確認できたら, 次の起動からは自動的にマウントされるように, 起動スクリプトの /etc/rc.local を書き換える。

	if [ -f /etc/vntab ]; then
		vnconfig -ae
	fi

しかしこれだけでは dos で立ち上げた時, a:\tmp\swap などという馬鹿でかい (32メガバイト!)ファイルが残ってしまう。linux だと, 終了スクリプト (reboot をかけた時などに init から呼ばれるスクリプト)でこのファイルの 後始末をしていたのだが, FreeBSD にはこの終了スクリプトに相当するものが 見つからない。ということで, dos 側でこれは対処する。 dos の autoexec.bat の先頭に,

	del a:\tmp\*
という一行を書き加える。

と, 今度は FreeBSD で立ち上げた時 /dos/tmp/swap というファイルがないといって おこられてしまう。そこで, /etc/rc.local に先ほど書き加えた部分を さらに書き換える。

	if [ -f /etc/vntab ]; then
		if [ ! -f /dos/tmp/swap ]; then
			echo 'making swap file...'
			dd if=/dev/zero of=/dos/tmp/swap bs=1024k count=32
		fi
		vnconfig -ae
	fi
なお, このファイルの作成にはかなり時間がかかってちょっと不安になるので, コンソールにメッセージを出すようにしている。

と, ここまでできたら再起動して, dos でも FreeBSD でもうまくいっていることを確認する。 これで, 今まで使っていた swap パーティションはお払い箱なので, ディスクラベルエディタを使って swap を ufs に書き換える。 これで新たに 16 M の領域が手にはいったことになる。 将来, サーバとして使うことを考え, このパーティションは /var にマウントすることにする。

まず /etc/fstab に

	/dev/wd0b2	/var	ufs	rw	1	1
という記述を書き足し, 念のためシングルユーザーモードにして
	# mv /var /var.bak
	# mkdir /var
	# mount /var
	# cp -p /var.bak/* /var
とすればおしまいである。再起動して, 問題ないようであれば
	# rm -rf /var.bak
する。これでかなりディスク容量が増えたうえ, スワップ領域も広がった。 いやぁめでたい。めでたい。
NAT パッチを当てる
X まで動いてしまった