libvirt環境でのHDD容量を増やす

こんにちは、mi2yo4です。

いよいよGW目前となりました。
今年もどこかに旅に出たいと思っていますが、どうなることやら…

computer_harddisk

さて今回は、少し前に行った作業のメモを書いておこうかと思います。
Linux上で構築した仮想マシンに割り当てるHDD容量を増やす、というものでちょっとニッチな感じもします。が、少なくとも未来のLinuxのHDDをふっ飛ばし、涙目になって再セットアップしている自分には役に立ちそうな感じです^^;

2月以降の私たち

Vagrantを使ってFuelPHP開発環境を構築」というエントリを書いて以来、私たちはVagrantを使用した開発者個々のマシン上の仮想環境でソフト動作確認・デバッグを行うようになっています。

また、先日(2017/2)に行ったあぐりログサーバの増強に伴い、サーバ上の蓄積されたデータが定期的にバックアップされるようになっています。

最近ではこのバックアップされたデータを加工し、開発者各自で色々な解析を始めています。
解析する目的はもちろん、より良い栽培環境のアドバイス、的なものをあぐりログで作りたい!と思っているからです。

仮想サーバ(vagrant)のHDD容量が足りない!

私も解析を始める一人でして、まずは手元のLinuxマシンで仮想サーバ環境と解析環境を構築しています。
今回は、この構築で困った事がありました。と言うのも、

「通常の仮想サーバ環境だとHDD容量が足りなくてデータを展開できない!」

と言うものです。

ので、その解決方法も併せて書いてみるつもりです。

仮想Linuxサーバ環境を構築

前述したVagrantはサーバの仮想化ソフトウェアとしてVirtualBoxを使っています。
開発者のマシンでよく使われるWindowsやMacOS(OSX)上ではとても便利に使えます。

一方、LinuxではKVMやXenといった仮想化ソフトウェアが標準です。ここで困った事にVagrantはそのままの状態ではKVMなどに対応していません。
それらを使う際にはVirtualBoxをLinuxにインストールするか、VagrantにlibvirtをインストールしてKVM形式にも対応させるか、となります。

で、私が今手持ちのLinuxサーバで使っているのは上で言うと後者の方式です。
諸般の事情により、(と言っても対象のLinuxサーバにモニタが繋がっていないので、CUIで使いやすそうな)後者の方法を用いました。

HDD容量を増やすための手順

ここからは実際にやった手順を書いていきます。

1. 最初にbox.imgの中身を確認します

$ virt-filesystems -lh --parts --pvs --vgs --lvs --extra -a box.img
Name                  Type       VFS  Label MBR Size Parent
/dev/sda1             filesystem ext4 -     -   500M -
/dev/VolGroup/lv_root filesystem ext4 -     -   38G  -
/dev/VolGroup/lv_swap filesystem swap -     -   2.0G -
/dev/VolGroup/lv_root lv         -    -     -   38G  /dev/VolGroup
/dev/VolGroup/lv_swap lv         -    -     -   2.0G /dev/VolGroup
/dev/VolGroup         vg         -    -     -   40G  /dev/sda2
/dev/sda2             pv         -    -     -   40G  -          (←ここの値を下の3.で指定する)
/dev/sda1             partition  -    -     83  500M /dev/sda
/dev/sda2             partition  -    -     8e  40G  /dev/sda

今回の最終目的は/dev/VolGroup/lv_rootを38Gから増やすこと。

2. 新しいディスクイメージの作成

今回は40Gの2.5倍の100Gで作成しましょう。

$ qemu-img create -f qcow2 box.img.new 100G

3. パーティションの割当

上記で確認した結果LVMパーティション(/dev/sda2)を増やし、同時に増加分を全て/dev/VolGroup/lv_rootに割り当てます。

$ virt-resize --expand /dev/sda2 --LV-expand /dev/VolGroup/lv_root box.img box.img.new

4. 結果を確認

結果を確認してみます。

# virt-filesystems -lh --parts --pvs --vgs --lvs --extra -a box.img.new
Name                  Type       VFS  Label MBR Size Parent
/dev/sda1             filesystem ext4 -     -   500M -
/dev/VolGroup/lv_root filesystem ext4 -     -   98G  -
/dev/VolGroup/lv_swap filesystem swap -     -   2.0G -
/dev/VolGroup/lv_root lv         -    -     -   98G  /dev/VolGroup
/dev/VolGroup/lv_swap lv         -    -     -   2.0G /dev/VolGroup
/dev/VolGroup         vg         -    -     -   100G /dev/sda2
/dev/sda2             pv         -    -     -   100G -
/dev/sda1             partition  -    -     83  500M /dev/sda
/dev/sda2             partition  -    -     8e  100G /dev/sda

無事に/dev/VolGroup/lv_rootには98Gが割り当てられました。

5. box.imgの置き換え

今までのbox.imgを退避させて、新しいbox.imgを使うようにします。

$ mv box.img.new box.img

6. vagrant起動

root@debug-server:~/.vagrant.d/boxes/bento-VAGRANTSLASH-centos-6.8/2.3.1/libvirt# virt-resize --expand /dev/sda2 box.img box.img.new

root@debug-server:~/.vagrant.d/boxes/bento-VAGRANTSLASH-centos-6.8/2.3.1/libvirt# virt-filesystems -lh --parts --pvs --vgs --lvs --extra -a box.img
Name                  Type       VFS  Label MBR Size Parent
/dev/sda1             filesystem ext4 -     -   500M -
/dev/VolGroup/lv_root filesystem ext4 -     -   38G  -
/dev/VolGroup/lv_swap filesystem swap -     -   2.0G -
/dev/VolGroup/lv_root lv         -    -     -   38G  /dev/VolGroup
/dev/VolGroup/lv_swap lv         -    -     -   2.0G /dev/VolGroup
/dev/VolGroup         vg         -    -     -   40G  /dev/sda2
/dev/sda2             pv         -    -     -   40G  -
/dev/sda1             partition  -    -     83  500M /dev/sda
/dev/sda2             partition  -    -     8e  40G  /dev/sda
root@debug-server:~/.vagrant.d/boxes/bento-VAGRANTSLASH-centos-6.8/2.3.1/libvirt# virt-filesystems -lh --parts --pvs --vgs --lvs --extra -a box.img.new
Name                  Type       VFS  Label MBR Size Parent
/dev/sda1             filesystem ext4 -     -   500M -
/dev/VolGroup/lv_root filesystem ext4 -     -   38G  -
/dev/VolGroup/lv_swap filesystem swap -     -   2.0G -
/dev/VolGroup/lv_root lv         -    -     -   38G  /dev/VolGroup
/dev/VolGroup/lv_swap lv         -    -     -   2.0G /dev/VolGroup
/dev/VolGroup         vg         -    -     -   100G /dev/sda2
/dev/sda2             pv         -    -     -   100G -
/dev/sda1             partition  -    -     83  500M /dev/sda
/dev/sda2             partition  -    -     8e  100G /dev/sda

virt-resize --expand /dev/sda2 --LV-expand /dev/VolGroup/lv_root box.img box.img.new
$ vagrant up
$ vagrant ssh

ここでfdiskを用いてパーティション設定を行いました。

その後、以下のコマンドを投入

[root@localhost ~]# pvcreate /dev/sda3
[root@localhost ~]# vgextend VolGroup /dev/sda3
[root@localhost ~]# lvextend -l +100%FREE /dev/mapper/VolGroup-lv_root
[root@localhost ~]# resize2fs /dev/mapper/VolGroup-lv_root
[root@localhost ~]# df
Filesystem           1K-blocks   Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root
                     100538860 800444  94630040   1% /
tmpfs                   251000      0    251000   0% /dev/shm
/dev/sda1               487652  29986    432066   7% /boot

ふぅ~、お疲れ様でした。
これで何とかLinux上に仮想マシンを立ち上げることが出来ました。
未来の私、分かりましたか?

それではまた!

参考情報

LVMで新たにディスクを追加して既存のLVを拡張する
http://qiita.com/g_maeda/items/3602dc2f7af3f711f9c4