2009/07/26

Ubuntu 8.04でLVM2を使ってxfsな領域を確保してみる

最近は裸族シリーズを使ってHDDをカートリッジのようにeSATA経由でUbuntu 8.04に接続しています。 autofsを使っている関係で手動でパーティションをumountしても安全か自信がないので、あまり頻繁には切り替えはしていないですけれど。 さてUbuntu 8.04でlvm2を使っていると書いたものの、パーティションの確保の仕方などをメモしておかなかったので残しておきます。

デバイスの確認

まずはHDDをシステムが認識した事をdmesgなどで確認しておきます。 外部USB, eSATAディスクを接続していれば、電源を入れて新しく認識されるとdmesgの出力の下の方に、ディスクの名前が("sdh"のように)新しく追加されたデバイスとして表示されます。

$ dmesg | tail
...
[25438.674740]  sdh: sdh1 sdh2
...

最初から電源を入れているとうっかり他のデバイスと勘違いしてしまう可能性があるので、パーティションを変更するディスクは内蔵でなければ後から電源を入れて追加するのがお勧めです。

fdiskでのパーティション設定

上記の例だと"sdh1", "sdh2"はパーティションの1番、2番をそれぞれ指します。 何が表示されるかは状況によって違うので、これを消してしまうなりfdiskを使って自由にやって、最終的に"sdh1"が1つだけある状態から話しを始めます。 ただしパーティションを作り直した時にはUSB外付けディスクなら一旦USBディスクの電源を入れ直すか、セルフパワーならUSBケーブルを抜いてディスクコントローラーのリセットとデバイスの再認識を行ないます。eSATAの場合も同様にケーブルを差し直すなり、外部電源駆動なら電源のリセットなりを行ないます。

後は"t"コマンドでパーティションのコードを'8e'に設定します。

sudo fdisk /dev/sdh
コマンド (m でヘルプ): t
領域番号 (1-4): 1
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 2 から 8e (Linux LVM) に変更しました

LVM2で必要な基礎知識

いろいろ説明している文書はGoogleで検索できるので、とりあえず自分の理解している範囲でメモ。

PV, VG, LVの名前が具体的に何を指しているかイメージできないと、操作のミスが増えてしまうと思います。 次の段落の説明でだいたい大丈夫だと思いますが、ポイントは次のような点でしょうか。

  • VGは複数のPVを含むこと(ディスクの抽象化)
  • LVはVGから作られるため物理的にどのディスク上に配置されるかは、とりあえず意識する必要がない
  • そうはいっても物理的なディスクの交換作業の必要性がでてくれば、引越し作業で詳しい知識が必要

LVM2は他の商用LVMと同様に、OSが認識したブロックデバイスをLVM用の物理デバイス(PV)として認識させ→グルーピング(VG)(必要なら物理デバイスの統合)→パーティションと同等で任意のサイズの論理デバイス(LV)に切り出して使います。

LVM2用デバイスの作成

まずはパーティション全体をLVM用のPVに変換します。 この操作で間違ったデバイスを指定するとデータが消えてしまいます。

パーティションの種類が"Linux LVM"用(システムID:8e)でなくても容赦なく成功するので注意します。

$ sudo pvcreate /dev/sdh1
  Physical volume "/dev/sdh1" successfully created

ちゃんと作成できたかはシステムに認識されているPVを確認します。 sudoを使わないとエラーなく、なにも表示されずに終るので、作成に失敗したと間違わないようにします。

$ sudo pvdisplay
  --- NEW Physical volume ---
  PV Name               /dev/sdh1
  VG Name               
  PV Size               152.43 GB
  Allocatable           NO

VGの作成

ここで用途によってVGを作成するのか、既存のVGを拡張するのか選択する事になります。ディスクが足りなくなって追加する手順はLVMレベルでのVGの拡張と、ext3のようなファイルシステムレベルでの拡張の2つを行なう必要があるので、とりあえず後回しにしておきます。

単純にいま作成した"sdh1"に適当な名前を付けてVGにします。 名前の最後に"vg"を付けた方がそれらしいかもしれません。"webappvg"を作ります。

$ sudo vgcreate webappvg /dev/sdh1
  Volume group "webappvg" successfully created

作ったら確認します。

$ sudo vgdisplay
...
  --- Volume group ---
  VG Name               webappvg
  System ID             
  Format                lvm2
...

任意のサイズのパーティションみたいなデバイスを作る

ファイルシステムはLV単位で作成ができるので、ext3やらreiserfsやらxfsやらを作成するために最終的に必要な作業です。いきなり最大サイズで作成しなければ、VGの余った領域から他の名前でLVを作成する事もできますし、既に使っているLVのサイズを拡張することもできます。LV自体は器なので、中身であるファイルシステムレベルでの拡張も必須なので両方の手順を確認しておかないと、後からmountしたままでは拡張できない事に気がついてシステムを停止したりする事になります。

さてさて、LVの作成は名前を決めてしまえば簡単です。 とりあえず200MBの"datalv"を作成します。

$ sudo lvcreate -L 200M -n datalv webappvg
  Logical volume "datalv" created

例によってシステムに認識されているLVをリストします。 コマンドは"*display"という命名規則に従っている分だけ覚えやすく、ちょっとしたメモがあれば日々の作業では困る事はないと思います。

$ sudo lvdisplay
...
  --- Logical volume ---
  LV Name                /dev/webappvg/datalv
  VG Name                webappvg
  LV UUID                ZHxqCl-GBVa-n8Zx-6SYu-NUm2-Rec9-hGfgLf
  LV Write Access        read/write
  LV Status              available

LVは作ったものの、ファイルシステムは…?

"lvdisplay"で"/dev/webappvg/datalv"の名前でデバイスが作成された事がわかったので、ここを"/dev/sda1"のように見立ててファイルシステムを作成します。 例えばext3なら次のような感じ。

$ sudo mke2fs -j /dev/webappvg/datalv
$ sudo tune2fs -c 0 -i 0 /dev/webappvg/datalv

LV自体にはパーティションのシステムID(例えば"83"や"e8")のように"ext3"でフォーマットするのか、"reiserfs"なのかといった情報はないんですよね。lv名にファイルシステムのタイプを書いておいた方がよかったかもしれません。

LVMの命名規則

ここから先はいろんなHOWTOドキュメントを読むしかないかもしれませんが、 LVMの使い方は基本的にUNIX系のOSであれば使い回しが効くので概念を理解すると良いでしょう。 一応説明も周りくどく書いたつもりです。冗長な分、それで理解が良くなるかどうかは微妙ですが。

例えばLVの名前に"ext3"を入れて"datalv_ext3"のように"LV名+FS名"のようなローカルルールを作ったので、既存のLV名を変更したいとしましょう。これは"lv*"の命名規則に従うコマンドのどれかを使ってできると想像する事ができます。

bashを標準的な環境で使っていればTabキー"を2回連続で叩けば、コマンド候補がでてくるので、端末で"lv"まで入力してからTabキーを連打すると使えそうなのは、"lvchange"か"lvrename"ぐらいで、manで調べてみれば"lvrename"が正解らしいとわかるでしょう。

さて、稼働中のシステムで"lvrename"を使ってみる…

せっかくなので/dev/webappvg/datalvをマウントしたまま、"lvrename"コマンドを使ってみましょう。

$ sudo mkdir /mnt/dsk1 /mnt/dsk2
$ sudo mount /dev/webappvg/datalv /mnt/dsk1
$ sudo lvrename webappvg datalv datalv_ext3
$ sudo mount /dev/webappvg/datalv_ext3 /mnt/dsk2

このコマンドたちはサクサク成功して、最終的には片側で作ったファイルがもう一方からもアクセスできるという変な事になってしまいます。

$ sudo touch /mnt/dsk1/test.txt
$ sudo ls /mnt/dsk1/
lost+found  test.txt
$ sudo ls /mnt/dsk2/
lost+found  test.txt

"pvcreate"の時もパーティションのシステムIDは無視してくれたり、 LVMの方ではあまり失敗に対して厳格なチェックは働かないようにみえるので、 人間が注意して使うしかないようです。

普通はこういった事は問題になりませんが、いざという時のためには最悪なシナリオを試して結果を確認した方が良いのかもしれません。 そうはいってもLVMは便利なんですよね。"/dev/vg_name/lv_name"の命名規則で簡単にアクセスする事ができるので。

0 件のコメント: