スワップをネットワーク経由で実現する

Linuxの良いところは「こんな事ができないかな」と思った時、「この機能とこの機能を組み合わせると出来そうだ」と想像でき、実際にやってみるとその通りに動くことだろう。基本的な機能を組み合わせて複雑な機能を実現するというコンセプトがUNIXの時代から受け継がれているためだろう。そのために1000を超える基本的な(ある意味で単純な)コマンド群がある。私は相性が悪いせいかWindowsでは「こうすれば出来そうだ」と思っても実際にやってみると「何でこういった実装になっているのだろう?」と壁にぶつかり実現できないことが多い。

さて、今日はスワップ機能をネットワーク越しに実現する方法にトライしてみた。以前、HDDを持たないディスクレスの実現方法についてメモしているが、基本的には主記憶だけで動作するので、大きなアプリケーションを実行すると領域が足りなくなることがある。HDDが無いのでスワップは無いか、もしくはtempfsで実際には主記憶を使うか、ということになる。皮肉なことにディスクレスで使いたいPCほど主記憶も限られている。

そこでスワップをネットワーク越しで実現できないかトライした。

素材とすればNFS、ディスク・イメージファイル、loopデバイスとなる。NFSに関しては説明するまでもない。ディスク・イメージファイルは“HDDイメージファイルをマウントして使う方法”でトライした様に、ファイルをHDDとして扱う方法だ。そして、そのイメージファイルをLinuxのデバイスファイルとして使えるようにするのがloopデバイスとなる。

なお、この方法はHDDを持たないディスクレスで利用できる他、一時的に追加のスワップが必要になったが、ローカルのHDDには余裕がない場合にも利用できる。また、最後のところで触れておくが、“スワップ・サーバ”となるマシンはWindowsマシンでも構わない。

NFSサーバ側での準備

先ず、NFSサーバでクライアントのスワップファイルを作成しておく。ファイルの作成場所はクライアントからNFSでマウントしてアクセスできるところとなる。例えば約1GBのスワップ領域を確保するのであれば次のようにする。

# dd if=/dev/zero of=/home/diskless/swap/00-0c-29-ab-cd-ef bs=1052835840 count=1
# chown nobody:nogroup /home/diskless/swap/00-0c-29-ab-cd-ef
# mkswap /home/diskless/swap/00-0c-29-ab-cd-ef

ここでファイル名は“00-0c-29-ab-cd-ef”としているが、別に何でも構わない。私の場合は利用するクライアントPCのMACアドレスをファイル名としている。(クライアントが複数存在する場合、同じファイルを使わないようにするため。)
ファイルの持ち主を“nobody:nogroup”としているのでNFSでroot_squashオプションでマウントしてもクライアントから利用できる。(no_root_squashではセキュリティ的に問題があるので。)
/etc/exportsでは必ず“rw”を指定しておく。例えば次のような記述になる。

/home/diskless/swap/    192.168.1.0/24(rw,sync,root_squash)

クライアント側での操作

まず、スワップを設定する前の状態を確認。

# free
             total       used       free     shared    buffers     cached
Mem:        509332     441560      67772          0          0     278908
-/+ buffers/cache:     162652     346680
Swap:            0          0          0

スワップは使われていない。そこで、次の手順でNFSサーバのファイルをスワップとして使う。

# mount nfs-server:/home/diskless/swap/ /mnt/swap/
# losetup -v -f /mnt/swap/00-0c-29-ab-cd-ef
Loop device is /dev/loop0
# swapon /dev/loop0

スワップ領域として確保されたか確認する。

# free
             total       used       free     shared    buffers     cached
Mem:        509332     444964      64368          0          4     279360
-/+ buffers/cache:     165600     343732
Swap:      1028152          0    1028152

スワップファイルを解放するのは次の手順:

# swapoff /dev/loop0
# losetup -d /dev/loop0
# umount /mnt/swap/

WindowsのファイルサーバでもOK

上の例はNFSサーバのファイルをスワップ領域として使ったが、WindowsのCIFSサーバでもOK。クライアントでマウントする際に、

# mount -t cifs //windows-pc/users/diskless/swap /mnt/swap -o user=adsaria

とマウントする(もちろん“C:\Users\diskless\swap”は共有設定されている必要がある)。後は同じ。ただし、mkswapでフォーマットしたファイルをWindowsのファイルサーバへコピーするか、クライアントからswaponする前に“mkswap -f /dev/loop0”を実行する。