新規にシステム構築するにあたり、サーバーサイジング、ましてやパーティションサイズを設計することは非常に厳しいものがあります。予め必要サイズの見積もれる既存システムの載せ替えなら良いのですが、新規システムの場合はどれだけの容量を見積もれば良いのか見当もつきません。
構築後に自由にサイズを変更できたら・・・と思ったことはありませんか? LVMは、システム停止を行わずに論理ボリュームの動的拡張・縮小が可能です。
LVMとは?
LVM(logical volume manager)とは、複数のハードディスクやパーティションにまたがった記憶領域をまとめて、単一の論理ボリューム(LV)として扱うことのできるディスク管理機能です。※ インストール時に手動パーティションの設定で作成することが出来ます。
利用者からは、通常のパーティションと同様に見え、作成されたlvを個々に任意のフォーマットで利用できる等のメリットがあります。また、システムを停止せずに論理ボリュームサイズの増減を自由に行うことが可能です。
LVMを使用すメリット
- 複数「PV(フィジカルボリューム)」を結合して作成された「VG(ボリュームグループ)」上に、フィジカルディスクサイズを超える「 LV(論理ボリューム)」 を作成する事が可能
- 「 LV(論理ボリューム)」 の動的拡張・縮小が可能
- 「PV(フィジカルボリューム)」の追加による「 LV(論理ボリューム)」 の拡張性の維持が可能
- ソフトウェアミラーやソフトウェアによるストライピングが可能
LVMの構成要素
LVMは、ハードディスクを「PE(フィジカルエクステント)」と言う記憶領域に分割し、必要な時に必要な分だけ使用することが可能です。
PE(フィジカルエクステント)とは?
PEとは、LVMが扱う記憶領域の最小単位で、デフォルトのサイズは4MBです。PEの数は最大65,536個となっており、デフォルトの4MBでlvを作成する場合、最大で「256GB」までとなっています。それ以上のサイズをLVで作成するためには、このPEのサイズを4MB以上にする必要があります。
むやみにPEサイズを大きくとってしまうと端数が発生し無駄な領域が生じてしまいます。
※ PEのサイズは8KB~512MBの範囲で指定が可能です。
PV(フィジカルボリューム)とは?
「PV(フィジカルボリューム)」とは、物理的な記憶媒体を指しています。通常は、物理ディスクに対して1対1で作成をしますが、複数のパーティションで区切ったパーティション単位にPVを1体1で作成することも可能です。「fdisk」コマンドでパーティションID「HEXコード(16進数)」には「8e」を指定して作成します。
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@db01 ~]# fdisk -l /dev/sda Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト Disk label type: dos ディスク識別子: 0x000c6a1f デバイス ブート 始点 終点 ブロック Id システム /dev/sda1 * 2048 2099199 1048576 83 Linux /dev/sda2 2099200 206899199 102400000 8e Linux LVM 👈 8e |
PVの拡張について
対象のPVが「ディスクの最終パーティション」にある場合のみ、PVの拡張が可能です。空きスペースを使用して「最終パーティション」以外を拡張した場合、後続のパーティションは破壊されてしまうため注意する必要があります。
VG(ボリュームグループ)とは?
「VG(ボリュームグループ)」は、作成されたPV管理します。特にPEサイズの指定が無い場合、VG作成時にPV中に4MB(デフォルト)でPEが作成され、複数「PV(フィジカルボリューム)」を結合して、フィジカルディスクサイズを超える「 VG(ボリュームグループ)」 を作成する事が可能です。
ただし、前述のとおり、PEの数は最大65,536個となっており、デフォルトの4MBでlvを作成する場合、最大で「256GB」までとなっています。さらに大きなVGを作成する場合は、PEサイズを(8K~512MB)の範囲で大きな値を指定する必要があります。
LV(ロジカルボリューム)とは?
「LV(ロジカルボリューム)」は、実ファイルを格納する領域です。LVはPEの集合で作成されており、作成するLVの容量はPEの倍数で最も効率的となります。
LVは任意のファイルシステムにフォーマットすることができ、またVGの空き容量にもよりますが、動的に拡張・縮小が可能です。
ファイルシステムとは?
ハードディスクやUSB等の記憶媒体上のデータやプログラムは、フアイルと呼ばれる単位で管理されます。この管理のしくみをファイルシステムといいます。ざっくりと言ってしまえば、ファイルを取り扱う(操作だけでなくその所在を定義したり読み出したりする)際の枠組み(規格)」といえます。通常はパーティション上に作成されますが、LVM環境ではLV上に作成されます。現時点では、「ext4」がLinuxの標準ファイルシステムになります。
ファイルシステムについては、下記のリンクページを参照してください。
システム領域
通常、linuxOSをインストールすると、ブート領域に第1バーティション「/dev/sda1」及び、システムの稼働に第2パーティション「/dev/sda2」が作成されます。
基本パーティション
- 第1パーティション
100MB程度の小さなパーティション「/boot」が作成されます。
昨今の物理マシンの場合、この領域に別パーティションとして「UEFI(FAT)」がマウントされます。なお「/boot」領域にLVMは使用されません。
123456789101112[root@db01 ~]# fdisk -l /dev/sdaDisk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O サイズ (最小 / 推奨): 512 バイト / 512 バイトDisk label type: dosディスク識別子: 0x000c6a1fデバイス ブート 始点 終点 ブロック Id システム/dev/sda1 * 2048 2099199 1048576 83 Linux 👈 これ/dev/sda2 2099200 206899199 102400000 8e Linux LVM - 第2パーティション
システムを稼働させるために必要な領域が作成されます。本記事では「root_vg」として作成されています。
123456789101112131415[root@db01 ~]# pvsPV VG Fmt Attr PSize PFree/dev/sda2 root_vg lvm2 a-- 97.65g 45.65g[root@db01 ~]# vgsVG #PV #LV #SN Attr VSize VFreeroot_vg 1 7 0 wz--n- 97.65g 45.65gtest_vg 1 1 0 wz--n- <1.34g 348.00m[root@db01 ~]# lvsLV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convertlv_crash root_vg -wi-ao---- 4.00glv_home root_vg -wi-ao---- 5.00glv_root root_vg -wi-ao---- 15.00glv_swap root_vg -wi-ao---- 4.00glv_var root_vg -wi-ao---- 4.00glv_work root_vg -wi-ao---- 10.00g
外部ディスクを追加する
データ格納領域や、バックアップ領域で巨大なディスクを外部から取り込み使用する場合もLVMは使用することが出来ます。下記のイメージはデータ格納領域を外部ディスク上へ作成して使用する場合のイメージになります。
昨今のシステムでは、腹持ちディスクの肥大化を避け、むしろ外部ディスクを積極的に使うプロジェクトが多くなっています。
上記イメージで言う「データ格納領域(外部ディスク)」とは、あくまでも例として「DBMS(Oracle)」のデータファイルを想定しています。如何にLVMを作成するか・・、何を格納するか・・は設計次第です(無理に作る必要はありません)。
LVM領域の作成
LVM領域を作成するには、下記の手順で「pv」「vg」「lv」を作成していきます。
メーカー製の物理ディスクを扱う場合、稀にLVM2がうまく認識されないと言った問題が起こります。これは、メーカーストレージの仕様によるもので「/etc/lvm/lvm.conf」内の「global_filter」に手を入れる必要があります。詳しくは、各当該メーカーへ確認してください。私は主に日立製品を扱っていたため、この問題によく遭遇していました。
こちらに参考URLを貼っておきます。
grub2でlvmが認識されないと言った声がちらほらと聞こえます。ログを見ていないので何とも言えませんが「/etc/default/grub」内の「GRUB_CMDLINE_LINUX」オプションに正しい値が指定されているか確認してください。「/etc/default/grub」で"GRUB_CMDLINE_LINUX"から始まる行を探して正しい値を設定し、そのうえでgrub2設定を再生成します。
参考:GRUB_CMDLINE_LINUX="crashkernel=256M elevator=noop audit=1 crashkernel=auto rd.lvm.lv=root_vg/lv_root rd.lvm.lv=root_vg/lv_swap rhgb quiet"
「root_vg」は、当サイトでのVG名になります。ご自身の使用環境のvg名が正しいことを確認してください。
UEFIを使用している場合は「vFat」フォーマットが有効であることを確認してください。UEFIは「/boot/efi」として別パーティションで作成されます。セキュリティ強化のために「vFat」を使用不可にしている場合、OSブート時に「/boot/efi」パーティションが読み込めず、結果的にOSの起動が始まりません。カーネルがどのファイルシステムをサポートしているかは「/proc/filesystems」で確認できます。
すみません、話がそれてしまいました。戻します。
ここでは「/dev/sda」へ3つ目のパーティションを作成してLVMを設定していきます。
領域作成の流れ
- パーティション作成
- pv(フィジカルボリューム)作成
- vg(ボリュームグループ)作成
- lv(ロジカルボリューム)作成
- lvのファイルシステムフォーマット
パーティション作成
LVM領域を作成するためには、まずLinux上へLVMで使用するパーティションを作成する必要があります。例として「/dev/sda」の空き領域へテスト用のパーティション「/dev/sda3」を作成します。
コマンドの書式
fdisk [オプション] デバイス名
コマンドの主なオプション
-l:指定したデバイスのパーティションテーブルを一覧表示する
-u:パーティションテーブルの始点と終点の位置をセクタで指定する
-s:指定したパーティションのサイズをブロック単位で表示する
下記のコマンドを入力して、新規パーティション「/dev/sda3」を作成します。
fdisk /dev/sda
下記のログを見ると長ったらしくてウザく見えますが、要求される質問に対して、対話形式でキーを入力していくだけです。やってみるとそうでもないことが分かります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
[root@db01 ~]# fdisk /dev/sda Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. コマンド (m でヘルプ): n Partition type: p primary (2 primary, 0 extended, 2 free) e extended Select (default p): p パーティション番号 (3,4, default 3): 最初 sector (206899200-209715199, 初期値 206899200): 初期値 206899200 を使います Last sector, +sectors or +size{K,M,G} (206899200-209715199, 初期値 209715199): 初期値 209715199 を使います Partition 3 of type Linux and of size 1.4 GiB is set コマンド (m でヘルプ): t パーティション番号 (1-3, default 3): 3 Hex code (type L to list all codes): 8e Changed type of partition 'Linux' to 'Linux LVM' コマンド (m でヘルプ): p Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト Disk label type: dos ディスク識別子: 0x000c6a1f デバイス ブート 始点 終点 ブロック Id システム /dev/sda1 * 2048 2099199 1048576 83 Linux /dev/sda2 2099200 206899199 102400000 8e Linux LVM /dev/sda3 206899200 209715199 1408000 8e Linux LVM コマンド (m でヘルプ): w パーティションテーブルは変更されました! ioctl() を呼び出してパーティションテーブルを再読込みします。 The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8) ディスクを同期しています。 |
35行目:新たなパーティション「/dev/sda3」が作成されていることが分かります。
対話モードの主なコマンド
m:対話モード用コマンドを一覧表示する
p:パーティションテーブルを表示する
v:パーティションテーブルを検査する
n:新しいパーティションを作成する
a:ブート可能フラグを切り替える
d:パーティションを削除する
w:パーティションテーブルの変更を保存して終了する
q:パーティションテーブルの変更を「保存せずに」終了する
ちなみにパーティションの削除は、「対話モードの主なコマンド」で「-d」を入力し、対象パーティションを選択して削除します。
pv(フィジカルボリューム)作成
パーティションへLVMの「フィジカルボリューム」を作成します。
コマンドの書式
pvcreate[オプション][デバイス名 or パーティション名…]
コマンドの主なオプション
-y:全ての問い合わせに対し「y」を入力したものとして実行する
-f:処理内容を確認せず、強制的に実行する
-t:実際には実行せず処理内容だけを表示する
下記のコマンドを入力して、作成したパーティション「/dev/sda3」へpvを作成します。
# pvcreate /dev/sda3
※ 環境により、パーティションの反映に再起動が必要です。
1 2 |
[root@db01 ~]# pvcreate /dev/sda3 Physical volume "/dev/sda3" successfully created. |
下記のコマンドを入力して、PVが正常に作成されていることを確認します。
# pvs
1 2 3 4 |
[root@db01 ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 root_vg lvm2 a-- 97.65g 45.65g /dev/sda3 lvm2 --- 1.34g 1.34g 👈 これ |
パーティション「/dev/sda2」に、ほとんどの領域が取られてしまっていますが、とりあえず1.3GB分pvが確保できているのが分かります。
pvの削除を行うには「pvremove」コマンドに、対象パーティションを引数として実行することで削除することが出来ます。
vg(ボリュームグループ)作成
LVMの「PV(フィジカルボリューム)」へボリュームグループを作成します。
# コマンドの書式
vgcreate[オプション] ボリュームグループ名 デバイス名 or パーティション名…
コマンドの主なオプション
-s:PE(Physical Extent:物理エクステント)のサイズを指定する
-l:ボリュームグループに作成可能な論理ボリュームの個数を指定する
-p:ボリュームグループに割当可能な物理ボリュームの個数を指定する
-y:全ての問い合わせに対し「y」を入力したものとして実行する
-f:処理内容を確認せず、強制的に実行する
-t:実際には実行せず処理内容だけを表示する
下記のコマンドを入力して、作成したpvへボリュームグループを作成します。
# vgcreate test_vg /dev/sda3
1 2 |
[root@db01 ~]# vgcreate test_vg /dev/sda3 Volume group "test_vg" successfully created |
下記のコマンドを入力して、VGが正常に作成されていることを確認します。
# vgs
1 2 3 4 |
[root@db01 ~]# vgs VG #PV #LV #SN Attr VSize VFree root_vg 1 7 0 wz--n- 97.65g 45.65g test_vg 1 0 0 wz--n- <1.34g <1.34g 👈 これ |
ボリュームグループ「test_vg」が作成されているのが分かります。
vgの削除を行うには、「vgremove」コマンドへ、対象ボリュームグループを引数として実行することで削除することが出来ます。
lv(ロジカルボリューム)作成
LVMの「vg(ボリュームグループ)」へロジカルボリュームを作成します。
コマンドの書式
lvcreate[オプション] ボリュームグループ名[物理ボリューム名]
コマンドの主なオプション
-L:作成する論理ボリュームのサイズを指定する
-l:作成する論理ボリュームのサイズを論理エクステントの個数、または割合を指定する
%VG ボリュームグループ全体に対する割合
%FREE ボリュームグループの空き容量に対する割合
%PVS 物理ボリュームに対する割合
%ORIGIN 元の論理ボリュームの合計サイズ(スナップショット用)に対する割合
-n:作成する論理ボリュームの名前を指定する
下記のコマンドを入力して、作成したVGへ論理ボリュームを作成します。
# lvcreate -n lv_test -L 1G test_vg
1 2 |
[root@db01 ~]# lvcreate -n lv_test -L 1G test_vg Logical volume "lv_test" created. |
下記のコマンドを入力して、LVが正常に作成されていることを確認します。
# lvs
1 2 3 4 5 6 7 8 9 10 11 |
[root@db01 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_arch01 data06_vg -wi-a----- <27.94g lv_crash root_vg -wi-ao---- 4.00g lv_home root_vg -wi-ao---- 5.00g lv_oracle root_vg -wi-ao---- 10.00g lv_root root_vg -wi-ao---- 15.00g lv_swap root_vg -wi-ao---- 4.00g lv_var root_vg -wi-ao---- 4.00g lv_work root_vg -wi-ao---- 10.00g lv_test test_vg -wi-a----- 1.00g 👈 これ |
論理ボリューム「lv_test」が作成されているのが分かります。
lvの削除を行うには、「lvremove」コマンドへ、対象ロジカルボリュームを引数として実行することで削除することが出来ます。
※ 実際に作成した「lv_test」を使用するには、システム使用されるフォーマット形式へ変換する必要があります。また、lvの「拡張・縮小」については、別記事でご紹介します。
実際のLVM活用方法については、下記リンク記事で詳しく扱っておりますのでそちらも参照ください。
Linux基礎知識(全12記事)
├─Linuxとは何か? Linuxの基本概要を理解しよう!
├─Linuxをインストールし、ログインしてみよう!
├─起動の仕組みとカーネルについて!
├─ディレクトリ構造とファイルシステムについて!
├─ユーザー環境(ユーザー、グループ、パスワード)の設定について!
├─ディレクトリ操作について!
├─ファイル操作について!
├─テキスト操作について!
├─Linuxの基本コマンドを覚えよう!
├─適切なアクセス制御を付与してみよう!
├─リンクとiノードについて理解を深めよう!
└─LVMとは?LVMを理解しよう?