LVM-CACHEの作り方いろいろ
LVMでHDDのキャッシュをSSDに作る方法のまとめです。
まずVGを作ろう
VG(ボリュームグループ)とは、PV(物理ボリューム)をまとめたもので、ここからLV(論理ボリューム)を切り出します。
HDDとSSDの物理ボリュームを一つのVGにまとめます。
$ sudo vgcreate sample /dev/sda6 /dev/sda7 /dev/sdb8
ここではsampleというVGに、/dev/sda6、/dev/sda7というSSD由来のPVと、/dev/sdb8というHDD由来のPVをまとめました。
私はgpartedでPVを作りましたが、以下のように、既にあるパーティーションをPVに初期化することができます。
初期化なので、元のデータは消えてしまうことに注意!
$ sudo pvcreate /dev/sda6
キャッシュ元のLVを作る
キャッシュ元のLVをHDDに作ります。
lvcreateコマンドで、指定したPVにLVを作ることができます。
$ sudo lvcreate -n system -L 50G sample /dev/sdb8
ここではsystemという名前で50GBのLVをHDDに作りました。
lvsコマンドでVG名sampleを指定すると、以下のように表示されます。
$ sudo lvs sample
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
system sample -wi-a----- 50.00g
そして、sample/systemにファイルシステムを作ります。
ここではext4でフォーマットしますが、好きなファイルシステムでフォーマットしてください。
$ sudo mkfs.ext4 /dev/sample/system
できたファイルシステムを適当なディレクトリにマウントします。
/mnt/sampleディレクトリを作って、そこにsample/systemをマウントします。
$ sudo mkdir /mnt/sample
$ sudo mount /dev/sample/system /mnt/sample/
キャッシュ付きLVにコンバートしよう
sample/systemをキャッシュ付きのLVに変換します。
いくつか方法がありますので気に入った方法でやってみてください。
1.lvconvert --type cache --cachedevice PVでSSDのPVをキャッシュ化する(lvm2 2.03.11-2にて確認)
これが一番簡単な方法です。
自動的にcachevol形式でキャッシュ化します。
当然ながら、VGに含まれないPVをキャッシュにすることはできません。
キャッシュ用にPVをすべて使う場合は以下のコマンドになります。
$ sudo lvconvert --type cache --cachedevice /dev/sda6 sample/system
Use all <5.01 GiB from /dev/sda6 for cache? [y/n]: y
Creating cachevol LV system_cache with size <5.01 GiB.
Logical volume "system_cache" created.
Logical volume sample/system is now cached.
--cachesizeで、キャッシュに使う容量を指定できます。
$ sudo lvconvert --type cache --cachedevice /dev/sda6 --cachesize 3G sample/system
Creating cachevol LV system_cache with size 3.00 GiB.
Logical volume "system_cache" created.
Logical volume sample/system is now cached.
既に使われているPVを指定すると、--cachesizeを要求されます。
$ sudo lvcreate -L 20G -n system2 sample /dev/sdb8
Logical volume "system2" created.
$ sudo lvconvert --type cache --cachedevice /dev/sda6 sample/system2
PV /dev/sda6 is in use, --cachesize is required.
lvsでsample LVを表示してみます。
$ sudo lvs sample
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
system sample Cwi-aoC--- 50.00g [system_cache_cvol] [system_corig] 7.26 5.32 0.00
2.キャッシュ用LVを作ってから、lvconvert --type cache --cachevol LV
6GBのキャッシュ用LVを作ります。
キャッシュ用なので、SSDのデバイスを指定します。
PV指定は複数可能です。
$ sudo lvcreate -n cache -L 6G sample /dev/sda6 /dev/sda7
Logical volume "cache" created.
LVの一覧を見てみます。
右端のデバイス名に注目。
$ sudo lvs sample -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
cache sample -wi-a----- 6.00g /dev/sda6(0)
cache sample -wi-a----- 6.00g /dev/sda7(0)
system sample -wi-a----- 50.00g /dev/sdb8(0) /dev/sdb8(0)
cacheというLVが/dev/sda6と/dev/sda7、つまりSSDにあります。
そしてcachevol形式でキャッシュにします。
$ sudo lvconvert --type cache --cachevol cache sample/system
Erase all existing data on sample/cache? [y/n]: y
Logical volume sample/system is now cached.
再度LV一覧を見るとこうなってます。
$ sudo lvs sample -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
system sample Cwi-aoC--- 50.00g [cache_cvol] [system_corig] 0.10 6.79 0.00 system_corig(0)
POOLに[cache_cvol]とあります。
元のLVはなんの変哲もない普通のLVなので、キャッシュが不要になったら、
$ sudo lvconvert --splitcache sample/system
このコマンドでキャッシュを切り離して別目的に使うことができます。
キャッシュLV自体が不要ならば、
$ sudo lvconvert --uncache sample/system
このコマンドでキャッシュ切り離し&キャッシュLV削除を行います。
3.lvconvert --type cache --cachepool LVでキャッシュ専用LVに変換してキャッシュ化
LVの一覧が以下のようになっていることが前提です。
$ sudo lvs sample -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
cache sample -wi------- 4.00g /dev/sda6(0)
system sample -wi-ao---- 50.00g
そして、
$ sudo lvconvert --type cache --cachepool cache sample/system
WARNING: Converting sample/cache to cache pool's data volume with metadata wiping.
THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
Do you really want to convert sample/cache? [y/n]: y
Converted sample/cache to cache pool.
Logical volume sample/system is now cached.
cache LVがキャッシュプールに変換された後、sample/systemがキャッシュ化されました。
LV一覧を見てみるとこうなります。
$ sudo lvs sample -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
system sample Cwi-aoC--- 50.00g [cache_cpool] [system_corig] 2.03 6.93 0.00 system_corig(0)
ここで、キャッシュ専用LVとなったsample/cacheが本当に普通のファイルシステム用に使えないのかどうか、lvconvert --splitcacheで切り離してみます。
$ sudo lvconvert --splitcache sample/system
Logical volume sample/system is not cached and sample/cache is unused.
そして、LVの一覧表示。
$ sudo lvs sample -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
cache sample Cwi---C--- 4.00g cache_cdata(0)
system sample -wi-ao---- 50.00g
LV一覧にsample/cacheは見えますが、Attr欄の1文字目と7文字目にCが入っています。試しにsudo mkfs.ext4 /dev/sample/cacheと入力してファイルシステムを作ろうとしても失敗します。
本当にキャッシュ専用LVになってしまったようです。
4.lvconvert --type cache-pool --poolmetadata LVでキャッシュプールLVとメタデータLVを統合した後、lvconvert --type cache --cachepool LVでキャッシュ化。
普段キャッシュ化LVを使う場合、1番目2番目のケースでほとんど対応可能だと思いますが、
SSDが複数あって、キャッシュプールLVとメタデータLVを別々のデバイスに割り振りたい、
またはキャッシュサイズを厳密に設定したい、
なんていう場合にこの方法を使います。
まず、キャッシュプール用LVとメタデータ用LVを作ります。
$ sudo lvcreate -n cache -L 4G sample /dev/sda6
Logical volume "cache" created.
$ sudo lvcreate -n meta -L 40M sample /dev/sda6
Logical volume "meta" created.
ここでLV一覧を表示してみます。
$ sudo lvs sample -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
cache sample -wi-a----- 4.00g /dev/sda6(0)
meta sample -wi-a----- 40.00m /dev/sda6(1028)
system sample -wi-ao---- 50.00g /dev/sdb8(0)
そして、キャッシュプールLVにメタデータLVを統合します。
$ sudo lvconvert --type cache-pool --poolmetadata meta sample/cache
WARNING: Converting sample/cache and sample/meta to cache pool's data and metadata volumes with metadata wiping.
THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
Do you really want to convert sample/cache and sample/meta? [y/n]: y
Converted sample/cache and sample/meta to cache pool.
LV一覧を見てみるとこうなります。
$ sudo lvs sample -o +devices -a
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
cache sample Cwi---C--- 4.00g cache_cdata(0)
[cache_cdata] sample Cwi------- 4.00g /dev/sda6(0)
[cache_cmeta] sample ewi------- 40.00m /dev/sda6(1024)
[lvol0_pmspare] sample ewi------- 40.00m /dev/sda6(1034)
system sample -wi-ao---- 50.00g /dev/sdb8(0)
[]で囲まれた、内部使用のためのLVが見えます。
そして、sample/systemにキャッシュを付けます。
$ sudo lvconvert --type cache --cachepool cache sample/system
Do you want wipe existing metadata of cache pool sample/cache? [y/n]: y
Logical volume sample/system is now cached.
最終的にLV一覧はこんな感じです。
$ sudo lvs sample -o +devices -a
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
[cache_cpool] sample Cwi---C--- 4.00g 0.00 1.36 0.00 cache_cpool_cdata(0)
[cache_cpool_cdata] sample Cwi-ao---- 4.00g /dev/sda6(0)
[cache_cpool_cmeta] sample ewi-ao---- 40.00m /dev/sda6(1024)
[lvol0_pmspare] sample ewi------- 40.00m /dev/sda6(1034)
system sample Cwi-aoC--- 50.00g [cache_cpool] [system_corig] 0.00 1.36 0.00 system_corig(0)
[system_corig] sample owi-aoC--- 50.00g /dev/sdb8(0)
それではよいLinuxライフを!
ここから先は
¥ 300
Amazonギフトカード5,000円分が当たる
この記事が気に入ったらチップで応援してみませんか?