LVM

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page LVM and the translation is 91% complete.


これと混同しないでください: LLVM.


LVM (Logical Volume Manager) は、ファイルシステムとその下で使用される物理ストレージの間に抽象レイヤを提供する、メタデバイスの作成を可能にします。このメタデバイス (この上にファイルシステムが置かれます) は論理ボリューム (logical volume) と呼ばれ、これはボリュームグループ (volume group) と呼ばれるストレージのプールから領域を使います。ボリュームグループは 1 つまたは 2 つ以上の物理ボリューム (physical volume) からなり、これらはデータが保存される真のデバイスです。

物理ボリュームとして使用できるものには、パーティション、JBOD (Just a Bunch Of Disks) によってグループ化されたハードドライブ全体、RAID システム、iSCSI、ファイバーチャネル、eSATA などがあります。

インストール

LVM は、カーネルレベルのデバイスドライバと、LVM の構成を管理するためのユーザ空間アプリケーションの、両方によって取り扱われます。

カーネル

次のカーネルオプションを有効化してください:

カーネル linux-4.9 LVM を有効化する
Device Drivers  --->
   Multiple devices driver support (RAID and LVM)  --->
       <*> Device mapper support
           <*> Crypt target support
           <*> Snapshot target
           <*> Mirror target
           <*> Multipath target
               <*> I/O Path Selector based on the number of in-flight I/Os
               <*> I/O Path Selector based on the service time
メモ
すべてを有効化する必要はありません。いくつかのオプションはLVM2 スナップショットと LVM2 シンスナップショットLVM2 ミラーLVM2 RAID 0/ストライプセット、および暗号化のためにのみ必要です。

USE フラグ

USE flags for sys-fs/lvm2 User-land utilities for LVM2 (device-mapper) software

+udev Enable virtual/udev integration (device discovery, power and storage device support, etc)
lvm Build all of LVM2 including daemons and tools like lvchange, not just the device-mapper library (for other packages to use). If your system uses LVM2 for managing disks and partitions, enable this flag.
readline Enable support for libreadline, a GNU line-editing library that almost everyone wants
sanlock Enable lvmlockd with support for sanlock
selinux !!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur
static !!do not set this during bootstrap!! Causes binaries to be statically linked instead of dynamically
static-libs Build static versions of dynamic libraries as well
systemd Enable use of systemd-specific libraries and features like socket activation or session tracking
thin Support for thin volumes
valgrind Enable annotations for accuracy. May slow down runtime slightly. Safe to use even if not currently using dev-debug/valgrind

重要
この記事中の lvm、pv*、vg*、または lv* コマンドの使用が必要な手順を実行するため、そして LVM ボリュームにアクセスするためには、lvm USE フラグを有効化する必要があります。

Emerge

sys-fs/lvm2 のために lvm USE フラグが有効化されていることを確認してください:

ファイル /etc/portage/package.use
# LVM デーモンと関連ツールのためのサポートを有効化する
sys-fs/lvm2 lvm

USE フラグを確認したら、sys-fs/lvm2 パッケージをインストールするように Portage に指示してください:

root #emerge --ask sys-fs/lvm2

設定

LVMの設定はいくつかのレベルにおいて行われます:

  1. 専用ユーティリティでのLV, PV と VG設定;
  2. 設定ファイルによるLVMサブシステムの微調整;
  3. ディストリビューションレベルのサービスの設定;
  4. initramfs時のセットアップ.

論理ボリュームや物理ボリューム、ボリュームグループの扱いは使い方の章にて取り上げます。

LVM設定ファイル

LVMは/etc/lvm/lvm.confに大きな設定ファイルを用意しています。ほとんどのユーザーはLVMを使い始めるにあたってこのファイルの設定を修正する必要はないでしょう。

サービス管理

Gentoo は、ボリュームグループと論理ボリュームを自動的に検出してアクティブにする LVM サービスを提供しています。

サービスは、init システムを介して管理することができます。

openrc

LVMを手動で起動するには:

root #/etc/init.d/lvm start

ブート時にLVMを起動するには:

root #rc-update add lvm boot

systemd

LVMを手動で起動するには:

root #systemctl start lvm2-monitor.service

ブート時にLVMを起動するには:

root #systemctl enable lvm2-monitor.service

initramfsの中でLVMを使う

ほとんどのブートローダは直接 LVM から起動することはできません - GRUB レガシーLILO もです。 GRUB2 は、LVM リニア論理ボリューム、ミラー化論理ボリュームとおそらくいくつかの種類の RAID 論理ボリュームから起動することができます。現時点で、シンプロビジョニングされた論理ボリュームをサポートするブートローダはありません。

それにより、LVM でない /boot パーティションを使い LVM のルートパーティションを initramfs からマウントすることが推奨されています。initramfsは Genkernel または Dracut を使って自動的に生成することができ、さらには手動でカスタム Initramfs として生成することもできます:

  • genkernelは全てのタイプからブート可能です。ただしシンプロビジョニングされたボリュームは除き(それがビルドホストからのsys-block/thin-provisioning-tools バイナリのビルドもコピーもしてなければ)、また、おそらくRAID10も除かれます。(RAID10サポートはLVM2 2.02.98が必要ですがgenkernelは2.02.89をビルドします。しかし、スタティックバイナリがあればそれらがコピーされます);
  • dracutは全てのタイプでブートするはずですが、もしホストがシンプロビジョニングルート上で動いている場合、シンプロビジョニングサポートがinitramfsにて必要です。

Genkernel

sys-kernel/genkernelをインストールしてください。genkernelがシステムバイナリを使うよう(でなければそのプライベートコピーがビルドされます)、静的USEフラグもパッケージsys-fs/lvm2で有効化されます。次の例はinitramfs(カーネル全体ではなく)をビルドし、LVMサポートを有効化します。

root #genkernel --lvm initramfs

genkernelのmanpageは、システム要件に応じて他のオプションの概要を説明します。

initrdはどのようにLVMを開始するか、パラメータを必要とします。そして彼らは他のカーネルパラメータと同じように提供されます。例えば:

ファイル /etc/default/grubdolvmをカーネルパラメータとして追加
GRUB_CMDLINE_LINUX="dolvm"

Dracut

sys-kernel/dracut パッケージは RedHat プロジェクトから移植され、initramfs を生成する類似ツールを提供します。詳細については Dracut のページを参照してください。一般に、次のコマンドは有効なデフォルト initramfs を生成します。

root #dracut -a lvm

initrdはどのようにLVMを開始するか、パラメータを必要とします。そして彼らは他のカーネルパラメータと同じように提供されます。例えば:

ファイル /etc/default/grubカーネルパラメータへのLVMサポートの追加
GRUB_CMDLINE_LINUX="rd.lvm.vg=vol00"

dracutについてのLVMオプションの包括的リストはDracut Manualの一節をご覧ください。

使い方

LVMは次に示す3つの異なるレベルでストレージを構成します:

  • ハードドライブ、パーティション、RAID、物理ボリューム(PV)として初期化される他の種類のストレージ
  • 物理ボリューム(PV)はボリュームグループ(VG)中にグループ化される
  • 論理ボリューム(LV)はボリュームグループ(VG)中に管理される

PV (物理ボリューム)

物理ボリュームはLVMが構成される実際のハードウェアやストレージシステムやストレージです。

パーティショニング

メモ
別々のパーティションをストレージのためにボリュームグループで使うことはディスク全体を単一LVMボリュームグループとして使うことが望まれてない場合に限り必要です。もしディスク全体を使うとなると、これをスキップしディスク全体を物理ボリュームとして設定してください。

LVM のパーティションタイプは 43 (Linux LVM) です。

例えば、fdisk/dev/sdaのパーティションのタイプを設定するには:

root #fdisk /dev/sda

fdisk では、n キーを使ってパーティションをつくり、それから t キーでパーティションタイプを 43 に変更してください。

PVを作成

物理ボリュームはpvcreateコマンドによって作成あるいは初期化されます。

例えば、次のコマンドは/dev/sda/dev/sdbの先頭パーティションに物理ボリュームをつくります:

root #pvcreate /dev/sd[ab]1

PVの一覧

pvdisplayコマンドによってシステムのアクティブな全ての物理ボリュームを得ることができます。

root #pvdisplay
 --- Physical volume ---
  PV Name               /dev/sda1
  VG Name               volgrp
  PV Size               160.01 GiB / not usable 2.31 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              40962
  Free PE               4098
  Allocated PE          36864
  PV UUID               3WHAz3-dh4r-RJ0E-5o6T-9Dbs-4xLe-inVwcV
  
 --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               volgrp
  PV Size               160.01 GiB / not usable 2.31 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              40962
  Free PE               40962
  Allocated PE          0
  PV UUID               b031x0-6rej-BcBu-bE2C-eCXG-jObu-0Boo0x

より多くの物理ボリュームについて表示したければ、pvscanは非アクティブの物理ボリュームを検知し、有効化します。

root #pvscan
  PV /dev/sda1  VG volgrp        lvm2 [160.01 GiB / 16.01 GiB free]
  PV /dev/sdb1  VG volgrp        lvm2 [160.01 GiB / 160.01 GiB free]
  Total: 2 [320.02 GB] / in use: 2 [320.02 GiB] / in no VG: 0 [0]

PVを削除する

LVMは自動的に(そうしないよう指示しない限り)全ての有効な物理ボリュームへデータを順に送ります。もし(ボリュームグループ内の)該当する論理ボリュームがある単一物理ボリュームのフリースペースの量より小さければ、その論理ボリューム用の全てのスペースがその(単一)物理ボリューム上に連続して確保されます。これはパフォーマンス上の理由です。

物理ボリュームがボリュームグループより削除される必要があるのであれば、データがまず物理ボリュームから除去される必要があります。pvmoveコマンドで物理ボリューム上の全てのデータが同一ボリュームグループの物理ボリュームに移されます。

root #pvmove -v /dev/sda1

このような動作は移動する必要があるデータの量に応じて時間がかかります。完了したらデバイス上に残されたデータはないはずです。pvdisplayによってどの論理ボリュームからも物理ボリュームがもはや使われていないことを確認してください。

次のステップは、pvremoveを使って物理ボリュームが"deselected"になった後に物理ボリュームをボリュームグループからvgreduceで削除することです。

root #vgreduce vg0 /dev/sda1 && pvremove /dev/sda1

VG (ボリュームグループ)

ボリュームグループ(VG)は多くの物理ボリュームをまとめ、デバイスファイルシステムに/dev/VG_NAMEとして表示します。ボリュームグループの名前は管理者によって決定されます。

VGを作成

次のコマンドはボリュームグループ"vg0"を/dev/sda1/dev/sdb1として割り当てられた2つの物理ボリュームからつくります。

root #vgcreate vg0 /dev/sd[ab]1

VGの一覧

全てのアクティブなボリュームグループを表示するにはvgdisplayコマンドを使ってください。

root #vgdisplay
  --- Volume group ---
  VG Name               vg0
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  8
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                6
  Open LV               6
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               320.02 GiB
  PE Size               4.00 MiB
  Total PE              81924
  Alloc PE / Size       36864 / 144.00 GiB
  Free  PE / Size       45056 /176.01 GiB
  VG UUID               mFPXj3-DdPi-7YJ5-9WKy-KA5Y-Vd4S-Lycxq3

ボリュームグループが見つからなければvgscanコマンドを使ってください。

root #vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "vg0" using metadata type lvm2

VGを拡張

管理者がストレージ・リソースのプールを使用できるようにボリューム・グループグループの物理ボリュームは、ファイルシステムに割り当てることができます。ボリュームグループが十分な記憶リソースを保持していない場合には、追加の物理ボリュームにボリュームグループを拡張する必要があります。

次の例はボリュームグループ "vg0"を物理ボリューム/dev/sdc1で拡張します。

root #vgextend vg0 /dev/sdc1

物理ボリュームを最初のように初期化する必要があることを忘れないでください!

VGの縮小

物理ボリュームをボリュームグループから削除する必要があるときは物理ボリューム上のまだ使われている全てのデータはそのボリュームグループ内の他の物理ボリュームに移動される必要があります。見てきたように、これはpvmoveコマンドによって行われ、その後物理ボリュームはvgrduceを使うことでボリュームグループから削除されます。

root #pvmove -v /dev/sdc1
root #vgreduce vg0 /dev/sdc1

VGの削除

ボリュームグループがもはや必要でない(あるいは、言い換えれば、それが表すストレージプールがもはや使われてなく、その中の物理ボリュームが他の目的で解放される必要がある)なら、ボリュームグループはvgremoveで削除されます。これは論理ボリュームがボリュームグループに存在しない場合と、プールからすでに除去された物理ボリューム以外の全てにのみ有効です。

root #vgremove vg0

LV (論理ボリューム)

論理ボリュームはシステムを利用可能にする最後のメタデバイスであり、通常、そこにファイルシステムを作成します。論理ボリュームはボリュームグループ中に作成・管理され、/dev/VG_NAME/LV_NAMEとして表示されます。ボリュームグループのように、論理ボリュームに使われる名前は管理者によって決定されます。

LVの作成

論理ボリュームをつくるためには、lvcreateコマンドが使われます。コマンドへのパラメータは論理ボリュームの要求サイズ(ただしボリュームグループ中の空き量量より大きくすることはできません)から成り、それによりボリュームグループ中にスペースが確保され、論理ボリュームの名前がつくられます。

次の例では、論理ボリューム lvol1 がボリュームグループ vg0 から 150MB のサイズで作成されます:

root #lvcreate --size 150M --name lvol1 vg0

lvcreateにボリュームグループ内の全ての空き容量を使うよう指示することが可能です。これは(人間に可読の)サイズではなく"エクステント"の量を指示する-lオプションによって行われます。論理ボリュームはボリュームグループ内のデータの塊である"論理エクステント"に分割されます。ボリュームグループ内の全てのエクステントは同じサイズです。-lオプションでlvcreateに全ての未使用エクステントに割り当てるよう指示できます。

root #lvcreate --extents 100%FREE --name lvol1 vg0

FREE の他に、ボリュームグループ全体のサイズを示すために VG キーも使うことができます。

LVの表示

全てのアクティブな論理ボリュームを表示するにはlvdisplayコマンドを使ってください。

root #lvdisplay

論理ボリュームがない場合、lvscanコマンドが全ての優子なボリュームグループ上の論理ボリュームをスキャンするのに使えます。

root #lvscan

LVを拡張

論理ボリュームを拡張する必要がある場合、lvextendコマンドは論理ボリュームの確保済みスペースを広げるのに使うことが出来ます。

例えば、論理ボリューム"lvol1"を計500MBに拡張するには:

root #lvextend -L500M /dev/vg0/lvol1

トータルサイズではなく追加サイズを指定することも可能です。

root #lvextend -L+350MB /dev/vg0/lvol1

拡張されたボリュームグループは直ちに追加のストレージをユーザーに提供するわけではありません。そのためには、ボリュームグループ上のファイルシステムを必要サイズだけ拡張する必要があります。もしファイルシステムがオンラインリサイズを許可しないばあい、問題のファイルシステムについてドキュメントを調べてください。

例えば、ext4ファイルシステムを500MBになるように拡張するには:

root #resize2fs /dev/vg0/lvol1 500M
ヒント
ファイルシステムによっては、lvresize は論理ボリュームの修正、ファイルシステムの修正、そしてファイルシステムチェックを、ワンステップで実行することができます!
root #lvresize --resizefs --size 150M /dev/vg0/lvol1

LVの縮小

論理ボリュームのサイズを縮小するには、まずファイルシステムそれ自体を縮小してください。。全てのファイルシステムがオンライン縮小をサポートしているわけではありません。

例えば、ext4 はオンライン縮小をサポートしていないので、ファイルシステムはまずアンマウントされる必要があります。不整合を排除するためファイルシステムチェックを行うことが推奨されています:

root #umount /mnt/data
root #e2fsck -f /dev/vg0/lvol1
root #resize2fs /dev/vg0/lvol1 150M

縮小済みファイルシステムのもと、論理ボリュームを縮小することが可能です。

root #lvreduce --size 150M /dev/vg0/lvol1
ヒント
ファイルシステムによっては、lvresize は論理ボリュームの修正、ファイルシステムの修正、そしてファイルシステムチェックを、ワンステップで実行することができます!
root #lvresize --resizefs --size 150M /dev/vg0/lvol1

LV権限

LVMは論理ボリューム上での権限付与をサポートしています。

例えば、論理ボリュームは lvchange コマンドにより read only にすることが可能です:

root #lvchange -p r /dev/vg0/lvol1
root #mount -o remount /dev/vg0/lvol1

変更が直ちに実行されるために再マウントが必要です。

論理ボリュームを再び書き込み可能にするためには、rw パーミッションビットを使ってください:

root #lvchange -p rw /dev/vg0/lvol1 && mount -o remount /dev/vg0/lvol1

LVを削除する

論理ボリュームを削除する前に、それがマウントされていないことを確認してください。

root #umount /dev/vg0/lvol1

さらなる書き込みが起こらないよう論理ボリュームを停止してください:

root #lvchange -a n /dev/vg0/lvol1

ボリュームがアンマウント・停止されたことで削除可能になり、ボリュームグループ内の他の論理ボリュームのためにエクステントを解放することができます。

root #lvremove /dev/vg0/lvol1

機能

LVMはストレージ管理者にたくさんのおもろい機能を提供しています。たとえば

  • シンプロビジョニング (ストレージのオーバーコミット)
  • スナップショット
  • 異なる領域確保方法によるボリュームタイプ

シンプロビジョニング

sys-fs/lvm2 のために thin USE フラグが有効化されていることを確認してください:

ファイル /etc/portage/package.use
# LVM デーモンと関連ツールのサポートを有効化する
sys-fs/lvm2 lvm
# シンプロビジョニングサポートを有効化する
sys-fs/lvm2 thin

LVM (バージョン >=2.02.89) は、"シン"ボリュームをサポートしています。シンボリュームは、ファイルシステムにおけるスパースファイルの考え方を、ブロックデバイスについて適用したものです。シンボリュームの示すサイズは割り付けられたサイズよりも大きく取ることができ、プールよりも大きいサイズにすることさえできます。スパースファイルと同様に、このブロックデバイスの内容が成長するのにしたがって、エクステントが割り付けられていきます。ファイルシステムが discard 操作をサポートしている場合は、ファイルが削除されたときにエクステントが再び解放され、プールの使用率を削減します。

LVM においては、このようなシンプールは、中に論理ボリュームを配置できる特殊な種類の論理ボリュームとなっています。

シンプールを作成する

警告
シンプールメタデータ内でオーバーフローが発生した場合、プールが壊れてしまうでしょう。LVM はこの状態から回復することができません
メモ
シンプールが枯渇した場合、そのシンプールにさらにエクステントを割り付けさせ (ようとし) たプロセスは、そのシンプールが拡張されるかプロセスが SIGKILL を受け取るまで、"killable sleep" 状態に入って動かなくなります。

Each thin pool has metadata associated with it, which is added to the thin pool size. LVM will compute the size of the metadata based on the size of the thin pool as the minimum of pool_chunks * 64 bytes or 2 MiB, whichever is larger. The administrator can select a different metadata size as well.

シンプールを作成するには、lvcreate--type thin-pool --thinpool thin_pool オプションを付与してください:

root #lvcreate -L 150M --type thin-pool --thinpool thin_pool vg0

上の例は、総サイズ 150 MB の thin_pool という名前のシンプールを作成します。これはシンプールのために実際に割り付けられるサイズです (つまり、使用できる実際のストレージの総容量です)。

ボリュームグループ内の残った空き容量を使用するためには:

root #lvcreate -l 100%FREE --type thin-pool --thinpool thin_pool vg0

特定のメタデータサイズを明示的に指定するためには、--metadatasize オプションを使用してください:

root #lvcreate -L 150M --poolmetadatasize 2M --type thin-pool --thinpool thin_pool vg0

シンプールは他の LV とは異なり、関連付けられたデバイスノードを持たないことに注意してください。

シン論理ボリュームを作成する

シン論理ボリュームは、シンプール (これ自体も論理ボリュームです) の中に存在する論理ボリュームです。シン論理ボリュームはスパースなので、-V オプションを使用して、物理サイズではなく仮想サイズを指定します:

root #lvcreate -T vg0/thin_pool -V 300M -n lvol1

この例では、(シン) 論理ボリューム lvol1 が、背後のプールには 150MB のストレージしか実際に割り付けられていないものの、300MB のサイズのデバイスとして見えるようになります。

シンプールと、そのシンプールの中の論理ボリュームを、ひとつのコマンドで同時に作成することもできます:

root #lvcreate -T vg0/thin_pool -V 300M -L150M -n lvol1

シンプールとシン論理ボリュームを一覧表示する

シンプールもシン論理ボリュームも特殊な種類の論理ボリュームであり、そのため lvdisplay コマンドによって表示されます。lvscan コマンドもこれらの論理ボリュームを検出するでしょう。

シンプールを拡張する

シンプールは lvextend を使用してシンでない論理ボリュームと同じように拡張できます。例えば:

root #lvextend -L +500M vg0/thin_pool

シンプールのメタデータも拡張できます:

root #lvextend --poolmetadatasize +5M vg0/thin_pool

シン論理ボリュームを拡張する

シン論理ボリュームは、通常の論理ボリュームと同様に拡張されます:

root #lvextend -L1G vg0/lvol1

lvextend コマンドでは、作成の際に使用した「仮想サイズ」のオプションと同様ではなく、-L オプション (または、エクステント数を使う場合は -l) を使うことに注意してください。

シンプールを縮小する

現時点で、LVM はシンプールのサイズを縮小させることはできません。LVM のバグ 812731 を確認してください。

シン論理ボリュームを縮小する

シン論理ボリュームは、通常の論理ボリュームと同様に縮小されます。

例えば:

root #lvreduce -L300M vg0/lvol1l

lvreduce コマンドでは、作成の際に使用した「仮想サイズ」のオプションと同様ではなく、-L オプション (または、エクステント数を使う場合は -l) を使うことに注意してください。

シンプールを削除する

シンプールは、その中のすべてのシン論理ボリュームが削除されるまで、削除することができません。

シンプールがシン論理ボリュームをひとつも提供していないなら、lvremove コマンドを使って削除することができます:

root #lvremove vg0/thin_pool

LVM2 スナップショットとシンスナップショット

スナップショットは、他の論理ボリュームのコピーとして振る舞う論理ボリュームです。スナップショットはそれが作成された時点でのオリジナルの論理ボリュームの状態として見ることができます。

警告
論理スナップショットボリュームは、元のボリュームと同じファイルシステム LABELUUID を持つので、/etc/fstab ファイルまたは initramfs 上で、これらのファイルシステムを指すために LABEL= または UUID= 記法を使用したエントリが含まれないようにしてください。そうしないと、(意図した) オリジナルの論理ボリュームの代わりに、スナップショットがマウントされてしまうかもしれません。

スナップショット論理ボリュームを作成する

スナップショット論理ボリュームは、lvcreate-s オプションを使用することで作成されます。スナップショット論理ボリュームにも記憶域が割り付けられ、与えられます。LVM はオリジナルの論理ボリュームに対して行われた変更をすべて「記録」し、これらの変更をスナップショットのために割り付けられた記憶域に保管します。スナップショットの状態が問い合わせられたとき、LVM はオリジナルの論理ボリュームを元にして、すべての記録された変更を確認し、変更を「アンドゥ」した結果をユーザに提示します。

したがって、スナップショット論理ボリュームはオリジナルの論理ボリュームへ変更が行われるのに応じて「成長」します。スナップショットに割り付けられた記憶域が完全に使用されると、スナップショットは自動的にシステムから削除されます。

root #lvcreate -l 10%VG -s -n 20140412_lvol1 /dev/vg0/lvol1

上の例は、ボリュームグループ vg0 内の論理ボリューム lvol1 を元にして、20140412_lvol1 という名前のスナップショット論理ボリュームを作成します。スナップショット論理ボリュームは、ボリュームグループに割り付けられた容量 (実際にはエクステント) の 10% を使用します。

スナップショット論理ボリュームにアクセスする

スナップショット論理ボリュームは通常の論理ボリュームと同じようにマウントすることができます。スナップショットに対して行える操作は読み込みのみに制限されません。スナップショットを変更することもできるので、「実運用」用のファイルシステムに変更を加える前に変更をテストするためにスナップショットを使用することができます。

スナップショット論理ボリュームが存在している間は、通常のオリジナルの論理ボリュームはサイズ縮小または削除を行うことができません。

LVM シンスナップショット

メモ
シンスナップショットは、以下に対して取ることができます:
  • シン論理ボリュームのシンプール。
  • 外部の読み取り専用のシンでない論理ボリューム。


シン論理ボリュームに対する通常の (シンでない) スナップショット論理ボリュームを作成することも可能です。

シンスナップショットを作成するには、lvcreate コマンドを -s とともに利用します。サイズの宣言を渡す必要はありません:

root #lvcreate -s -n 20140413_lvol1 /dev/vg0/lvol1

シン論理ボリュームスナップショットは、オリジナルのシン論理ボリュームと同じサイズを持ち、他のシン論理ボリュームと同様に物理割り付けを行いません。

重要
-l または -L を指定すると、それでもスナップショットは作成されますが、出来上がるスナップショットはシンスナップショットではなく、通常のスナップショットになってしまうでしょう。

スナップショットのスナップショットを取ることもできます:

root #lvcreate -s -n 1_20140413_lvol1 /dev/vg0/20140413_lvol1

シンスナップショットには通常のスナップショットに対するいくつかの利点があります。第一に、シンスナップショットは一度作成されると、オリジナルの論理ボリュームから独立したものになります。オリジナルの論理ボリュームは、スナップショットに影響を与えることなく縮小したり削除したりできます。第二に、シンスナップショットを再帰的に (スナップショットのスナップショットを) 作成する場合、通常の再帰 LVM スナップショットで発生する "連鎖" オーバーヘッドがなく、効率的に作成することができます。

スナップショットの状態にロールバックする

論理ボリュームをスナップショットの版にロールバックするには、次のコマンドを使用してください:

root #lvconvert --merge /dev/vg0/20140413_lvol1

ボリュームのサイズにもよりますが、これには数分かかることがあります。親の論理ボリュームがオフラインになったときに初めてロールバックが発生することに注意してください。そのため再起動が必要になるかもしれません。

重要
スナップショットは消失し、この変更を元に戻すことはできません。

シンスナップショットをロールバックする

シンスナップショットをマージするには:

root #lvconvert --merge vg0/20140413_lvol1

これを手動で行うには、オリジナルの論理ボリュームを削除して、スナップショットの名前を変更してください:

root #umount /dev/vg0/lvol1
root #lvremove /dev/vg0/lvol1
root #lvrename vg0/20140413_lvol1 lvol1

様々なストレージ割り付け方法

LVM は様々なストレージの割り付け方法に対応しています:

  • リニアボリューム (これがデフォルトです);
  • ミラー化ボリューム (アクティブ/スタンバイ構成に近い);
  • ストライピング (RAID0);
  • ミラー化ボリューム (RAID1 - アクティブ/アクティブ構成に近い);
  • パリティ付きストライピング (RAID4 および RAID5);
  • ダブルパリティ付きストライピング (RAID6);
  • ストライピングおよびミラーリング (RAID10).

リニアボリューム

リニアボリュームは最もよく使われる LVM ボリュームの種類です。LVM は論理ボリュームを可能な限り物理的に連続して割り付けようとします。論理ボリューム全体を収められる大きさの物理ボリュームがある場合は、LVM はそこに論理ボリュームを割り付け、そうでない場合は可能な限り少ない断片に分けることになります。

先に紹介したボリュームグループと論理ボリュームを作成するコマンドは、リニアボリュームを作成します。

リニアボリュームには特別な前提条件が無いため、最も利用しやすく、自在にリサイズや移動を行うことができます。論理ボリュームが複数の物理ボリュームにまたがって割り付けられている場合、物理ボリュームのどれかひとつでも利用できなくなると、その論理ボリュームはもはや開始させることができず、利用できなくなるでしょう。

ミラー化ボリューム

LVM はミラー化されたボリュームに対応しており、ドライブ障害発生時の耐障害性を提供します。RAID1 とは違い、パフォーマンス上の利点はありません。すべての読み込みと書き込みはミラーの一方に行われます。

ミラーの状態を追跡するために、LVM はログを取る必要があります。このログは、ミラー化論理ボリュームのいずれも含まない物理ボリューム上に配置するのが推奨されます (むしろ必須であることも多いです)。ミラーのために利用できるログは 3 種類あります:

  1. disk はデフォルトのログタイプです。すべての変更は LVM が管理する追加のメタデータエクステントにログとして記録されます。デバイスに障害が発生した場合には、ミラーリング時点までにログに保持された変更は再度復元することができます。
  2. mirror ログは、それ自体がミラーリングされる disk ログです。
  3. core ミラーログはメモリ内にのみミラーの状態を記録します。LVM は、ミラーが有効化されるときに毎回、ミラーを再構築する必要があるでしょう。 このタイプは一時的なミラーで有用です。

1 個のミラーを持つ論理ボリュームを作成するには、任意で特定のログタイプを選択するために --mirrorlog とともに、-m 1 引数 (標準的なミラーリングを選択するために) を渡してください:

root #lvcreate -m 1 --mirrorlog mirror -l 40%VG --nosync -n lvol1 vg0

-m 1 は LVM に 1 個の (追加の) ミラーを作成するように指示するので、2 個の物理ボリュームを必要とします。--nosync オプションは最適化です - これ無しでは、LVM は空のセクタを一方の論理ボリュームからもう一方にコピーすることで、ミラーを同期しようとするでしょう。

既存の論理ボリュームのミラーを作成することもできます:

root #lvconvert -m 1 -b vg0/lvol1

これにはしばらく時間がかかることがあるので、-b オプションによって変換をバックグラウンドで行います。

ミラーを削除するには、ミラーの数を 0 に設定して (戻して) ください:

root #lvconvert -m0 vg0/lvol1

If part of the mirror is unavailable (usually because the disk containing the physical volume has failed), the volume group will need to be brought up in degraded mode:

root #vgchange -ay --partial vg0

On the first write, LVM will notice the mirror is broken. The default policy ("remove") is to automatically reduce/break the mirror according to the number of pieces available. A 3-way mirror with a missing physical volume will be reduced to 2-way mirror; a 2-way mirror will be reduced to a regular linear volume. If the failure is only transient, and the missing physical volume returns after LVM has broken the mirror, the mirrored logical volume will need to be recreated on it.

To recover the mirror, the failed physical volume needs to be removed from the volume group, and a replacement physical volume needs to be added (or if the volume group has a free physical volume, it can be created on that one). Then the mirror can be recreated with lvconvert at which point the old physical volume can be removed from the volume group:

root #vgextend vg0 /dev/sdc1
root #lvconvert -b -m 1 --mirrorlog disk vg0/lvol1
root #vgreduce --removemissing vg0

It is possible to have LVM recreate the mirror with free extents on a different physical volume if one side fails. To accomplish that, set mirror_image_fault_policy to allocate in lvm.conf.

シンミラー

It is not (yet) possible to create a mirrored thin pool or thin volume. It is possible to create a mirrored thin pool by creating a normal mirrored logical volume and then converting the logical volume to a thin pool with lvconvert. 2 logical volumes are required: one for the thin pool and one for the thin metadata; the conversion process will merge them into a single logical volume.

警告
LVM 2.02.98 or above is required for this to work properly. Prior versions are either not capable or will segfault and corrupt the volume group. Also, conversion of a mirror into a thin pool destroys all existing data in the mirror!
root #lvcreate -m 1 --mirrorlog mirrored -l40%VG -n thin_pool vg0
root #lvcreate -m 1 --mirrorlog mirrored -L4MB -n thin_meta vg0
root #lvconvert --thinpool vg0/thin_pool --poolmetadata vg0/thin_meta

ストライピング (RAID0)

リニアボリュームでは複数の連続した物理ボリュームが連結されますが、代わりに、より優れたパフォーマンスのためにストライピングまたは RAID0 ボリュームを作成することができます。これは利用可能な物理ボリュームの間で交互にストレージを割り付けます。

3 個の物理ボリュームにわたるストライピングボリュームを作成するには:

root #lvcreate -i 3 -l 20%VG -n lvol1_stripe vg0
Using default stripesize 64.00 KiB

-i オプションは、何個の物理ボリュームにわたってストライピングを行うべきかを指定します。

ストライプセットをミラーリングすることもできます。ストライピングされたミラーを作成するには、-i および -m オプションを組み合わせることができます:

root #lvcreate -i 2 -m 1 -l 10%VG vg0

これは 2 個の物理ボリュームからなるストライプセットを作成し、別の 2 個の物理ボリューム上にそれをミラーリングし、合計 4 個の物理ボリュームを使用します。既存のストライプセットは lvconvert でミラーリングすることができます。

A thin pool can be striped like any other logical volume. All the thin volumes created from the pool inherit that settings - do not specify it manually when creating a thin volume.

It is not possible to stripe an existing volume, nor reshape the stripes across more/less physical volumes, nor to convert to a different RAID level/linear volume. A stripe set can be mirrored. It is possible to extend a stripe set across additional physical volumes, but they must be added in multiples of the original stripe set (which will effectively linearly append a new stripe set).

ミラーリング (RAID1)

Unlike RAID0, which is striping, RAID1 is mirroring, but implemented differently than the original LVM mirror. Under RAID1, reads are spread out across physical volumes, improving performance. RAID1 mirror failures do not cause I/O to block because LVM does not need to break it on write.

Any place where an LVM mirror could be used, a RAID1 mirror can be used in its place. It is possible to have LVM create RAID1 mirrors instead of regular mirrors implicitly by setting mirror_segtype_default to raid1 in lvm.conf.

警告
LVM RAID1 mirroring is not supported by GRUB before version 2.02. Ensure the latest version is installed with grub-install or the system may become unbootable if the grub files are contained in the LVM RAID1.

1 個のミラーを持つ論理ボリュームを作成するには:

root #lvcreate -m 1 --type raid1 -l 40%VG --nosync -n lvm_raid1 vg0

ミラーを作成するときの違いに注目してください: RAID1 論理ボリュームは明示的なミラーログを持たず、論理ボリュームに組み込まれているので、mirrorlog は指定されていません。

既存の論理ボリュームを RAID1 に変換することもできます:

root #lvconvert -m 1 --type raid1 -b vg0/lvol1

RAID1 ミラーを削除するには、ミラーの数を 0 に設定してください:

root #lvconvert -m0 vg0/lvm_raid1

If part of the RAID1 is unavailable (usually because the disk containing the physical volume has failed), the volume group will need to be brought up in degraded mode:

root #vgchange -ay --partial vg0

Unlike an LVM mirror, writing does NOT break the mirroring. If the failure is only transient, and the missing physical volume returns, LVM will resync the mirror by copying cover the out-of-date segments instead of the entire logical volume. If the failure is permanent, then the failed physical volume needs to be removed from the volume group, and a replacement physical volume needs to be added (or if the volume group has a free physical volume, it can be created on a different PV). The mirror can then be repaired with lvconvert, and the old physical volume can be removed from the volume group:

root #vgextend vg0 /dev/sdc1
root #lvconvert --repair -b vg0/lvm_raid1
root #vgreduce --removemissing vg0

シン RAID1

It is not (yet) possible to create a RAID1 thin pool or thin volume. It is possible to create a RAID1 thin pool by creating a normal mirrored logical volume and then converting the logical volume to a thin pool with lvconvert. 2 logical volumes are required: one for the thin pool and one for the thin metadata; the conversion process will then merge them into a single logical volume.

警告
LVM 2.02.98 or above is required for this to work properly. Prior versions are either not capable or will segfault and corrupt the VG. Also, conversion of a RAID1 into a thin pool destroys all existing data in the mirror!
root #lvcreate -m 1 --type raid1 -l40%VG -n thin_pool vg0
root #lvcreate -m 1 --type raid1 -L4MB -n thin_meta vg0
root #lvconvert --thinpool vg0/thin_pool --poolmetadata vg00/thin_meta

パリティ付きストライピング (RAID4 および RAID5)

メモ
パリティ付きストライピングは少なくとも 3 個の物理ボリュームを必要とします。

RAID0 には耐障害性がありません - 物理ボリュームのうちひとつでも障害が発生すると、論理ボリュームは使用できなくなります。RAID0 にパリティストライプを追加することで、物理ボリュームが欠けている場合でも論理ボリュームを機能させることができます。その後、新しい物理ボリュームを追加して、耐障害性を回復することができます。

Stripe sets with parity come in 2 flavors: RAID4 and RAID5. Under RAID4, all the parity stripes are stored on the same physical volume. This can become a bottleneck because all writes hit that physical volume, and it gets worse the more physical volumes are in the array. With RAID5, the parity data is distributed evenly across the physical volumes so none of them become a bottleneck. For that reason, RAID4 is rare and is considered obsolete/historical. In practice, all stripe sets with parity are RAID5.

root #lvcreate --type raid5 -l 20%VG -i 2 -n lvm_raid5 vg0

データ物理ボリュームのみの個数を -i で指定してください。LVM が自動的にそれにパリティのための 1 を加えます。そのため、3 個の物理ボリュームからなる RAID5 のためには、-i 3 ではなく -i 2 を渡してください。

When a physical volume fails, then the volume group will need to be brought up in degraded mode:

root #vgchange -ay --partial vg0

The volume will work normally at this point, however this degrades the array to RAID0 until a replacement physical volume is added. Performance is unlikely to be affected while the array is degraded - although it does need to recompute its missing data via parity, it only requires simple XOR for the parity block with the remaining data. The overhead is negligible compared to the disk I/O.

RAID5 を修復するには:

root #lvconvert --repair vg0/lvm_raid5
root #vgreduce --removemissing vg0

It is possible to replace a still working physical volume in RAID5 as well:

root #lvconvert --replace /dev/sdb1 vg0/lvm_raid5
root #vgreduce vg0 /dev/sdb1

The same restrictions of stripe sets apply to stripe sets with parity as well: it is not possible to enable striping with parity on an existing volume, nor reshape the stripes with parity across more/less physical volumes, nor to convert to a different RAID level/linear volume. A stripe set with parity can be mirrored. It is possible to extend a stripe set with parity across additional physical volumes, but they must be added in multiples of the original stripe set with parity (which will effectively linearly append a new stripe set with parity).

シン RAID5 論理ボリューム

It is not (yet) possible to create stripe set with parity (RAID5) thin pools or thin logical volumes. It is possible to create a RAID5 thin pool by creating a normal RAID5 logical volume and then converting the logical volume into a thin pool with lvconvert. 2 logical volumes are required: one for the thin pool and one for the thin metadata; the conversion process will merge them into a single logical volume.

警告
LVM 2.02.98 or above is required for this to work properly. Prior versions are either not capable or will segfault and corrupt the VG. Also, coversion of a RAID5 LV into a thin pool destroys all existing data in the LV!
root #lvcreate --type raid5 -i 2 -l20%VG -n thin_pool vg0
root #lvcreate --type raid5 -i 2 -L4MB -n thin_meta vg0
root #lvconvert --thinpool vg0/thin_pool --poolmetadata vg00/thin_meta

ダブルパリティ付きストライピング (RAID6)

メモ
RAID6 は少なくとも 5 個の物理ボリュームを必要とします。

RAID6 は RAID5 と似ていますが、RAID6 は 2 個までの物理ボリューム故障に耐えることができます。そのため、追加の物理ボリュームは必要ですが、RAID5 以上の障害耐性を提供します。

root #lvcreate --type raid6 -l 20%VG -i 3 -n lvm_raid6 vg00

RAID5 と同様に、-i オプションを使用して、パリティのための 2 個の物理ボリュームを除いた、ストライプされる物理ボリュームの個数を指定します。そのため、5 個の物理ボリュームからなる RAID6 のためには、-i 5 ではなく -i 3 を渡してください。

RAID6 の回復は RAID5 と同じです。

メモ
Unlike RAID5 where parity block is cheap to recompute vs disk I/O, this is only half true in RAID6. RAID6 uses 2 parity stripes: One stripe is computed the same way as RAID5 (simple XOR). The second parity stripe is much harder to compute - see [https://www.kernel.org/pub/linux/kernel/people/hpa/raid6.pdf

シン RAID6 論理ボリューム

It is not (yet) possible to create a RAID6 thin pool or thin volumes. It is possible to create a RAID6 thin pool by creating a normal RAID6 logical volume and then converting the logical volume into a thin pool with lvconvert. 2 logical volumes are required: one for the thin pool and one for the thin metadata; the conversion process will merge them into a single logical volume.

警告
LVM 2.02.98 or above is required for this to work properly. Prior versions are either not capable or will segfault and corrupt the VG. Also, conversion of a RAID6 LV into a thin pool destroys all existing data in the LV!
root #lvcreate --type raid6 -i 2 -l20%VG -n thin_pool vg0
root #lvcreate --type raid6 -i 2 -L4MB -n thin_meta vg0
root #lvconvert --thinpool vg0/thin_pool --poolmetadata vg0/thin_meta

LVM RAID10

メモ
RAID10 は最低でも 4 個の物理ボリュームを必要とします。また LVM の構文は、RAID10 フォーマットの必要条件ではないものの、物理ボリュームの個数がストライプの個数およびミラーの個数の倍数であることを必要とします。

RAID10 は RAID0 および RAID1 の組み合わせです。ミラーリングは論理ボリューム単位ではなくストライプ単位で行われるので、RIAD0+RAID1 よりも強力で、レイアウトは対称でなくてもかまいません。RAID10 ボリュームは少なくとも 1 個の物理ボリュームの欠損に耐えることができ、条件によってはそれ以上の耐性を持ちます。

メモ
LVM は現時点で RAID10 を 1 個のミラーに制限しています。
root #lvcreate --type raid10 -l 1020 -i 2 -m 1 --nosync -n lvm_raid10 vg0

-i および -m オプションの両方が指定されます: -i はストライプの個数で、-m はミラーの個数です。2 個のストライプと 1 個のミラーで、4 個の物理ボリュームが必要になります。

シン RAID10

It is not (yet) possible to create a RAID10 thin pool or thin volumes. It is possible to create a RAID10 thin pool by creating a normal RAID10 logical volume and then converting the logical volume into a thin pool with lvconvert. 2 logical volumes are required: one for the thin pool and one for the thin metadata; the conversion process will merge them into a single logical volume.

警告
Conversion of a RAID10 logical volume into a thin pool destroys all existing data in the logical volume!
root #lvcreate -i 2 -m 1 --type raid10 -l 1012 -n thin_pool vg0
root #lvcreate -i 2 -m 1 --type raid10 -l 6 -n thin_meta vg0
root #lvconvert --thinpool vg0/thin_pool --poolmetadata vg0/thin_meta

LVM で実験する

実際のストレージデバイスを使用せずに LVM で実験することができます。これを実現するために、ループバックデバイスを作成します。

まずは、ループバックモジュールがロードされているか確認してください。

root #modprobe -r loop && modprobe loop max_part=63
メモ
ループバックサポートがカーネルに組み込まれている場合は、ブートオプションとして loop.max_part=63 を使用してください。

次に、デバイスのスキャンに udev を使用しないように LVM を設定してください:

ファイル /etc/lvm/lvm.confLVM コンフィグで udev を無効化する
obtain_device_list_from_udev = 0
重要
これはテストのみを目的としたものです。実際のデバイスを取り扱うときは udev を使ったほうが速いので、忘れずに設定を戻してください!

ストレージデバイスとなるイメージファイルをいくつか作成してください。次の例は、実ハードドライブ容量で計約 10GB を取る 5 個のファイルを使用します:

root #mkdir /var/lib/lvm_img
root #dd if=/dev/null of=/var/lib/lvm_img/lvm0.img bs=1024 seek=2097152
root #dd if=/dev/null of=/var/lib/lvm_img/lvm1.img bs=1024 seek=2097152
root #dd if=/dev/null of=/var/lib/lvm_img/lvm2.img bs=1024 seek=2097152
root #dd if=/dev/null of=/var/lib/lvm_img/lvm3.img bs=1024 seek=2097152
root #dd if=/dev/null of=/var/lib/lvm_img/lvm4.img bs=1024 seek=2097152

どのループバックデバイスが利用可能か確認してください:

root #losetup -a

すべてのループバックデバイスが利用可能であると仮定して、次はデバイスを作成してください:

root #losetup /dev/loop0 /var/lib/lvm_img/lvm0.img
root #losetup /dev/loop1 /var/lib/lvm_img/lvm1.img
root #losetup /dev/loop2 /var/lib/lvm_img/lvm2.img
root #losetup /dev/loop3 /var/lib/lvm_img/lvm3.img
root #losetup /dev/loop4 /var/lib/lvm_img/lvm4.img

これで /dev/loop[0-4] デバイスは、システムの他のハードドライブと同じように使用するために、利用可能になりました (ので、物理ボリュームとして利用するのに最適です)。

メモ
次の再起動時に、すべてのループバックデバイスは解放されるでしょうから、フォルダ /var/lib/lvm_img は削除することができます。

トラブルシューティング

LVM は既に一定のレベルの冗長性を提供する機能をいくつか備えています。しかしながら、物理ボリュームまたは論理ボリュームが失われるという状況もあり、そしてそれらを復元できる場合もあります。

vgcfgrestore ユーティリティ

デフォルトでは、LVM 物理ボリューム、ボリュームグループ、または論理ボリュームへの変更時に、LVM2 は /etc/lvm/archive にメタデータのバックアップファイルを作成します。これらのファイルは、意図しない変更 (異なる論理ボリュームの削除など) から回復するために使用することができます。LVM は /etc/lvm/backup に最新のメタデータのバックアップコピーも保持しています。置き換え後のディスクにメタデータを復元するために、あるいは破損したメタデータを修復するために、これらを使用することができます。

ボリュームグループのどの状態が復元のために利用可能であるか確認するには (読みやすさのために出力の一部を記載しています):

root #vgcfgrestore --list vg00
  File:		/etc/lvm/archive/vg0_00042-302371184.vg
  VG name:    	vg0
  Description:	Created *before* executing 'lvremove vg0/lvm_raid1'
  Backup Time:	Sat Jul 13 01:41:32 201

誤って削除した論理ボリュームを復元する

論理ボリューム lvm_raid1 がボリュームグループ vg0 から誤って削除されたと仮定すると、以下のようにして回復することができます:

root #vgcfgrestore -f /etc/lvm/archive/vg0_00042-302371184.vg vg0
重要
vgcfgrestore は LVM メタデータのみを復元し、論理ボリューム内のデータは復元しません。ですが、pvremove、vgremove、および lvremove はメタデータのみを削除し、データはそのまま残します。それでも、/etc/lvm/lvm.confissue_discards が設定されている場合は、これらのコマンドはデータを破壊します

障害の発生した物理ボリュームを交換する

It possible to do a true "replace" and recreate the metadata on the new physical volume to be the same as the old physical volume:

root #vgdisplay --partial --verbose
  --- Physical volumes ---
  PV Name               /dev/loop0     
  PV UUID               iLdp2U-GX3X-W2PY-aSlX-AVE9-7zVC-Cjr5VU
  PV Status             allocatable
  Total PE / Free PE    511 / 102
  
  PV Name               unknown device     
  PV UUID               T7bUjc-PYoO-bMqI-53vh-uxOV-xHYv-0VejBY
  PV Status             allocatable
  Total PE / Free PE    511 / 102

The important line here is the UUID "unknown device".

root #pvcreate --uuid T7bUjc-PYoO-bMqI-53vh-uxOV-xHYv-0VejBY --restorefile /etc/lvm/backup/vg0 /dev/loop1
  Couldn't find device with uuid T7bUjc-PYoO-bMqI-53vh-uxOV-xHYv-0VejBY.
  Physical volume "/dev/loop1" successfully created

This recreates the physical volume metadata, but not the missing logical volume or volume group data on the physical volume.

root #vgcfgrestore -f /etc/lvm/backup/vg0 vg0
  Restored volume group vg0

This now reconstructs all the missing metadata on the physical volume, including the logical volume and volume group data. However it doesn't restore the data, so the mirror is out of sync.

root #vgchange -ay vg0
  device-mapper: reload ioctl on  failed: Invalid argument
  1 logical volume(s) in volume group "vg0" now active
root #lvchange --resync vg0/lvm_raid1
Do you really want to deactivate logical volume lvm_raid1 to resync it? [y/n]: y

This will resync the mirror. This works with RAID 4,5 and 6 as well.

論理ボリュームを非アクティブ化する

以下のコマンドで論理ボリュームを非アクティブ化することができます:

root #umount /dev/vg0/lvol1
root #lvchange -a n /dev/vg0/lvol1

再アクティブ化されるまで、論理ボリュームはどこにもマウントすることができません:

root #lvchange -a y /dev/vg0/lvol1

関連項目

外部資料