3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

LVM-CACHEの作り方いろいろ

Last updated at Posted at 2023-09-03

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ライフを!

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?