LVMについて個人的なまとめ (概要とLVMの作成まわりについて)



参考にしたもの:[Red Hat Enterprise Linux 6 論理ボリュームマネージャーの管理(pdf)](https://goo.gl/bMSSOl "")


## 0.前置きとか
※ GRUB LegacyはLVM未サポート.
→LVMの中に/bootはおけない.(GRUB2の場合は可.)
GRUB LegacyでLVMを使用する場合は/bootを分割して作成し直接フォーマットすること.

#####利点
･容量の柔軟性:ファイルシステムを複数のディスクにまたがって拡張可能
･再変更可能なストレージプール
･ディスクのストライピング:2つ以上のディスクにまたがってデータをストライプする論理ボリュームの作成が可能
･スナップショット
とかいろいろ

#####物理ボリューム(PV):
･LVM論理ボーリュームように物理デバイスを使用するにはPVとして初期化する必要がある.
･初期化すると先頭にラベルが付加される.このラベルは2番目の512バイトセクタにに配置される(デフォルト)
→先頭から4セクタ以内ならいいみたい
･ラベルはデバイスをPVとして識別するもであり,これには物理ボリューム用のUUIDが含まれれる.
･LVMメタデータにはシステム上のLVMボリュームグループの詳細設定が含まれる.
→これらは同一のコピーがボリュームグループ内のすべてのPVのメタデータ領域で保持される.

#####LVMボリュームレイアウト
･PVの物理レイアウトのこと.
･LVMラベルは2セクタ目にあり,次にメタデータ領域,デバイスの使用可能領域の順に続く.

#####ボリュームグループ(VG)
･PVはVGに統合される.→論理ボーリュームに割り当てるためのディスク領域プールができる.
･割当可能なディスク領域はエクステントと呼ばれる固定サイズの単位に分割される.
→1エクステントが割当可能な最小単位.(デフォルト4MB)
→物理ボリューム内ではエクステントは物理エクステントとと呼ばれる.
･論理ボリュームは物理エクステントと同じサイズの論理エクステントを割り当て可能.


とりあえずざっくりまとまるならPV>VG>LVの3つの関係をなんとなく理解すれば作成くらいまでは
大丈夫じゃないかな､と

## 1.物理ボリューム(PV)の管理
#####1.1 パーティションタイプの作成
･適宜partedやfdiskを用いてパーティションを作成する←パーティションに作成する場合
※dosの場合はパーティションIDを0x8eとする必要がある

##### 1.2.PVの作成
```shell-session
･パーティションを初期化する場合
# pvcreate /dev/sdb1
Physical Volume “/dev/sdb1” successfully created

･複数のデバイスを初期化する場合
# pvcreate /dev/sdb /dev/sdc /dev/sdd
```

##### 1.3.ブロックデバイスの表示

```shell-session
･PVとして使用可能なブロックデバイスの表示
# lvmdiskscan
```

##### 1.4.PVの表示
LVMの物理ボリューム情報を表示するにはpvs, pvdisplay, pvscanがある.

```shell-session
･pvs:1PV毎に1行ずつ表示する
# pvs
  PV         VG         Fmt  Attr PSize  PFree
  /dev/sdb1  VolGroup00 lvm2 a--  20.00g 20.00g

･pvdisplay:各PVの詳細情報を表示
# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               VolGroup00
  PV Size               20.00 GiB / not usable 3.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              5119
  Free PE               5119
  Allocated PE          0
  PV UUID               85SJvt-2VGL-MoZq-KsOV-ACAV-U8zC-cwbITn

･pvscan:検出される全てのLVmブロックデバイスの表示
# pvscan
  PV /dev/sdb1   VG VolGroup00   lvm2 [20.00 GiB / 20.00 GiB free]
  Total: 1 [20.00 GiB] / in use: 1 [20.00 GiB] / in no VG: 0 [0   ]

```

※ 特定のボリュームをスキャンしないようlvm.confにフィルタを定義することが可能
  →pvchangeコマンドで空き領域に物理エクステントを割り当てられないようにできるみたい

##### 1.5.PVサイズの変更
･pvrisizeコマンドを使用することで可能.LVMが物理ボリュームを使用中でも実行可能.

##### 1.6.PVの削除
※ 削除するPVがVGで使用している場合はvgreduceコマンドでVGからPVを取除くこと

```shell-session
# pvdisplay
  "/dev/sdb1" is a new physical volume of "20.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name
  PV Size               20.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               85SJvt-2VGL-MoZq-KsOV-ACAV-U8zC-cwbITn

# pvremove /dev/sdb1
  Labels on physical volume "/dev/sdb1" successfully wiped
```

## 2.ボリュームグループ(VG)の管理
##### 2.1.VGの作成
```shell-session
# pvs ← PV情報を表示
  PV         VG   Fmt  Attr PSize  PFree
  /dev/sdb1       lvm2 ---  20.00g 20.00g

# vgcreate VG01 /dev/sdb1 ← VG01という名前のVGを作成(デバイスは複数選択可)
  Volume group "VG01" successfully created
```
･vgcreateはデフォルトで4MBのエクステントに分割される.オプションでエクステントサイズの指定やVGに追加できるPVの数を制限することなどが可能.また,割当ポリシーに関してもオプション指定ができる.

･LVMのVGとその配下のPVは/dev/vg/lv/に配置される.
/dev/<VG名>/<PV名>/←な書式
※ 対応するPVがアクティブな場合表示される.

##### 2.2.VGの表示
･VGではvgsとvgdisplayコマンドがある.

```shell-session
･vgs:1ボリュームに付き1行で表示
# vgs
  VG   #PV #LV #SN Attr   VSize  VFree
  VG01   1   0   0 wz--n- 20.00g 20.00g

･vgdisplay:VGのサイズ,エクステント,PVの数などを表示
# vgdisplay ← VG名を指定することも可能
  --- Volume group ---
  VG Name               VG01
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               20.00 GiB
  PE Size               4.00 MiB
  Total PE              5119
  Alloc PE / Size       0 / 0
  Free  PE / Size       5119 / 20.00 GiB
  VG UUID               ot0rzm-1yCy-Yz3b-D7Df-2DFW-0dDB-7bA21I
```
##### 2.3.キャッシュファイルの構築
･/etc/lvm/cache/.cacheファイル内のLVMキャッシュファイルが更新される.
 システム起動時やvgcreate実行時などに自動実行されるが,手動で実行しないといけない場合がある.
 →SANにディスクを追加した場合やPVとしてラベル付された新しいディスクをホットプラグする場合などに必要になる可能性があるみたい.

```shell-session
# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "VG01" using metadata type lvm2
```

##### 2.4.VGからPVの削除
```shell-session
･VGから未使用のPVを削除するにはvgreduceを使用する.
→該当のPVがLVに使用されているかどうかを確認するにはpvdisplayコマンドを使用
# pvdisplay /dev/sdb1
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               VG01
  PV Size               20.00 GiB / not usable 3.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              5119
  Free PE               5119
  Allocated PE          0
  PV UUID               1UVxod-Mhi0-AU3R-0SvL-nAks-FnWD-YocaTr

# vgreduce <VG名> <デバイス名> ←複数指定可
```
※ PVが使用されている場合pvmoveコマンドでデータを別のPVへ移行させる必要がある.

メモ:VGにPVが1つの時にvgreduceをしたら怒られた,素直にvgremoveした方がいい?

```shell-session
# vgreduce VG01 /dev/sdb1
  Can't remove final physical volume "/dev/sdb1" from volume group "VG01"
```
##### 2.5.VGのパラメータ変更
･VGに追加できるPVの最大数の指定や,VGのアクティブ化/非アクティブ化などのパラメータ変更はvgchangeコマンドで変更できる.

##### 2.6.VGの削除

```shell-session
# vgremove VG01 ← VG名を指定
  Volume group "VG01" successfully removed
# vgs
# 
```
##### 2.6.その他できること
その他VGの分割(vgsplit)や結合(vgmerge),VG名の変更(vgrename)などが可能だけど詳細は割愛

## 3.論理ボリューム(LV)の管理
##### 3.1.LVの作成

```shell-session
･VG01というVGに2Gと3GのLVを作成する
→名前を指定しない場合自動的に｢lvol+ボリューム番号｣で作成される.
→また,サイズはb(byte), K(kilobyte), M(MG), G(GB)とか指定できる(デフォルトはMB) 
# lvcreate -L 2G VG01
  Logical volume "lvol0" created.
# lvcreate -L 3000 VG01 
  Logical volume "lvol1" created.
# lvcreate -L 3000 -n hoge VG01 ← VG(VG0)に3000MBのhogeというLVを作成
  Logical volume "hoge" created.
# lvs
  LV    VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  hoge  VG01 -wi-a----- 2.93g ←3000=3GBではないみたい
  lvol0 VG01 -wi-a----- 2.00g
  lvol1 VG01 -wi-a----- 3.00g
  
･空き領域全てを指定する場合
# lvcreate -l 100%FREE VG01
  Logical volume "lvol3" created.
※ -lオプションはその他にもVGサイズを%指定してLVサイズとすることも可能.
```
##### 3.2.LVの表示
･lvs,lvdisplay,lvscanの3つ.

```shell-session
# lvs
  LV    VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  hoge  VG01 -wi-a----- 2.93g                                                   
  lvol0 VG01 -wi-a----- 2.00g                                                   
  lvol1 VG01 -wi-a----- 3.00g

･lvdisplay:サイズ,レイアウト,マッピングなどを表示
# lvdisplay
  --- Logical volume ---
  LV Path                /dev/VG01/lvol0
  LV Name                lvol0
  VG Name                VG01
  LV UUID                afVtJj-cUaZ-5Tl1-PNZy-6W5t-iA3s-hLSLGy
  LV Write Access        read/write
  LV Creation host, time nekousa-cent6, 2016-01-27 10:57:54 -0500
  LV Status              available
  # open                 0
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0
(省略)

･lvscan:システム内全てのLVを一覧表示する.
# lvscan
  ACTIVE            '/dev/VG01/lvol0' [2.00 GiB] inherit
  ACTIVE            '/dev/VG01/lvol1' [3.00 GiB] inherit
  ACTIVE            '/dev/VG02/hoge' [2.93 GiB] inherit
```
###3.3.LVの削除

```shell-session
･LVを削除する場合はLVをアンマウント後に下記のようにする.
#lvremove /dev/VG01/lvol2
Do you really want to remove active logical volume lvol2? [y/n]: y
  Logical volume "lvol2" successfully removed
# lvscan
  ACTIVE            '/dev/VG01/lvol0' [2.00 GiB] inherit
  ACTIVE            '/dev/VG01/lvol3' [12.07 GiB] inherit
# lvremove /dev/VG01/lvol3
Do you really want to remove active logical volume lvol3? [y/n]: y
  Logical volume "lvol3" successfully removed
# lvscan
  ACTIVE            '/dev/VG01/lvol0' [2.00 GiB] inherit
# lvs
  LV    VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lvol0 VG01 -wi-a----- 2.00g
```  
### 3.4.その他
･その他,ボリューム拡張,ストライプ化ボリュームや,ミラー化LV,シンプロビジョニングなどいろいろできるけど割愛