LVM

Last-modified: 2015-04-09 (木) 02:35:39

参考資料1

1章 LVM入門

パーティション管理の悩み

 Linuxユーザーなら誰でも、パーティション管理に悩まされたことあるかと思います。
「/とswapだけにしようか、/varは2GBほしいかな。いやいやswapは実メモリの2倍必要だ…。」
 いくら悩んでパーティション設計を行ったとしても、リミットは忘れた頃に訪れます。デスクトップやワークステーションとして利用していた場合、作成したデータを蓄積する「/home」が、サーバーとして運用していた場合には「/var」や「/tmp」が溢れることが多いと思います。
 そんなとき、「パーティションが再起動なしで広げれればいいのになぁ」と思ったことありませんか?この悩みを解決する方法、それがLVM(Logical Volume Manager, 論理ボリュームマネージャー)です。
 1章ではLVMの用語を含む入門編、2章では基本操作、3章では応用操作をご紹介します。

LVM(論理ボリュームマネージャー)とは?

 LVMは、商用UNIXでは何年も前から使われてきた一般的なディスク管理の手法です。SolarisやAIX、HP-UXなどを触ったことがある方ならば、一度はLVMという言葉を聞いたこともあるかと思います。
 ハードディスクをパーティションで区切るのではなく、あらかじめハードディスクをPEという一定サイズの記憶領域のカプセルに分け、そのPEを必要な時に必要な分だけ使用します。

PE(物理エクステント)とは?

 PEとは、LVMが扱う記憶領域の最小単位です。一般的なLinuxディストリビューションではデフォルトPEサイズは4MBとなっています。
 このPEサイズは任意で指定できますが、そのサイズは大き過ぎても、小さ過ぎてもいけません。1つの「LV」(Logical Volume. 後述します)が持てるPE数には上限があり、最大65,536個までとなっています。そのため、PEサイズが4MBでは256GBまでしか扱えないことになります。
 といって、逆に大きすぎるとパーティション内のPEサイズで割り切れない分が無駄になります。
 例えば、図1のように100MBのLVMパーティションをPEサイズ16MBで初期化した場合には、PEが6つ作られ4MBが余ります。これがPEサイズ64MBの場合ならば、PEが1つしか作れず36MBも余ってしまうことになります。
 最近のハードディスクの容量を考慮すると、PEサイズは16MB(上限1TB)か32MB(上限2TB)あたりがちょうどよいかと思います。
 PEサイズの設定値の範囲は、8KBから512MBまでです。

PV(物理ボリューム)とは?

 PV(Phygical Volume, 物理ボリューム)とは、物理的な記憶媒体を示します。1つのPVが1つのディスクと対応するのが一般的ですが、LinuxのLVMでは、1つのディスクと対応させることも、1つのLinux LVMパーティションと対応させることも可能です。
 Linux LVMパーティションのパーティションIDは8e(16進数)です。fdiskなどで作成する際にはパーティションIDの変更を行わなければ鳴りません。

VG(ボリュームグループ)とは?

 VG(Volume Group, ボリュームグループ)とは、複数のPVをまとめるグループです。VGを作成することで、PVをまとめて1つの大きな記憶領域として振る舞わせることができるようになります。つまり、小さなHDDでも複数台用意すれば、1つの大きなHDDとして見せることができるということです。
 最近では、ファイルサーバーやデータベースサーバーに1TB以上のデータを格納するケースも珍しくありません。1TBのパーティションが必要な場合、250GBのハードディスクを4つ用意すれば実現できます。

LV(論理ボリューム)とは?

 LV(Logical Volume, 論理ボリューム)とは、実際にファイルシステムを作る入れ物です。従来のパーティションと対応します。
 LVは、PEの集まりで出来ています。そのため、PEサイズの倍数で作成する必要があります。たとえば、PEサイズが32MBだった場合、48MBのLVは作成できません。

ファイルシステムとは?

 ファイルシステムとは、実際にファイルが格納される記憶領域です。従来の環境ではパーティション上に作られますが、LVM環境ではLV上に作られます。
 現在、Linuxで使われているファイルシステムには、Linux ext2や、Linux ext3、ReiserFS、JFS、XFSなどがあります。どのファイルシステムにも一長一短があり、それぞれの特徴を活かすも殺すも管理者次第です。

1章のまとめ

 PV、VG、LVと用語がたくさんあり、難しいと思われる方も多いかと思います。でも心配いりません。使っているうちに慣れます。「百聞は一見にしかず」と言われるとおり、LVMも習うより慣れろです。
 次の章ではLVM環境を実際に構築してみたいと思います。


2章 LVM操作 基本編

前提条件

 記事中のコマンドは、図2のような構成を前提としています。

  1. 第1パーティション
    100MBくらいのLinuxパーティションです。これを「/boot」とします。
  2. 第2パーティション
    2GBくらいのLinux LVMパーティションです。これをシステム用VG「vg01」とします。この中に「root_lv(/)」と「swap_lv(swap)」があり、その中にFedora Coreがインストールされているとします。
  3. 第3パーティション
    4GBくらいのLinux LVMパーティションです。これをテスト用VG「testvg」とします。テスト用VG「testvg」は記事中で作成するため、事前に作成されなくて結構です。

 大切なのは操作の流れを理解することですので、まったく同じ環境でなくても問題はありません。
図2 本稿の前提環境

LVMパーティションを作成する

 まず、Linux LVMパーティションを作成します。
 Linux上でLVMを利用するには、空きディスクか、Linux LVMパーティションが少なくても1つ必要です。パーティション番号は、前述のとおり16進数で8eです。Linux LVMパーティションの作成には、fdiskや、cfdiskなどパーティション操作が行なえるツールを使います。

fdiskコマンドでLVMパーティションを作成する

 今回は、fdiskを使ってLinux LVMパーティションする流れをご紹介します。図3をご覧下さい。
 まず、「n」コマンドで新規パーティションを作成し、「t」コマンドでパーティションタイプを変更します。
 パーティションを作成した後、確認するために「p」コマンドを実行します。問題がなければ、「w」コマンドでパーティションテーブルを保存します。
 「カーネルはまだ古いテーブルを使っています。新しいテーブルは次回リブート時に使えるようになるでしょう。」というメッセージが表示された場合、再起動するかpartprobeコマンドを実行します。
 partprobeコマンドは、Fedora CoreをはじめとするRed Hat系ディストリビューションに含まれるコマンドです。ディスクからパーティションテーブルを読み込み、カーネル内のパーティションテーブルに反映することができます。

図3 LVMパーティションを作成

# fdisk /dev/hda
コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 3
領域番号 (1-4): 3
最初 シリンダ (4417-19590, default 4417):
Using default value 4417
終点 シリンダ または +サイズ または +サイズM または +サイズK (4417-19590, default 19590):
Using default value 19590
コマンド (m でヘルプ): t
Partition number (1-4): 3
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 3 から 8e (Linux LVM) に変更しました
コマンド (m でヘルプ): p
Disk /dev/hda: 10.1 GB, 10110320640 bytes
16 heads, 63 sectors/track, 19590 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1         249      125464+  83  Linux
/dev/hda2             250        4416     2100168   8e  Linux LVM
/dev/hda3            4417       19590     7647696   8e  Linux LVM
Command (m for help): w
領域テーブルは交換されました!
ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。

警告: 領域テーブルの再読込みがエラー 16 で失敗しました: デバイスもしくはリソースがビジー状態です。
カーネルはまだ古いテーブルを使っています。
新しいテーブルは次回リブート時に使えるようになるでしょう。
ディスクを同期させます。

PVを作成する

 Linux LVMパーティションを作成した後に、PVを作成します。
 PVを作成するには、pvcreateというコマンドを使います。(図4) このコマンドを実行することにより、LVMパーティションが区画整備されます。PVがうまく作成されたか確認するには、pvdisplayコマンドを実行します。

図4 PVを作成

# pvcreate /dev/hda3
  Physical volume \"/dev/hda3\" successfully created]
# pvdisplay -C
  PV         VG     Fmt  Attr PSize PFree
  /dev/hda2  vg01   lvm2 a-   2.00G    0
  /dev/hda3         lvm2 --   7.29G 7.29G
# pvdisplay /dev/hda3
  --- Physical volume ---
  PV Name               /dev/hda3
  VG Name
  PV Size               7.29 GB
  Allocatable           NO
  PE Size (KByte)       0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               1RA8bb-JHjJ-KfAO-JobK-QKAg-aYp4-eAdGJ0

VGを作成する

 PVの作成を行った後、PVをまとめるためにVGを作成します。
 VGを作成するには、vgcreateというコマンドを使います。(図5) このコマンドを実行することによりVGが定義され、同時にPVの中にPEが作成されます。
 今回はPEサイズ32MBで作成します。VGが作成されたことを確認するには、vgdisplayコマンドを実行します。

図5 VGを作成

# vgcreate -s 32m testvg /dev/hda3
  Volume group \"testvg\" successfully created
# vgdisplay -C
  VG     #PV #LV #SN Attr  VSize VFree
  testvg   1   0   0 wz--n 7.28G 7.28G
  vg01     1   2   0 wz--n 2.00G    0
# vgdisplay testvg
  --- Volume group ---
  VG Name               testvg
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               7.28 GB
  PE Size               32.00 MB
  Total PE              233
  Alloc PE / Size       0 / 0
  Free  PE / Size       233 / 7.28 GB
  VG UUID               Sqfqv5-i3s3-CnvX-MZW3-bl9M-bHQA-3WnD1B

LVを作成する

 VGの作成が終われば、もうあと少しです。次に実際にLVを作成します。
 LVを作成するには、lvcreateというコマンドを使います。(図6) 今回はテスト用VG「testvg」上に1GBの「opt_lv」というLVを作成します。LVがうまく作成できたか確認するには、lvdisplayコマンドを実行します。

図6 LVを作成

# lvcreate -L 1G -n opt_lv testvg
  Logical volume \"opt_lv\" created
# lvdisplay -C
  LV      VG     Attr   LSize   Origin Snap%  Move Copy%
  opt_lv  testvg -wi-a-   1.00G
  root_lv vg01   -wi-ao   1.50G
  swap_lv vg01   -wi-ao 512.00M
# lvdisplay /dev/testvg/opt_lv
  --- Logical volume ---
  LV Name                /dev/testvg/opt_lv
  VG Name                testvg
  LV UUID                jsyfKs-Ri3q-cPdt-pTcI-BAX3-chrG-hGP5zl
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                1.00 GB
  Current LE             32
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           253:2

ファイルシステムを作成する

 LVを作成した後、その中にファイルシステムを作ります。
 ファイルシステムを作成するには、mkfsコマンドを使います。(図7)
 最近ではファイルシステムの種類ごとにmkfs.ext2、mkfs.ext3、mkfs.xfsなどといったコマンドも用意されています。今回は、XFSでフォーマットします。

図7 ファイルシステムを作成
# mkfs.xfs -f /dev/testvg/opt_lv
meta-data=/dev/testvg/opt_lv     isize=256    agcount=8, agsize=32768 blks
         =                       sectsz=512
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks, unwritten=1
naming   =version 2              bsize=4096
log      =internal log           bsize=4096   blocks=2560, version=1
         =                       sectsz=512   sunit=0 blks
realtime =none                   extsz=65536  blocks=0, rtextents=0

ファイルシステムをマウントする

 ファイルシステムを作りましたので、ようやくマウントすることができます。
 従来のパーティション管理と同じく、mountコマンドを実行します。きちんとマウントされているか、dfコマンドで確認します。(図8)

図8 ファイルシステムをマウント

# mount /dev/testvg/opt_lv /opt
# df -h /opt/
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/testvg-opt_lv
                     1014M  144K 1014M   1% /opt

2章のまとめ

 いかがだったでしょうか?この「基本編」だけでは、まだLVMの便利さが体感できないかもしれません。
 各種のcreate系、display系コマンドを覚えて頂ければ、この章の目的は達成です。
 何度か環境を壊すくらい実行すれば、コマンドも覚えてしまうはず。次の章ではLVMを活用する方法をご紹介します。Linux生活が便利になるかもしれません。

3章 LVM操作 応用編

応用1 LVのリサイズ

LVのサイズは変更することができます。拡大も縮小も行なえます。
もっとも、そのためにはLV内のファイルシステムがリサイズ機能をサポートしているの必要があります。
しかし心配は無用です。Linuxで一般的に使われているLinux ext2、Linux ext3/ext4、ReiserFSなどのファイルシステムは、すでにサポートしています。
なお、XFS、JFSといった一部のファイルシステムはサイズ縮小機能をサポートしていません。Fedora Core 4におけるファイルシステム別のリサイズ対応状況をまとめると表1のようになります。
このリサイズ機能を使う機会としては、次のような場合が挙げられます。
•ログ領域が予想以上に使用し「/var/log」が圧迫している場合
•yumで多量のパッケージをアップデートする際に「/var/cache/yum」が肥大しすぎる場合
•ISOイメージをダウンロードする際に「/home」を一時的に大きくしたい場合

とくにISOイメージのために「/home」を一時的に大きくした場合は、CD-Rへ焼き終えた後、確保した領域は不要となります。このような場合、LVのリサイズは非常に効果的です。

表1 ファイルシステム別のリサイズ対応状況(Fedora Core 4の場合)

ext2 ext3/ext4 ReiserFS XFS JFS
拡大 オフライン ※1(resize2fs) オンライン/オフライン(resize2fs) オンライン/オフライン(resize_reiserfs) オンライン(xfs_growfs) オンライン(mount -o remount,resize)
縮小 オフライン オフライン オフライン なし なし

※1 ext2用のオンラインリサイズパッチは過去に存在していました。

(1) LVのリサイズするには

LVのリサイズには、lvresize、lvextend、lvreduceといったコマンドを使います。また、LVのリサイズの中にも、マウントしたままサイズ変更される「オンラインリサイズ」と、一度アンマウントした後にリサイズを行う「オフラインリサイズ」があります。
Linux上の一般的なファイルシステムはオンラインリサイズができます。

(2) LVのサイズ拡大

サイズの拡大は、まず入れ物であるLVを先に大きくし、その後、中身のファイルシステムを大きくします。(図9)
LVのサイズを拡大には、lvresizeコマンドか、lvextendコマンドを使います。(図10) 次にファイルシステムを拡大します。この場合、ファイルシステム固有のコマンドを使います。(表1を参照)

図9 LVのサイズ拡大

図10 LVのサイズ拡大

# lvextend -L +512M /dev/testvg/LVName
Extending logical volume LVName to 1.50 GB
Logical volume LVName successfully resized

[1] Linux ext2の場合

Linux ext2の場合はオンラインリサイズを行えません。一度アンマウントし、fsck.ext2コマンドでファイルシステムの整合性をチェックします。
その後、resize2fsコマンドにてサイズを行い、最後に再度マウントします。(図11)

図11 Linux ext2のサイズ拡大

# umount /mnt/MountPoint
# fsck.ext2 -f /dev/testvg/LVName
e2fsck 1.37 (21-Mar-2005)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/testvg/LVName: 12/131072 files (8.3% non-contiguous), 262144/262144 blocks
# resize2fs /dev/testvg/LVName 1534M
resize2fs 1.37 (21-Mar-2005)
Resizing the filesystem on /dev/testvg/LVName to 392704 (4k) blocks.
The filesystem on /dev/testvg/LVName is now 392704 blocks long.
# mount -t ext2 /dev/testvg/LVName /mnt/MountPoint

[2] Linux ext3/ext4の場合

Linux ext3/ext4の場合はオンラインリサイズが可能です。マウントしたままの状態で
マウントしたままの状態で resize2fs コマンドをします。(図12.1)
一部の古いLinuxではext2onlineコマンドが提供されております。(図12.2)

図12.1 Linux ext3/4のサイズ拡大

# resize2fs /dev/testvg/LVName
resize2fs 1.40.8 (13-Mar-2008)

図12.2 Linux ext3のサイズ拡大

# ext2online /dev/testvg/LVName
ext2online v1.1.18 - 2001/03/18 for EXT2FS 0.5b

[3] ReiserFSの場合

ReiserFSの場合はオンラインリサイズが可能です。マウントしたままの状態で
resize_reiserfsコマンドを実行します。(図13)

図13 ReiserFSのサイズ拡大

# resize_reiserfs /dev/testvg/LVName
resize_reiserfs 3.6.18 (2003 www.namesys.com)
resize_reiserfs: On-line resizing finished successfully.

[4] XFSの場合

XFSの場合はオンラインリサイズが可能です。マウントしたままの状態でxfs_growfsコマンドを実行します。(図14) ここで注意すべき点は、LV名ではなくマウントポイントを指定することです。

図14 XFSのサイズ拡大

# xfs_growfs /mnt/MountPoint
meta-data=/mnt/MountPoint        isize=256    agcount=8, agsize=32768 blks
=                       sectsz=512
data     =                       bsize=4096   blocks=262144, imaxpct=25
=                       sunit=0      swidth=0 blks, unwritten=1
naming   =version 2              bsize=4096
log      =internal               bsize=4096   blocks=2560, version=1
=                       sectsz=512   sunit=0 blks
realtime =none                   extsz=65536  blocks=0, rtextents=0
data blocks changed from 262144 to 393216

[5] JFSの場合

JFSの場合はオンラインリサイズが可能です。マウントしたままの状態で
mountコマンドを実行します。(図15) ファイルシステムを再マウントする際にresizeオプションがあれば、内部でリサイズ処理が行われます。

図15 JFSのサイズ拡大

# mount -t jfs -o remount,resize /dev/testvg/LVName /mnt/MountPoint

(3) LVのサイズ縮小
サイズ縮小は、まず中身のファイルシステムを先に小さくし、その後、入れ物であるLVを小さくします。(図16)
ファイルシステムのサイズ縮小する際には、fsckでファイルシステムをチェックし、ファイルシステム固有のコマンドを使って縮小します。(表1を参照)
「LVのリサイズ」で述べましたが、XFSとJFSにはサイズ縮小のコマンドが用意されていません。
LVのサイズ縮小には、lvresizeコマンドか、lvreduceコマンドを使います。

図16 LVのサイズ縮小

[1] Linux ext2/ext3/ext4の場合

Linux ext2/ext3/ext4はサイズ縮小の際、オフラインリサイズが必要です。
一度アンマウントし、fsck.ext2/fsck.ext3/fsck.ext4コマンドでファイルシステムの整合性をチェックします。(図17) その後、resize2fsコマンドにてサイズ縮小を行い、lvreduceコマンドにてLVのサイズ縮小を行います。最後にマウントします。

図17 Linux ext2/ext3のサイズ縮小

# umount /mnt/MountPoint
# fsck.ext2 -f /dev/testvg/LVName (← ext3の場合、fsck.ext3)
e2fsck 1.37 (21-Mar-2005)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/testvg/LVName: 12/196608 files (8.3% non-contiguous), 265057/393216 blocks
# resize2fs /dev/testvg/LVName 1024M
resize2fs 1.37 (21-Mar-2005)
Resizing the filesystem on /dev/testvg/LVName to 392704 (4k) blocks.
The filesystem on /dev/testvg/LVName is now 392704 blocks long.
# mount -t ext2 /dev/testvg/LVName (← ext3の場合、mount -t ext3)

[2] ReiserFSの場合

ReiserFSはサイズ縮小の際、オフラインリサイズが必要です。
一度アンマウントし、resize_reiserfsコマンドにてサイズ縮小を行います。(図18) そして、lvreduceコマンドにてLVのサイズ縮小(図19)が完了した後、マウントします。

図18 ReiserFSのサイズ縮小

# resize_reiserfs /dev/testvg/LVName
resize_reiserfs 3.6.18 (2003 www.namesys.com)
resize_reiserfs: On-line resizing finished successfully.

図19 LVのサイズ縮小

# lvreduce -L -512M /dev/testvg/LVName
WARNING: Reducing active logical volume to 1.00 GB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce LVName? [y/n]: y
Reducing logical volume LVName to 1.00 GB
Logical volume LVName successfully resized

応用2 PVの移動

PVの移動は、複数のPVでVGを形成している環境で、PVを切り離す際に利用できます。以下のような環境を想定してみます。(図20)

  • 「/dev/sda」と「/dev/sdb」でデータ用VG「datavg」を形成している。
  • 「/dev/sdc」と「/dev/sdd」でバックアップ用VG「backupvg」を形成している。

このような環境でdatavgの領域が足りず、そして、backupvgが余っているとします。そこで、backupvgの「/dev/sdd」をbackupvgから切り離してdatavgへ追加したいと思います。
実際にPVを移動するコマンドは、図21のようになります。
なお、pvmoveコマンドは、PV内のPEを転送先PVへ転送するのにかなりの時間がかかります。テスト環境では1Gバイトあたり約4分かかりました。

図20 PVの移動

図21 backupvgからdatavgへPVを移動させる作業の流れ
# vgdisplay -C datavg backupvg
VG       #PV #LV #SN Attr  VSize  VFree
backupvg   2   2   0 wz--n 40.00G 26.00G
datavg     2   5   0 wz--n 40.00G      0
# pvmove /dev/sdd
/dev/sdd: Moved: 0.0%
/dev/sdd: Moved: 3.1%
/dev/sdd: Moved: 6.2%
/dev/sdd: Moved: 9.4%
/dev/sdd: Moved: 12.5%
(途中省略...)
/dev/sdd: Moved: 96.9%
/dev/sdd: Moved: 100.0%
# vgreduce backupvg /dev/sdd
Removed \"/dev/sdd\" from volume group \"backupvg\"
# vgextend datavg /dev/sdd
Volume group \"datavg\" successfully extended
# vgdisplay -C datavg backupvg
VG       #PV #LV #SN Attr  VSize  VFree
backupvg   1   2   0 wz--n 20.00G  6.00G
datavg     3   5   0 wz--n 60.00G 20.00G

応用3 スナップショットLV

LVMの便利な機能として、スナップショットは外せません。Linux LVMでは、スナップショット機能をLVに実装しています。
データベースに関わっている方はスナップショットという言葉を聞いたことがあるかもしれません。スナップショットとは動いているシステムの断片を写真に撮ったように記録する方法です。使い道として、以下のような場合が考えられます。

  • データベースをオンラインバックアップする場合
  • PHP、Perlなどを使ったWebコンテンツのバックアップを行う場合
  • rsyncを行う際にデータの整合性を合わせる場合
    などなど、工夫次第でいろいろな使い方ができる機能です。

(1) テストデータの作成
スナップショットLVの作成を行う前に、何らかのデータがないと面白くありません。筆者が好きなddコマンドでテスト用のデータを作りたいと思います。(図22)
図22の例では、ループで「/dev/urandom」からテストデータを作成し、md5sumコマンドでデータのハッシュ値を求めて保存しています。なお、この例の中の「/opt」は、前述の「LVを作成する」(図6)で作成したものです。あらかじめマウント状態になっているものとします。

図22 テスト用に適当なデータを作る

# i=1;
# while [ $i -lt 512 ]
do
dd if=/dev/urandom of=/opt/${i}.dat bs=${i}M count=1
((i=i*2))
done
# cd /opt
# md5sum *.dat > md5sum.base

(2) スナップショットLVの作成
さっそく、スナップショットLVを作ってみましょう。スナップショットLVの作り方は簡単です。任意のLVを指定し、lvcreateコマンドを実行するだけです。(図23)
スナップショット領域は、LVサイズの10%〜30%で指定するとよいと思います。今回は256Mバイトとしました。また、バッファに入っている書き込まれていないデータは最近の実装ではスナップショットLVの作成時に書き込まれるようになりました。そのため、sync コマンドや fsfreeze、xfs_freeze などのコマンドは実行しなくても問題ありません。
なお、fsfreeze や xfs_freezeコマンドはファイルシステムの書き込みを禁止/解除するコマンドです。

図23 スナップショットLVの作成

# lvcreate -s -L 256m -n opt_snap /dev/testvg/opt_lv

(3) テストデータを追加・削除
スナップショットLVが作成できたので、テストデータを追加したり削除したりしてみましょう。(図24)
まず、先程図22で作成した32Mバイトのファイル「/opt/32.dat」を削除します。そして、スナップショット領域の使用率をlvdisplayコマンドで確認してみます。すると図24のように、たった0.12%しか消費していないことがわかります。これは削除情報の分だけ変更情報として持っているためです。
次に64Mバイトのファイル「/opt/64.dat2」を追加します。もう一度lvdisplayコマンドで確認すると、今度は25%(64Mバイト/256Mバイト)消費しました。(図24) 追加情報は、その容量分だけスナップショット領域を消費します。

図24 データの追加・削除時のスナップショット領域の使用率を見る

# rm -f /opt/32.dat
# lvdisplay -C /dev/testvg/opt_snap
LV       VG     Attr   LSize   Origin Snap%  Move Copy%
opt_snap testvg swi-a- 256.00M opt_lv   0.12
# dd if=/dev/urandom of=/opt/64.dat2 bs=64M count=1
# lvdisplay -C /dev/testvg/opt_snap
LV       VG     Attr   LSize   Origin Snap%  Move Copy%
opt_snap testvg swi-a- 256.00M opt_lv  25.17

(4) スナップショットLVの確認
テストデータの追加と削除を行ったので、今度はスナップショットが本当に取得されたのか実際にマウントし、lsコマンドで内容を確認してみることにしましょう。(図25)
※2 XFSの場合は、マウント時にマウントオプション「ro,nouuid」を忘れずに指定してください。
lsコマンドで確認してみると、先ほど削除したはずの「32.dat」が存在し、追加したはずの「64.dat2」が存在しません。(図25) また、ファイルの中身が本当に正しいのかmd5sumコマンドで確認してみます。
※3 なお、差分データがスナップショット領域を超えると、対象スナップショットLVが壊れます。

図25 スナップショットが本当に取得されているのか確認

# mkdir /opt_snap
# mount -o ro,nouuid /dev/testvg/opt_snap /opt_snap
# cd /opt_snap
# ls
128.dat  1.dat    2.dat   4.dat   8.dat
16.dat   256.dat  32.dat  64.dat  md5sum.base
# md5sum --check md5sum.base
128.dat: OK
16.dat: OK
1.dat: OK
256.dat: OK
2.dat: OK
32.dat: OK
4.dat: OK
64.dat: OK
8.dat: OK

(5) スナップショットLVの解放
使い終わったスナップショットLVはlvremoveコマンドにて解放します。マウント状態のままでしたら、umountを忘れずに行います。(図26)

図26 スナップショットLVの解放

# cd
# umount /opt_snap
# lvremove -f /dev/testvg/opt_snap
Logical volume \"opt_snap\" successfully removed

応用4 PVのリサイズ

Fedora Core 5 以降、Red Hat Enterprise Linux 4 Update 4 以降から PV をオンラインでリサイズする pvresize コマンドが新しく加わりました。もしもLUNのオンラインリサイズを行えるストレージ(/dev/sdb)をお使いの場合、PVのリサイズを行うことが可能です。(図27)
この機能を使う際にはLUNにパーティションを作らず、そのままPVとして扱うと運用が楽になります。PVのリサイズが終われば通常通り、応用1でご説明したようにLVのリサイズを行えばオンラインでの容量拡張が可能になります。
図27 PVのオンラインリサイズ

# pvscan
PV /dev/sda2   VG rootvg       lvm2 [74.00 GB / 14.00 GB free]
PV /dev/sdb    VG datavg       lvm2 [10.00 GB / 0     free]
Total: 2 [84.00GB] / in use: 2 [84.00 GB] / in no VG: 0 [0   ]
# pvresize /dev/sdb
Physical volume \"/dev/sdb\" changed
1 physical volume(s) resized / 0 physical volume(s) not resized
# pvscan
PV /dev/sda2   VG rootvg       lvm2 [74.00 GB / 14.00 GB free]
PV /dev/sdb    VG datavg       lvm2 [20.00 GB / 10.00 GB free]
Total: 2 [94.00GB] / in use: 2 [94.00 GB] / in no VG: 0 [0   ]

3章のまとめ

3章は応用編ということで、いくつかのLVMの魅力的な点を紹介させて頂きました。なお、ドキュメント化されていなかった点については、Linuxカーネルのソースコードを元に記述しました。環境によっては若干動作が変わるかもしれません。
最近のディストリビューションではLVMが標準で使えますので、普段Fedora Coreを使わない方も、この記事を機に一度LVMをお試し頂ければ幸いです。
Linux LVMの情報源