LVM-CACHEの作り方いろいろ

LVMでHDDのキャッシュをSSDに作る方法のまとめです。

# まずVGを作ろう
VG（ボリュームグループ）とは、PV（物理ボリューム）をまとめたもので、ここからLV（論理ボリューム）を切り出します。
HDDとSSDの物理ボリュームを一つのVGにまとめます。
```shell-session
$ sudo vgcreate sample /dev/sda6 /dev/sda7 /dev/sdb8
```
ここではsampleというVGに、/dev/sda6、/dev/sda7というSSD由来のPVと、/dev/sdb8というHDD由来のPVをまとめました。

私はgpartedでPVを作りましたが、以下のように、既にあるパーティーションをPVに初期化することができます。
初期化なので、元のデータは消えてしまうことに注意！
```shell-session
$ sudo pvcreate /dev/sda6
```
# キャッシュ元のLVを作る
キャッシュ元のLVをHDDに作ります。
*lvcreate*コマンドで、指定したPVにLVを作ることができます。
```shell-session
$ sudo lvcreate -n system -L 50G sample /dev/sdb8
```
ここではsystemという名前で50GBのLVをHDDに作りました。
*lvs*コマンドでVG名sampleを指定すると、以下のように表示されます。
```shell-session
$ 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でフォーマットしますが、好きなファイルシステムでフォーマットしてください。
```shell-session
$ sudo mkfs.ext4 /dev/sample/system 
```
できたファイルシステムを適当なディレクトリにマウントします。
*/mnt/sample*ディレクトリを作って、そこに*sample/system*をマウントします。
```shell-session
$ sudo mkdir /mnt/sample
$ sudo mount /dev/sample/system /mnt/sample/
```

# キャッシュ付きLVにコンバートしよう
*sample/system*をキャッシュ付きのLVに変換します。
いくつか方法がありますので気に入った方法でやってみてください。

## １．*lvconvert --type cache --cachedevice* PVでSSDのPVをキャッシュ化する(lvm2 2.03.11-2にて確認)
これが一番簡単な方法です。
自動的にcachevol形式でキャッシュ化します。
当然ながら、VGに含まれないPVをキャッシュにすることはできません。

キャッシュ用にPVをすべて使う場合は以下のコマンドになります。
```shell-session
$ 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*で、キャッシュに使う容量を指定できます。

```shell-session
$ 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*を要求されます。
```shell-session
$ 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を表示してみます。
```shell-session
$ 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指定は複数可能です。
```shell-session
$ sudo lvcreate -n cache -L 6G sample /dev/sda6 /dev/sda7
  Logical volume "cache" created.
```

LVの一覧を見てみます。
右端のデバイス名に注目。
```shell-session
$ 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形式でキャッシュにします。
```shell-session
$ 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一覧を見るとこうなってます。
```shell-session
$ 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なので、キャッシュが不要になったら、
```shell-session
$ sudo lvconvert --splitcache sample/system
```

このコマンドでキャッシュを切り離して別目的に使うことができます。

キャッシュLV自体が不要ならば、
```shell-session
$ sudo lvconvert --uncache sample/system
```

このコマンドでキャッシュ切り離し＆キャッシュLV削除を行います。

## 3.*lvconvert --type cache --cachepool* LVでキャッシュ専用LVに変換してキャッシュ化
LVの一覧が以下のようになっていることが前提です。
```shell-session
$ 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    
```
そして、
```shell-session
$ 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一覧を見てみるとこうなります。
```shell-session
$ 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*で切り離してみます。
```shell-session
$ sudo lvconvert --splitcache sample/system
  Logical volume sample/system is not cached and sample/cache is unused.
```

そして、LVの一覧表示。
```shell-session
$ 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欄の１文字目と７文字目にCが入っています。試しに*sudo mkfs.ext4 /dev/sample/cache*と入力してファイルシステムを作ろうとしても失敗します。
本当にキャッシュ専用LVになってしまったようです。

## 4.*lvconvert --type cache-pool --poolmetadata* LVでキャッシュプールLVとメタデータLVを統合した後、*lvconvert --type cache --cachepool* LVでキャッシュ化。
普段キャッシュ化LVを使う場合、１番目2番目のケースでほとんど対応可能だと思いますが、
SSDが複数あって、キャッシュプールLVとメタデータLVを別々のデバイスに割り振りたい、
またはキャッシュサイズを厳密に設定したい、
なんていう場合にこの方法を使います。

まず、キャッシュプール用LVとメタデータ用LVを作ります。
```shell-session
$ 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一覧を表示してみます。
```shell_session
$ 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を統合します。
```shell-session
$ 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一覧を見てみるとこうなります。
```shell-session
$ 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*にキャッシュを付けます。
```shell-session
$ 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一覧はこんな感じです。
```shell-session
$ 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ライフを！