※この記事は公開されてから1年半以上経過しています。情報が古い可能性がありますのでご注意ください。
こんにちは。梶川です。
Linuxの論理ボリュームマネージャであるLVM(logical volume manager)は皆さんご存知かと思います。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
シンプールを利用したスナップショットは以前よりも使いやすくなったため、何かに使えそうですよね! なにか面白い使い方を思いついた方は是非教えてください!