Posted at

仮想マシンのディスク拡張方法がなかなか理解できない人のための記事


はじめに

最近はDockerイメージほいほい作ったりpullしたりしているとすぐにディスクが溢れる。

何番煎じかわからないくらい書かれているけど、毎回ディスク拡張で混乱して調べて毎回いろいろな情報に踊らされて余計に混乱してなんかよくわからないうちにできるっていう経験をしているので、いいかげん自分用兼自分と同じ状態になっている人用メモとして書いておく。

そんなに詳しく理解して書いているわけではないので間違っている部分あったら許してください。

なお、このあたりのことを調べているとディスクとかストレージとかボリュームとかの言葉が出てきますが、どれもだいたい似たような意味だと思えばそんなに間違いないです。いまいち使い分け方がよくわかっていません。この記事ではなるべくディスクに統一して書いています。


やりたいこと

ESXのLinux(CentOS)のvmdkの使用可能ディスク領域のサイズを拡張する。

ディスクの個数は増やさない。


なんでいろんな情報があるの?


  • 仮想マシンを動かしているホスト(ESXとかVirtualBoxとか)によって操作方法が異なるから

  • ファイルシステム(ext4とかxfsとか)によって微妙にコマンドが異なるから


    • 特にCentOSのデフォルトは6だとext4で7でxfsになったため注意



  • ディスク領域を増やす方法にはいくつか方法(サイズを大きくするとか個数を増やすとか)があるから


  • LVMを組んでいるかどうかで方法が異なるから

主に下2つが問題


なんでなかなか理解できないの?

上記のリストを見ると「わからない人はわかる」と思いますが、親しみの無い概念が急にたくさん出てくるのが厄介

ファイルシステムやLVMなんて初心者はたいていわかりません。

ディスク領域を増やすのも物理的に個数を増やすのだったらわかりやすいけど、仮想だとただ数字変えているだけという感覚なのでよくわかりません。

ホストから数字変えただけでなぜ増えてくれないのか?なぜOSのコマンドを打つ必要があるのか?なぜ作成は簡単にできたのに変更でこんな苦労するのか?

このあたりが個人的な躓きポイントでした。


ディスクの拡張ってなんなの?

普通の物理ディスクの容量を増やしたかったら新しいディスクを付け足すか、より大きなサイズのディスクに差し替えるのが一般的だと思います。仮想マシンの場合は仮想的なディスクを追加します。

この方法でサイズを大きくするのは拡張ではなく、ディスクの追加です。

差し替えは追加っぽくないですが、「既存のディスク削除+新規ディスク追加」なのでディスクの追加と同じです。

ディスク追加の場合はディスクの「どこからどこまでの領域」を「どこのパス」にマウントするのかをOSに教えることでようやくディスクを利用できるようになります。

マウントしないとただディスクを認識しているだけの状態になり、利用することができません。

どこかにあるのは知っているけどどこにあるのかは知らないから使えないって感じです。

ここまではイメージしやすいと思います。

では、ディスクの拡張とはなんなのか?

それは上記の「どこからどこまでの領域」の「どこまで」の部分をOSに教え直すことだと理解しています。

OSはディスクの「どこからどこまでの領域」を「どこのパス」にマウントするのかという情報を持ってディスクを認識しているため、ホスト上から使用可能なディスクサイズをあげただけではOSの認識しているディスクサイズは変わりません。「どこまで」の情報を変更することでようやくOSは増えた分を利用可能な状態にしてくれます。

ディスクの追加を「パーティションの追加」

ディスクの拡張を「パーティションの切り直し」

とか言ったりもします。

これがわかると、対話形式でなんか取っつきづらいfdiskコマンドで何をしているのかがイメージできると思います。

fdiskの操作方法書くと無駄に長くてややこしくなるので、具体的にはググって調べてください。

なお、切り直しの場合は一旦パーティションを消して作り直します。fdiskコマンドはwで保存するまで反映されないので結果的に領域の範囲だけが変わります。

本当に消しちゃっていいの?変更じゃないの?というのも地味に躓きポイントでした。


LVMってなんなの?

fdiskでパーティションの設定を変更したのにまだディスクサイズが増えない。pvとかvgとかlvとか似たようなものいっぱい出てくるけどなんなの?」

LVMが組まれている場合、ディスク拡張をした初心者はここでまた躓きます。

要するにディスクを抽象化して扱いやすくしているものがLVMなのですが、抽象化は得てして初心者を困惑させます。

pv/vg/lvをざっくりとなんとなくわかればディスクの拡張ができるため、ここではとりあえず以下のように理解しておけばよいかと思います。


  • pv: OSが使っていいディスク領域(/dev/sda1のような表記)


    • 追加したパーティションをLVMで扱いたい場合は新規のpvを作る必要がある(pvcreate

    • 追加済みのパーティションサイズが変わった場合は「認識し直せ」と命令する必要がある(pvresize



  • vg: 1つ以上のpvをまとめて仮想的に1つのディスク領域として見せかけているもの


    • 追加したpvを含ませたい場合はvgに追加したいpvを教える必要がある(vgextend

    • 追加済みのpvのサイズが変わった場合はvgのサイズも自動的に変わる



  • lv: vgから切り出した仮想的なパーティション(/dev/mapper/hogehogeのような表記)


    • 最終的にOSはこのパーティションを使用可能ディスク領域としてマウントする

    • サイズを変えたい場合は変更したいサイズを教える必要がある(lvextend



vgは複数のディスクを1つであるかのように扱うことができ、lvはvgから欲しいサイズの分だけ指定のパスにマウントすることができるため、ディスクを容易に柔軟に扱うことができるようになります。

LVMが組まれていない場合はパーティションごとにfstabでマウントの設定を行う必要があり、結構手間がかかります。

なお、マウントサイズを変更した後はファイルシステムにサイズが変更されたことを教えて認識させ直す必要があります。

コマンドはファイルシステムによって異なり、xfsの場合はxfs_growfs ext4の場合はresize2fs になります。


結局ディスクの拡張と追加どっちがいいの?

ぶっちゃけよくわかっていません

増やせればどっちでもいい気がしています。

ただ、ディスク追加の場合はパーティションを追加する必要があり、パーティションは5つ以上になると追加が面倒になるようなので、可能であれば拡張した方がいいと思ってます。

1つの仮想マシンに特に意味なくディスクがたくさんついているのもなんか嫌ですし。

ちなみにVirtualBoxはvdi形式のディスクサイズの変更はできるけどvmdk形式のディスクだとエラー(VBOX_E_NOT_SUPPORTED)が出て変更できないらしく、変更できない形式で作ってしまった場合は形式指定してクローンすれば作り直せるらしいですが、ディスク追加で凌いだ方が楽です。