Linux の基礎知識

【Linuxの基礎知識】LVMとは?LVMを理解しよう!

2020年6月19日

新規にシステム構築するにあたり、サーバーサイジング、ましてやパーティションサイズを設計することは非常に厳しいものがあります。予め必要サイズの見積もれる既存システムの載せ替えなら良いのですが、新規システムの場合はどれだけの容量を見積もれば良いのか見当もつきません。

構築後に自由にサイズを変更できたら・・・と思ったことはありませんか? 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サイズ4MBと8MBで100MBのパーティションを作成した場合のイメージ

むやみにPEサイズを大きくとってしまうと端数が発生し無駄な領域が生じてしまいます。
PEのサイズは8KB~512MBの範囲で指定が可能です。

PV(フィジカルボリューム)とは?

「PV(フィジカルボリューム)」とは、物理的な記憶媒体を指しています。通常は、物理ディスクに対して1対1で作成をしますが、複数のパーティションで区切ったパーティション単位にPVを1体1で作成することも可能です。「fdisk」コマンドでパーティションID「HEXコード(16進数)」には「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は使用されません。
  • 第2パーティション
    システムを稼働させるために必要な領域が作成されます。本記事では「root_vg」として作成されています。

外部ディスクを追加する

データ格納領域や、バックアップ領域で巨大なディスクを外部から取り込み使用する場合も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を設定していきます。

作成するLVMのイメージ

領域作成の流れ

  1. パーティション作成
  2. pv(フィジカルボリューム)作成
  3. vg(ボリュームグループ)作成
  4. lv(ロジカルボリューム)作成
  5. lvのファイルシステムフォーマット

パーティション作成

LVM領域を作成するためには、まずLinux上へLVMで使用するパーティションを作成する必要があります。例として「/dev/sda」の空き領域へテスト用のパーティション「/dev/sda3」を作成します。

コマンドの書式

fdisk [オプション] デバイス名

コマンドの主なオプション

-l:指定したデバイスのパーティションテーブルを一覧表示する
-u:パーティションテーブルの始点と終点の位置をセクタで指定する
-s:指定したパーティションのサイズをブロック単位で表示する

下記のコマンドを入力して、新規パーティション「/dev/sda3」を作成します。

fdisk /dev/sda

下記のログを見ると長ったらしくてウザく見えますが、要求される質問に対して、対話形式でキーを入力していくだけです。やってみるとそうでもないことが分かります。

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

環境により、パーティションの反映に再起動が必要です。

下記のコマンドを入力して、PVが正常に作成されていることを確認します。

# pvs

パーティション「/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

下記のコマンドを入力して、PVが正常に作成されていることを確認します。

# vgs

ボリュームグループ「test_vg」が作成されているのが分かります。

vgの削除を行うには、「vgremove」コマンドへ、対象ボリュームグループを引数として実行することで削除することが出来ます。

lv(ロジカルボリューム)作成

LVMの「vg(ボリュームグループ)」へロジカルボリュームを作成します。

コマンドの書式

lvcreate[オプション] ボリュームグループ名[物理ボリューム名]

コマンドの主なオプション

-L:作成する論理ボリュームのサイズを指定する
-l:作成する論理ボリュームのサイズを論理エクステントの個数、または割合を指定する
 %VG ボリュームグループ全体に対する割合
 %FREE ボリュームグループの空き容量に対する割合
 %PVS 物理ボリュームに対する割合
 %ORIGIN 元の論理ボリュームの合計サイズ(スナップショット用)に対する割合
-n:作成する論理ボリュームの名前を指定する

下記のコマンドを入力して、作成したVGへ論理ボリュームを作成します。

# lvcreate -n lv_test -L 1G test_vg

下記のコマンドを入力して、LVが正常に作成されていることを確認します。

# lvs

論理ボリューム「lv_test」が作成されているのが分かります。

lvの削除を行うには、「lvremove」コマンドへ、対象ロジカルボリュームを引数として実行することで削除することが出来ます。また、lvの「拡張・縮小」については、別記事でご紹介します。

よく読まれている記事

1

目次1 Shellとは?1.1 代表的なシェルの種類2 シェルスクリプトの違いとは? Shellとは? Shellとは、人間の理解できる言葉を機会へ伝えるプログラムです。 Linux環境でコマンドプロ ...

2

Linuxは主にサーバー用として利用されるOSです。大規模な基幹システムの開発者、ロボットや家電開発等の組み込み系エンジニア、ネットワーク機器やデータベースに携わるインフラエンジニアは触れることが多い ...

3

プログラミング言語を習得しようと思った時、必ずと言っていいほど候補として挙げられるのが「Java」というプログラミング言語です。 「Java」は、現在日本で最も使われている言語であり、非常に人気のある ...

4

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-Linux の基礎知識

Copyright© Beエンジニア , 2020 All Rights Reserved.