ある日、仮想マシンサーバーの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に焼いてセットし、そこから起動すれば、当記事と同じ手順で実行できます。
方法
1つずつ、やり方を紹介していきます。
【手順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
以下のエラーが表示された場合は、ディスクが使用中です。マウントされていないか確認してください。
できませんでした。おそらく、使用中だったのが原因だと思われます。そのため、古いパーティション情報がそのまま使われます。さらなる変更をする前に再起動してください。
問題なければ、パーティションを作成します。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】ファイルシステムの拡張
次に、ファイルシステムの拡張を行います。
ファイルシステムの拡張を行うことで、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
まとめ
仮想マシンはラフに使えることもあり、気づいたら容量がパンパンになっていた(汗)ということがありがちです。
当記事で紹介した手順通りやれば、かんたんに容量を拡張することができます。空きが足らなくなって困ったときは、参考にしていただければ幸いです。
コメント