[Danceing Penguin]
LVM
?%5B%5BLVM%5D%5D

[ リロード ]   [ 新規 | 編集 | 差分 | 添付 ]   [ トップ | 一覧 | 単語検索 | 最終更新 | バックアップ | ヘルプ ]

リンク

TLUC
JPLUG
にっかわくらぶ
もつ蔵
My blog

最新の20件
2008-11-11

edit

Logical Volume Manager

難しいLVM?

新しくサーバーを導入するのを機会にLVMを使ってみることにしました。 LVM自体の導入はそれほど難しいものではなかったのですが、ルートパーティションをLVMと共に使おうとすると結構苦労するようです。
最近のディストリビューション(Red Hat 8以降とか)では、インストールのときにlvmが使えるらしいので、こんな苦労は要らないのかもしれませんが。

lvmを使ってファイルシステムを構築する利点としては、

  1. ファイルシステムの容量を動的に変更できる
  2. スナップショットを作れるのでシステムを止めずにバックアップが取れる
  3. 複数のディスクをまとめて1つの論理ボリュームにできる

などが挙げられるようですが、今回は、(1.)のァイルシステムの容量を動的に変更できる点と、物理的には1つのパーティション中に仮想的に複数のファイルシステムを作れる点に魅力を感じ、 lvmを使ってみました。
何故、この1つのパーティションに仮想的に複数のファイルシステムを作れることに注目したかと言うと、今回はソフトウエアでRAID1(ミラー)を構成したのですが、lvmを使わずに、普通にパーティションを分割してファイルシステムを構築した場合、LinuxのソフトウエアRAIDでは、それぞれのパーティション毎にRAIDを構成しなければならず少々面倒ですが、lvmを使えば物理的には単一のRAIDディスクを作れば済んでしまいます。

メモ

今回は、富士通のRX100という1Uのラックマウントサーバーにインストールを行ないました。
実は、このマシンを注文する時に、RAIDはソフトウエアで組むので、RAIDコントローラー無しの物を注文したはずなのですが、何故かFastTrack?が搭載されているモデルで、まずこれでつまづいてしまいました。
最初は、仕方がないので真面目にFastTrack?用のドライバを組み込んで、これを利用しようかとも思ったのですが、現在はPromiseではバイナリしか用意さてれおらず、またパフォーマンスも低いとの事なので、これを使うのは止めにしました。

Promiseのドライバを使わない場合には、FastTrack?のBIOS設定で構成をspanにし、ドライブを1台だけ割り当てれば通常のIDEコントローラーとして使用できます。

1台目のHDDにLinuxをインストール

取り敢えず、片方のディスクに普通にLinuxをインストールします。 このインストールされたファイルを元に、2台目のディスクにlvmを使った環境を構築することにします。

2台目を分割

今回は、/bootとswapは通常のパーティションに作成し、これ以外のファイルシステムをlvmで構成することにしました。

今回は以下のようにパーティションを分割しました

 /dev/hdg1   *         1       163     82120+  83  Linux
 /dev/hdg2           164      2244   1048824   82  Linux スワップ
 /dev/hdg3          2245    155061  77019768    5  拡張領域
 /dev/hdg5          2245    155061  77019736+  8e  Linux LVM

このうち、hdg1とhdg5をRAID1で二重化し、片方のディスクが壊れた場合には、もう一方のディスクで起動できるようにします。

/etc/raidtabを編集

/etc/raidtabを作成してRAID(ミラー)を構成します。 このとき、片側(現在起動中のパーティション)はfailed-diskにしておき、片肺飛行の状態で2台目のディスクだけでRAIDディスク(md0, md1)をアクティブにします。

/etc/raidtab

 # /boot
 raiddev /dev/md0
         raid-level             1
         nr-raid-disks          2
         nr-spare-disks         0
         chunk-size             4
         persistent-superblock  1
         device                 /dev/hdg1
         raid-disk              0
         device                 /dev/hde1
         failed-disk            1
 
 # lv     
 raiddev /dev/md1
         raid-level             1
         nr-raid-disks          2
         nr-spare-disks         0
         chunk-size             4
         persistent-superblock  1
         device                 /dev/hdg5
         raid-disk              0
         device                 /dev/hde5
         failed-disk            1

raidをアクティブにする

md0をアクティブにする

 mkraid -R /dev/md0

md0に利用するパーティション/dev/hdg1はgrudなどのブートマネージャで利用する場合の事を考えてパーティションのタイプをLinux Native(0x82)にしてあるので、-R(--really-force)オプションをつけないと文句を言われます。

md1もアクティブにする

 mkraid /dev/md1 

md1(/dev/hdg5)は、パーティションのタイプがLVM(0x8e)なので、特に何もオプションをつけなくても大丈夫です。

lvmをインストール

 rpm -ivh lvm-....

/etc/modules.confを編集し、lvmのモジュールが自動的にロードできるようにする

 alias block-major-58 lvm-mod
 post-install block-major-58 /sbin/vgscan && /sbin/vgchange -a y
 pre-remove block-major-58 /sbin/vgchange -a n
 alias char-major-109 lvm-mod
 post-install char-major-109 /sbin/vgscan && /sbin/vgchange -a y
 pre-remove char-major-109 /sbin/vgchange -a n

今回は、ルートファイルシステム(/)までlvmで構成するのでinitrdを作り、この中でlvmのモジュールのロードとlv(論理ボリューム)のアクティベーションを行なうので、この記述は追加しなくとも問題ありませんが、もしファイルシステムの一部だけをlvmを使って構成し、initrdを使った論理ボリュームのアクティベーションをしないなら、この記述を行なうことで起動時に論理ボリュームのアクティベーションを行なえます。

vgscanを行ない初期化 (/etc/lvmtabと/etc/lvmtab.dが作られる)

 vgscan

lvmをインストールしたら、vgscanを実行することでlvmに必要なディレクトリなどが作成されます。

物理ボリューム作成

 pvcreate /dev/md1

先程作成したRAIDディスク上に物理ボリュームを作成します。 今回は、物理ボリュームを1つだけ作成しましたが、システムに複数のディスクが搭載されているなら、物理ボリュームを複数作り、これを1つにまとめて利用する事もできます。

ボリュームグループ作成

 vgcreate -s 16M raid1 /dev/md1 

ボリュームグループでは、複数の物理ボリュームを一まとめにして仮想的に1つのボリューム(ディスクやパーティションのようなもの)として扱うことができます。
ここでは、物理ボリュームは1つしかないので、raid1というボリュームグループに物理ボリューム/dev/md1を追加しています。
オプションパラメータ -s で物理ボリュームのブロックサイズを指定しています。 1つの論理ボリュームでは、最大で65535のブロックしか扱えないので、物理ボリュームのブロックサイズを小さくしすぎると最大で扱えるボリュームサイズが小さくなってしまうし、大きくしすぎると無駄が多くなってしまいます。
オプションの2番目はボリュームグループの名前です。 ここでは、raid1という名称を付けていますが、利用目的に合わせて適当な名前を与えます。

論理ボリューム作成

 lvcreate -L 2G -n root raid1
 lvcreate -L 1G -n var raid1
 ....

vgcreateで作成したボリュームグループに論理ボリュームを作成します。 lvmでは、この論理ボリュームが通常のパーティションの様に扱われます。
オプションでしていいている -L の後の値は、論理ボリュームに割り当てるボリュームグループ中の容量です。

  • n の後の値は論理ボリュームの名前です。 論理ボリュームを利用するときには、この名前を使いアクセスします。 例えば、この例で作成した root という名前の論理ボリュームを使う場合には、/dev/raid1/root の様に /dev/<ボリュームグループ名>/<論理ボリューム名> でアクセスします。

最後のパラメータは、論理ボリューム名を作成するボリュームグループの名前です。

論理ボリュームの一覧 作成した論理ボリュームはlvscanコマンドで状態を確認できます。

 lvscan
 lvscan -- ACTIVE            "/dev/raid1/root" [2 GB]
 lvscan -- ACTIVE            "/dev/raid1/var" [4 GB]
 lvscan -- ACTIVE            "/dev/raid1/usr" [8 GB]
 lvscan -- ACTIVE            "/dev/raid1/local" [2 GB]
 lvscan -- ACTIVE            "/dev/raid1/home" [20 GB]
 lvscan -- ACTIVE            "/dev/raid1/coda" [20 GB]
 lvscan -- 6 logical volumes with 56 GB total in 1 volume group
 lvscan -- 6 active logical volumes
 

論理ボリュームにファイルシステムを作成

 mkfs.ext3 /dev/raid1/root
 mkfs.ext3 /dev/raid1/var
 ....

一度、論理ボリュームを作成すれば、後は普通のパーティションと同じように扱えます。 ここではext3ファイルシステムを作成していますが、reiserfsでも、ext2でも、あるいはminixでも、好きなフォーマットでファイルシステムを作れますが、lvmの動的にリサイズ可能な利点を考えたなら、ファイルシステムのフォーマットもリサイズ可能なものにするのが得策です。

作成したファイルシステムを適当なマウントポイントにマウント

 mount /dev/raid1/root /mnt/misc
 mkdir /mnt/misc/{var,usr,home}
 mount /dev/raid1/var
 ....

1台目のディスクにインストールされているシステムをコピーするために、2台目のディスクに作成した論理ボリュームをマウントします。
この例では、この後のinitrd作成作業などのことも考え、/mnt/misc以下に実際の運用時と同じ構成で論理ボリュームをマウントしています。

インストールされているシステムをコピー

 tar cf - --exclude=./proc --exclude=./mnt --exclude=./initrd  . | { cd /mnt/misc; tar -xpsvf -; }

マウントした論理ボリュームへのシステムのコピーには定石通りtarを利用しました。 /procや/mnt、/initrdなどの特殊なマウントポイントは-excludeで除外して、コピーが終った後で作成しています。

excludeしたディレクトリも作っておく

 mkdir mnt/misc/{initrd,mnt,proc}
 mkdir mnt/misc/mnt/{cdrom,floppy}

コピーしたシステムの/etc/fstabを編集して論理ボリュームがマウントされるように変更

/mnt/misc/etc/fstab

 /dev/raid1/root         /                       ext3    nocheck,noatime 1 1
 /dev/md0                /boot                   ext3    nocheck,noatime 1 2
 none                    /dev/pts                devpts  gid=5,mode=620  0 0
 /dev/raid1/home         /home                   ext3    nocheck,noatime 1 2
 none                    /proc                   proc    defaults        0 0
 none                    /dev/shm                tmpfs   defaults        0 0
 /dev/raid1/usr          /usr                    ext3    nocheck,noatime 1 2
 /dev/raid1/local        /usr/local              ext3    nocheck,noatime 1 2
 /dev/raid1/var          /var                    ext3    nocheck,noatime 1 2
 /dev/hdg2               swap                    swap    defaults        0 0
 /dev/cdrom              /mnt/cdrom              iso9660 noauto,owner,kudzu,ro 0 

initrdの作成

今回は、ルートファイルシステムまで含めてlvmで構成しましたから、カーネルの起動時にinitrdを使いlv(論理ボリューム)をアクティブにしないとルートファイルシステムがマウントできません。
lvmのパッケージには、起動時に論理ボリュームをアクティブにするためのinitrdを作成するスクリプトlvmcreate_initrdが含まれていますが、ここではlvmcreate_initrd は使わないでRed Hat系のディストリビューションに標準で用意されているmkinitrdスクリプトでinitrdの作成を行ないます。 (この方が親和性が高そうなので)

chrootで作業用マウントポイントを/に変更

 chroot /mnt/misc

2台目のディスク(論理ボリューム)で起動した状態に合わせてinitrdを作成するために、chrootでコピーしたシステムを仮想的にルートにします。

/procをマウント

 mount /proc

chrootした直後は/procがマウントされていないので、これをマウントします。 mkinitrdでは、これを元にlvmが使われている事が検知されるので忘れずに。

/sbin/mkinitrdを編集

/sbin/mkinitrd (一部)

 if [ `uname -m` = "ia64" ]; then
   IMAGESIZE=6000
 else
   IMAGESIZE=5000
 fi

今回利用した環境では、オリジナルのままだとinitrdの容量が足りなかったので、それぞれ2000づつ容量を増やしましたが、Red Hatの新しいものなどでは不要なのかもしれません。

initrdを作成

 mkinitrd -f /boot/initrd-lvm-2.4.19-1.8h4.1.img 2.4.19-1.8h4.1

mkinitrdコマンドで新しくinitrdを作成します。 もし、うまく起動できなかった場合に備えて、オリジナルのinitrdとは名前を変えて作成します。 mkinitrdがちゃんとlvmに対応したものなら、lvmに対応したinitrdが作られるはずです。

chrootを終了し、もとの環境に戻ります。

 # ^D (もしくはexit)

出来上がったinitrdを現在のbootディレクトリにコピー

 cp -a /mnt/misc/boot/initrd-lvm-2.4.19-1.8h4.1.img /boot/

/etc/grub.confを編集してテスト用設定を追加

/etc/grub.conf

 default=0
 timeout=10
 splashimage=(hd0,0)/grub/splash.xpm.gz
 title Linux (2.4.19-1.8h4.1)
         root (hd0,0)
         kernel /vmlinuz-2.4.19-1.8h4.1 ro root=LABEL=/ video=atyfb:off
         initrd /initrd-2.4.19-1.8h4.1.img
 
 title test
         root (hd1,0)
         kernel /vmlinuz-2.4.19-1.8h4.1 ro root=3a00 video=atyfb:off ramdisk=8192
         initrd /initrd-lvm-2.4.19-1.8h4.1.img

※mkinitrdでinitrdのサイズを変更したなら、ramdiskのサイズに注意すること。 標準だと4Kブロックまでのinitrdしかロード出来ないので、ramdisk=8192として容量を増やしている。

ここまでの作業が終ったら、システムを再起動して、テスト用の設定を使いシステムを起動してみます。

仕上げ

うまく起動するのを確認したら、2台目のディスク(lvmで構築した方)でシステムを起動して、1台目(元のシステム側)のディスクのパーティションを切り直します。

※この手順を失敗すると、システムを立ち上げられなくなってしまう可能性が大きいので、grubやliloなどの起動ディスクを作っておくと安心です。

今回のケースでは、2台のディスクでミラーを行なうので、1台目のディスクも2台目と同じ構成でパーティションを作成します。

これで、1台目のディスクは以前と構成が変わってしまったので、下手をすればgrubはうまく動いてくれないかもしれません。

次に、/etc/raidtabを編集して、/bootファイルシステム(md0)のfailed-diskをraid-diskに変更し、/dev/hde1をアクティブにします。

 raidhotadd /dev/md0 /dev/hde1

パーティションのサイズにもよりますが、暫くすると2台目のディスク(/dev/hdg1)の内容が1台目のディスク(/dev/hde1)にコピーされるはずです。

/proc/mdstatの内容でミラー処理の進行具合を確認できます。 以下のようにそれぞれのディスクが "U" 状態となれば大丈夫です。

cat /proc/mdstatを実行

 md0 : active raid1 hde1[1] hdg1[0]
       82048 blocks [2/2] [UU]

次に、


リロード   新規 編集 差分   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: Tue, 11 Nov 2008 00:00:00 JST (3297d)

Modified by Kazuhide Takahashi

"PukiWiki" 1.3.6 Copyright © 2001,2002,2003 PukiWiki Developers Team. License is GNU/GPL.
Based on "PukiWiki" 1.3 by sng
Powered by PHP 5.3.3

HTML convert time to 0.029 sec.