CentOS7 LVM によるディスク管理の基本

Linux

<景品表示法に基づく表記> 本サイトのコンテンツには、商品プロモーションが含まれている場合があります。

LVMとは?

LVM(Logical Volume Manager)は、ディスク(ボリューム)管理をするツールです。今ではLinuxをインストールすると自動的にLVMで管理される設定になります。

ひと昔前はLVMがありませんでした。LVMが実装されていないと、ディスクの空き容量が無くなると大がかりな作業が必要でしたが、LVMのおかげて簡単に済ませることが出来るようになりました。

LVMは「物理的」にパーティションを管理するのではなく、「論理的」にパーティションを管理します。

論理的にパーティションを区切ることのメリットは次の通りです。

  • 無駄なパーティション領域を削減できる
  • 領域不足のパーティションを拡張できる
  • 物理的なディスク容量より大きいパーティションを作成できる

LVMの基本的な仕組み

LVMは物理ディスクを3つの階層で論理的に管理します。

  1. PV(物理ボリューム:Physical Volume)で物理パーティションを管理
  2. VG(ボリュームグループ:Volume Group)でPVを管理
  3. LV(論理ボリューム:Logical Volume)でVGを管理
LVMの仕組み
LVMの仕組み

基本的なLVMの作成手順

次のような手順でLVMを利用したパーティションを作成します。

  1. パーティションの作成
  2. PV(物理ボリューム)を作成
  3. VG(ボリュームグループ)を作成
  4. LV(論理ボリューム)を作成
  5. フォーマット
  6. マウント

パーティションの作成

物理ディスク(/dev/sdb)に対してfdiskコマンドを実行し、新しいパーティションをを作成します。

# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x2e7614ee.

コマンド (m でヘルプ): n ← 新しくパーティションを作成

新しくパーティションを作成し、全領域を割り当てます。

コマンド (m でヘルプ): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p ← プライマリーを選択
パーティション番号 (1-4, default 1):  ← 空エンター
最初 sector (2048-16777215, 初期値 2048): ← 空エンター
Last sector, +sectors or +size{K,M,G} (2048-16777215, 初期値 16777215): ← 空エンター
初期値 16777215 を使います
Partition 1 of type Linux and of size 8 GiB is set

パーティションのタイプをLVMに設定します。

コマンド (m でヘルプ): t ← パーティションのタイプを設定
Selected partition 1
Hex code (type L to list all codes): 8e ← LVMを選択
Changed type of partition 'Empty' to 'Linux LVM'

最後に書込みを行います。

コマンド (m でヘルプ): w ← 書込み
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。

PV(物理ボリューム)を作成

pvcreateコマンドを利用してPVを作成します。

# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.

実行結果は色々なコマンドから確認できます。

# pvs
  PV         VG      Fmt  Attr PSize   PFree
  /dev/sda2  centos  lvm2 a--  <29.51g 44.00m
  /dev/sdb1          lvm2 a--   <8.00g <8.00g ← 新しいPVが作成

# pvscan
  PV /dev/sda2   VG centos          lvm2 [<29.51 GiB / 44.00 MiB free]
  PV /dev/sdb1                      lvm2 [<8.00 GiB] ← 新しいPVが作成
  Total: 2 [<37.51 GiB] / in use: 1 [<29.51 GiB] / in no VG: 1 [<8.00 GiB]

# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               centos
  PV Size               29.51 GiB / not usable 3.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              7554
  Free PE               11
  Allocated PE          7543
  PV UUID               VefoGZ-0R9L-eNlh-xbK8-zlNO-Ge4W-WfEm28

  "/dev/sdb1" is a new physical volume of "<8.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1 ← 新しいPVが作成
  VG Name
  PV Size               <8.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               3gtLSl-qfpQ-R0gp-4jgw-NWdY-pse9-qiTx25

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

vgcreateコマンドを利用してVGを作成します。VG名を”test-vg”としました。

#vgcreate test-vg /dev/sdb1
  Volume group "test-vg" successfully created

実行結果は色々なコマンドから確認できます。

# vgs
  VG      #PV #LV #SN Attr   VSize   VFree
  centos    1   2   0 wz--n- <29.51g 44.00m
  test-vg   1   0   0 wz--n-  <8.00g <8.00g ← 新しいVGが作成

# vgscan
  Reading volume groups from cache.
  Found volume group "centos" using metadata type lvm2
  Found volume group "test-vg" using metadata type lvm2 ← 新しいVGが作成 

# vgdisplay
  --- Volume group ---
  VG Name               centos
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <29.51 GiB
  PE Size               4.00 MiB
  Total PE              7554
  Alloc PE / Size       7543 / 29.46 GiB
  Free  PE / Size       11 / 44.00 MiB
  VG UUID               fvJ2Gp-hR96-ysZ9-IWxw-C9BA-G8YN-kZ0bk9

  --- Volume group ---
  VG Name               test-vg ← 新しいVGが作成 
  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               <8.00 GiB
  PE Size               4.00 MiB
  Total PE              2047
  Alloc PE / Size       0 / 0
  Free  PE / Size       2047 / <8.00 GiB
  VG UUID               2ZG94A-PZOK-9JDR-MDUy-BTUD-T2OS-O2doFL

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

lvcreateコマンドを利用します。空き領域の全てを割り当てるLVを作成します。LV名を”test-lv”としました。

#lvcreate -n test-lv  -l 100%FREE test-vg
 Logical volume "test-lv" created.

実行結果は色々なコマンドから確認できます。

# lvs
  LV      VG      Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root    centos  -wi-ao---- 27.46g
  swap    centos  -wi-ao----  2.00g
  test-lv test-vg -wi-a----- <8.00g ← 新しいLVが作成 

# lvscan
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit
  ACTIVE            '/dev/centos/root' [27.46 GiB] inherit
  ACTIVE            '/dev/test-vg/test-lv' [<8.00 GiB] inherit ← 新しいLVが作成

# lvdisplay
  --- Logical volume ---
  LV Path                /dev/centos/swap
  LV Name                swap
  VG Name                centos
  LV UUID                wWBtao-OAOk-IdMq-ch4b-vcFB-SoeS-EFScBp
  LV Write Access        read/write
  LV Creation host, time hogehoge, 2016-10-11 09:59:25 +0900
  LV Status              available
  # open                 2
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/centos/root
  LV Name                root
  VG Name                centos
  LV UUID                Vd88ms-fbbK-Shcj-mDrD-Iloj-3HDs-RONj3G
  LV Write Access        read/write
  LV Creation host, time hogehoge, 2016-10-11 09:59:26 +0900
  LV Status              available
  # open                 1
  LV Size                27.46 GiB
  Current LE             7031
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

  --- Logical volume ---
  LV Path                /dev/test-vg/test-lv ← 新しいLVが作成
  LV Name                test-lv
  VG Name                test-vg
  LV UUID                YFO6Rd-ewSt-l3UR-a7nt-tcHa-jQPd-6MCfSN
  LV Write Access        read/write
  LV Creation host, time hogehoge, 2019-03-27 17:22:22 +0900
  LV Status              available
  # open                 0
  LV Size                <8.00 GiB
  Current LE             2047
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2

フォーマット

lsblkコマンドを利用してデバイス・マッパーを確認します。

# lsblk
NAME                  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0                     2:0    1    4K  0 disk
sda                     8:0    0   30G  0 disk
├─sda1                  8:1    0  500M  0 part /boot
└─sda2                  8:2    0 29.5G  0 part
  ├─centos-root       253:0    0 27.5G  0 lvm  /
  └─centos-swap       253:1    0    2G  0 lvm  [SWAP]
sdb                     8:16   0    8G  0 disk
└─sdb1                  8:17   0    8G  0 part
  └─test--vg-test--lv 253:2    0    8G  0 lvm
sr0                    11:0    1 1024M  0 rom

CentOS7はxfsを利用しています。

mkfs.xfs コマンドを利用してフォーマットします。

# mkfs.xfs /dev/mapper/test--vg-test--lv
meta-data=/dev/mapper/test--vg-test--lv isize=512    agcount=4, agsize=524032 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=2096128, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

マウント

マウントポイントを作成し、mountコマンドを利用してマウントします。

# mkdir test-lvm
# mount /dev/test-vg/test-lv /test-lvm/

実行結果の確認

# df -h
ファイルシス                  サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root          28G  3.1G   25G   11% /
devtmpfs                        485M     0  485M    0% /dev
tmpfs                           496M     0  496M    0% /dev/shm
tmpfs                           496M  7.1M  489M    2% /run
tmpfs                           496M     0  496M    0% /sys/fs/cgroup
/dev/sda1                       497M  255M  243M   52% /boot
tmpfs                           100M     0  100M    0% /run/user/0
tmpfs                           100M     0  100M    0% /run/user/1000
/dev/mapper/test--vg-test--lv   8.0G   33M  8.0G    1% /test-lvm

既にある領域を拡張したい場合

LVMで作成した領域は、非常に容易に領域を拡張することができます。

昔は、ディスク容量の増強は大仕事でした。今ではLVMでディスクを管理しているのでコマンドで、チョイチョイと進めて行くだけです。本当に便利になりました。

使用率が100%に近づいてきたら領域拡張を実施してください。

基本的なLVMの削除手順

削除は、作成の逆を順番に実施します。

マウント解除 → LV削除 → VG 削除 → PV 削除

アンマウント

umountコマンドを利用してアンマウントします。

umount /test-lvm/

LV(論理ボリューム)削除

lvremoveコマンドを利用してLVを削除します。

# lvremove  test-vg test-lv
Do you really want to remove active logical volume test-vg/test-lv? [y/n]: y
  Logical volume "test-lv" successfully removed
  Volume group "test-lv" not found
  Cannot process volume group test-lv

VG(ボリューム・ボリューム)削除

vgremoveコマンドを利用してVGを削除します。

# vgremove test-vg
  Volume group "test-vg" successfully removed

PV(物理ボリューム)削除

pvremoveコマンドを利用してPVを削除します。

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