LVMを使ってみる。

小さいサイズのHDDが何個かあって、どかんと大きいサイズでボリュームを作りたいときなぁというときは、ハードウェアRAID使えば複数のHDDを1つのドライブとして扱うことができますが、コントローラカードを買わなければならなかったり、買ったカードにディスクを繋ぎ変えたり、ディスクもタイプ(SAS/SATA)を合わせなければならなかったりといろいろ手間だったりします。

ただ、LinuxでもOSで認識している複数のHDDをグループ化して大きなサイズで使用する機能がLogical Volume Management(LVM)というので提供されておりまして、ハード的な要件を気にせず気軽に使えるので、考え方と使い方をまとめてみました。

ハードウェアRAIDを使ったことがある人はそんなにハードルは高くないと思います。

 

一応、完成形はこんな感じです。

 

f:id:linlinrh:20180202155906p:plain

物理ディスクをグループ化して、グループから論理的なボリュームを作ります。

 

 

  • PV(Physical Volume):
    物理のHDDは2本ですが、片方(sdc)のHDDはパーティションを切ってそのパーティションをPVとして設定します。
    ※パティーションの境目でVGを作れるよ!というのを説明するためにあえて作ってますが、通常はHDDまるごとでVGは作ると思うのであまりやらないかもです。

  • VG(Volume Group):
    上のPVでボリュームグループをつくります。物理的な境目をなくします。

  • LV(Logical Volume):
    作ったボリュームグループからフレキシブルに、論理的なボリュームを切り出します。論理的な境目を作ります。

 

作業の流れです。

基本、PV→VG→LVの3ステップなのですが、今回はパーティションをPVにするために準備作業がありますが。パーティションを使わないときは飛ばしてください。以下手順になります。

 

 

0.準備(オプション)

1本目のHDD(sdb)はスルーして、2本目のHDD(sdc)にパーティションを作成します。今回partedコマンドを使いましたが、もちろんfdiskコマンドでもOKです。

■ボリュームラベルの作成
partedコマンドのmklabel オプションでmsdosを指定するとMBRになります。他gptがあります。

 

[root@host1 ~]# parted /dev/sdc mklabel msdos
Information: You may need to update /etc/fstab.

…infomationの行はpartedコマンドを実行すると出てきますが無視して大丈夫です。

 

■プライマリパーティションの作成

タイプprimaryのパーティション1を201MBで作成します。


[root@host1 ~]# parted /dev/sdc mkpart primary 1 201m
Information: You may need to update /etc/fstab.

 

»printオプションでプライマリパーティションが作成されたかを確認

[root@host1 ~]# parted /dev/sdc print
Model: VMware Virtual disk (scsi)
Disk /dev/sdc: 2147MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start     End      Size     Type      File system Flags
1           1049kB 201MB 200MB primary
[root@host1 ~]#

 

1.PV(物理ボリューム)の作成

LVMでディスクの領域を使うにあたっては、予めPVとしてその領域を予約して起きます。

 

pvcreateコマンドで、領域を設定します。複数PVに設定する場合はスペース区切りでデバイス名を指定します。ここでは、/dev/sdbと/dev/sdc1(パーティション)です。
※オプション-vをつけるとy/nのプロンプトをyで通してくれるので便利です。

 

[root@host1 ~]# pvcreate -v /dev/sdb /dev/sdc1
WARNING: Device for PV kz10h1-geHB-RDlB-Edi1-7S4K-rwfh-l3RN5D not found or rejected by a filter.
Wiping internal VG cache
Wiping cache of LVM-capable devices
WARNING: Device for PV kz10h1-geHB-RDlB-Edi1-7S4K-rwfh-l3RN5D not found or rejected by a filter.
Wiping signatures on new PV /dev/sdb.
Wiping signatures on new PV /dev/sdc1.
Set up physical volume for "/dev/sdb" with 4194304 available sectors.
Zeroing start of device /dev/sdb.
Writing physical volume data to disk "/dev/sdb".
Physical volume "/dev/sdb" successfully created.
Set up physical volume for "/dev/sdc1" with 391168 available sectors.
Zeroing start of device /dev/sdc1.
Writing physical volume data to disk "/dev/sdc1".
Physical volume "/dev/sdc1" successfully created.
[root@host1 ~]#

 

»PV作成後の確認
[root@host1 ~]# pvs
WARNING: Device for PV kz10h1-geHB-RDlB-Edi1-7S4K-rwfh-l3RN5D not found or rejected by a filter.
PV VG Fmt Attr PSize PFree
/dev/sda2 vg00 lvm2 a--   11.19g     8.00m
/dev/sdb            lvm2 ---     2.00g      2.00g
/dev/sdc1          lvm2 --- 191.00m 191.00m
[root@host1 ~]#

 


2.VG(ボリューム・グループ)作成

VG作成もvgcreateでPVを指定してあげるだけなんですけど、今回は、オプション-sを使用してエクステントのサイズを16MBで設定しました。エクステントはLV(論理VOL)に割り当てる際の最小単位となります。デフォルトは4MBですね。ランダムアクセスが多いときは小さいほうがいいですし、シーケンシャルアクセスが多いときは大きい方がいいと思いますが、特にこれと言った感じでもなければ、デフォルトで良いかと。オプション-vは例のy/nのプロンプトをyで通してくれるので便利なやつです。


[root@host1 ~]# vgcreate -s 16 vg01 /dev/sdb /dev/sdc1 -v
WARNING: Device for PV kz10h1-geHB-RDlB-Edi1-7S4K-rwfh-l3RN5D not found or rejected by a filter.
Wiping internal VG cache
Wiping cache of LVM-capable devices
WARNING: Device for PV kz10h1-geHB-RDlB-Edi1-7S4K-rwfh-l3RN5D not found or rejected by a filter.
Wiping signatures on new PV /dev/sdb.
Wiping signatures on new PV /dev/sdc1.
Adding physical volume '/dev/sdb' to volume group 'vg01'
Adding physical volume '/dev/sdc1' to volume group 'vg01'
Archiving volume group "vg01" metadata (seqno 0).
Creating volume group backup "/etc/lvm/backup/vg01" (seqno 1).
Volume group "vg01" successfully created
[root@host1 ~]#

 

» VG作成後の確認 
[root@host1 ~]# vgs    ...VGの情報
VG #PV #LV #SN Attr VSize VFree
vg00 1  3  0  wz--n- 11.19g 8.00m
vg01 2  0  0  wz--n- 2.16g 2.16g
[root@host1 ~]#

[root@host1 ~]# pvs   ...PVの情報
WARNING: Device for PV kz10h1-geHB-RDlB-Edi1-7S4K-rwfh-l3RN5D not found or rejected by a filter.
PV VG Fmt Attr PSize PFree
/dev/sda2 vg00 lvm2 a-- 11.19g 8.00m
/dev/sdb  vg01 lvm2 a-- 1.98g 1.98g
/dev/sdc1   vg01 lvm2 a-- 176.00m 176.00m
[root@host1 ~]#

 

[root@host1 ~]# vgdisplay -v vg01   ...VGの詳細 ※-vをつけると詳細表示
--- Volume group ---
VG Name vg01
System ID
Format lvm2
Metadata Areas 2
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 2
Act PV 2
VG Size 2.16 GiB
PE Size 16.00 MiB
Total PE 138
Alloc PE / Size 0 / 0
Free PE / Size 138 / 2.16 GiB
VG UUID qeYXfr-Yfs6-dEdO-Werb-1Iji-3E8p-3M2ILl

--- Physical volumes ---
PV Name /dev/sdb
PV UUID RcjuXH-9LAj-oxKA-HhM3-1rFf-Aolm-XnH82s
PV Status allocatable
Total PE / Free PE 127 / 127

PV Name /dev/sdc1
PV UUID D1ODWI-9Nml-ZTWY-rRe0-H3YA-aUQ9-ovGlMf
PV Status allocatable
Total PE / Free PE 11 / 11


3.LV(論理ボリューム)作成

 LVの作成はlvcreateで行います。サイズ指定はオプション-Lになります。単位を付けないとMB指定になります。

 

1つ目のLVを600MBで、vg01上に作成します。

 

[root@host1 ~]# lvcreate -L 600 vg01 -v
Rounding up size to full physical extent 608.00 MiB
Archiving volume group "vg01" metadata (seqno 1).
Creating logical volume lvol0
Creating volume group backup "/etc/lvm/backup/vg01" (seqno 2).
Activating logical volume vg01/lvol0.
activation/volume_list configuration setting not defined: Checking only host tags for vg01/lvol0.
Creating vg01-lvol0
Loading vg01-lvol0 table (253:3)
Resuming vg01-lvol0 (253:3)
Wiping known signatures on logical volume "vg01/lvol0"
Found existing signature on /dev/vg01/lvol0 at offset 536: LABEL="(null)" UUID="kz10h1-geHB-RDlB-Edi1-7S4K-rwfh-l3RN5D" TYPE="LVM2_member" USAGE="raid"
WARNING: LVM2_member signature detected on /dev/vg01/lvol0 at offset 536. Wipe it? [y/n]:    …-vをつけたのに出てしまいました。。。
Accepted input: [y]
Wiping LVM2_member signature on /dev/vg01/lvol0.
Initializing 4.00 KiB of logical volume "vg01/lvol0" with value 0.
Logical volume "lvol0" created.
[root@host1 ~]#

 

2つ目のVLを作成します。

今度はサイスを1.2GB(単位をgで)で、オプション-nで名前をtestVolにして作成します。

 

[root@host1 ~]# lvcreate -L 1.2g -n testVol vg01
Rounding up size to full physical extent 1.20 GiB
Logical volume "testVol" created.
[root@host1 ~]#

2度目以降のLV作成は、メッセージが少ないですね。

 

» LV作成後の確認 

[root@host1 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home vg00 -wi-ao---- 956.00m
root vg00 -wi-ao---- 9.31g
swap vg00 -wi-ao---- 956.00m
lvol0 vg01 -wi-a----- 608.00m
testVol vg01 -wi-a----- 1.20g


[root@host1 ~]# lvscan
ACTIVE '/dev/vg01/lvol0' [608.00 MiB] inherit
ACTIVE '/dev/vg01/testVol' [1.20 GiB] inherit
ACTIVE '/dev/vg00/root' [9.31 GiB] inherit
ACTIVE '/dev/vg00/home' [956.00 MiB] inherit
ACTIVE '/dev/vg00/swap' [956.00 MiB] inherit
[root@host1 ~]#

 

[root@host1 ~]# lvdisplay /dev/vg01/lvol0
--- Logical volume ---
LV Path /dev/vg01/lvol0
LV Name lvol0
VG Name vg01
LV UUID cXdAjp-ajia-S8rI-3xUi-naqx-wS1a-D2sMcj
LV Write Access read/write
LV Creation host, time host1.example.com, 2018-02-02 15:19:55 +0900
LV Status available
# open 0
LV Size 608.00 MiB
Current LE 38
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3

[root@host1 ~]#

 


[root@host1 ~]# lvdisplay /dev/vg01/testVol
--- Logical volume ---
LV Path /dev/vg01/testVol
LV Name testVol
VG Name vg01
LV UUID nnmIZp-Ldse-tUVh-xwB8-nOkK-XklO-utD1kt
LV Write Access read/write
LV Creation host, time host1.example.com, 2018-02-02 15:22:44 +0900
LV Status available
# open 0
LV Size 1.20 GiB
Current LE 77
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:4
[root@host1 ~]#

 

 

以上でした。