# LVM (日本語)

関連記事

- Software RAID and LVM
- System Encryption with LUKS
- dm-crypt/Encrypting an entire system#LVM on LUKS
- dm-crypt/Encrypting an entire system#LUKS on LVM

Wikipedia より:

  LVM は Linux カーネルの論理ボリュームマネージャです。ディスクドライブと大容量記憶装置を管理します。

### LVM の構成要素

Logical Volume Management は Linux カーネルの device-mapper 機能を利用して基になっているディスクレイアウトから独立したパーティションのシステムを提供します。LVM を使うことで記憶領域を抽象化することで、（使っているファイルシステムで可能な限り）簡単にパーティションを拡大・縮小したり、物理ディスク上に十分な連続した領域があるかどうか心配することなく、また、fdisk したいディスクが使用中だったり (そしてカーネルが新旧どちらのパーティションテーブルを使っているのかわからなかったり) 他のパーティションをどけなくてはならないという問題に煩わされることなく、パーティションを追加・削除することが可能になります。これは厳密に言えば管理のしやすさの問題です: LVM はセキュリティを追加することはありません。しかしながら、私達の使っている他の2つの技術と上手く収まりがつきます。

LVM の基本的な構成要素は以下の通りです:

- 物理ボリューム (PV, Physical volume): ハードディスク上のパーティション (もしくはハードディスクそれ自体、ループバックファイル) です。これをまとめてボリュームグループを作ることができます。特別なヘッダーがあり物理エクステントに分割されます。物理ボリュームについてはハードドライブを構成するための大きなブロックとして考えて下さい。
- ボリュームグループ (VG, Volume group): ストレージボリューム（つまり一つのディスク）として使われる物理ボリュームの集まりです。ボリュームグループには論理ボリュームが含められます。ボリュームグループはハードドライブとして考えて下さい。
- 論理ボリューム (LV, Logical volume): ボリュームグループの中にある"仮想/論理パーティション"であり、物理エクステントで構成されます。論理ボリュームのことは通常のパーティションみたいなものと考えて下さい。
- 物理エクステント (PE, Physical extent): 論理ボリュームに割り当てるごとができるディスクの欠片 (通常 4MiB) です。物理エクステントはどのパーティションにも割り当てることが出来るディスクのパーツと考えて下さい。

例:

    Physical disks

      Disk1 (/dev/sda):
         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
        |Partition1 50GB (Physical volume) |Partition2 80GB (Physical volume)     |
        |/dev/sda1                         |/dev/sda2                             |
        |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |

      Disk2 (/dev/sdb):
         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
        |Partition1 120GB (Physical volume)                 |
        |/dev/sdb1                                          |
        | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _|

    LVM logical volumes

      Volume Group1 (/dev/MyStorage/ = /dev/sda1 + /dev/sda2 + /dev/sdb1):
         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
        |Logical volume1 15GB  |Logical volume2 35GB      |Logical volume3 200GB               |
        |/dev/MyStorage/rootvol|/dev/MyStorage/homevol    |/dev/MyStorage/mediavol             |
        |_ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |

### 利点

LVM には通常のハードドライブのパーティションを使うよりも幅広い柔軟性があります:

- 多数のディスクを一つの大きなディスクとして使えます。
- 複数のディスクにまたがる論理ボリュームを作れます。
- 小さな論理ボリュームを作成し、満杯になったら"動的に"リサイズできます。
- ディスクの順番と関係なく論理ボリュームをリサイズできます。VG における LV の位置に依存しないので、周辺に空き容量を取る必要がありません。
- オンラインで論理・物理ボリュームをリサイズ・作成・削除できます。ボリューム上のファイルシステムもリサイズする必要がありますが、オンラインリサイズをサポートしているファイルシステムもあります。
- サービスによって使われている LV を、サービスを再起動する必要なく他のディスクへオンラインで移行することができます。
- スナップショットを使うことでファイルシステムのフローズンコピーをバックアップすることができます。サービスを落とす時間を最小限にできます。

以上のことはサーバー環境でとても役に立ちます。デスクトップでは利点が薄れるかもしれませんが、これらの機能を使う価値があるかどうか決めるのはあなたです。

### 欠点

- (ほとんど) Linux でしか使えない。他の OS (FreeBSD, Windows..) には公式なサポートがない。
- システムのセットアップに追加の手順が必要で、やや複雑。
- btrfs ファイルシステムを使用する場合、サブボリューム機能があるので柔軟性のあるレイアウトを作ることができる。そのため、LVM の抽象レイヤーを使う必要性が少なくなる。

## Arch Linux を LVM にインストールする

インストール作業のパーティション分割とフォーマットの手順の間に LVM ボリュームを作成する必要があります。root ファイルシステムにするパーティションを直接フォーマットする代わりに、論理ボリューム (LV) の中に作成します。

lvm2 パッケージをインストールしてください。

概略:

- PV を入れるパーティションを作成します。パーティションのタイプは 'Linux LVM' に設定してください、MBR を使っている場合は 8e、GPT の場合は 8e00 です。
- 物理ボリューム (PV) を作成します。ディスクが一つしかない場合は一つの大きなパーティションに一つの PV を作成するのが良いでしょう。ディスクが複数ある場合はそれぞれにパーティションを作成してパーティション毎に PV を作ることができます。
- ボリュームグループ (VG) を作成して全ての PV を追加します。
- VG の中に論理ボリューム (LV) を作成します。
- ビギナーズガイドの "パーティションのフォーマット" の手順に進んで下さい。
- ビギナーズガイドの “Initial ramdisk 環境の作成” まで行ったら、`mkinitcpio.conf` に lvm フックを追加してください (詳細は下を見て下さい)。

Warning: GRUB Legacy は LVM をサポートしていないため、LVM の中に `/boot` を置くことはできません。GRUB を使っている場合はこの制限はありません。GRUB Legacy を使う必要があるときは、`/boot` パーティションを分割して作成し直接フォーマットするようにしてください。

### 物理ボリュームの作成

適切なパーティションを指定するようにしてください。'Linux LVM' タイプのパーティションを見つけるには:

- MBR システム: `fdisk -l`
- GPT システム: `lsblk` からの `gdisk -l disk-device`

パーティションに物理ボリュームを作成してください:

    # pvcreate disk-device

disk-device は `/dev/sda2` などに置き換えてください。このコマンドはパーティションにヘッダーを作成し LVM に使えるようにします。次のコマンドで作成した物理ボリュームを確認できます:

    # pvdisplay

Note: SSD を使っているなら `pvcreate --dataalignment 1m /dev/sda2` を使用してください (1MiB 境界で整列させる)、ここ を参照。

### ボリュームグループの作成

次は物理ボリュームの上にボリュームグループを作成します。まず新しいパーティションの一つにボリュームグループを作成してから、そこに入れたい他の全ての物理ボリュームを追加します:

    # vgcreate VolGroup00 /dev/sda2
    # vgextend VolGroup00 /dev/sdb1

また、ボリュームグループを作成する際に、VolGroup00 以外の好きな名前を付けることもできます。ボリュームグループがどうなっているか確認するには次のコマンドを使います:

    # vgdisplay

Note: 必要ならば複数のボリュームグループを作成することもできますが、それだと全てのストレージを一つのディスクにまとめることはできなくなります。

### 論理ボリュームの作成

そしてボリュームグループには論理ボリュームを作る必要があります。論理ボリュームを作成するには次のコマンドを使います。新しい論理ボリュームの名前、サイズ、そしてどのボリュームグループに作るかを指定してください:

    # lvcreate -L 10G VolGroup00 -n lvolhome

これで論理ボリュームが作成され `/dev/mapper/Volgroup00-lvolhome` や `/dev/VolGroup00/lvolhome` でアクセスできるようになります。ボリュームグループと同じく、論理ボリュームには好きな名前を命名できます。

論理ボリュームにスワップを作成するには、引数を追加する必要があります:

    # lvcreate -C y -L 10G VolGroup00 -n lvolswap

`-C y` を使うことで連続するパーティションが作られます。スワップ領域を複数のディスクや飛び飛びの物理エクステントにまたがってパーティション分けすることはできません。

ボリュームグループに残っている空き容量全てを使う論理ボリュームを作成するには、次のコマンドを使って下さい:

    # lvcreate -l +100%FREE VolGroup00 -n lvolmedia

作成した論理ボリュームは次のコマンドで確認できます:

    # lvdisplay

Note: 上のコマンドを実行するために device-mapper カーネルモジュールをロード (`modprobe dm-mod`) しなくてはならない場合があります。
Tip: 比較的小さな論理ボリュームを作ってから、後で必要になったときに拡大することも可能です。シンプリシティを尊ぶのなら、ボリュームグループに拡大のための空き容量をいくらか残しておきましょう。

### ファイルシステムの作成と論理ボリュームのマウント

論理ボリュームは `/dev/mapper/` や `/dev/YourVolumeGroupName` に配置されているはずです。論理ボリュームを見つけられないときは、以下のコマンドを使ってデバイスノードを作成するためのモジュールをロードしてボリュームグループが使えるようにしてください:

    # modprobe dm-mod
    # vgscan
    # vgchange -ay

さて論理ボリュームにファイルシステムを作成して通常のパーティションとしてマウントすることが可能になりました (Arch linux のインストールをしているのならば、詳しくはパーティションのマウントを参照してください):

    # mkfs.ext4 /dev/mapper/VolGroup00-lvolhome
    # mount /dev/mapper/VolGroup00-lvolhome /home

Warning: マウントポイントを選択する時は、新しく作成した論理ボリュームを選択してください (次を使って下さい: `/dev/mapper/Volgroup00-lvolhome`)。論理ボリュームが作られている実際のパーティションを選択してはいけません (次は使わないで下さい: `/dev/sda2`)。

### lvm フックを mkinitcpio.conf に追加する

`udev` と `lvm2` の mkinitcpio フックを有効にする必要があります。

`udev` はデフォルトで有効になっています。以下のようにファイルを編集して `block` と `filesystem` の間に `lvm2` を入れて下さい:

    /etc/mkinitcpio.conf:

    HOOKS="base udev ... block lvm2 filesystems"

その後、initial ramdisk の作成を行なってから通常のインストールの手順に戻ることができます。

## 設定

### 高度なオプション

（スナップショットに必要な）モニタリングが必要な場合は lvmetad を有効にしてください。`/etc/lvm/lvm.conf` の `use_lvmetad = 1` を設定することで有効にできます。現在はデフォルトで有効になっています。

自動的に有効になるボリュームを制限するには `/etc/lvm/lvm.conf` の `auto_activation_volume_list` を設定します。よくわからないときは、このオプションはコメントアウトしたままにしてください。

### 論理ボリュームを拡大する

論理ボリュームを拡大するには、まず論理ボリュームを拡大させてから次に新しく作られた空き容量を使うようにファイルシステムを拡大させる必要があります。例えば ext3 が載った 15GB の論理ボリュームがあり 20G まで拡大したいとします。そうすると以下のコマンドを実行しなくてはなりません:

    # lvextend -L 20G VolGroup00/lvolhome (or lvresize -L +5G VolGroup00/lvolhome)
    # resize2fs /dev/VolGroup00/lvolhome

`lvextend` の代わりに `lvresize` を使うことも可能です。

ボリュームグループにある全ての空き容量を使うようにしたい場合は、次のコマンドを使って下さい:

    # lvextend -l +100%FREE VolGroup00/lvolhome

Warning: ファイルシステムによっては拡大するとデータが消失したり、オンラインでの拡大をサポートしていません。
Note: ファイルシステムのリサイズを行わないと、以前のボリュームと同じサイズしか使えません (ボリュームは大きくなっていますが部分的にしか使えません)。

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

基本的にファイルシステムは論理ボリュームと同じ大きさになっているので、まずファイルシステムを縮小してから次に論理ボリュームを縮小する必要があります。ファイルシステムによっては、先にファイルシステムをアンマウントする必要があるかもしれません。例えば ext3 が載った 15GB の論理ボリュームがあり 10G まで縮小したいとします。そうすると以下のコマンドを実行することになります:

    # resize2fs /dev/VolGroup00/lvolhome 9G
    # lvreduce -L 10G VolGroup00/lvolhome

ここでファイルシステムを必要以上に縮小しているのは論理ボリュームを縮小するときにファイルシステムの末尾を偶発的に切り落とすことがないようにするためです。論理ボリュームを縮小した後に、論理ボリュームに残っている空き容量を満たすようにファイルシステムを拡大してください。`lvreduce` の代わりに `lvresize` を使うことも可能です。

    # lvresize -L -5G VolGroup00/lvolhome
    # resize2fs /dev/VolGroup00/lvolhome

Warning:

- ファイルシステムのサイズをデータによって占められている容量よりも削減してはいけません、データを消失する可能性があります。
- ファイルシステムによっては縮小するとデータが消失したり、オンラインでの縮小をサポートしていません。

### 論理ボリュームを削除する

Warning: 論理ボリュームを削除する前に、データは全て他の場所に退避させてください、残っているデータは消去されます！

まず、削除したい論理ボリュームの名前を確認してください。システムにインストールされている全ての論理ボリュームのリストを表示するには次のコマンドを使います:

    # lvs

次に、削除する論理ボリュームのマウントポイントを確認して:

    $ df -h

アンマウントしてください:

    # umount /your_mountpoint

最後に、論理ボリュームを削除してください:

    # lvremove /dev/yourVG/yourLV

`y` を入力することで実際に削除が実行されます。

`/etc/fstab` を更新することを忘れないようにしましょう。

論理ボリュームの削除を確認するには root で `lvs` を実行します (このセクションの一番最初を参照)。

### ボリュームグループに物理ボリュームを追加する

まず使いたいブロックデバイスに新しい物理ボリュームを作成して、それからボリュームグループに追加してください:

    # pvcreate /dev/sdb1
    # vgextend VolGroup00 /dev/sdb1

これでボリュームグループの物理エクステントの総量が増えて、自由に論理ボリュームに割り当てることができるようになります。

Note: ストレージメディアのパーティションテーブルは LVM の下に置くのが良いと考えられています。適切なタイプコードを使って下さい: MBR なら `8e`、GPT なら `8e00`。

### ボリュームグループからパーティションを削除する

パーティションにあるデータを全て他のパーティションに移動する必要があります。ありがたいことに、LVM では簡単にできます:

    # pvmove /dev/sdb1

データを特定の物理ボリュームに移したい場合は、`pvmove` の二番目の引数に物理ボリュームを指定してください:

    # pvmove /dev/sdb1 /dev/sdf1

次に物理ボリュームをボリュームグループから削除する必要があります:

    # vgreduce myVg /dev/sdb1

もしくは、空の物理ボリュームを全て削除してください:

    # vgreduce --all vg0

そして最後に、パーティションを他のことに使うために、LVM にパーティションを物理ボリュームとして扱わせないようにするには:

    # pvremove /dev/sdb1

### ボリュームグループを無効化する

次を実行してください:

    # vgchange -a n my_volume_group

これでボリュームグループが無効になりボリュームグループが入っていたコンテナをアンマウントできるようになります。

### スナップショット

#### 説明

LVM を使うことで伝統的なバックアップよりも効率的なシステムのスナップショットを作ることができます。COW (copy-on-write) ポリシーを使うことによって効率化を実現しています。最初に作成したスナップショットには実際のデータの inode のハードリンクだけが含まれます。データに変更が加えられない間は、スナップショットには inode ポインターしかなくデータ自体は入りません。スナップショット先のファイルやディレクトリに変更が入ると、スナップショットによって古いコピーが参照され、新しいコピーは実行中のシステムによって参照されます。このため、35GB のデータがあるシステムでも 2GB 以下しか (オリジナルとスナップショット両方に) 変更を加えない限り、スナップショットに消費する空き容量は 2GB だけです。

#### 設定

スナップショットの論理ボリュームは通常の論理ボリュームと同じように作れます:

    # lvcreate --size 100M --snapshot --name snap01 /dev/mapper/vg0-pv

上記のボリュームでは、スナップショットボリュームが一杯になるまで、データの 100M まで変更を加えることができます。

次のコマンドを使うことによって変更が入った後の 'pv' 論理ボリュームを 'snap01' スナップショットが作られた状態まで戻すことが可能です:

    # lvconvert --merge /dev/vg0/snap01

オリジナルの論理ボリュームが使用中の場合は、次のブート時にマージされます (LiveCD からマージすることもできます)。

マージが行われるとスナップショットはもう存在しなくなります。

また、複数のスナップショットを作成して、それぞれを自由にオリジナルの論理ボリュームにマージすることも可能です。

スナップショットはマウントして dd や tar を使うことでバックアップできます。dd で作られるバックアップファイルのサイズはスナップショットボリュームに入っているファイルのサイズになります。 復元は、スナップショットを作成してマウントして、バックアップをそこに書き込むか展開するだけです。そしてオリジナルのボリュームにマージしてください。

`/etc/mkinitcpio.conf` の MODULES 変数に dm_snapshot モジュールを入れることが必要で、これがないとシステムが起動しなくなります。インストールしたシステムに既に記述してある場合は、次のコマンドでイメージを再生成してください:

    # mkinitcpio -g /boot/initramfs-linux.img

スナップショットは主にバックアップのためのファイルシステムのフローズンコピーを作るのに使われます; 2時間かかるバックアップはパーティションを直接バックアップするよりも一貫性のあるファイルシステムのイメージを提供します。

バックアップやロールバックのためシステム起動時に root ファイルシステムのスナップショットを自動的に作成する方法は Create root filesystem snapshots with LVM を見て下さい。

initramfs によって有効にならない LVM ボリュームがある場合は、lvm2 パッケージに入っている lvm-monitoring サービスを有効化してください。

## トラブルシューティング

### Arch-Linux のデフォルトの変更のためにする必要がある変更

`/etc/lvm/lvm.conf` には `use_lvmetad = 1` を設定する必要があります。現在はデフォルトで設定されています。`lvm.conf.pacnew` ファイルがある場合は、この変更を適用してください。

### LVM コマンドが機能しない

- 適切なモジュールをロードしてください:

    # modprobe dm_mod

`dm_mod` モジュールは自動的にロードされるはずです。そうならない場合は、次を試してみて下さい:

    /etc/mkinitcpio.conf:

    MODULES="dm_mod ..."

変更を適用するには initramfs を再生成する必要があります。

- lvm コマンドを次のように試してみて下さい:

    # lvm pvdisplay

### 論理ボリュームが表示されない

既存の論理ボリュームをマウントしようとしても、`lvscan` に表示されない場合、以下のコマンドによってボリュームを有効にすることができます:

    # vgscan
    # vgchange -ay

### リムーバルメディア上の LVM

症状:

    # vgscan
     Reading all physical volumes.  This may take a while...
     /dev/backupdrive1/backup: read failed after 0 of 4096 at 319836585984: Input/output error
     /dev/backupdrive1/backup: read failed after 0 of 4096 at 319836643328: Input/output error
     /dev/backupdrive1/backup: read failed after 0 of 4096 at 0: Input/output error
     /dev/backupdrive1/backup: read failed after 0 of 4096 at 4096: Input/output error
     Found volume group "backupdrive1" using metadata type lvm2
     Found volume group "networkdrive" using metadata type lvm2

病因:

  最初にボリュームグループを無効にしないで外付けの LVM ドライブを取り外したこと。切断する前に、次を実行するようにしましょう:

    # vgchange -an volume group name

治療:

  外部ドライブのプラグを抜いて数分待って下さい:

    # vgscan
    # vgchange -ay volume group name

### カーネルオプション

カーネルオプションに、`dolvm` が必要かもしれません。`root=` は論理ボリュームに設定してください (例: `/dev/mapper/vg-name-lv-name`)。

## 参照

- LVM2 Resource Page on SourceWare.org
- LVM HOWTO article at The Linux Documentation project
- LVM article at Gentoo wiki
- LVM2 Mirrors vs. MD Raid 1 post by Josh Bryan
- Ubuntu LVM Guide Part 1 Part 2 detals snapshots

Categories:

- Getting and installing Arch (日本語)
- File systems (日本語)