LVM についての覚書
以前導入したサーバで使用されており少し操作が必要になったこともありましたが、なかなか理解がしきれない部分があったので。でもって、すぐに忘れるので。
(以下の記述では触れてませんが、ファイル操作を行うときにはマウントが必要だし、パーティション等の操作を行うときはアンマウントが必要(一部マウントしたままで可能なものもあるけど)。)
LVM を使わないとき
新しく購入した HDD を使おうとするとき、接続し、うまく認識されれば(たとえば) /dev/sdc といった名前が付けられたディスクがみつかる。この /dev/sdc に対し、1つ、あるいは複数のパーティションを作成する。そうして得られたパーティション /dev/sdcX に対して ext4 あたりの好みのファイルシステムでフォーマット。
# # 適当な例 # # 動作テストも何もしてないので注意 # ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2 /dev/sda3 /dev/sdb /dev/sdb1 /dev/sdc # # パーティションの作成 # fdisk /dev/sdc (略) # ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2 /dev/sda3 /dev/sdb /dev/sdb1 /dev/sdc /dev/sdc1 # # ext4 でフォーマット # mkfs.ext4 /dev/sdc1 (略)
このようにディスクを用意し、ディスクをパーティションに分割し、パーティションを任意のファイルシステムをフォーマットするという流れをとる。イメージとしては家(ディスク)を壁(パーティション)を区切っても、本棚(ファイルシステム)を用意しないと本(ファイル)は整理できない……みたいな感じだろうか?
パーティションとして拡張できる余裕があり、ファイルシステムが対応していれば、領域を拡張することも可能。まずパーティションを広げ、次に resize2fs
でファイルシステムの領域をパーティションいっぱいまで拡張する。
領域の縮小もファイルシステムが対応していれば可能で、 ext4 は対応している。まず縮小を行う前にチェック(解析?)のために fsck.ext4
を実行し、次に resize2fs
でファイルシステムの縮小を行い、その後パーティションの縮小という流れ。
LVM とは
複数のディスクやパーティション(PV; Phisical Volume)を、論理的(仮想的)なグループ(VG; Volume Group)としてまとめ、その中にパーティションのような領域(LV; Logical Volume)を作ることができる技術で、色々と柔軟な管理ができる。
対比としては VG ≒デバイス、 LV ≒パーティションで、 PV は VG に追加するために LVM の管理下に登録したものといった感じ?
でもって、 LV も当然ファイルシステムでフォーマットする必要がある。ここで、ファイルシステムとして縮小不可能な XFS 等を使うと、 LVM として非常に柔軟性を欠くことになり HDD の取外し等が大変なことになる。
LV の作り方
pvcreate
でデバイスやパーティションを PV として登録し、 vgcreate
で1つ以上の PV から VG を作る。 lvcreate
で VG 上に任意サイズの LV を作る。
ファイルシステムのフォーマットも行う。
LV の拡張
pvcreate
でデバイスやパーティションを PV として登録し、既に存在する VG に対し vgextend
で PV を追加する。既に存在する lvextend
で領域を拡張する。
ファイルシステムの拡張も行う。
PV として登録した HDD の取外し
まず VG のなかで LV に割当てていない空き領域が、取外したい PV 以上の容量あるか確認する。十分な空き容量がない場合、(可能であれば)ファイルシステムの縮小→ LV の縮小を実施するか、新たに PV を追加して VG を増やす。ここで、縮小不可能なファイルシステムを使っているとつらい。
LV を縮小させるなり VG を拡張するなりして十分な空き容量ができたら、 LV が実際に専有している PV を別の PV の変更する pvmove
を使って取外したい PV から実データをなくす。その後、 vgreduce
で VG から PV を取外し、 pvremove
で LVM の管理下から外す。こうすることでようやく HDD の取外しができる(他のパーティションも問題なければ)。
障害が発生した場合はしょうがないが、データを保存した HDD を取外して保管といった運用が非常に難しくなる。結局、新規で構築しなおした際に、 LVM は使用しない構成に改めたのであった。