参考資料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パーティション
100MBくらいのLinuxパーティションです。これを「/boot」とします。 - 第2パーティション
2GBくらいのLinux LVMパーティションです。これをシステム用VG「vg01」とします。この中に「root_lv(/)」と「swap_lv(swap)」があり、その中にFedora Coreがインストールされているとします。 - 第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の情報源
- LVM HOWTO
- Logical Volume Manager HOWTO
- Logical Volume Manager HOWTO(日本語訳)
- IBM developerWorks Learning Linux LVM