特集
2003/08/08 13:00:00 更新


特集:LVMによるディスクパーティションの動的化(後編) (3/5)


LVMの操作には2つのシーンがある

 ここから先は、LVMの操作に関する詳細な設定を紹介していこう。LVの削除にまつわる問題や、VG/PVの削除という問題を含んでいる。

 LVMの操作は、「その場でできること」と「前処理をしておかないといけないこと」の2つに分かれている。

 例えば、VGへPVを追加することはいつでも行えるが、VGそのものを削除しようという場合は、手軽には行えない。その理由は、対象となるVGから生成されているLVを、マウントしているかもしれないからだ。もしも、VG自体を消そうとする場合には、

1. 生成しているLVを全て削除する

2. VGを非活性状態にして

3. VGを削除する

 と、手順を追う必要がある。LVの削除は、「lvremove」コマンドで行う。

# /sbin/lvremove /dev/system/work
    lvremove -- do you really want to remove "/dev/system/work"? [y/n]: y
    lvremove -- doing automatic backup of volume group "system"
    lvremove -- logical volume "/dev/system/work" successfully removed

 今回、VG「system」には、ここで削除をしたLV「work」のみの存在なため、この状態ではLVが無くても削除可能だ。しかし、VGの削除を行うための「vgremove」コマンドを用いても、

# /sbin/vgremove system
    vgremove -- ERROR: can't remove active volume group "system"

 とエラーになってしまい削除に失敗する。VGそのものが活性状態ではならないということだ。そこで登場するのが「vgchange」コマンドである。このコマンドにより、非活性状態(-a n)へ移行でき、削除が行えるようになる。次の通りだ。

# /sbin/vgchange -a n system
    vgchange -- volume group "system" successfully deactivated
# /sbin/vgremove system
    vgremove -- volume group "system" successfully removed

 これで利用していたPV(/dev/hda7、/dev/hda8)は、別のVGの作成や追加にまわすことが可能である。このような手順は、LVやVGの状態によりうまくいかない場合があるが、エラー出力内容をよく見てほしい。

PV移動とVGからの取り外し方

 「ディスクの動作がおかしくなりだした」などの理由で、現在LVMに利用しているディスクを取り外したい場合、そのディスクのLVM上からデータを退避させなければならない。この手順を知っておけば、PV間でのデータ移行も可能になるので、ぜひ覚えておこう。

 VGにPVを追加する処理(vgextend)は、比較的容易に行えるものの、VGからPVを取り外すには若干の問題が生じる。なぜならば、取り外したいPV上のPEが利用されているかもしれないからだ。例えば、

# /sbin/vgcreate system /dev/hda7 /dev/hdc
    vgcreate -- INFO: using default physical extent size 4 MB
    vgcreate -- INFO: maximum logical volume size is 255.99 Gigabyte
    vgcreate -- doing automatic backup of volume group "system"
    vgcreate -- volume group "system" successfully created and activated

 とすると、VG名「system」には、PVとして/dev/hda7と/dev/hdcが含まれていることが分かり、

# /sbin/lvcreate -L2g -nwork system
    lvcreate -- doing automatic backup of "system"
    lvcreate -- logical volume "/dev/system/work" successfully created

 2GBの領域を切り出すよう指定した場合には、この2GBが/dev/hda7上に作られたのか、それとも/dev/hdc上に作られたのか、さらに両方をまたがって作成されたのかが分からないのだ。

 この状態で/dev/hda7をVGから外してしまうと、/dev/hda7上にあったデータはすべてロストすることになる。そのため、VGからPVを取り外すための「vgreduce」が失敗してしまうことになる。

# vgreduce -v system  /dev/hda7
    vgreduce -- locking logical volume manager
    vgreduce -- checking volume group name "system"
    vgreduce -- checking volume group "system" existence
    vgreduce -- checking volume group "system" activity
    vgreduce -- reading data of volume group "system" from disk(s)
    vgreduce -- reducing VGDA structures of volume group "system"
    vgreduce -- ERROR: can't reduce volume group "system" by used physical volume "/dev/hda7"

 この問題に対処するべくものが「PVの移動」だ。これは、同じVG上に指定したPV上のPEを移動させることを意味する。この方法でPVから使用中のPEが無くなれば、対象となるPVを取り外すことが可能だ。

 それでは実際にPVを移動させてみよう。そのために利用するコマンドが「pvmove」である。今回は、/dev/hda7を外すために、/dev/hda7内で使用中のPEを、ほかのPVへ移動させることにしよう。現在、/dev/hda8もVGに含めた状態で、「vgdisplay -v」指定により、各PV内の使用状況は次の通りになっている。

--- Physical volumes --- PV Name (#) /dev/hdc (2) PV Status available / allocatable Total PE / Free PE 1030 / 1027 PV Name (#) /dev/hda7 (1) PV Status available / allocatable Total PE / Free PE 1024 / 970 PV Name (#) /dev/hda8 (3) PV Status available / allocatable Total PE / Free PE 1024 / 569

 つまり、/dev/hda7には54個のPE(1024-970=54)が使用中ということだ。この54個のPEをほかのVGへ追い出せれば、/dev/hda7は削除可能となるわけだ。前述のpvmoveを使おう。

# pvmove -v /dev/hda7
    pvmove -- checking name of source physical volume "/dev/hda7"
    pvmove -- locking logical volume manager
    ...
    pvmove -- moving physical extents in active volume group "system"
    pvmove -- WARNING: if you lose power during the move you may need
            to restore your LVM metadata from backup!
    pvmove -- do you want to continue? [y/n] y
    pvmove -- starting to move extents away from physical volume "/dev/hda7"
    pvmove -- checking for enough free physical extents in "system"
    pvmove -- /dev/hda7 [PE 3 [work [LE 3]] -> /dev/hda8 [PE 0] [1/54]
    pvmove -- /dev/hda7 [PE 4 [work [LE 4]] -> /dev/hda8 [PE 1] [2/54]
    ... 移動中                                        pvmove -- /dev/hda7 [PE 510 [work [LE 510]] -> /dev/hdc [PE 55] [53/54]
    pvmove -- /dev/hda7 [PE 511 [work [LE 511]] -> /dev/hdc [PE 56] [54/54]
    pvmove -- changing lvmtab
    pvmove -- checking volume group name "system"
    pvmove -- checking volume group consistency of "system"
    pvmove -- checking existence of "/etc/lvmtab.d"
    ...
    pvmove -- unlocking logical volume manager
    pvmove -- 54 extents of physical volume "/dev/hda7" successfully moved

 表示には移動中のPV数が表示され、完全に移動できたボリュームは、次のように指定することで外すことができる。

# vgreduce system /dev/hda7
    vgreduce -- doing automatic backup of volume group "system"
    vgreduce -- volume group "system" successfully reduced by physical volume:
    vgreduce -- /dev/hda7

 この方法であれば、古いハードディスクから新しいディスクにデータを移すことも可能だ。

 さらに、比較的起きそうなシチュエーションとして、既存の「/var」ディレクトリをLVMに変更する例を挙げよう。標準設定であれば、ログやWebページコンテンツで容量が増える可能性も高いスペースであるため、サイズ変更やディスク交換の行いやすいLVMにすることで管理を楽にすることができるディレクトリの1つだ。

 この場合には、前述するVG「system」を転用させることにしよう(なお、ここではhdcのアクセススピードが遅いため、ディスク「/dev/hdc」を外し、実パーティション「/dev/hda7」と「/dev/hda8」で構成することにする)。LV名をここでは「var」としておこう。ディレクトリ名そのままで割り振っておいたほうが分かりやすい。以下の指定は、1GBのLV「var」をVG「system」上に作成という意味だ。

$ sudo /sbin/lvcreate -nvar -L1g system
  lvcreate -- doing automatic backup of "system"
  lvcreate -- logical volume "/dev/system/var2" successfully created
$ sudo /sbin/mke2fs -j /dev/system/var2
  mke2fs 1.32 (09-Nov-2002)
  Filesystem label=
  OS type: Linux
  Block size=4096 (log=2)
  Fragment size=4096 (log=2)
  131072 inodes, 262144 blocks
  13107 blocks (5.00%) reserved for the super user
  First data block=0
  8 block groups
  32768 blocks per group, 32768 fragments per group
  16384 inodes per group
  Superblock backups stored on blocks:
          32768, 98304, 163840, 229376
  Writing inode tables: done
  Creating journal (8192 blocks): done
  Writing superblocks and filesystem accounting information: done
  This filesystem will be automatically checked every 35 mounts or
  180 days, whichever comes first.  Use tune2fs -c or -i to override.
$ sudo /sbin/tune2fs -c0 -i0 /dev/system/var2
  tune2fs 1.32 (09-Nov-2002)
  Setting maximal mount count to -1
  Setting interval between check 0 seconds

 なお、上記の例ではファイルシステムをext3にしているため、tune2fsでチェックのパラメータを操作追加している。この部分はフォーマットに利用するファイルシステムにより異なるため注意をしてほしい。

 ここでいちどランレベルを1に下げる(落とす)必要があり、なぜならば作業中に/varへの書き込みが発生するのが好ましくないからだ。続けて、次のように/varのダンプイメージを作成し、マウント操作をする。

# dump -0f /tmp/var.dump /var
# mount /dev/system/var /mnt

 さらにマウントしたLV上で、ダンプイメージを展開して戻せばよい。

# cd /mnt
# restore -rf /tmp/var.dump
# mv var/* .

# cd /
# mv var var.old
# mkdir var

 ここでは、念のために元のディレクトリを残しつつvarを作成後、fstabを修正しよう。

/dev/system/var /var ext3 defaults 1 2

 この状態で再度全マウントを行い(mount -a)、/varに問題がないかを確認した後、元のランレベルに戻せばよい。後日リサイズする際には、ランレベル1へと落とした後、/varをいちどアンマウント後、e2fsadmを使ってリサイズ、そして元のランレベルへ戻せばよい。

前のページ | 1 2 3 4 5 | 次のページ

[佐藤大輔,ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.