2020/08/09 CentOS7.4





LVMでボリュームを拡張する

LVM論理ボリュームとはストレージを抽象化し、ディスク容量を柔軟にします。
またディスクの拡張・削減・構成変更の際も、システムを停止することなく変更できるため運用コストが下がります。

本家Redhat 論理ボリューム
と、Redhat本家にもありますが、けっこう多くの人が苦手意識を持っているのも確かです。
コマンドがややこしいですからね。

CentOS6まではsystem-config-lvmというGUIもあったようですが、CentOS7では削除されました。
現在はSSM(SystemStorageManager)と呼ばれるツールがモダンのようですがそもそもLVMの内容を把握してないと、コマンドがなにをしているかはピンときません。

LVMはいろいろなことができるため、全てを学ぼうとすると情報が多くなります。
そこで、勉強がてら実際に一番必要としやすい「容量を増やす」に絞って記載します。

課題
「/varの容量が足らなくなったので、増やしたい」

LVM拡張のコマンドだけ列挙すると、以下の手順になります。
追加ディスクへパーティションの作成
#fdisk

物理ボリュームへの追加
#pvcreate /dev/sdb1

物理ボリュームの状態確認、ボリュームグループの名前確認
#pvdisplay

ボリュームグループの状態確認
#vgdisplay

ボリュームグループへ追加
#vgextend centos /dev/sdb1

論理ボリュームの状態確認
#lvdisplay

論理ボリュームの拡張
#lvextend -L+20G /dev/centos/var --resizefs
pv、vg、lvという略語が頭についてるだけで、displayやextendといったコマンドは統一されています。


LVMは順序が重要です。一見すると手順が長い気がしますが、順序通りだと理解しやすいです。

用語の説明
前提。そもそもLVMじゃないとできない
ディスクの追加
新しいディスクへパーティションを作成する
物理ボリュームへディスクを追加
ボリュームグループへ追加する
論理ボリュームを拡張する




用語の説明

○ボリュームとパーティション

パーティションとはその名のとおり「仕切り」です。
Windowsの知識を持つ人なら、500GBのHDDを250GB/250GBに割ってCドライブとDドライブとして利用することはよくあるでしょう。
500GBのHDDを250GB/250GBの領域に割ったら、それはパーティションです。
そこにCドライブ、Dドライブと名前を付けてフォーマットし、利用可能にしたらボリュームです。

パーティションがボリュームとは限りません。
割っただけで「未使用」状態のパーティション領域は、ボリュームではありません。

ボリュームもパーティションとは限りません。
1TBのHDDに1つのパーティションを作り、そのHDDを3つ束ねて「3TBのDドライブ」として利用した場合、
3パーティションと1ボリュームとなります。
これもボリューム イコール パーティションになってません。


○LVMにおける用語

LVMではその名の通り、ボリュームを管理します。
「パーティションを作成する」というレベルのコマンドは用意されていません。そこはfdiskなど他のツールを使います。
物理ボリューム、論理ボリューム、と全てボリュームという単語で統一されています。

LVMで出てくる単語
物理デバイス
/dev/sdbとか。代表格はHDD。
物理ボリューム(PV)
/dev/sdb1とか。物理デバイスに作成されたLVMタイプの領域(ボリューム)。
この領域にさらに物理ボリュームの設定をすることで、ボリュームグループで
選択できるようになります。
ボリュームグループ(VG)
物理ボリュームを束ねた領域。ここから切り出して使う。
論理ボリューム(LV)
ボリュームグループから切り出した領域。この領域をマウントしてOS上から
使用する。




前提。そもそもLVMじゃないとできない

LVMは柔軟にいろんなことができますが、結局一番多い要件が「容量が足らなくなったので増やしたい」ではないでしょうか。
特に仮想環境が普及した現在、仮想ディスクの追加は容易になりました。

「/varの容量が不足してきたので、拡充したい」 という例をあげます。


/varの容量がひっ迫してきました。
16GBの内、14GBが使用されています。
#df -m
ファイルシス            1M-ブロック  使用 使用可 使用% マウント位置
devtmpfs                       1391     0   1391    0% /dev
tmpfs                          1408     0   1408    0% /dev/shm
tmpfs                          1408    10   1398    1% /run
tmpfs                          1408     0   1408    0% /sys/fs/cgroup
/dev/mapper/centos-root       10230  4041   6190   40% /
/dev/sda1                      1014   183    832   19% /boot
/dev/mapper/centos-var        16370 14284   2087   88% /var
tmpfs                           282     1    282    1% /run/user/42
tmpfs                           282     0    282    0% /run/user/0
これをLVMで容量を拡張します。

ですがそもそもLVMが構成されていないとハナシになりません。

OSインストール時にディスクが「自動構成」になっている、もしくは


手動構成でデバイスタイプにLVMを選択している必要があります。


今回のテーマは「/varの容量を増やしたい」なので、/varボリュームが、LVMで構成されている必要があります。


fdiskコマンドにより現在のパーティションを確認します。
ここでは/dev/sda2に/varがあるとします。
#fdisk -l
Disk /dev/sda: 32.2 GB, 32212254720 bytes, 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x00091abe

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    62914559    30407680   8e  Linux LVM

Disk /dev/mapper/centos-root: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
(略)
/dev/sda2がLVMであることを確認できました。




ディスクの追加


拡張するため、空きディスクを追加します。
ここではVirtualBoxなのですが、もちろんESXiでもHyper-Vでも同様です。


20GBの空ディスクを接続しました。



ディスク追加後、改めてOSを起動し、fdiskコマンドでデバイスリストを確認します。
するとメッセージが変化しました。
#fdisk -l
Disk /dev/sda: 32.2 GB, 32212254720 bytes, 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x00091abe

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    62914559    30407680   8e  Linux LVM

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト

Disk /dev/mapper/centos-root: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
(略

/dev/sdbが見つかったが、パーティションはまだないことが分かります。

ここからの流れは
 ・fdiskにより、/dev/sdbへパーティションを作成
 ・fdiskにより、作成したsdb1のタイプをLVMへ設定
 ・pvcreateにより、物理ボリュームへsdb1を追加
 ・vgcreateにより、既存のボリュームグループでsdb1を追加
 ・/varを広げる
という流れになります。




新しいディスクへパーティションを作成する


fdiskにより、新しいディスクへLVMタイプのパーティションを作成します。

・nコマンドにより、パーティションの新規作成
・pコマンドにより、プライマリパーティション設定(default)
・パーティション容量で、ディスク全体(default)
・tコマンドにより、パーティションタイプからLVMを選択(途中Lコマンドで一覧表示してます)
・wコマンドにより、書き込み

となります。


赤い行が入力ポイントです
#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 0xe9fe66d1.

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

コマンド (m でヘルプ): t
Selected partition 1
Hex code (type L to list all codes): L

 0  空              24  NEC DOS         81  Minix / 古い Li bf  Solaris
 1  FAT12           27  Hidden NTFS Win 82  Linux スワップ  c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 隠し C: ド c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux 拡張領域  c7  Syrinx
 5  拡張領域        41  PPC PReP Boot   86  NTFS ボリューム da  非 FS データ
 6  FAT16           42  SFS             87  NTFS ボリューム db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux プレーン  de  Dell ユーティリ
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt
 9  AIX ブート可能  4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access
 a  OS/2 ブートマネ 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad ハ eb  BeOS fs
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT
 f  W95 拡張領域 (L 54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC
11  隠し FAT12      56  Golden Bow      a8  Darwin UFS      f1  SpeedStor
12  Compaq 診断     5c  Priam Edisk     a9  NetBSD          f4  SpeedStor
14  隠し FAT16 <32M 61  SpeedStor       ab  Darwin ブート   f2  DOS セカンダリ
16  隠し FAT16      63  GNU HURD または af  HFS / HFS+      fb  VMware VMFS
17  隠し HPFS/NTFS  64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE
18  AST SmartSleep  65  Novell Netware  b8  BSDI スワップ   fd  Linux raid 自動
1b  隠し W95 FAT32  70  DiskSecure Mult bb  隠し Boot Wizar fe  LANstep
1c  隠し W95 FAT32  75  PC/IX           be  Solaris ブート  ff  BBT
1e  隠し W95 FAT16  80  古い Minix
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'

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

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

再度fdiskでリスト表示します。
#fdisk -l
Disk /dev/sda: 32.2 GB, 32212254720 bytes, 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x00091abe

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    62914559    30407680   8e  Linux LVM

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0xe9fe66d1

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1            2048    41943039    20970496   8e  Linux LVM

Disk /dev/mapper/centos-root: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
/dev/sdb1のLVM領域を確認できます。





物理ボリュームへディスクを追加


ここからLVMの変更に入ります。
コマンドの細かいオプションについてはRedhatのページに詳細に記載されています。
本家Redhat 物理ボリュームの管理

物理デバイスにfdiskを使ってLVMボリュームを作成しただけでは、利用可能にはなりません。
物理ボリュームとして「登録」する必要があります。

物理ボリュームを表示するコマンドはいくつかあります。
pvdisplay、lvmdiskscan、pvscanなどです。

物理ボリュームとして登録されているデバイスを確認します。
#pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               centos
  PV Size               <29.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              7423
  Free PE               0
  Allocated PE          7423
  PV UUID               e9aECd-IT9a-CIAY-6yCM-TEUV-12tG-mSy5xz
現在のボリュームグループの名前(VG Name)を確認します。
/dev/sda2という「物理ボリューム」1つにより、ボリュームグループ「centos」が構成されていることを確認できます。
つまり、追加するつもりの/dev/sdb1が、物理ボリュームに表示されていないことが分かります。


コマンドによりLVMボリュームを、物理ボリュームへ追加します。
#pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.
感覚的には物理ボリュームという単語は/dev/sdb1というボリュームでもあり、ボリュームグループから利用可能になる登録グループ、という二重の意味があるように思えます。
なので/dev/sdb1を物理ボリュームへ「参加させる」と表現すると、自分は理解しやすいです。


pvdiskplayで確認すると、/dev/sdb1が増えました。
しかしVG Nameのパラメータは空白です。まだ使用されていないことを示します。
#pvdisplay
 --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               centos
  PV Size               <29.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              7423
  Free PE               0
  Allocated PE          7423
  PV UUID               e9aECd-IT9a-CIAY-6yCM-TEUV-12tG-mSy5xz

  "/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               nbrfNY-MAdS-CLIv-pwx8-2HWz-stfL-Nf2OeE




ボリュームグループへ追加する


本家Redhat ボリュームグループの管理


vgdisplayコマンドにより、ボリュームグループの情報を表示します。
#vgdisplay
 --- Volume group ---
  VG Name               centos
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <29.00 GiB
  PE Size               4.00 MiB
  Total PE              7423
  Alloc PE / Size       7423 / <29.00 GiB
  Free  PE / Size       0 / 0
  VG UUID               sAUPPC-AnGW-WtEV-SmNT-Kg3R-WZ0x-vA3HPL

コマンドにより、拡張したい/varの含まれる、/dev/sda2のボリュームグループは「centos」でした。

新しくボリュームグループを使うのならvgcreateコマンドを使用するところですが、今回は既存のボリュームグループへ物理ボリュームを追加するので、vgextendコマンドを使用します。
#vgextend centos /dev/sdb1
  Volume group "centos" successfully extended
centosというボリュームグループへ、新しい物理ボリュームである/dev/sdb1を追加しました。


vgdisplayコマンドで再確認します。
ボリュームグループ容量、空き容量が増えています。
#vgdisplay
  --- Volume group ---
  VG Name               centos
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               48.99 GiB
  PE Size               4.00 MiB
  Total PE              12542
  Alloc PE / Size       7423 / <29.00 GiB
  Free  PE / Size       5119 / <20.00 GiB
  VG UUID               sAUPPC-AnGW-WtEV-SmNT-Kg3R-WZ0x-vA3HPL
ここではFreeが20GBあることを確認します。つまり20GB拡張できます。




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

本家Redhat 論理ボリュームの管理

論理ボリュームの情報を表示します。
いま着目したいのは、目的のパーティションである/varが含まれる論理ボリューム名です。
#lvdisplay
(略)
  --- Logical volume ---
  LV Path                /dev/centos/var
  LV Name                var
  VG Name                centos
  LV UUID                juJmT8-pC2n-iJi1-tHJ2-808r-0tUL-aARynJ
  LV Write Access        read/write
  LV Creation host, time localhost, 2020-08-02 17:46:56 +0900
  LV Status              available
  # open                 1
  LV Size                <16.00 GiB
  Current LE             4095
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
このコマンドにより、目的の「/var」は、「/dev/centos/var」というデバイスファイルであることが
確認できます。
この値を次のコマンドで使用します。


lvextendコマンドで、/varを拡張します。
コマンドは以下のようにサイズ指定します。
-L+オプションで、拡張するサイズを指定
#lvextend -L+20G /dev/centos/var --resizefs

-L+オプションで、拡張するFree PE値を指定(vgdisplay参照)
#lvextend -L+5119 /dev/centos/var --resizefs

-Lオプションで拡張後のサイズを指定
#lvextend -L36G /dev/centos/var --resizefs

-lオプションで空き領域の%で指定
#lvextend -l +100%FREE /dev/centos/var --resizefs


20GBのディスクを追加したつもりなので、20GBを加えたサイズ(36GB)を指定しますが、よくある問題が発生します。
サイズがちょっと合わない
#lvextend -L36G /dev/centos/var --resizefs
  Insufficient free space: 5121 extents needed, but only 5119 available

拡張サイズを小さくしたら成功
#lvextend -L35G /dev/centos/var --resizefs
  Size of logical volume centos/var unchanged from 35.00 GiB (8960 extents).
  Logical volume centos/var successfully resized.
meta-data=/dev/mapper/centos-var isize=512    agcount=4, agsize=1048320 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=4193280, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 4193280 to 9175040
空き領域を無駄なく指定したいのなら、100%で指定するかPE値で指定すると良いでしょう。
「but only 5119 available」とは、vgdisplayコマンドの「Free PE値」のことです。
PE値で指定する場合
#lvextend -L+5119 /dev/centos/var --resizefs
論理ボリュームを拡張後、そのサイズをファイルシステムに教える必要があります。(拡張サイズの反映)
その反映は、lvextendコマンドの--resizefsオプションで行っています。


--resizeオプションを設定し忘れた場合は別途fsadmコマンドでサイズを反映します。
拡張と同時にサイズ反映を行う
#lvextend -l +100%FREE /dev/centos/var --resizefs

拡張とサイズ反映を、別コマンドで行う
#lvextend -l +100%FREE /dev/centos/var
#fsadm --lvresize resize /dev/centos/var
lvextendの--resizefsオプションも、実体はfsadmコマンドを呼び出しているのだそうです。





最終確認

論理グループの表示
#lvdisplay
(略)
  --- Logical volume ---
  LV Path                /dev/centos/var
  LV Name                var
  VG Name                centos
  LV UUID                juJmT8-pC2n-iJi1-tHJ2-808r-0tUL-aARynJ
  LV Write Access        read/write
  LV Creation host, time localhost, 2020-08-02 17:46:56 +0900
  LV Status              available
  # open                 1
  LV Size                35.00 GiB
  Current LE             8960
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

容量の確認
#df -m
ファイルシス            1M-ブロック  使用 使用可 使用% マウント位置
devtmpfs                       1391     0   1391    0% /dev
tmpfs                          1408     0   1408    0% /dev/shm
tmpfs                          1408    10   1398    1% /run
tmpfs                          1408     0   1408    0% /sys/fs/cgroup
/dev/mapper/centos-root       10230  4041   6190   40% /
/dev/sda1                      1014   183    832   19% /boot
/dev/mapper/centos-var        35830 14284  21547   40% /var
tmpfs                           282     1    282    1% /run/user/42
tmpfs                           282     0    282    0% /run/user/0
無事、/varの空き容量が増えていることが分かります。







prev.gif