3章 LVM操作 応用編

3.1 応用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のサイズ拡大
図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のサイズ縮小
図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

3.2 応用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の移動
図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.3 応用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

3.4 応用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.5 3章のまとめ

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

Linux LVMの情報源

ナビゲーション

目次へ | 前のページへ | 次のページへ