VPSのストレージ拡張方法

古都の老兵
2024-02-20
2024-02-20

はじめに

 KVM上のVPSでストレージが足りなくなってしまった事は皆さん経験があると思いますので今回はVPSのストレージ拡張方法を簡潔にまとめてみました。

イメージサイズの変更

 まずはVPSが動いている物理サーバー上でイメージサイズを変更しますが、その前に現在の状況を確認してみます。
注)qem-img info はVPS停止中でないと見る事ができません。CentOS7までは稼働中でも見る事が出来ましたが

# qemu-img info dev999.img
image: dev999.img
file format: qcow2
virtual size: 30G (32212254720 bytes)
disk size: 3.2G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

 virtual size が割り当てているサイズになります。disk size は実際に使っているサイズです。今回は解説用ですので使用しているサイズは小さくなっています。

 では実際に10GBほど拡張して確認してみましょう。

# qemu-img resize dev999.img +10G
Image resized.
# qemu-img info dev999.img
image: dev999.img
file format: qcow2
virtual size: 40G (42949672960 bytes)
disk size: 3.2G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

 使うコマンドは qemu-img で info で確認、resize で拡張する事ができます。一応縮小もできますが、操作前に減らす分のパーティションを縮小させたり、ファイルシステムを小さくしておく必要があります。ただ、xfs はファイルサイズを小さく出来ませんので、実質小さくすることは出来ないと考えておいた方が良いかもしれません。
 操作についてはVPSを停止後に行って下さい。拡張を反映させる為には、VPSの完全停止が必要になります。OSの再起動(reboot)では反映されません。

 という事で、拡張が終わったらVPSを起動します。

パーティションの拡張

 OSが起動したらpartedコマンドでディスクを拡張しますが、その前に各ファイルシステムの状況を確認しておきます。

# df -h
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               4.0M     0  4.0M   0% /dev
tmpfs                  882M     0  882M   0% /dev/shm
tmpfs                  353M  4.9M  348M   2% /run
/dev/mapper/main-root   25G  1.9G   24G   8% /
/dev/vda1             1014M  256M  759M  26% /boot

 root パーティションが現在25GBとなっています。
 次にpartedで拡張していきますが、print free で見割当ての状況が確認できます。

# parted /dev/vda print free
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
        1024B   1049kB  1048kB           Free Space
 1      1049kB  1075MB  1074MB  primary  xfs          boot
 2      1075MB  32.2GB  31.1GB  primary               lvm
        32.2GB  42.9GB  10.7GB           Free Space

 10GB程のフリースペースが確認できますのでフリースペース全てを Number 2 のパーティションに割り当ててみます。

# parted /dev/vda
GNU Parted 3.5
Using /dev/vda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) resizepart 2 100%
(parted) print free
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
        1024B   1049kB  1048kB           Free Space
 1      1049kB  1075MB  1074MB  primary  xfs          boot
 2      1075MB  42.9GB  41.9GB  primary               lvm

(parted) quit

 resizepart (パーティション番号) を指定し、100%はフリースペース全てになります。また parted コマンド内で print free で確認する事ができます。

LVMを拡張

 ようやくLVMの拡張です。拡張するには pvresize コマンドを使いますが、まずは現状を確認してみましょう。

# pvdisplay
  --- Physical volume ---
  PV Name               /dev/vda2
  VG Name               main
  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               NQIGxz-UORq-3HMz-DsKo-2wbK-y77w-0ljzZr

 何もしていない状態だと Free PE は 0 で未割当てはありませんので、pvresize で拡張します。

# pvresize /dev/vda2
  Physical volume "/dev/vda2" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized
# pvdisplay
  --- Physical volume ---
  PV Name               /dev/vda2
  VG Name               main
  PV Size               <39.00 GiB / not usable 2.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              9983
  Free PE               2560
  Allocated PE          7423
  PV UUID               NQIGxz-UORq-3HMz-DsKo-2wbK-y77w-0ljzZr

 空きが増えた事が確認できましたので、root 領域に割り当てます。

# lvextend -l +100%FREE /dev/main/root
  Size of logical volume main/root changed from <25.00 GiB (6399 extents) to <35.00 GiB (8959 extents).
  Logical volume main/root successfully resized.

 +100%FREE で空き領域全てを割り当てる事ができます。
 これでパーティションとしては空きが増えていますが、ファイルシステム上からはまだ大きくはなっていませんので、ファイルシステムをリサイズします。これは使っているファイルシステムの種類によってコマンドが違いますが、ext4 なら resize2fs、xfs なら xfs_growfs を使います。RedHat EL7 以降は xfs が標準のファイルシステムになっていますので、今回は xfs_growfs を使います。

# xfs_growfs /dev/main/root
meta-data=/dev/mapper/main-root  isize=512    agcount=4, agsize=1638144 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1 nrext64=0
data     =                       bsize=4096   blocks=6552576, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=3199, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 6552576 to 9174016

 では実際に大きくなっているかの確認です。

# df -h
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               4.0M     0  4.0M   0% /dev
tmpfs                  882M     0  882M   0% /dev/shm
tmpfs                  353M  4.9M  348M   2% /run
/dev/mapper/main-root   35G  2.0G   34G   6% /
/dev/vda1             1014M  256M  759M  26% /boot

 ページの最初の方に戻って頂き、作業前が 25GB で作業後は 35GB と大きくなったことが確認できます。

最後に

 どうしてもVPSの完全停止が必要になりますが、停止⇒拡張⇒起動くらいなら数分の停止に留める事ができるのではないでしょうか。