ここを参照。
Logical Volume Managerのことです。これを行うと何が良いかというと、例えば皆さんもPCを長く使っているとこんなことがあるかと思います。
(」゜ロ゜)」(」゜ロ゜)」(」゜ロ゜)」オオオオオッッッ、これは便利!但し一つ問題が。HDに直接アクセスするのではなく、LVMというソフトウェアのオブラートを物理HDにかまし、上位アプリケーションはこいつにアクセスします。HDへの書き込みは、LVMが勝手にグループに属しているHDに分散書き込みします。なので、ディスクアクセス時のCPUオーバーヘッドが増えます。ですが/var、/home、データ置き場等、これだけあれば十分、という容量がはっきり分からないパーティションをきる場合は非常に有利といえますね。
おいちゃんところでは、LVMを最初は使用しない状態でスタートしましたので、LVM化する場合は、結局LVMを使わない場合と同じ事をする羽目になります。ですがこれは最初だけ。以下の方針を立てました。
多分これで大丈夫、なはず。ここで領域を若干残してあるのは、snapshotバックアップ領域を作っておくため。snapshotとは、データの書き換えとかが行われている運用中のディスクドライブのある瞬間の状態を保存する機能です。例えばバックアップ中にアプリによる書き換えが発生した場合、バックアップ開始時にバックアップされたデータが、バックアップ終了間際に書き換えられて、不整合が発生したりする可能性があります。本来は一旦アプリサービスを停止して書き換えを抑止した状態でバックアップを撮るのがいいのですが、サーバが停止するためそれもいや。そこでサービスを運用していながらディスクのsnapshotが取れる機能が生きてくるわけですね♪しかもこのsnapshot用に撮っておく領域は、実領域の1/10以下でいいときてるのでとても柔軟性があります。
と、言うわけで、基本的なLVMの使い方をやってみましょう。
カーネルのコンパイルオプションを確認してください。おいちゃんの所は2.6.ですので一般的にLVM2と言われる形式に合わせます。
Device Drivers ---> Multi-device support (RAID and LVM) ---> [*] Multiple devices driver support (RAID and LVM) < > RAID support <M> Device mapper support
このDevice Mapper supportをON、もしくはモジュール化してやります。
# emerge lvm2
終ったら
# echo 'devices { filter=["r/cdrom/"] }' >/etc/lvm/lvm.conf
CD-ROMドライブをLVMの検索対象からはずすってことね。起動時にLVM化されたドライブを検索するの。CD-ROMとかは絶対ありえないからはずしておくと良い。
# vgscan Reading all physical volumes. This may take a while... No volume groups found # vgchange -a y
まずはLVMにしたいディスクのパーティションタイプをfdiskで変更します
#fdisk /dev/hdb このディスクのシリンダ数は 15017 に設定されています。 間違いではないのですが、1024 を超えているため、以下の場合 に問題を生じうる事を確認しましょう: 1) ブート時に実行するソフトウェア (例. バージョンが古い LILO) 2) 別の OS のブートやパーティション作成ソフト (例. DOS FDISK, OS/2 FDISK) コマンド (m でヘルプ): p Disk /dev/hdb: 123.5 GB, 123522416640 bytes 255 heads, 63 sectors/track, 15017 cylinders Units = シリンダ数 of 16065 * 512 = 8225280 bytes デバイス Boot Start End Blocks Id System /dev/hdb1 1 15017 120624021 83 Linux
Idが83ですよね。SystemがLinuxです。このhdb1を変更します。
コマンド (m でヘルプ): t Selected partition 1 16進数コード (L コマンドでコードリスト表示): 8e コマンド (m でヘルプ): p Disk /dev/hdb: 123.5 GB, 123522416640 bytes 255 heads, 63 sectors/track, 15017 cylinders Units = シリンダ数 of 16065 * 512 = 8225280 bytes デバイス Boot Start End Blocks Id System /dev/hdb1 1 15017 120624021 8e Linux LVM
分かりますか?SystemがLinux LVMに変更されましたよね。
pvcreateコマンドを使用して、物理HDをLVMのphysical volumeに加えます。
# pvcreate /dev/hdb1 No physical volume label read from /dev/hdb1 Physical volume "/dev/hdb1" successfully created
普通のHDで言うところのHD1ドライブに相当するボリュームグループってのを作ります。
# vgcreate -s 32M lvm /dev/hdb1 Volume group "lvm" successfully created
ここでは、lvmというボリュームグループに先ほど作った/dev/hdb1を加えています。-s 32Mってのは何かというと、PhysicalExtentという、普通のHDで言うところのクラスタみたいなものを32Mbyteにする、という指定です。省略すると4Mbyteが指定されます。ディスク容量の増減が4Mbyte単位で行われるということ。但し、これが曲者。4Mbyteの場合だと、この64000倍である256Gbyteのボリュームグループまでしか作れません。なので32Mbyteに拡張してるのですね。すると、32×64000=2Tbyteまでのボリュームグループが作れるというわけ。但し増減は32Mbyte単位です。
ロジカルボリュームとは、普通のHDで言うところのパーティションを切る作業です。
# lvcreate -L20G -nvar lvm # lvcreate -L95G -nshare lvm
これで先ほどのvar(20G)とshare(95G)ができたわけですね。あとは、/dev/lvm/var,/dev/lvm/shareで普通のディスクと同様にアクセスできます。
/dev/ボリュームグループ/ロジカルボリューム
がデバイス名ですね。
あとは普通のディスクと同様に、初期化してやります。おいちゃんはReiserFS好きなので
# mkreiserfs /dev/lvm/var
とかやってフォーマットしてやります。ext2でもext3でもXFSでも好きにして。 これをfstabに書いてやったり、mountで指定したりするわけです。
さて、どーするかというと以下の手順。安全のため、一応/dev/lvm/shareのマウントははずしておいたほうが良いとは思います。 ここでは、/dev/hda7を新たに追加するとします。あらかじめパーティションタイプをfdiskで8eに変更しといてやって
# pvcreate /dev/hda7 # vgextend lvm /dev/hda7 # lvextend -L+120G /dev/lvm/share # resize_reiserfs -s +120G /dev/lvm/share
順を追って説明すると/dev/hda7の物理ボリュームを作成。/dev/hda7を追加してボリュームグループlvmを拡張。ロジカルボリューム/dev/lvm/shareを120G拡張。最後にreiserfsのファイルサイズを拡張して、作業終了でっす。再度マウントしたら、データが消去されずにディスク領域が広がってるのが分かるはず。これはすごいっしょ??
しばらく使用していたら、ディスクから異音が…そろそろ寿命かしら。ど、どうしよう~~~。てなときに、LVMの場合データを生かしたまま移動する手段があるんですよ。やってみましょう。
さて、このとき増設ディスクを/dev/sdc、故障間近のディスクを/dev/hddとしますね。 このとき注意するのは、交換するディスクのデータを移動するために、最低限同じ容量のディスクが必要ってことね。この時、ボリュームグループlvmのパーティションは、マウント解除しておくのをおすすめします。
増設したディスクを、1ボリュームのパーティション切ったとして、話を進めましょう
# pvcreate /dev/sdc1 # vgextend lvm /dev/sdc1
これで、容量はそのままで、ボリュームグループlvmが使用されていないFree PEが増えた状態になります。
pvmoveコマンドを使用します。/dev/hddは、同じく1ボリュームのパーティションだとします。
# pvmove /dev/hdd1
これで、せこせことhdd1にあるPEが、sdc1に移動し始めます…移動が100%になったところで、pvdisplayコマンド打ってみてください。hdd1の Allocated PEが0になって、 Free PEが増えているはず。
かわりに、/dev/sdc1に、hdd1分のAllocated PEが増えているはずです。
# vgreduce lvm /dev/hdd1
最後に
# pvremove /dev/hdd1
これで、/dev/hddを引っこ抜いてもOKな状態になりました。電源落として、HDDを引っこ抜きましょう。ね、簡単でしょ…
Snapshotとは、さっきも書いた、ロジカルボリュームの一瞬を切り取ったバックアップです。仕組みでいうと、変更が無いファイルは、元領域のデータを用いる。その代わりsnapshot領域に、変更されたファイルだけを書き込んでいくのです。ですので、ず~っとsnapshotをとった瞬間が保存されていくという寸法。 ですので、Snapshot用に取っておく領域は、変更差分が書き込まれる程度の大きさでよいわけです。目安でいうと元領域の10%程度だといわれています。1Gだったら100Mぐらい。でも、サービスが暇な夜間にSnapをとって、バックアップ領域に退避して、すぐに消してしまうのであれば、書き換えが多くは発生しないのでもっと少なくても良いわけです。これは効率的ですね♪
SnapshotはSnapshot用の論理ボリュームを作成してやります。基本はlvmのlvcreateと一緒。
# lvcreate --size 1G --snapshot --name snap /dev/lvm/example
上の例だと、/dev/lvm/snapという名前の、/dev/lvm/exampleのスナップショットを作成するということ。実際に動きをみてみると、/dev/lvm/exampleが10Gの領域で/exportにマウントして運用中として、上記コマンドでSnapshotを作ります。で、/dev/lvm/snapを適当な場所(仮に/mnt/snap)にマウントしてやります。/exportも/mnt/snapも同じイメージが見えていますね?/exportに何かファイルを追加したり、削除したりしてやりましょう。当然/exportの内容は変わっていますよね。/mnt/snapを見てみるとどうですか?変わりない/exportが見えていませんか?