先日,Ubuntuを搭載しているマシンで大量のメモリを使用するアプリケーションを動作させようと思い,SwapFileを追加しようとしたところ,
swapon: /sw: skipping - it appears to have holes.
というエラーが出て SwapFile を追加することができなかった.
調べてみると,原因はファイルシステムにZFSを使用していることだった.ZFSでは, SwapFile はファイルではなく,ボリュームとして提供しなくてはいけないらしい.
(ZFSについては,この記事を参照.)
この解決方法を調べたので,以下に記載しようと思う.
目次
1. 忙しい人へ
以下のコマンドを実行してください.
$ sudo zfs create -V [任意の数字]G rpool/swap
$ sudo mkswap /dev/zvol/rpool/swap
$ sudo swapon /dev/zvol/rpool/swap
$ sudo swapon --show
sudo swapon --show
の結果,Swapファイルが増えていればOKです.
2. エラーが出るまでに実施したこと
エラーが出るまでに試したコマンドは以下になります.
$ sudo fallocate -l 1G /swapfile # ddコマンドを使用してもよい
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
実際に試した際の画像は以下になります.
3. 解決方法
基本的には
- ZFSのプールを確認する
- ZFSのボリュームを作成
- swap領域の作成と追加
ということをやります.
ZFSのプールを確認
まず初めに,ZFSのストレージプールの一覧を確認します.以下のコマンドを入力し,ZFSのプールの一覧を表示します.
$ sudo zpool list
以下の画像のような出力がされるはずです.この出力からSIZEの値が大きいプールの名前を憶えておきましょう.下の画像なら,「rpool」になります.
ZFSのボリュームを作成
次に,ZFSのボリュームを作成します.作成するためのコマンドは以下です.
$ sudo zfs create -V [容量] [プール名]/swap
上記のコマンドにおける[]は,個人の環境によって置き換えるべきものです.
- [容量]: 追加したいSwap領域の大きさを指定する.
- 「1G」と書けば1Giga Byte,「1M」と書けば1 Mega Byte追加されます.
- [プール名]: 先ほど確認した最もSIZEが大きいプール名
例えば,rpoolに1GのSwap領域を追加するなら,コマンドは以下になります.
$ sudo zfs create -V 1G rpool/swap
Swap領域の作成と追加
ボリュームさえ追加してしまえば,後は他のファイルシステムの場合と変わりません.
ボリュームのデバイスパス「/dev/zvol/rpool/swap」に対して,swap関連のコマンドを実行しましょう.
$ sudo mkswap /dev/zvol/rpool/swap
$ sudo swapon /dev/zvol/rpool/swap
最後に,以下のコマンドで,Swap領域が追加されているのかを確認すれば完成です!
$ sudo swapon --show