【VirtualBox】仮想マシンのディスク容量を増やすには?サイズ変更からLinuxのパーティション・LVM拡張までの全手順

サーバー

ある日、仮想マシンサーバーのWordPressの動きがおかしいなあと思っていたら、ルートディレクトリの使用率が98%に迫っていました。容量が足りなかったんですね。。

[root@ts02 ~]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
devtmpfs                  908M     0  908M    0% /dev
tmpfs                     920M     0  920M    0% /dev/shm
tmpfs                     920M  8.5M  911M    1% /run
tmpfs                     920M     0  920M    0% /sys/fs/cgroup
/dev/mapper/centos-root   8.0G  7.8G  243M   98% /
/dev/sda1                1014M  178M  837M   18% /boot
tmpfs                     184M     0  184M    0% /run/user/0

こういったとき、VirtualBoxの仮想マシン(Linux)の容量を増やす手順をまとめておきます。仮想ハードディスクファイルのサイズ変更から、Linuxのパーティション変更、LVMについての話まで、網羅的にまとめています。

スポンサーリンク

<STEP1>仮想ハードディスクを大きくする

まずは、仮想ハードディスクファイルのサイズを拡張しないといけません。

「VirtualBoxマネージャー」から、仮想マシンの起動ディスクファイル名をチェックしておきます。

スクリーンショット
スクリーンショット
スクリーンショット

次に、「仮想メディアマネージャー」から仮想ディスクを拡張します。

スクリーンショット
スクリーンショット
スクリーンショット
スクリーンショット

サイズを大きくします。ここでは10GBを20GBまで拡張することにしました。

サイズ指定後、[適用]ボタンを押します。

サイズ変更後、[適用]を押すと、エラーになることがあります。

スクリーンショット

これは仮想ハードディスクファイルがVDIではないためです。この場合は一旦、仮想ハードディスクファイルを.vdi形式に変換する必要があります。「仮想ディスクマネージャー」にて、[コピー]をクリックし、VDI形式に変換後、再度サイズ変更を実施してみてください。

スポンサーリンク

<STEP2>Linuxから拡張したディスクを使えるようにしよう

サイズを拡張したら、とりあえずマシンを起動して、Linuxでパーティション構成を見てみましょう。

Linuxではpartedというコマンドを使って、パーティションテーブルを確認・操作することが可能です。parted -lでディスクに存在するパーティションを表示できます。

[root@ts02 ~]# parted -l
モデル: ATA VBOX HARDDISK (scsi)
ディスク /dev/sda: 21.5GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  1075MB  1074MB  primary  xfs               boot
 2    1075MB  10.7GB  9663MB  primary                    lvm

2つのパーティションが確認できました。

OSが読み書きできるのは、あくまでパーティションです。ディスク容量を増やしただけでは、パーティションのサイズは変わらず、OSから使用することはできません。拡張した分は、パーティションが割り当てられていない空の領域となってしまいます。

パーティションの解説

そこで、パーティションのサイズを拡張することが必要となります。

パーティションの解説

実際の方法ですが、パーティション2の終点をディスク末尾に変更するようにします。

まず、2番のパーティションを削除します。そして、始点をそのままにして、終点のみディスク末尾のセクタに変更し、パーティションを作り直すようにします。これならすでに存在しているデータを破壊せず、後からパーティションを拡張することが可能です。当記事では、この 詳しい手順を紹介します。

パーティションを削除というところで、「データ消えちゃうんじゃないの?」と思った方もいるかも知れませんが、大丈夫です。パーティションというのはあくまで「仕切り」ですので、一度消しても後から同じ位置に戻せば、データが消えることはありません。

とはいえ、間違って操作すると、一瞬でデータが飛びます。必ずバックアップしてから、以降の操作を行ってください。

環境

改めて、今回の環境をまとめておきます。

  • マシン(A)
    • Oracle VM VirtualBox 5.2.22 r126460
    • OS:CentOS7.4
  • パーティション変更を行うマシン(B)
    • Oracle VM VirtualBox 5.2.22 r126460
    • OS:ubuntu-18.04.5-desktop-amd64.iso

パーティションの変更は、対象のディスクがマウントされていない状態で行わなければなりません。よって、用意した別のマシンにディスクを接続し、パーティショニングする必要があります。(つまり、マシンの起動に使用しているディスクをパーティショニングすることはできません。)

当記事では、仮想マシンのディスクを別の仮想マシンからパーティショニングします。UbuntuのISOイメージから別の仮想マシンをもう一つ立ち上げ、仮想ディスクのパーティションを変更するようにしていますが、UbuntuなどのISOを仮想マシンの仮想ディスクドライブにセットして、Liveで立ち上げてもOKです。なお、実機では、UbuntuなどをUSBやCDに焼いてセットし、そこから起動すれば、当記事と同じ手順で実行できます。

スクリーンショット
仮想高額ドライブにUbuntuのISOをセット。
スクリーンショット
ISOからLiveで立ち上げれば、パーティションの変更が可能となる。

方法

1つずつ、やり方を紹介していきます。

コマンドはすべてスーパーユーザー(rootユーザー)で実行してください。一般ユーザーでは、ディスクが正しく表示されない場合があります。

【手順1】現在のディスク情報を取得

まず、パーティション変更前のフォーマットを取得し、メモしておきます。


[root@ts02 ~]# df -Th
ファイルシス            タイプ   サイズ  使用  残り 使用% マウント位置
devtmpfs                devtmpfs   908M     0  908M    0% /dev
tmpfs                   tmpfs      920M     0  920M    0% /dev/shm
tmpfs                   tmpfs      920M  8.6M  911M    1% /run
tmpfs                   tmpfs      920M     0  920M    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs #←チェック! 8.0G  7.8G  243M   98% /
/dev/sda1               xfs       1014M  178M  837M   18% /boot
tmpfs                   tmpfs      184M     0  184M    0% /run/user/0

Tオプションにより、フォーマットを表示させています。今回はxfsが採用されていることが確認できました。フォーマットは後で必要になるので、覚えておいてください。

次に、partedで拡張したいディスクを開きます。

[root@ts02 ~]# parted /dev/sda
GNU Parted 3.1
/dev/sda を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。

partedで開くときは、パーティションではなくデバイスを指定します。/dev/sda1など、末尾に数字がついているものはパーティションです。そうではなくて、数字なしで/dev/sdaのように指定します。

とりあえずprintしてみます。

(parted) print
モデル: ATA VBOX HARDDISK (scsi)
ディスク /dev/sda: 21.5GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  1075MB  1074MB  primary  xfs               boot
 2    1075MB  10.7GB  9663MB  primary                    lvm

間違ったデバイスを指定していないことを確認したら、表示単位をセクタに変更します。

(parted)unit s

セクタ単位にしたら、もう一度printします。この出力も後で必要になります。確実にメモしておいてください。とくに開始と終了の値は、1文字でも間違うとデータが飛ぶので要注意です。

(parted) print
モデル: ATA VBOX HARDDISK (scsi)
ディスク /dev/sda: 41943040s
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:

番号  開始      終了       サイズ     タイプ   ファイルシステム  フラグ
 1    2048s     2099199s   2097152s   primary  xfs               boot
 2    2099200s  20971519s  18872320s  primary                    lvm

【手順2】パーティションテーブルの変更

ここからいよいよパーティションテーブルを変更していきます。

まず、2番めのパーティションを削除します。

(parted)rm 2

以下のエラーが表示された場合は、ディスクが使用中です。マウントされていないか確認してください。

できませんでした。おそらく、使用中だったのが原因だと思われます。そのため、古いパーティション情報がそのまま使われます。さらなる変更をする前に再起動してください。

使用中のディスクは、パーティショニングできません。必ず別のマシン(もしくはLiveイメージのOS)からパーティショニングする必要があります。

問題なければ、パーティションを作成します。mkpartコマンドを実行し、プロンプトに従ってください。

(parted) mkpart
Partition type? primary/extended? primary
File system type? [ext2]? xfs
Start? 2099200s
End? 100%

いくつか質問されますので、以下のように回答します。

  • パーティションタイプはPrimaryを指定します。
  • File system typeは確認しておいたフォーマット(ここではxfs)を指定します。
  • Startはメモしておいたパーティション2の開始(ここでは2099200s)を指定します。単位付きで指定してください。
  • Endはディスクの未割り当て領域すべてをパーティションに割り当てたいので、100%を指定します。

すべてやったら、printします。問題なさそうなら、qと入力してpartedを終了します。

【手順3】ファイルシステムの拡張

ここからは、元のマシン(B)に戻って作業を行ってもOK

次に、ファイルシステムの拡張を行います。

ファイルシステムの拡張を行うことで、OSから拡張した分のパーティションを使用できるようになります。使用するコマンドは、ディスクのフォーマットによって異なります。

  • XFS以外(ext4など)→resize2fsコマンド
  • XFSの場合→xfs_growthfsコマンド

今回はxfsだったので、xfs_growthfsコマンドを使用します。

# xfs_growfs /dev/centos/root
スクリーンショット

うまくいけば、下のようなメッセージが表示されます。その場合は拡張成功です。

data blocks changed from 2096128 to 4699136

一方、スクリーンショットのように、拡張に成功した旨のメッセージが表示されない場合は失敗です。次の手順に進んでください。

うまくいかなかったときは?

今回の手順でうまく行かなかった場合、おそらくLVMが使用されています。

LVMというのは、ディスクを仮想的に認識するシステムです。LVMが使用されているときにパーティションを変更した場合は、その変更をLVMにも認識させる必要があります。

以下に手順を掲載していますので、続けて操作してください。

【手順4】パーティションにLVMフラグを立てる

はじめに、拡張したパーティションにpartedでLVMフラグを立てます。

ここは別マシンでやる必要はありません。フラグに関しては、使用中のディスクに対しても設定することができます。

[root@ts02 ~]# parted /dev/sda
GNU Parted 3.1
/dev/sda を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。
(parted) set 2 lvm on
(parted) print
モデル: ATA VBOX HARDDISK (scsi)
ディスク /dev/sda: 21.5GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  1075MB  1074MB  primary  xfs               boot
 2    1075MB  21.5GB  20.4GB  primary                    lvm #LVMフラグが付いた
(parted)q

LVMフラグが立ちました。

【手順5】LVMの拡張

次に、LVMを拡張していきます。まず、PV(物理ボリューム)を拡張します。

[root@ts02 ~]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               centos
  PV Size               <9.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              2303
  Free PE               0
  Allocated PE          2303
  PV UUID               l24sPn-F5Es-m6NA-135o-FIkb-IGGk-FP1E2r

[root@ts02 ~]# pvresize /dev/sda2
  Physical volume "/dev/sda2" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized

[root@ts02 ~]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               centos
  PV Size               <19.00 GiB / not usable 2.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              4863
  Free PE               2560
  Allocated PE          2303
  PV UUID               l24sPn-F5Es-m6NA-135o-FIkb-IGGk-FP1E2r

PV Sizeのところに注目すると、ちゃんと容量が増えたことがわかります。

つづいて、LV(論理ボリューム)の拡張を行います。

論理ボリュームの拡張は、lvextendコマンドで行います。partedでパーティションに10GB追加したので、とりあえず10GB追加するようコマンドします。

[root@ts02 ~]# lvextend -L +10G /dev/centos/root
  Insufficient free space: 2560 extents needed, but only 2535 available

エラーとなりました。誤差が生じるので、単純な計算通りにはいきません。追加できる最大値がエラー内に表示されているので、その値を+の次に指定すればOKです。

[root@ts02 ~]# lvextend -L +2535 /dev/centos/root
  Size of logical volume centos/root changed from 8.09 GiB (2072 extents) to 17.90 GiB (4583 extents).
  Logical volume centos/root successfully resized.

うまくいきました。

最後にファイルシステムを拡張します。

[root@ts02 ~]# xfs_growfs /dev/centos/root
meta-data=/dev/mapper/centos-root isize=512    agcount=4, agsize=524032 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=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               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 2096128 to 4699136 # 拡張された!

【手順6】完了!

これでミッション完了です。dfコマンドでチェックしてみると、きちんと容量が追加されたことが確認できます。

[root@ts02 ~]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
devtmpfs                  908M     0  908M    0% /dev
tmpfs                     920M     0  920M    0% /dev/shm
tmpfs                     920M  8.5M  911M    1% /run
tmpfs                     920M     0  920M    0% /sys/fs/cgroup
/dev/mapper/centos-root    18G  7.8G   11G   44% / # ふえた!!
/dev/sda1                1014M  178M  837M   18% /boot
tmpfs                     184M     0  184M    0% /run/user/0

まとめ

仮想マシンはラフに使えることもあり、気づいたら容量がパンパンになっていた(汗)ということがありがちです。

当記事で紹介した手順通りやれば、かんたんに容量を拡張することができます。空きが足らなくなって困ったときは、参考にしていただければ幸いです。

コメント

タイトルとURLをコピーしました