IDCF Tech-Blog

読者です 読者をやめる 読者になる 読者になる

IDCF Tech-Blog

クラウド・ビッグデータ・データセンターを提供するIDCフロンティアの公式エンジニアブログ

LVM シンプロビジョニング(シンボリューム) & スナップショット

cloudstack クラウド セルフクラウド

※この記事は公開されてから1年半以上経過しています。情報が古い可能性がありますのでご注意ください。

こんにちは。梶川です。

Linuxの論理ボリュームマネージャであるLVM(logical volume manager)は皆さんご存知かと思います。IDCフロンティア マネージドクラウドで提供しているCentOSも、デフォルトがLVMで構成されています。クラウドではストレージの追加/削除が容易なこともあり、LVMで構成しておいて後からストレージの拡張を容易にできるようにしています。

LVMですが、こちらも色々と機能拡張がされており、その成果が新しいRed Hat Enterprise Linuxが出るたびに取り込まれています。

Red Hat Enterprise Linux 6 論理ボリュームマネージャの管理 => 1.1. 新機能および変更された機能

もちろんRed Hat Enterprise LinuxのクローンであるCentOSでも同様に利用することができます。今回は表題にあるLVMのシンプロビジョニング(シンボリューム)をご紹介します。

Red Hatでは6.3からTechnology Previewで利用できるようになっており、6.4からTechnology Previewが外れて正式に利用できるようになりました。シンプロビジョニングを利用すると、物理的なストレージサイズにとらわれることなくストレージの割り当てが可能になり、より効率のよい運用が可能になります。

Red Hat Enterprise Linux 6 論理ボリュームマネージャの管理 => 2.3.4. シンプロビジョニングされた論理ボリューム (シンボリューム)

また、シンプロビジョニングされたスナップショットボリュームの作成もサポートされていて、今までのLVMスナップショットよりも便利にスナップショットを取ることができます。

Red Hat Enterprise Linux 6 論理ボリュームマネージャの管理 => 2.3.6. シンプロビジョニングされたスナップショットボリューム

シンプロビジョニング

それでは早速試してみましょう。

IDCフロンティア セルフクラウドで「[LATEST] CentOS 6.5 64-bit」のテンプレートから、5GB程度の小さいディスク ボリュームを1つ追加した仮想マシンを作成してください。(後からディスク ボリュームを追加する方法はご利用ガイドを参照)

fdisk, pvcreate, vgcreateまでは通常のボリューム作成とまったく同じです。

# fdisk -uc /dev/sdb

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 1
最初 セクタ (2048-10485759, 初期値 2048): 2048
Last セクタ, +セクタ数 or +size{K,M,G} (2048-10485759, 初期値 10485759): 10485759

コマンド (m でヘルプ): t
選択した領域 1
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 1 から 8e (Linux LVM) に変更しました

コマンド (m でヘルプ): p

ディスク /dev/sdb: 5368 MB, 5368709120 バイト
ヘッド 255, セクタ 63, シリンダ 652, 合計 10485760 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x99fe783f

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1            2048    10485759     5241856   8e  Linux LVM

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
 # pvcreate /dev/sdb1
   Physical volume "/dev/sdb1" successfully created
 # vgcreate VolGroup00 /dev/sdb1
   Volume group "VolGroup00" successfully created

lvcreateからが通常と違い、まずシンプール(Thin Pool Logica Volume)を作成し、次にシンプール内にシンプロビジョニングされたロジカルボリュームの作成を行います。

まずは、シンプールを作成します。

# lvcreate -l 100%FREE -T /dev/mapper/VolGroup00/ThinPool00  
  Logical volume "lvol0" created
  Logical volume "ThinPool00" created

# lvs
  LV         VG         Attr       LSize   Pool       Origin Data%  Move Log Cpy%Sync Convert
  ThinPool00 VolGroup00 twi-a-tz--   4.98g                     0.00

これで、ボリュームグループVolGroup00内に、ThinPool00を作成しました。ThinPool00と一緒にlvol0という名前のメタデータ用のLVも作成されているのが分かります。

次に、ThinPool00内にシンプロビジョニングされたロジカルボリュームを作成します。

# lvcreate -V 100G -T /dev/mapper/VolGroup00-ThinPool00 -n lv_data
Logical volume "lv_data" created

# lvs
  LV         VG         Attr       LSize   Pool       Origin Data%  Move Log Cpy%Sync Convert
  ThinPool00 VolGroup00 twi-a-tz--   4.98g                     0.00
  lv_data    VolGroup00 Vwi-a-tz-- 100.00g ThinPool00          0.00

# lvscan
  ACTIVE            '/dev/VolGroup00/ThinPool00' [4.98 GiB] inherit
  ACTIVE            '/dev/VolGroup00/lv_data' [100.00 GiB] inherit

ThinPool00は5GB程度しかありませんが、100GBのロジカルボリュームlv_dataが作成されているのが分かります。 それでは、フォーマットしてマウントしてみましょう。

# mkfs.ext4 /dev/VolGroup00/lv_data
mke2fs 1.41.12 (17-May-2010)
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=16 blocks
6553600 inodes, 26214400 blocks
1310720 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
800 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624, 11239424, 20480000, 23887872

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 37 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

# mount /dev/VolGroup00/lv_data /mnt/
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              15G  1.2G   13G   9% /
tmpfs                 939M     0  939M   0% /dev/shm
/dev/mapper/VolGroup00-lv_data
                       99G  188M   94G   1% /mnt

ちゃんと100GBで見えていることが分かりますね。

これで、ファイルシステムを拡張することなく100GBまではつかえるので、将来に備えて大きめに確保しておくことが可能になります。

もし物理的に足りなってきた場合は、ディスクを追加し、シンプールへディスクを追加すればOKです。

シンプロビジョニングされたスナップショットボリューム

シンプロビジョニングされたボリュームは、シンプロビジョニングされたスナップショットボリュームを作成することができます。

実の所、個人的にはこちらのスナップショットの方に注目しています。今までのLVMもスナップショットはサポートしていますが、VolumeGroupに空きがないと作成できませんでした。要するにスナップショット用に別途容量を確保しておくことが必要でした。(同容量確保しておく必要はない。)

また、作成した容量を超えた書き込みをするとスナップショットが壊れてしまい、今ひとつ使い勝手が悪かったように思います。

シンプロビジョニングされたスナップショットボリュームはシンプロビジョニングの恩恵を受けることが可能で、別途VolumeGroupに空きがなくても、シンプールに空きがあれば作成することができます。また、スナップショットのスナップショットを作ることもできます。

それではシンプロビジョニングされたスナップショットボリュームを作成してみましょう。

# lvcreate -s /dev/VolGroup00/lv_data -n lv_data_snap1
  Logical volume "lv_data_snap1" created

今までのスナップショットと違い、サイズの指定は不要です。シンプロビジョニングのおかげですね。また、作成したスナップショットはシンボリュームとほとんど同じ扱いになるため、スナップショットのスナップショット作成も可能です。

なお、スナップショットは作成した際に"activation skip"のフラグ(lvsコマンドのAttrでkのフラグ)がついた状態で作成されるため、ボリュームのアクティブ化にはlvchangeに[-K|--ignoreactivationskip]のオプションが必要です。

# lvs
LV            VG         Attr       LSize   Pool       Origin  Data%  Move Log Cpy%Sync Convert
  ThinPool00    VolGroup00 twi-a-tz--   4.98g                      0.00
  lv_data       VolGroup00 Vwi-a-tz-- 100.00g ThinPool00           0.00
  lv_data_snap1 VolGroup00 Vwi-a-tz-k 100.00g ThinPool00 lv_data   0.00

# lvscan
  ACTIVE            '/dev/VolGroup00/ThinPool00' [4.98 GiB] inherit
  ACTIVE            '/dev/VolGroup00/lv_data' [100.00 GiB] inherit
  inactive          '/dev/VolGroup00/lv_data_snap1' [100.00 GiB] inherit

# lvchange -ay /dev/VolGroup00/lv_data_snap1 -K

# lvscan
  ACTIVE            '/dev/VolGroup00/ThinPool00' [4.98 GiB] inherit
  ACTIVE            '/dev/VolGroup00/lv_data' [100.00 GiB] inherit
  ACTIVE            '/dev/VolGroup00/lv_data_snap1' [100.00 GiB] inherit

シンプールを利用したスナップショットは以前よりも使いやすくなったため、何かに使えそうですよね! なにか面白い使い方を思いついた方は是非教えてください!

Copyright © IDC Frontier Inc.